#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",
#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,
};
#ifdef CONFIG_RK_HEADSET_DET
&rk28_device_headset,
#endif
+#ifdef CONFIG_RK29_GPS
+ &rk29_device_gps,
+#endif
};
#ifdef CONFIG_RK29_VMAC
* 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,
\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
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
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