add gps gns7560 to phone sdk
authorhxy <hxy@rock-chips.com>
Fri, 25 Feb 2011 07:41:43 +0000 (15:41 +0800)
committerhxy <hxy@rock-chips.com>
Fri, 25 Feb 2011 07:41:43 +0000 (15:41 +0800)
arch/arm/mach-rk29/board-rk29-phonesdk.c
drivers/misc/Kconfig
drivers/misc/gps/Kconfig [new file with mode: 0644]
drivers/misc/gps/Makefile [new file with mode: 0644]
drivers/misc/gps/rk29_gps.c [new file with mode: 0644]
drivers/misc/gps/rk29_gps.h [new file with mode: 0644]

index cab099ae14c53710ae0a4e0b988037a0f341b1d7..c1a6e597f519adfd4f3d23438a93ebae180529db 100755 (executable)
@@ -52,6 +52,7 @@
 
 #include "devices.h"
 #include "../../../drivers/input/touchscreen/xpt2046_cbn_ts.h"
+#include "../../../drivers/misc/gps/rk29_gps.h"
 
 
 /* Set memory size of pmem */
@@ -403,6 +404,55 @@ static struct mma8452_platform_data mma8452_info = {
 #endif
 
 
+#if defined(CONFIG_RK29_GPS)
+
+#define        RK29_GPS_POWER_PIN              RK29_PIN6_PB2
+#define        RK29_GPS_RESET_PIN              RK29_PIN6_PC1
+
+static int gps_open =0;
+
+int rk29_gps_power_up(void)
+{      
+       gps_open = 1;   
+       printk("%s \n", __FUNCTION__);  
+       gpio_request(RK29_GPS_POWER_PIN, NULL);    
+       gpio_direction_output(RK29_GPS_POWER_PIN, GPIO_HIGH);   
+       gpio_request(RK29_GPS_RESET_PIN, NULL);        
+       gpio_direction_output(RK29_GPS_RESET_PIN, GPIO_LOW);      
+       rk29_mux_api_set(GPIO2B3_UART3SOUT_NAME, GPIO2L_UART3_SOUT);
+       rk29_mux_api_set(GPIO2B2_UART3SIN_NAME, GPIO2L_UART3_SIN);      
+       mdelay(100);    
+       gpio_direction_output(RK29_GPS_RESET_PIN, GPIO_HIGH);           
+       return 0;
+}
+
+int rk29_gps_power_down(void)
+{      
+       gps_open =0;    
+       printk("%s \n", __FUNCTION__);  
+       gpio_direction_output(RK29_GPS_POWER_PIN, GPIO_LOW);            
+       mdelay(100);      
+       gpio_direction_output(RK29_GPS_RESET_PIN, GPIO_LOW);    //uart1 
+       return 0;
+}
+
+
+struct rk29_gps_data rk29_gps_info = { 
+       .power_up = rk29_gps_power_up,  
+       .power_down = rk29_gps_power_down,      
+       .uart_id = 3,
+       .powerpin = RK29_GPS_POWER_PIN,
+       .powerflag = 1,
+       };
+
+struct platform_device rk29_device_gps = {
+       .name = "rk29_gps",
+       .id = -1,               
+       .dev            = {
+       .platform_data = &rk29_gps_info,        
+               }           
+       };
+#endif
 
 /*****************************************************************************************
  * i2c devices
index 1f67cb9b0b82626cc48331cef2302040d38f66e1..b68f4b249d0a2e0bcf5273e192136ce989bebe37 100644 (file)
@@ -292,5 +292,6 @@ source "drivers/misc/c2port/Kconfig"
 source "drivers/misc/eeprom/Kconfig"
 source "drivers/misc/cb710/Kconfig"
 source "drivers/misc/rk29_modem/Kconfig"
+source "drivers/misc/gps/Kconfig"
 
 endif # MISC_DEVICES
diff --git a/drivers/misc/gps/Kconfig b/drivers/misc/gps/Kconfig
new file mode 100644 (file)
index 0000000..ae012db
--- /dev/null
@@ -0,0 +1,19 @@
+#
+# gps device configuration
+#
+
+menuconfig RK29_GPS
+       bool "RK29 support GPS"
+       default n
+       ---help---
+        Say Y here if you have a support modem
+
+if RK29_GPS
+
+config GPS_GNS7560
+       bool "gns7560 support"
+       default n
+
+endif # RK29_GPS
+
+
diff --git a/drivers/misc/gps/Makefile b/drivers/misc/gps/Makefile
new file mode 100644 (file)
index 0000000..6b4bdb6
--- /dev/null
@@ -0,0 +1,3 @@
+obj-$(CONFIG_GPS_GNS7560)    += rk29_gps.o
+
+
diff --git a/drivers/misc/gps/rk29_gps.c b/drivers/misc/gps/rk29_gps.c
new file mode 100644 (file)
index 0000000..a3ff376
--- /dev/null
@@ -0,0 +1,195 @@
+#include <linux/input.h>\r
+#include <linux/module.h>\r
+#include <linux/init.h>\r
+#include <linux/interrupt.h>\r
+#include <linux/kernel.h>\r
+#include <linux/fcntl.h>\r
+#include <linux/delay.h>\r
+#include <linux/device.h>\r
+#include <linux/miscdevice.h>\r
+#include <asm/types.h>\r
+#include <mach/gpio.h>\r
+#include <mach/iomux.h>\r
+#include <linux/platform_device.h>\r
+#include "rk29_gps.h"\r
+#ifdef CONFIG_HAS_EARLYSUSPEND\r
+#include <linux/earlysuspend.h>\r
+#endif\r
+#if 0\r
+#define DBG(x...)      printk(KERN_INFO x)\r
+#else\r
+#define DBG(x...)\r
+#endif\r
+\r
+#define ENABLE  1\r
+#define DISABLE 0\r
+\r
+static struct rk29_gps_data *pgps;\r
+static struct early_suspend gps_early_suspend;\r
+\r
+static void rk29_gps_early_suspend(struct early_suspend *h)\r
+{\r
+       struct rk29_gps_data *pdata = pgps;\r
+       if(!pdata)\r
+       return;\r
+               \r
+       if(pdata->uart_id == 3)\r
+       {\r
+               rk29_mux_api_set(GPIO2B3_UART3SOUT_NAME, GPIO2L_GPIO2B3);                       \r
+               gpio_request(RK29_PIN2_PB3, NULL);\r
+               gpio_direction_output(RK29_PIN2_PB3,GPIO_LOW);\r
+\r
+               rk29_mux_api_set(GPIO2B2_UART3SIN_NAME, GPIO2L_GPIO2B2);                \r
+               gpio_request(RK29_PIN2_PB2, NULL);\r
+               gpio_direction_output(RK29_PIN2_PB2,GPIO_LOW);\r
+\r
+       }\r
+       else\r
+       {\r
+               //to do\r
+\r
+       }\r
+\r
+       if(pdata->powerflag == 1)\r
+       {\r
+               pdata->power_down();    \r
+               pdata->powerflag = 0;\r
+       }\r
+       \r
+       printk("%s\n",__FUNCTION__);\r
+       \r
+}\r
+\r
+static void rk29_gps_early_resume(struct early_suspend *h)\r
+{\r
+       struct rk29_gps_data *pdata = pgps;\r
+       if(!pdata)\r
+       return;\r
+       \r
+       if(pdata->uart_id == 3)\r
+       {\r
+                rk29_mux_api_set(GPIO2B3_UART3SOUT_NAME, GPIO2L_UART3_SOUT);\r
+                rk29_mux_api_set(GPIO2B2_UART3SIN_NAME, GPIO2L_UART3_SIN); \r
+       }\r
+       else\r
+       {\r
+               //to do\r
+\r
+       }\r
+\r
+       if(pdata->powerflag == 0)\r
+       {\r
+                 pdata->power_up();\r
+                 pdata->powerflag = 1;\r
+       }\r
+       \r
+       printk("%s\n",__FUNCTION__);\r
+       \r
+}\r
+int rk29_gps_open(struct inode *inode, struct file *filp)\r
+{\r
+       DBG("rk29_gps_open\n");\r
+\r
+       return 0;\r
+}\r
+\r
+int rk29_gps_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)\r
+{\r
+       int ret = 0;\r
+    \r
+       DBG("rk29_gps_ioctl: cmd = %d\n",cmd);\r
+\r
+       switch (cmd){\r
+               case ENABLE:\r
+                       pgps->power_up();\r
+                       pgps->powerflag = 1;\r
+                       break;\r
+               \r
+               case DISABLE:\r
+                       pgps->power_down();\r
+                       pgps->powerflag = 0;\r
+                       break;\r
+               \r
+               default:\r
+                       printk("unknown ioctl cmd!\n");\r
+                       ret = -EINVAL;\r
+                       break;\r
+       }\r
+\r
+       return ret;\r
+}\r
+\r
+\r
+int rk29_gps_release(struct inode *inode, struct file *filp)\r
+{\r
+       DBG("rk29_gps_release\n");\r
+    \r
+       return 0;\r
+}\r
+\r
+static struct file_operations rk29_gps_fops = {\r
+       .owner   = THIS_MODULE,\r
+       .open    = rk29_gps_open,\r
+       .ioctl   = rk29_gps_ioctl,\r
+       .release = rk29_gps_release,\r
+};\r
+\r
+static struct miscdevice rk29_gps_dev = \r
+{\r
+    .minor = MISC_DYNAMIC_MINOR,\r
+    .name = "rk29_gps",\r
+    .fops = &rk29_gps_fops,\r
+};\r
+\r
+static int rk29_gps_probe(struct platform_device *pdev)\r
+{\r
+       int ret = 0;\r
+       struct rk29_gps_data *pdata = pdev->dev.platform_data;\r
+       if(!pdata)\r
+               return -1;\r
+               \r
+       ret = misc_register(&rk29_gps_dev);\r
+       if (ret < 0){\r
+               printk("rk29 gps register err!\n");\r
+               return ret;\r
+       }\r
+       \r
+       if(pdata->power_up)\r
+       pdata->power_up();\r
+       pgps = pdata;\r
+\r
+#ifdef CONFIG_HAS_EARLYSUSPEND\r
+       gps_early_suspend.suspend = rk29_gps_early_suspend;\r
+       gps_early_suspend.resume = rk29_gps_early_resume;\r
+       gps_early_suspend.level = ~0x0;\r
+       register_early_suspend(&gps_early_suspend);\r
+#endif\r
+\r
+       printk("%s:rk29 GPS initialized\n",__FUNCTION__);\r
+\r
+       return ret;\r
+}\r
+\r
+static struct platform_driver rk29_gps_driver = {\r
+       .probe  = rk29_gps_probe,\r
+       .driver = {\r
+               .name   = "rk29_gps",\r
+               .owner  = THIS_MODULE,\r
+       },\r
+};\r
+\r
+static int __init rk29_gps_init(void)\r
+{\r
+       return platform_driver_register(&rk29_gps_driver);\r
+}\r
+\r
+static void __exit rk29_gps_exit(void)\r
+{\r
+       platform_driver_unregister(&rk29_gps_driver);\r
+}\r
+\r
+module_init(rk29_gps_init);\r
+module_exit(rk29_gps_exit);\r
+MODULE_DESCRIPTION ("rk29 gps driver");\r
+MODULE_LICENSE("GPL");\r
+\r
diff --git a/drivers/misc/gps/rk29_gps.h b/drivers/misc/gps/rk29_gps.h
new file mode 100644 (file)
index 0000000..a54c5d1
--- /dev/null
@@ -0,0 +1,16 @@
+/*\r
+       2011.01.16  lw@rock-chips.com\r
+*/\r
+\r
+#ifndef __RK29_GPS_H__\r
+#define __RK29_GPS_H__\r
+\r
+struct rk29_gps_data {\r
+       int (*power_up)(void);\r
+       int (*power_down)(void);\r
+       int uart_id;\r
+       int powerpin;\r
+       int powerflag;\r
+};\r
+\r
+#endif\r