open uart3 and add gps module
authorlinjh <linjh@rock-chips.com>
Fri, 15 Apr 2011 08:53:08 +0000 (16:53 +0800)
committerlinjh <linjh@rock-chips.com>
Fri, 15 Apr 2011 08:53:29 +0000 (16:53 +0800)
arch/arm/configs/rk29_phonesdk_defconfig
arch/arm/mach-rk29/board-rk29-phonesdk.c
drivers/misc/gps/rk29_gps.c
drivers/misc/gps/rk29_gps.h

index 0e667e02e9cb2b898f26891429367563ef1e81ae..929b7a26c43ae56c7be3555e25177095a9ebbd5f 100755 (executable)
@@ -643,7 +643,8 @@ CONFIG_MTK23D=y
 # CONFIG_EEPROM_MAX6875 is not set
 # CONFIG_EEPROM_93CX6 is not set
 # CONFIG_RK29_SUPPORT_MODEM is not set
-# CONFIG_RK29_GPS is not set
+CONFIG_RK29_GPS=y
+CONFIG_GPS_GNS7560=y
 
 #
 # Motion Sensors Support
@@ -928,7 +929,7 @@ CONFIG_UART0_CTS_RTS_RK29=y
 CONFIG_UART1_RK29=y
 CONFIG_UART2_RK29=y
 CONFIG_UART2_CTS_RTS_RK29=y
-# CONFIG_UART3_RK29 is not set
+CONFIG_UART3_RK29=y
 CONFIG_SERIAL_RK29_CONSOLE=y
 CONFIG_UNIX98_PTYS=y
 # CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
index 2872efbb9fe5f566447015fee183dcadfabefeaf..2b2dff5eb7416553b2b8d44035105dbcfc0bd3cd 100755 (executable)
@@ -1231,41 +1231,42 @@ struct wm831x_pdata wm831x_platdata = {
 #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_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;
 }
 
+int rk29_gps_reset_set(int level)
+{
+       gpio_request(RK29_GPS_RESET_PIN, NULL);
+       if (level)
+               gpio_direction_output(RK29_GPS_RESET_PIN, GPIO_HIGH);
+       else
+               gpio_direction_output(RK29_GPS_RESET_PIN, GPIO_LOW);
+
+       return 0;
+}
 
 struct rk29_gps_data rk29_gps_info = { 
        .power_up = rk29_gps_power_up,  
        .power_down = rk29_gps_power_down,      
+       .reset = rk29_gps_reset_set,
        .uart_id = 3,
-       .powerpin = RK29_GPS_POWER_PIN,
-       .powerflag = 1,
-       };
+};
 
 struct platform_device rk29_device_gps = {
        .name = "rk29_gps",
@@ -1392,7 +1393,7 @@ struct wm8994_pdata wm8994_platdata = {
 #define HEADSET_GPIO RK29_PIN4_PD2
 struct rk2818_headset_data rk2818_headset_info = {
        .gpio           = HEADSET_GPIO,
-       .irq_type       = IRQF_TRIGGER_RISING,//IRQF_TRIGGER_RISING -- ÉÏÉýÑØ   IRQF_TRIGGER_FALLING -- Ï½µÑØ
+       .irq_type       = IRQF_TRIGGER_RISING,//IRQF_TRIGGER_RISING -- ??????   IRQF_TRIGGER_FALLING -- ?½???
        .headset_in_type= HEADSET_IN_HIGH,
 };
 
@@ -2614,6 +2615,9 @@ static struct platform_device *devices[] __initdata = {
 #ifdef CONFIG_RK_HEADSET_DET
     &rk28_device_headset,
 #endif
+#ifdef CONFIG_RK29_GPS
+       &rk29_device_gps,
+#endif
 };
 
 #ifdef CONFIG_RK29_VMAC
@@ -2772,7 +2776,7 @@ struct rk29xx_spi_platform_data rk29xx_spi1_platdata = {
  * author: hhb@rock-chips.com
  *****************************************************************************************/
 #if defined(CONFIG_TOUCHSCREEN_XPT2046_NORMAL_SPI) || defined(CONFIG_TOUCHSCREEN_XPT2046_TSLIB_SPI)
-#define XPT2046_GPIO_INT           RK29_PIN4_PD5 //中断è\84?#define DEBOUNCE_REPTIME  3
+#define XPT2046_GPIO_INT           RK29_PIN4_PD5 //中断???#define DEBOUNCE_REPTIME  3
 
 static struct xpt2046_platform_data xpt2046_info = {
        .model                  = 2046,
index 088a885c70b1c1f1fca8908f9c619626a4794d27..a40e342c1190a920be4e7f5518bc840ac3728290 100644 (file)
 \r
 static struct rk29_gps_data *pgps;\r
 \r
-\r
-int rk29_gps_suspend(struct platform_device *pdev,  pm_message_t state)\r
+static int rk29_gps_uart_to_gpio(int uart_id)\r
 {\r
-       struct rk29_gps_data *pdata = pdev->dev.platform_data;\r
-       if(!pdata)\r
-       return -1;\r
-               \r
-       if(pdata->uart_id == 3)\r
-       {\r
+       if(uart_id == 3) {\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
+\r
+               gpio_request(RK29_PIN2_PB3, NULL);\r
                gpio_request(RK29_PIN2_PB2, NULL);\r
-               gpio_direction_output(RK29_PIN2_PB2,GPIO_LOW);\r
 \r
+               gpio_direction_output(RK29_PIN2_PB3, GPIO_LOW);\r
+               gpio_direction_output(RK29_PIN2_PB2, GPIO_LOW);\r
        }\r
-       else\r
-       {\r
+       else if(uart_id == 2) {\r
+               rk29_mux_api_set(GPIO2B1_UART2SOUT_NAME, GPIO2L_GPIO2B1);                       \r
+               rk29_mux_api_set(GPIO2B0_UART2SIN_NAME, GPIO2L_GPIO2B0);                \r
+\r
+               gpio_request(RK29_PIN2_PB1, NULL);\r
+               gpio_request(RK29_PIN2_PB0, NULL);\r
+\r
+               gpio_direction_output(RK29_PIN2_PB1, GPIO_LOW);\r
+               gpio_direction_output(RK29_PIN2_PB0, GPIO_LOW);\r
+       }\r
+       else if(uart_id == 1) {\r
+               rk29_mux_api_set(GPIO2A5_UART1SOUT_NAME, GPIO2L_GPIO2A5);                       \r
+               rk29_mux_api_set(GPIO2A4_UART1SIN_NAME, GPIO2L_GPIO2A4);                \r
+\r
+               gpio_request(RK29_PIN2_PA5, NULL);\r
+               gpio_request(RK29_PIN2_PA4, NULL);\r
+\r
+               gpio_direction_output(RK29_PIN2_PA5, GPIO_LOW);\r
+               gpio_direction_output(RK29_PIN2_PA4, GPIO_LOW);\r
+       }\r
+       else {\r
                //to do\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+static int rk29_gps_gpio_to_uart(int uart_id)\r
+{\r
+       if(uart_id == 3) {\r
+               rk29_mux_api_set(GPIO2B3_UART3SOUT_NAME, GPIO2L_UART3_SOUT);\r
+               rk29_mux_api_set(GPIO2B2_UART3SIN_NAME, GPIO2L_UART3_SIN); \r
+\r
+               gpio_request(RK29_PIN2_PB3, NULL);\r
+               gpio_request(RK29_PIN2_PB2, NULL);\r
+\r
+               gpio_direction_output(RK29_PIN2_PB3, GPIO_HIGH);\r
+               gpio_direction_output(RK29_PIN2_PB2, GPIO_HIGH);\r
+       }\r
+       else if(uart_id == 2) {\r
+               rk29_mux_api_set(GPIO2B1_UART2SOUT_NAME, GPIO2L_UART2_SOUT);                    \r
+               rk29_mux_api_set(GPIO2B0_UART2SIN_NAME, GPIO2L_UART2_SIN);              \r
+\r
+               gpio_request(RK29_PIN2_PB1, NULL);\r
+               gpio_request(RK29_PIN2_PB0, NULL);\r
+\r
+               gpio_direction_output(RK29_PIN2_PB1, GPIO_HIGH);\r
+               gpio_direction_output(RK29_PIN2_PB0, GPIO_HIGH);\r
+       }\r
+       else if(uart_id == 1) {\r
+               rk29_mux_api_set(GPIO2A5_UART1SOUT_NAME, GPIO2L_UART1_SOUT);                    \r
+               rk29_mux_api_set(GPIO2A4_UART1SIN_NAME, GPIO2L_UART1_SIN);              \r
+\r
+               gpio_request(RK29_PIN2_PA5, NULL);\r
+               gpio_request(RK29_PIN2_PA4, NULL);\r
 \r
+               gpio_direction_output(RK29_PIN2_PA5, GPIO_HIGH);\r
+               gpio_direction_output(RK29_PIN2_PA4, GPIO_HIGH);\r
        }\r
+       else {\r
+               //to do\r
+       }\r
+\r
+       return 0;\r
+\r
+}\r
+\r
+int rk29_gps_suspend(struct platform_device *pdev,  pm_message_t state)\r
+{\r
+       struct rk29_gps_data *pdata = pdev->dev.platform_data;\r
 \r
-       if(pdata->powerflag == 1)\r
+       if(!pdata)\r
+               return -1;\r
+               \r
+       if(pdata->power_flag == 1)\r
        {\r
+               rk29_gps_uart_to_gpio(pdata->uart_id);\r
                pdata->power_down();    \r
-               pdata->powerflag = 0;\r
+               pdata->reset(GPIO_LOW);\r
        }\r
        \r
        printk("%s\n",__FUNCTION__);\r
+\r
        return 0;       \r
 }\r
 \r
 int rk29_gps_resume(struct platform_device *pdev)\r
 {\r
        struct rk29_gps_data *pdata = pdev->dev.platform_data;\r
+\r
        if(!pdata)\r
-       return -1;\r
+               return -1;\r
        \r
-       if(pdata->uart_id == 3)\r
+       if(pdata->power_flag == 1)\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
+               pdata->reset(GPIO_LOW);\r
+               mdelay(10);\r
+               pdata->power_up();\r
+               mdelay(500);\r
+               pdata->reset(GPIO_HIGH);\r
+               rk29_gps_gpio_to_uart(pdata->uart_id);\r
        }\r
        \r
        printk("%s\n",__FUNCTION__);\r
+\r
        return 0;\r
 }\r
 \r
 int rk29_gps_open(struct inode *inode, struct file *filp)\r
 {\r
-       DBG("rk29_gps_open\n");\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
+       int ret = 0;\r
+       struct rk29_gps_data *pdata = pgps;\r
+\r
+       DBG("rk29_gps_ioctl: cmd = %d\n",cmd);\r
+\r
+       ret = down_interruptible(&pdata->power_sem);\r
+       if (ret < 0) {\r
+               printk("%s: down power_sem error ret = %d\n", __func__, ret);\r
+               return ret;\r
+       }\r
 \r
-       switch (cmd){\r
+       switch (cmd){\r
                case ENABLE:\r
-                       pgps->power_up();\r
-                       pgps->powerflag = 1;\r
+                       pdata->reset(GPIO_LOW);\r
+                       mdelay(10);\r
+                       pdata->power_up();\r
+                       mdelay(10);\r
+                       rk29_gps_gpio_to_uart(pdata->uart_id);\r
+                       mdelay(500);\r
+                       pdata->reset(GPIO_HIGH);\r
+                       pdata->power_flag = 1;\r
                        break;\r
-               \r
+                       \r
                case DISABLE:\r
-                       pgps->power_down();\r
-                       pgps->powerflag = 0;\r
+                       rk29_gps_uart_to_gpio(pdata->uart_id);\r
+                       pdata->power_down();\r
+                       pdata->reset(GPIO_LOW);\r
+                       pdata->power_flag = 0;\r
                        break;\r
-               \r
+                       \r
                default:\r
                        printk("unknown ioctl cmd!\n");\r
+                       up(&pdata->power_sem);\r
                        ret = -EINVAL;\r
                        break;\r
        }\r
 \r
+       up(&pdata->power_sem);\r
+\r
        return ret;\r
 }\r
 \r
@@ -142,6 +219,7 @@ static struct miscdevice rk29_gps_dev =
 static int rk29_gps_probe(struct platform_device *pdev)\r
 {\r
        int ret = 0;\r
+       printk("\n\n=========================\n%s\n", __func__);\r
        struct rk29_gps_data *pdata = pdev->dev.platform_data;\r
        if(!pdata)\r
                return -1;\r
@@ -152,8 +230,9 @@ static int rk29_gps_probe(struct platform_device *pdev)
                return ret;\r
        }\r
        \r
-       if(pdata->power_up)\r
-       pdata->power_up();\r
+       init_MUTEX(&pdata->power_sem);\r
+       pdata->power_flag = 0;\r
+\r
        pgps = pdata;\r
 \r
 \r
index a54c5d1da65d243ba47acc35b3f455d09a4da5c8..9e22ff5fd51729ff36dddb884652db84c38da9e5 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
-       2011.01.16  lw@rock-chips.com\r
+       2011.01.2  lw@rock-chips.com\r
 */\r
 \r
 #ifndef __RK29_GPS_H__\r
@@ -8,9 +8,10 @@
 struct rk29_gps_data {\r
        int (*power_up)(void);\r
        int (*power_down)(void);\r
+       int (*reset)(int);\r
        int uart_id;\r
-       int powerpin;\r
-       int powerflag;\r
+       int power_flag;\r
+       struct semaphore power_sem;\r
 };\r
 \r
 #endif\r