rk2928 add gps support
author蓝斌元 <lby@rock-chips.com>
Thu, 26 Jul 2012 10:14:24 +0000 (18:14 +0800)
committer蓝斌元 <lby@rock-chips.com>
Thu, 26 Jul 2012 10:14:24 +0000 (18:14 +0800)
13 files changed:
arch/arm/mach-rk2928/board-rk2928-fpga.c
drivers/misc/Makefile
drivers/misc/gps/Kconfig
drivers/misc/gps/Makefile
drivers/misc/gps/hv5820b/Kconfig [new file with mode: 0755]
drivers/misc/gps/hv5820b/Makefile [new file with mode: 0755]
drivers/misc/gps/hv5820b/PALAPI.c [new file with mode: 0755]
drivers/misc/gps/hv5820b/PALAPI.h [new file with mode: 0755]
drivers/misc/gps/hv5820b/gpsdriver.c [new file with mode: 0755]
drivers/misc/gps/hv5820b/gpsdriver.h [new file with mode: 0755]
drivers/misc/gps/hv5820b/gpsdrv.h [new file with mode: 0755]
drivers/misc/gps/hv5820b/hv5820b_gps.h [new file with mode: 0755]
drivers/misc/gps/hv5820b/lnxdrv.h [new file with mode: 0755]

index 7fd99583b24cba87cc336e1b916bbe527a9f5c23..07e366c32fb286dbcd4f20006b2a62b5768609ce 100755 (executable)
@@ -42,6 +42,9 @@
 #include <linux/regulator/machine.h>
 #include <linux/rfkill-rk.h>
 #include <linux/sensor-dev.h>
+#if defined(CONFIG_GPS_HV5820B)
+#include "../../../drivers/misc/gps/hv5820b/hv5820b_gps.h"
+#endif
 
 #ifdef CONFIG_VIDEO_RK29
 /*---------------- Camera Sensor Macro Define Begin  ------------------------*/
@@ -769,7 +772,85 @@ static struct platform_device device_ion = {
        },
 };
 #endif
+#if defined(CONFIG_GPS_HV5820B)
+int hv5820b_gps_io_init(void)
+{
+       printk("%s \n", __FUNCTION__);
+       rk30_mux_api_set(GPIO1B1_SPI_TXD_UART1_SOUT_NAME, GPIO1B_GPIO1B1);//VCC_EN
+       gpio_request(RK2928_PIN1_PB1, NULL);
+       gpio_direction_output(RK2928_PIN1_PB1, GPIO_LOW);
+
+       rk30_mux_api_set(GPIO1A2_I2S_LRCKRX_GPS_CLK_NAME, GPIO1A_GPS_CLK);//GPS_CLK
+       rk30_mux_api_set(GPIO1A4_I2S_SDO_GPS_MAG_NAME, GPIO1A_GPS_MAG);//GPS_MAG
+       rk30_mux_api_set(GPIO1A5_I2S_SDI_GPS_SIGN_NAME, GPIO1A_GPS_SIGN);//GPS_SIGN
+
+       rk30_mux_api_set(GPIO1B0_SPI_CLK_UART1_CTSN_NAME, GPIO1B_GPIO1B0);//SPI_CLK
+       gpio_request(RK2928_PIN1_PB0, NULL);
+       gpio_direction_output(RK2928_PIN1_PB0, GPIO_LOW);
+
+       rk30_mux_api_set(GPIO1B2_SPI_RXD_UART1_SIN_NAME, GPIO1B_GPIO1B2);//SPI_MOSI
+       gpio_request(RK2928_PIN1_PB2, NULL);
+       gpio_direction_output(RK2928_PIN1_PB2, GPIO_LOW);       
+
+       rk30_mux_api_set(GPIO1B3_SPI_CSN0_UART1_RTSN_NAME, GPIO1B_GPIO1B3);//SPI_CS
+       gpio_request(RK2928_PIN1_PB3, NULL);
+       gpio_direction_output(RK2928_PIN1_PB3, GPIO_LOW);               
+       return 0;
+}
+int hv5820b_gps_power_up(void)
+{
+       printk("%s \n", __FUNCTION__);
+
+       return 0;
+}
+
+int hv5820b_gps_power_down(void)
+{
+       printk("%s \n", __FUNCTION__);
+
+       return 0;
+}
+
+int hv5820b_gps_reset_set(int level)
+{
+       return 0;
+}
+int hv5820b_enable_hclk_gps(void)
+{
+       printk("%s \n", __FUNCTION__);
+       clk_enable(clk_get(NULL, "hclk_gps"));
+       return 0;
+}
+int hv5820b_disable_hclk_gps(void)
+{
+       printk("%s \n", __FUNCTION__);
+       clk_disable(clk_get(NULL, "hclk_gps"));
+       return 0;
+}
+struct hv5820b_gps_data hv5820b_gps_info = {
+       .io_init = hv5820b_gps_io_init,
+       .power_up = hv5820b_gps_power_up,
+       .power_down = hv5820b_gps_power_down,
+       .reset = hv5820b_gps_reset_set,
+       .enable_hclk_gps = hv5820b_enable_hclk_gps,
+       .disable_hclk_gps = hv5820b_disable_hclk_gps,
+       .GpsSign = RK2928_PIN1_PA4,
+       .GpsMag = RK2928_PIN1_PB1,        //GPIO index
+       .GpsClk = RK2928_PIN1_PA2,        //GPIO index
+       .GpsVCCEn = RK2928_PIN1_PB1,     //GPIO index
+       .GpsSpi_CSO = RK2928_PIN1_PB3,    //GPIO index
+       .GpsSpiClk = RK2928_PIN1_PB0,     //GPIO index
+       .GpsSpiMOSI = RK2928_PIN1_PB2,    //GPIO index
+};
 
+struct platform_device hv5820b_device_gps = {
+       .name = "gps_hv5820b",
+       .id = -1,
+       .dev            = {
+       .platform_data = &hv5820b_gps_info,
+               }
+       };
+#endif
 static struct platform_device *devices[] __initdata = {
 #ifdef CONFIG_ION
        &device_ion,
@@ -777,6 +858,9 @@ static struct platform_device *devices[] __initdata = {
 #ifdef CONFIG_FB_ROCKCHIP
        &device_fb,
 #endif
+#ifdef CONFIG_GPS_HV5820B
+       &hv5820b_device_gps,
+#endif
 };
 
 static void __init rk2928_board_init(void)
index e5b97a33c72409127f75f71d85c6abbd0161178c..5a99f5aaab7c73610f7f553ce94b30b67a0309db 100644 (file)
@@ -58,7 +58,7 @@ obj-$(CONFIG_MW100)           += mw100.o
 obj-$(CONFIG_MT6229)             += mt6229.o
 obj-$(CONFIG_STE)              += ste.o
 obj-$(CONFIG_RK29_SUPPORT_MODEM)       += rk29_modem/
-obj-$(CONFIG_GPS_GNS7560)      += gps/
+obj-$(CONFIG_RK29_GPS) += gps/
 obj-y += inv_mpu/
 obj-$(CONFIG_RK29_NEWTON)      += newton.o
 obj-$(CONFIG_TDSC8800) += tdsc8800.o
index ae012dbcaefdc7b9028a272154e752c02e4c4fab..7c912b3f74f60d773354714fa85721585748646c 100644 (file)
@@ -13,7 +13,8 @@ if RK29_GPS
 config GPS_GNS7560
        bool "gns7560 support"
        default n
-
+       
+source "drivers/misc/gps/hv5820b/Kconfig"      
 endif # RK29_GPS
 
 
index 6b4bdb6480c2beb2678d48b47f0786b81ba6cb44..5488d964d9fd0e3c2feb91a6b33db1cba8af073d 100644 (file)
@@ -1,3 +1,3 @@
 obj-$(CONFIG_GPS_GNS7560)    += rk29_gps.o
-
+obj-$(CONFIG_RK29_GPS)    += hv5820b/
 
diff --git a/drivers/misc/gps/hv5820b/Kconfig b/drivers/misc/gps/hv5820b/Kconfig
new file mode 100755 (executable)
index 0000000..47365c0
--- /dev/null
@@ -0,0 +1,13 @@
+#
+# gps device configuration
+#
+
+
+
+config GPS_HV5820B
+       bool "HV5820B support"
+       default n
+
+
+
+
diff --git a/drivers/misc/gps/hv5820b/Makefile b/drivers/misc/gps/hv5820b/Makefile
new file mode 100755 (executable)
index 0000000..150c554
--- /dev/null
@@ -0,0 +1,3 @@
+obj-$(CONFIG_GPS_HV5820B)    += gpsdriver.o PALAPI.o gpsdrv.a
+
+
diff --git a/drivers/misc/gps/hv5820b/PALAPI.c b/drivers/misc/gps/hv5820b/PALAPI.c
new file mode 100755 (executable)
index 0000000..610bfca
--- /dev/null
@@ -0,0 +1,421 @@
+///////////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Filename: PALAPI.c\r
+// Author:     sjchen\r
+// Copyright: \r
+// Date: 2010/12/01\r
+// Description:\r
+//                     linux system interface\r
+//\r
+// Revision:\r
+//             0.0.1\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+#include <linux/module.h>\r
+#include <linux/kernel.h>\r
+#include <linux/string.h>\r
+#include <linux/slab.h>\r
+#include <linux/sched.h>\r
+#include <linux/time.h>\r
+#include <linux/fs.h>\r
+#include <linux/delay.h>\r
+#include <linux/spinlock.h>\r
+#include <linux/mm.h>\r
+#include <linux/miscdevice.h>\r
+#include <asm/system.h>\r
+#include <asm/page.h>\r
+#include <asm/pgtable.h>\r
+#include <asm/uaccess.h>\r
+\r
+#include <linux/interrupt.h>\r
+#include <asm/cacheflush.h>\r
+#include <asm/cachetype.h>\r
+#include <asm/io.h>\r
+#include <linux/semaphore.h>\r
+\r
+#include <mach/gpio.h>\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:PAL_AllocMem\r
+// Parameters:\r
+// Description: allocate system memory\r
+// Notes: sjchen 2010/12/01\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+void* PAL_AllocMem(int nBytes)\r
+{\r
+    return kmalloc ( nBytes, GFP_KERNEL);\r
+}\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:PAL_FreeMem\r
+// Parameters:\r
+// Description: free system memory\r
+// Notes: sjchen 2010/12/01\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+void PAL_FreeMem(void* pMem)\r
+{\r
+       if(pMem)\r
+       {\r
+               kfree(pMem);\r
+       }\r
+}\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:PAL_CreateMutex\r
+// Parameters:\r
+// Description: Create a semaphore\r
+// Notes: sjchen 2010/12/01\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+int    PAL_CreateMutex         ( void)\r
+{\r
+       struct semaphore  *psem;\r
+\r
+       psem = (struct semaphore *)PAL_AllocMem(sizeof(struct semaphore));\r
+       //init_MUTEX_LOCKED(psem);\r
+       sema_init(psem, 0);\r
+       return  (int)psem;\r
+\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:PAL_ReleaseMutex\r
+// Parameters:\r
+// Description: Release a semaphore\r
+// Notes: sjchen 2010/12/01\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+void   PAL_ReleaseMutex        ( int hMutex )\r
+{\r
+       if(hMutex)\r
+       {\r
+           up((struct semaphore *)hMutex);\r
+       }\r
+\r
+       return ;\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:PAL_WaitMutex\r
+// Parameters:\r
+// Description: Wait semaphore to signal\r
+// Notes: sjchen 2010/12/01\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+void   PAL_WaitMutex(int hMutex)\r
+{\r
+       if(hMutex)\r
+       {\r
+           down((struct semaphore *)hMutex);\r
+       }\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:PAL_CloseMutes\r
+// Parameters:\r
+// Description: Close a semaphore\r
+// Notes: sjchen 2010/12/01\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+void  PAL_CloseMutes(int hMutex)\r
+{\r
+       if(hMutex)\r
+       {\r
+               PAL_FreeMem((void *)hMutex);\r
+       }\r
+}\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:PAL_memset\r
+// Parameters:\r
+// Description:\r
+// Notes: sjchen 2010/12/01\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+void PAL_memset (\r
+       void*           pbuf,\r
+       unsigned char   nval,\r
+       int     nsize\r
+       )\r
+{\r
+       memset ( pbuf, nval, nsize );\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:PAL_memcpy\r
+// Parameters:\r
+// Description:\r
+// Notes: sjchen 2010/12/01\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+void PAL_memcpy (\r
+       void*   pDst,\r
+       void*   pSrc,\r
+       int     nSize\r
+       )\r
+{\r
+       memcpy ( pDst, pSrc, nSize );\r
+}\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:PAL_GetCurTimer_US\r
+// Parameters:\r
+// Description: Get system time \r
+// Notes: sjchen 2010/11/30\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+void PAL_GetCurTimer_US(\r
+                                         int *n32Second,\r
+                                         int *n32us\r
+       )\r
+{\r
+       struct timeval  tv;\r
+\r
+       do_gettimeofday(&tv);\r
+\r
+       *n32Second = tv.tv_sec;\r
+       *n32us     = tv.tv_usec;\r
+}\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:PAL_GetCurTimer_US\r
+// Parameters:\r
+// Description: Get system time \r
+// Notes: sjchen 2010/11/30\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+void PAL_GetSysTimer_US(\r
+                                               int *n32Second,\r
+                                               int *n32us\r
+                                               )\r
+{\r
+       PAL_GetCurTimer_US(n32Second, n32us);\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:PAL_GetKernelFreePage\r
+// Parameters:\r
+// Description: Allocate kernel free page\r
+// Notes: sjchen 2010/11/30\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+int PAL_GetKernelFreePage(int nPageSize)\r
+{\r
+       return __get_free_pages(GFP_KERNEL,get_order(nPageSize));\r
+}\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:PAL_FreeKernelPage\r
+// Parameters:\r
+// Description: Free kernel page\r
+// Notes: sjchen 2010/11/30\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+void PAL_FreeKernelPage(int nAddr,int nPageSize)\r
+{\r
+       if(nAddr != 0 && nPageSize != 0)\r
+       {\r
+               free_pages(nAddr,get_order(nPageSize)); \r
+       \r
+       }\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:PAL_GetUser\r
+// Parameters:\r
+// Description: \r
+// Notes: sjchen 2010/11/30\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+int  PAL_GetUser(int *p)\r
+{\r
+       int nData = 0;\r
+       \r
+       __get_user(nData,(int __user *)p);\r
+\r
+       return nData;\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:PAL_CopyFromUser\r
+// Parameters:\r
+// Description: Copy datas from user space to kernel space\r
+// Notes: sjchen 2010/11/30\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+void PAL_CopyFromUser(void *pDest,void *pSrc,int nSize)\r
+{\r
+       __copy_from_user(pDest,(void __user *)pSrc,nSize);\r
+}\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:PAL_CopyToUser\r
+// Parameters:\r
+// Description: Copy datas from kernel space to user space\r
+// Notes: sjchen 2010/11/30\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+int PAL_CopyToUser(void *pDest,void *pSrc,int nSize)\r
+{\r
+       return copy_to_user((void __user *)pDest, pSrc, nSize);\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:PAL_Sprintf\r
+// Parameters:\r
+// Description:\r
+// Notes: sjchen 2010/11/04\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+int PAL_Sprintf (\r
+       char * pDst,\r
+       const char * pFormat,\r
+       ...\r
+       )\r
+{\r
+       int nNum = 0;\r
+\r
+       va_list ptr;\r
+\r
+       va_start ( ptr, pFormat );\r
+\r
+       nNum = vsprintf ( pDst, pFormat, ptr );\r
+\r
+       va_end ( ptr );\r
+\r
+       return nNum;\r
+}\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:PAL_Sprintf\r
+// Parameters:\r
+// Description:\r
+// Notes: sjchen 2010/11/04\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+void PAL_KDEBUG (\r
+       const char * pFormat,\r
+       ...\r
+       )\r
+{\r
+#if 1\r
+       va_list ptr;\r
+       \r
+       va_start ( ptr, pFormat );\r
+\r
+       vprintk ( pFormat, ptr );\r
+\r
+       va_end ( ptr );\r
+#endif\r
+       return ;\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:PAL_mdelay\r
+// Parameters:\r
+// Description:\r
+// Notes: sjchen 2010/11/04\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+void PAL_mdelay(int ms)\r
+{\r
+       mdelay(ms);\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:PAL_dma_cache_wback_inv\r
+// Parameters:\r
+// Description:\r
+// Notes: sjchen 2010/11/04\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+void PAL_dma_cache_wback_inv(void * pMem, int size )\r
+{\r
+       //TODO:\r
+       //fluch cache\r
+       \r
+       __cpuc_flush_dcache_area(pMem, size );\r
+}\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:PAL_dma_cache_wback_inv\r
+// Parameters:\r
+// Description:\r
+// Notes: sjchen 2010/11/04\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+void PAL_dma_cache_inv(void * pMem, int size )\r
+{\r
+       //TODO:\r
+       //fluch cache\r
+       \r
+       __cpuc_flush_dcache_area(pMem, size );\r
+}\r
+\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:PAL_Set_GPIO_Pin\r
+// Parameters:\r
+// Description:\r
+// Notes: sjchen 2010/11/04\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+void PAL_Set_GPIO_Pin(int gpio)\r
+{\r
+       //TODO:\r
+       //Set gpio to high level\r
+               \r
+       //gpio_write_one_pin_value(gpio, 1);\r
+       gpio_set_value(gpio, GPIO_HIGH);\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:PAL_Clr_GPIO_Pin\r
+// Parameters:\r
+// Description:\r
+// Notes: sjchen 2010/11/04\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+void PAL_Clr_GPIO_Pin(int gpio)\r
+{\r
+       //TODO:\r
+       //Set gpio to low level\r
+       \r
+       //gpio_write_one_pin_value(gpio, 0);\r
+       gpio_set_value(gpio, GPIO_LOW);\r
+}\r
+\r
+\r
diff --git a/drivers/misc/gps/hv5820b/PALAPI.h b/drivers/misc/gps/hv5820b/PALAPI.h
new file mode 100755 (executable)
index 0000000..b45a7a8
--- /dev/null
@@ -0,0 +1,72 @@
+///////////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Filename: PALAPI.h\r
+// Author:     sjchen\r
+// Copyright: \r
+// Date: 2010/12/01\r
+// Description:\r
+//                     declare linux driver function \r
+//\r
+// Revision:\r
+//             0.0.1\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifndef __PALAPI_H___\r
+#define __PALAPI_H___\r
+\r
+extern void* PAL_AllocMem(int nBytes);\r
+extern void  PAL_FreeMem(void* pMem);\r
+extern int   PAL_CreateMutex   ( void);\r
+extern void  PAL_ReleaseMutex  ( int hMutex );\r
+extern void  PAL_WaitMutex(int hMutex);\r
+extern void  PAL_CloseMutes(int hMutex);\r
+\r
+extern void  PAL_memset (\r
+       void*           pbuf,\r
+       unsigned char   nval,\r
+       int             nsize\r
+       );\r
+\r
+extern void PAL_memcpy (\r
+       void*   pDst,\r
+       void*   pSrc,\r
+       int     nSize\r
+       );\r
+\r
+void PAL_GetCurTimer_US(\r
+         int *n32Second,\r
+         int *n32us\r
+       );\r
+\r
+void PAL_GetSysTimer_US(\r
+                                               int *n32Second,\r
+                                               int *n32us\r
+                                               );\r
+\r
+int  PAL_GetKernelFreePage(int nPageSize);\r
+\r
+void PAL_FreeKernelPage(int nAddr,int nPageSize);\r
+\r
+int  PAL_GetUser(int *p);\r
+\r
+void PAL_CopyFromUser(void *pDest,void *pSrc,int nSize);\r
+\r
+int  PAL_CopyToUser(void *pDest,void *pSrc,int nSize);\r
+\r
+int  PAL_Sprintf (\r
+          char  * pDst,\r
+          const char * pFormat,\r
+       ...\r
+       );\r
+\r
+void PAL_mdelay(int ms);\r
+\r
+void PAL_KDEBUG (\r
+       const char * pFormat,\r
+       ...\r
+       );\r
+void PAL_Set_GPIO_Pin(int gpio);\r
+void PAL_Clr_GPIO_Pin(int gpio);\r
+\r
+#endif //__PALAPI_H___\r
diff --git a/drivers/misc/gps/hv5820b/gpsdriver.c b/drivers/misc/gps/hv5820b/gpsdriver.c
new file mode 100755 (executable)
index 0000000..97877d3
--- /dev/null
@@ -0,0 +1,529 @@
+///////////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Filename: gpsdriver.c\r
+// Author:     sjchen\r
+// Copyright: \r
+// Date: 2012/07/09\r
+// Description:\r
+//                     GPS driver\r
+//\r
+// Revision:\r
+//             0.0.1\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+#include <linux/module.h>\r
+#include <linux/kernel.h>\r
+#include <linux/string.h>\r
+#include <linux/slab.h>\r
+#include <linux/errno.h>\r
+#include <linux/init.h>\r
+#include <linux/fs.h>\r
+#include <linux/delay.h>\r
+#include <linux/spinlock.h>\r
+#include <linux/mm.h>\r
+#include <linux/miscdevice.h>\r
+#include <linux/interrupt.h>\r
+#include <linux/printk.h>\r
+#include <asm/system.h>\r
+#include <asm/page.h>\r
+#include <asm/pgtable.h>\r
+#include <asm/uaccess.h>\r
+#include <linux/clk.h>\r
+#include <asm/io.h>\r
+\r
+//#include <mach/clock.h>\r
+\r
+\r
+#include "gpsdrv.h"\r
+#include "gpsdriver.h"\r
+#include "lnxdrv.h"\r
+#include "PALAPI.h"\r
+\r
+#include <linux/platform_device.h>\r
+#include <mach/gpio.h>\r
+#include "hv5820b_gps.h"\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// macro declaration\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+#define GPS_MAJOR                                                              ( 61 )\r
+#define SW_VA_GPS_IO_BASE                              0x10400000\r
+#define GPS_USE_SPI                                            \r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// static variables declaration\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+static char   gpsstr[]="gps";\r
+static struct miscdevice  gps_miscdev;\r
+struct hv5820b_gps_data *hv5820b_pdata ;\r
+void *gps_mem =NULL;\r
+unsigned long gps_mem_address; //BSP define for u32MemoryPhyAddr\r
+unsigned long gps_mem_size = 8*0x00100000;    //it must be more than 8MB\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// extern variables declaration\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+extern unsigned long gps_mem_address; //BSP define for u32MemoryPhyAddr\r
+extern unsigned long gps_mem_size;    //it must be more than 8MB\r
+\r
+\r
+#ifdef GPS_USE_SPI\r
+#include <linux/adc.h>\r
+void VtuneAndSpiCheck_rk(int enable_check);\r
+int AdcValueGet(void);\r
+int GetVtuneAdcValue_rk(void);\r
+void ConfigRfSpi_rk(int Val );\r
+struct adc_client *adc_gps_cleint;\r
+#define LOW_SCALE_0_65V 600\r
+#define HIGH_SCALE_0_95V 1000\r
+void gps_callback(struct adc_client *client, void *callback_param, int result)\r
+{\r
+        return;\r
+}\r
+void VtuneAndSpiCheck_rk(int enable_check)\r
+{\r
+       int VtuneAvg;\r
+       int SpiValue = 2;\r
+       int cnt = 0;\r
+\r
+       if( enable_check == 0)\r
+               return;\r
+\r
+       VtuneAvg = 0;   \r
+       while( (VtuneAvg < LOW_SCALE_0_65V) || (VtuneAvg > HIGH_SCALE_0_95V) && cnt < 10)\r
+       {       \r
+               if( (SpiValue >= 8) || (SpiValue <= 0) )\r
+                       break;  \r
+\r
+               VtuneAvg = AdcValueGet();\r
+               \r
+               if( VtuneAvg < LOW_SCALE_0_65V)\r
+               {\r
+                       SpiValue++;\r
+                       ConfigRfSpi_rk( SpiValue);\r
+               }\r
+\r
+               if( VtuneAvg > HIGH_SCALE_0_95V)\r
+               {\r
+                       SpiValue--;\r
+                       ConfigRfSpi_rk( SpiValue);\r
+               }\r
+               cnt ++;\r
+       }\r
+}\r
+\r
\r
+int AdcValueGet()\r
+{\r
+       // Read adc value\r
+       int adc_value;\r
+       int sampletime = 100;\r
+       int AveValue;\r
+       int SumValue;\r
+       int i;  \r
+\r
+       \r
+       SumValue = 0;\r
+       for(i = 0; i < sampletime; i++)\r
+       {\r
+               adc_value = GetVtuneAdcValue_rk();\r
+               \r
+               SumValue += adc_value;\r
+       }\r
+       AveValue = SumValue / sampletime;\r
+       return AveValue;\r
+}\r
+\r
+int GetVtuneAdcValue_rk()\r
+{\r
+       int adc_val = 0;\r
+       \r
+       adc_val = adc_sync_read(adc_gps_cleint);\r
+       if(adc_val < 0)\r
+               printk("GetVtuneAdcValue error");\r
+       \r
+       return adc_val;\r
+}\r
+\r
+void ConfigRfSpi_rk(int Val )\r
+{\r
+       int i;\r
+\r
+#define GPS_SCLK  hv5820b_pdata->GpsSpiMOSI\r
+#define GPS_MOSI  hv5820b_pdata->GpsSpiClk\r
+#define GPS_SCS   hv5820b_pdata->GpsSpi_CSO\r
+\r
+\r
+       PAL_Clr_GPIO_Pin(GPS_SCLK);\r
+       PAL_Clr_GPIO_Pin(GPS_SCS);\r
+\r
+       for(i = 0; i < 100000000; i++);\r
+\r
+       PAL_Set_GPIO_Pin(GPS_SCLK);\r
+       PAL_Set_GPIO_Pin(GPS_MOSI);  //b15\r
+\r
+\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Clr_GPIO_Pin(GPS_SCLK);\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Set_GPIO_Pin(GPS_SCLK);  //b14\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Clr_GPIO_Pin(GPS_SCLK);\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Set_GPIO_Pin(GPS_SCLK);  //b13\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Clr_GPIO_Pin(GPS_SCLK);\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Set_GPIO_Pin(GPS_SCLK);  //b12\r
+       PAL_Clr_GPIO_Pin(GPS_MOSI);\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Clr_GPIO_Pin(GPS_SCLK);\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Set_GPIO_Pin(GPS_SCLK);  //b11\r
+       PAL_Set_GPIO_Pin(GPS_MOSI);\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Clr_GPIO_Pin(GPS_SCLK);\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Set_GPIO_Pin(GPS_SCLK);  //b10\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Clr_GPIO_Pin(GPS_SCLK);\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Set_GPIO_Pin(GPS_SCLK);  //b9\r
+       PAL_Clr_GPIO_Pin(GPS_MOSI);\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Clr_GPIO_Pin(GPS_SCLK);\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Set_GPIO_Pin(GPS_SCLK);  //b8\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Clr_GPIO_Pin(GPS_SCLK);\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Set_GPIO_Pin(GPS_SCLK);  //b7\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Clr_GPIO_Pin(GPS_SCLK);\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Set_GPIO_Pin(GPS_SCLK);  //b6\r
+       if ((Val >> 4) & 1)\r
+           PAL_Set_GPIO_Pin(GPS_MOSI);\r
+       else\r
+           PAL_Clr_GPIO_Pin(GPS_MOSI);\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Clr_GPIO_Pin(GPS_SCLK);\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Set_GPIO_Pin(GPS_SCLK);  //b5\r
+       if ((Val >> 3) & 1)\r
+           PAL_Set_GPIO_Pin(GPS_MOSI);\r
+       else\r
+           PAL_Clr_GPIO_Pin(GPS_MOSI); \r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Clr_GPIO_Pin(GPS_SCLK);\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Set_GPIO_Pin(GPS_SCLK);  //b4\r
+        if ((Val >> 2) & 1)\r
+           PAL_Set_GPIO_Pin(GPS_MOSI);\r
+       else\r
+           PAL_Clr_GPIO_Pin(GPS_MOSI); \r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Clr_GPIO_Pin(GPS_SCLK);\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Set_GPIO_Pin(GPS_SCLK);  //b3\r
+       if ((Val >> 1) & 1)\r
+           PAL_Set_GPIO_Pin(GPS_MOSI);\r
+       else\r
+           PAL_Clr_GPIO_Pin(GPS_MOSI);\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Clr_GPIO_Pin(GPS_SCLK);\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Set_GPIO_Pin(GPS_SCLK);  //b2\r
+       if ((Val >> 0) & 1)\r
+           PAL_Set_GPIO_Pin(GPS_MOSI);\r
+       else\r
+           PAL_Clr_GPIO_Pin(GPS_MOSI);\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Clr_GPIO_Pin(GPS_SCLK);\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Set_GPIO_Pin(GPS_SCLK);  //b1\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Clr_GPIO_Pin(GPS_SCLK);\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Set_GPIO_Pin(GPS_SCLK);  //b0\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Clr_GPIO_Pin(GPS_SCLK);\r
+       for(i = 0; i < 100000000; i++);\r
+       for(i = 0; i < 100000000; i++);\r
+       PAL_Set_GPIO_Pin(GPS_SCS);\r
+}\r
+#endif\r
+static int hv5820b_gps_probe(struct platform_device *pdev)\r
+{\r
+       int err;\r
+       struct hv5820b_gps_data *pdata = pdev->dev.platform_data;\r
+       if(!pdata)\r
+               return -1;\r
+       hv5820b_pdata = pdata;\r
+               \r
+       printk("Enter GPSDrv_Init\n");\r
+\r
+       err = request_irq ( GPS_BB_INT_MASK, gps_int_handler, IRQF_DISABLED, gpsstr, NULL );\r
+\r
+       if ( err )\r
+       {\r
+               printk ( "gps_mod_init: gps request irq failed!\n" );\r
+\r
+               return err;\r
+       }\r
+\r
+       err = misc_register( &gps_miscdev);\r
+       if (err < 0)\r
+       {\r
+               return err;\r
+       }\r
+\r
+       gps_mem=kzalloc(gps_mem_size, GFP_KERNEL);\r
+       gps_mem_address = (unsigned long)(&gps_mem);\r
+       //TODO: \r
+       //Set the GPIO (GPS_VCC_EN) to low level in here\r
+       //\r
+       if(pdata->io_init)\r
+               pdata->io_init();\r
+       gpio_direction_output(pdata->GpsVCCEn, GPIO_LOW);\r
+       #ifdef GPS_USE_SPI\r
+       adc_gps_cleint = adc_register(2, gps_callback, NULL);\r
+       #endif\r
+       return 0;       \r
+}\r
+static int hv5820b_gps_remove(struct platform_device *pdev)\r
+{\r
+#ifdef GPS_USE_SPI\r
+       adc_unregister(adc_gps_cleint);\r
+#endif\r
+       return 0;\r
+}\r
+static int hv5820b_gps_suspend(struct platform_device *pdev,  pm_message_t state)\r
+{\r
+       return 0;       \r
+}\r
+static int hv5820b_gps_resume(struct platform_device *pdev)\r
+{\r
+       return 0;\r
+}\r
+static struct platform_driver hv5820b_gps_driver = {\r
+       .probe  = hv5820b_gps_probe,\r
+       .remove = hv5820b_gps_remove,\r
+       .suspend        = hv5820b_gps_suspend,\r
+       .resume         = hv5820b_gps_resume,\r
+       .driver = {\r
+               .name   = "gps_hv5820b",\r
+               .owner  = THIS_MODULE,\r
+       },\r
+};\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name: gps_mod_init\r
+// Parameters: \r
+// Description:\r
+// Notes: sjchen 2010/11/04\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+static int __init gps_mod_init(void)\r
+{\r
+       return platform_driver_register(&hv5820b_gps_driver);\r
+}\r
+\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name: gps_mod_exit\r
+// Parameters:\r
+// Description:\r
+// Notes: sjchen 2010/11/04\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+static void __exit gps_mod_exit ( void )\r
+{\r
+       //Disable baseband interrupt\r
+       WriteGpsRegisterUlong ( BB_INT_ENA_OFFSET, 0 );\r
+\r
+       free_irq( GPS_BB_INT_MASK, NULL );\r
+\r
+       //unregister_chrdev ( GPS_MAJOR, gpsstr );\r
+       misc_deregister(&gps_miscdev);\r
+       platform_driver_unregister(&hv5820b_gps_driver);\r
+       printk ( "GPS exit ok!\n");\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:gps_ioctl\r
+// Parameters:\r
+// Description:\r
+// Notes: sjchen 2010/11/04\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+long gps_ioctl(struct file *file, unsigned int cmd,\r
+             unsigned long arg) \r
+{\r
+       int ret = 0;\r
+       BB_DRV_VERSION __user    * pVersion;\r
+       GPS_DRV_INIT   GpsInitStruct;\r
+\r
+       switch(cmd) \r
+       {\r
+\r
+       case IOCTL_BB_GPS_START:\r
+               //TODO:\r
+               // Gps baseband module initialize in here. \r
+               // Module power up\r
+               if(hv5820b_pdata->enable_hclk_gps)\r
+                       hv5820b_pdata->enable_hclk_gps();\r
+               \r
+               memset(&GpsInitStruct,0,sizeof(GpsInitStruct));\r
+               GpsInitStruct.u32GpsRegBase    = SW_VA_GPS_IO_BASE;                // GPS Reg Base address \r
+               GpsInitStruct.u32MemoryPhyAddr = gps_mem_address;                  // sample code\r
+               GpsInitStruct.u32MemoryVirAddr = __phys_to_virt(gps_mem_address);\r
+               GpsInitStruct.u32GpsSign = hv5820b_pdata->GpsSign;       //GPIO index\r
+               GpsInitStruct.u32GpsMag = hv5820b_pdata->GpsMag;        //GPIO index\r
+               GpsInitStruct.u32GpsClk = hv5820b_pdata->GpsClk;        //GPIO index\r
+               GpsInitStruct.u32GpsVCCEn = hv5820b_pdata->GpsVCCEn;      //GPIO index\r
+               GpsInitStruct.u32GpsSpi_CSO = hv5820b_pdata->GpsSpi_CSO;    //GPIO index\r
+               GpsInitStruct.u32GpsSpiClk = hv5820b_pdata->GpsSpiClk;     //GPIO index\r
+               GpsInitStruct.u32GpsSpiMOSI = hv5820b_pdata->GpsSpiMOSI;          //GPIO index\r
+               //TODO:\r
+               //Add other member of struct GpsInitStruct\r
+               Gps_Init( arg,&GpsInitStruct);\r
+               #ifdef GPS_USE_SPI\r
+               VtuneAndSpiCheck_rk(1);\r
+               #endif\r
+               break;\r
+\r
+       case IOCTL_BB_UPDATEDATA:\r
+               Gps_UpdateData(arg);\r
+               break;\r
+\r
+\r
+       case IOCTL_BB_GPS_STOP:\r
+               Gps_Stop();\r
+               \r
+               //TODO:\r
+               // Set the GPIO(GPS_VCC_EN) to low level\r
+               // Close the module clk.\r
+               gpio_direction_output(hv5820b_pdata->GpsVCCEn, GPIO_LOW);\r
+               if(hv5820b_pdata->disable_hclk_gps)\r
+                       hv5820b_pdata->disable_hclk_gps();\r
+               break;\r
+\r
+       case IOCTL_BB_GET_VERSION:\r
+               pVersion        = ( void __user * ) arg;\r
+\r
+               pVersion->u32Major = DRV_MAJOR_VERSION;\r
+               pVersion->u32Minor = DRV_MINOR_VERSION; \r
+               PAL_Sprintf(pVersion->strCompileTime,"%s,%s",__DATE__,__TIME__);\r
+\r
+               break;\r
+\r
+       default:\r
+\r
+               printk ( "gpsdrv: ioctl number is worng %d\n",cmd);\r
+\r
+               break;\r
+       };\r
+\r
+       return ret;\r
+}\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:gps_read\r
+// Parameters:\r
+// Description: Read gps data\r
+// Notes: sjchen 2010/11/04\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+ssize_t gps_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)\r
+{\r
+       ssize_t  nsize;\r
+       if((nsize = GpsDrv_Read(buf,size)))\r
+       {\r
+               return nsize;\r
+       }\r
+\r
+       return -EFAULT;\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:gps_open\r
+// Parameters:\r
+// Description:\r
+// Notes: sjchen 2010/11/04\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+static int gps_open (struct inode *inode, struct file *filp)\r
+{\r
+       return 0;          /* success */\r
+}\r
+\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name:gps_close \r
+// Parameters:\r
+// Description:\r
+// Notes: sjchen 2010/11/04\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+static int gps_close (struct inode *inode, struct file *filp) \r
+{\r
+       return 0;\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Function Name: driver struct\r
+// Parameters:\r
+// Description:\r
+// Notes: sjchen 2010/11/04\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+static const struct file_operations gps_fops = \r
+{\r
+       . owner   =     THIS_MODULE,\r
+       . open    =     gps_open,\r
+       . release =     gps_close,\r
+       . unlocked_ioctl   =    gps_ioctl,\r
+       . read    =     gps_read,\r
+};\r
+\r
+static struct miscdevice  gps_miscdev = \r
+{\r
+       .minor   = MISC_DYNAMIC_MINOR,\r
+       .name    = gpsstr,\r
+       .fops    = &gps_fops,\r
+};\r
+\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// Module Name:\r
+// Parameters:\r
+// Description:\r
+// Notes: sjchen 2010/11/04\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+module_init ( gps_mod_init );\r
+module_exit ( gps_mod_exit );\r
+\r
+\r
+MODULE_LICENSE("GPL");\r
+\r
+\r
diff --git a/drivers/misc/gps/hv5820b/gpsdriver.h b/drivers/misc/gps/hv5820b/gpsdriver.h
new file mode 100755 (executable)
index 0000000..026ab5a
--- /dev/null
@@ -0,0 +1,50 @@
+///////////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Filename: gpsdriver.h\r
+// Author:     sjchen\r
+// Copyright: \r
+// Date: 2012/07/09\r
+// Description:\r
+//                     gps driver function \r
+//\r
+// Revision:\r
+//             0.0.1\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifndef __GPSDRIVER_H___\r
+#define __GPSDRIVER_H___\r
+\r
+#define  GPS_BB_INT_MASK            57  \r
+\r
+\r
+typedef struct __tag_GPS_DRV_INIT\r
+{\r
+       unsigned long   u32MemoryPhyAddr; //must reserved 8MB memory for GPS\r
+       unsigned long   u32MemoryVirAddr;\r
+       unsigned long   u32GpsRegBase;    //GPS register base virtual address\r
+       unsigned int    u32GpsSign;       //GPIO index\r
+       unsigned int    u32GpsMag;        //GPIO index\r
+       unsigned int    u32GpsClk;        //GPIO index\r
+       unsigned int    u32GpsVCCEn;      //GPIO index\r
+       unsigned int    u32GpsSpi_CSO;    //GPIO index\r
+       unsigned int    u32GpsSpiClk;     //GPIO index\r
+       unsigned int    u32GpsSpiMOSI;    //GPIO index\r
+}GPS_DRV_INIT,*PGPS_DRV_INIT;\r
+\r
+extern void WriteGpsRegisterUlong ( int reg_offset, int value );
+
+extern int  ReadGpsRegisterUlong ( int reg_offset );
+
+extern irqreturn_t gps_int_handler ( int irq, void * dev_id );
+
+extern  void Gps_Init(unsigned long arg,PGPS_DRV_INIT pGpsDrvInit);
+
+extern  void Gps_UpdateData(unsigned long arg);
+
+extern  void Gps_Stop(void);
+
+extern  int GpsDrv_Read(char *buf ,int nSize);
+
+#endif //__GPSDRIVER_H___
+
diff --git a/drivers/misc/gps/hv5820b/gpsdrv.h b/drivers/misc/gps/hv5820b/gpsdrv.h
new file mode 100755 (executable)
index 0000000..cc24b89
--- /dev/null
@@ -0,0 +1,53 @@
+///////////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Filename: gpsdrv.h\r
+// Author:     sjchen\r
+// Copyright: \r
+// Date: 2012/07/09\r
+// Description:\r
+//                     the struct driver to app\r
+//\r
+// Revision:\r
+//             0.0.1\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+#ifndef __GPSDRV_H__\r
+#define __GPSDRV_H__\r
+\r
+\r
+#define DRV_MAJOR_VERSION                   1          \r
+#define DRV_MINOR_VERSION                   9\r
+\r
+typedef struct __tag_BB_COMMAND_BUFFER {\r
+       int     n32BufferA;\r
+       int     n32BufferB;\r
+       int n32NavBuf;\r
+} BB_COMMAND_BUFFER, *PBB_COMMAND_BUFFER;\r
+\r
+\r
+typedef struct __tag_DRV_VERSION {\r
+       unsigned int    u32Major;\r
+       unsigned int    u32Minor;\r
+       char            strCompileTime[32];\r
+\r
+}BB_DRV_VERSION,*PBB_DRV_VERSION;\r
+\r
+// IOCTL code\r
+enum\r
+{\r
+  // GPS Start\r
+  IOCTL_BB_GPS_START = 128,\r
+  IOCTL_BB_GPS_STOP,\r
+\r
+  //Update gps data\r
+  IOCTL_BB_UPDATEDATA,\r
+\r
+  //Driver version\r
+  IOCTL_BB_GET_VERSION\r
+\r
+};\r
+\r
+#endif /* __GPSDRV_H__ */\r
+\r
+\r
+\r
diff --git a/drivers/misc/gps/hv5820b/hv5820b_gps.h b/drivers/misc/gps/hv5820b/hv5820b_gps.h
new file mode 100755 (executable)
index 0000000..bec227d
--- /dev/null
@@ -0,0 +1,25 @@
+/*\r
+       2012.07.25  lby@rock-chips.com\r
+*/\r
+\r
+#ifndef __HV5820B_GPS_H__\r
+#define __HV5820B_GPS_H__\r
+\r
+struct hv5820b_gps_data {\r
+       int (*io_init)(void);\r
+       int (*power_up)(void);\r
+       int (*power_down)(void);\r
+       int (*reset)(int);\r
+       int (*enable_hclk_gps)(void);\r
+       int (*disable_hclk_gps)(void);\r
+       int   GpsSign;\r
+       int    GpsMag;        //GPIO index\r
+       int    GpsClk;        //GPIO index\r
+       int    GpsVCCEn;      //GPIO index\r
+       int    GpsSpi_CSO;    //GPIO index\r
+       int    GpsSpiClk;     //GPIO index\r
+       int    GpsSpiMOSI;        //GPIO index\r
+\r
+};\r
+\r
+#endif\r
diff --git a/drivers/misc/gps/hv5820b/lnxdrv.h b/drivers/misc/gps/hv5820b/lnxdrv.h
new file mode 100755 (executable)
index 0000000..56c6f02
--- /dev/null
@@ -0,0 +1,52 @@
+///////////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Filename: lnxdrv.h\r
+// Author:     sjchen\r
+// Copyright: \r
+// Date: 2012/07/09\r
+// Description:\r
+//                     the macor of GPS baseband\r
+//\r
+// Revision:\r
+//             0.0.1\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifndef __LNXDRV_H__\r
+#define __LNXDRV_H__\r
+\r
+///////////////////////////////////////////////////////////////////////////////////\r
+// \r
+// macro declaration\r
+//\r
+///////////////////////////////////////////////////////////////////////////////////\r
+\r
+#define MEM_CHECK_BOUNDARY  (16)\r
+\r
+//base band control registers offset       \r
+#define BB_CTRL_OFFSET                         0x0400\r
+#define BB_START_ADR_OFFSET                    0x0404\r
+#define BB_DS_PAR_OFFSET                       0x0408\r
+#define BB_INT_ENA_OFFSET                      0x040c\r
+#define BB_INT_STATUS_OFFSET                   0x0410\r
+#define BB_CHN_STATUS_OFFSET                   0x0414\r
+#define BB_CHN_VALID_OFFSET                    0x0418\r
+#define BB_TIMER_VAL_OFFSET                    0x041c\r
+#define BB_RF_WT_ADDR_OFFSET                   0x0420\r
+                               \r
+                               \r
+\r
+//the following is bb register bit define\r
+#define BB_RESET                               0x4      \r
+#define BB_NXT_BLK                             0x2      \r
+#define BB_TRICKLE                             0x1      \r
+#define BB_CTRL_CLR                            0x0      \r
+\r
+#define TIMEOUT_INT                            0x1      \r
+#define ACC_BLK_DONE_INT                       0x2      \r
+#define OBUF_RDY_INT                           0x4      \r
+\r
+#endif /* __LNXDRV_H__ */\r
+\r
+\r
+\r