From e8dca4daf3d8bd53a5eee6e0b6f1e1251c166362 Mon Sep 17 00:00:00 2001 From: cmy Date: Thu, 27 Jan 2011 22:17:43 -0800 Subject: [PATCH] support internal modem v0.10 --- drivers/misc/Kconfig | 1 + drivers/misc/Makefile | 1 + drivers/misc/rk29_modem/Kconfig | 46 ++++++ drivers/misc/rk29_modem/Makefile | 16 ++ drivers/misc/rk29_modem/modem_rockchip_demo.c | 146 ++++++++++++++++++ drivers/misc/rk29_modem/rk29_modem.c | 145 +++++++++++++++++ drivers/misc/rk29_modem/rk29_modem.h | 41 +++++ drivers/usb/serial/option.c | 14 ++ 8 files changed, 410 insertions(+) create mode 100644 drivers/misc/rk29_modem/Kconfig create mode 100644 drivers/misc/rk29_modem/Makefile create mode 100755 drivers/misc/rk29_modem/modem_rockchip_demo.c create mode 100755 drivers/misc/rk29_modem/rk29_modem.c create mode 100755 drivers/misc/rk29_modem/rk29_modem.h diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index 94e5c7b8df92..1f67cb9b0b82 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -291,5 +291,6 @@ config STE source "drivers/misc/c2port/Kconfig" source "drivers/misc/eeprom/Kconfig" source "drivers/misc/cb710/Kconfig" +source "drivers/misc/rk29_modem/Kconfig" endif # MISC_DEVICES diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index 932b3a87cfce..1265365196f8 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -29,3 +29,4 @@ obj-y += cb710/ obj-$(CONFIG_WL127X_RFKILL) += wl127x-rfkill.o obj-$(CONFIG_APANIC) += apanic.o obj-$(CONFIG_STE) += ste.o +obj-$(CONFIG_RK29_SUPPORT_MODEM) += rk29_modem/ diff --git a/drivers/misc/rk29_modem/Kconfig b/drivers/misc/rk29_modem/Kconfig new file mode 100644 index 000000000000..70113c1f164b --- /dev/null +++ b/drivers/misc/rk29_modem/Kconfig @@ -0,0 +1,46 @@ +# +# USB Serial device configuration +# + +menuconfig RK29_SUPPORT_MODEM + tristate "RK29 support Modem" + depends on USB11_HOST_EN + ---help--- + Say Y here if you have a support modem + +choice + depends on RK29_SUPPORT_MODEM + prompt "Select 3G Modem" + + config MODEM_ROCKCHIP_DEMO + bool "ROCKCHIP_GENERAL_MODEM_DEVICE" + +# config MODEM_ZTE_MG3732 +# bool "ZTE_MG3732" + +#config MODEM_ZTE_MF210 +# bool "ZTE_MF210" + +#config MODEM_ZTE_AD3812 +# bool "ZTE_AD3812" + +#config MODEM_THINKWILL_ME800 +# bool "THINKWILL_ME800" + +#config MODEM_HUAWEI_EM660 +# bool "HUAWEI_EM660" + +#config MODEM_HUAWEI_EM770 +# bool "HUAWEI_EM770" + +#config MODEM_HUAWEI_EM660C + # bool "HUAWEI_EM660C" + +#config MODEM_ZTE_MU301 +# bool "ZTE_MU301" + +#config MODEM_TDM_330 +# bool "TDM_330" + +endchoice + diff --git a/drivers/misc/rk29_modem/Makefile b/drivers/misc/rk29_modem/Makefile new file mode 100644 index 000000000000..6d5c5ad49636 --- /dev/null +++ b/drivers/misc/rk29_modem/Makefile @@ -0,0 +1,16 @@ +obj-$(CONFIG_RK29_SUPPORT_MODEM) += rk29_modem.o + +obj-$(CONFIG_MODEM_ROCKCHIP_DEMO) +=modem_rockchip_demo.o + +obj-$(CONFIG_MODEM_ZTE_MG3732) +=modem_zte_mg3732.o + +#obj-$(CONFIG_MODEM_ZTE_MF210) += modem_zte_mf210.o +#obj-$(CONFIG_MODEM_ZTE_AD3812) += modem_zte_ad3812.o +#obj-$(CONFIG_MODEM_THINKWILL_ME800) += modem_thinkwill_me800.o +#obj-$(CONFIG_MODEM_HUAWEI_EM660) += modem_huawei_em660.o +#obj-$(CONFIG_MODEM_HUAWEI_EM770) += modem_huawei_em770.o +#obj-$(CONFIG_MODEM_HUAWEI_EM660C) += modem_huawei_em660c.o +#obj-$(CONFIG_MODEM_ZTE_MU301) += modem_zte_mu301.o +#obj-$(CONFIG_MODEM_TDM_330) += modem_tdm_330.o + + diff --git a/drivers/misc/rk29_modem/modem_rockchip_demo.c b/drivers/misc/rk29_modem/modem_rockchip_demo.c new file mode 100755 index 000000000000..c5e6a68eb3a5 --- /dev/null +++ b/drivers/misc/rk29_modem/modem_rockchip_demo.c @@ -0,0 +1,146 @@ +#include +#include +#include +#include +#include +#include +#include +#include /* permission constants */ +#include +#include +#include +#include +#include +#include +//#include +#include + +#include "rk29_modem.h" + +/**************************************************************** + huawei-em660/em660c/em770 + zte-ad3812/mf210/mu301 + thinkwill-me800 + +*****************************************************************/ + +static int modem_enable(void){ + printk("%s[%d]: %s\n", __FILE__, __LINE__, __FUNCTION__); + // PG1: 3G reset + /*arch/arm/mach-rockchip/iomux.c*/ +// rockchip_mux_api_set(G3_RESET_IOMUX_NAME, G3_RESET_IOMUX_MODE); + // PB0: 3G poweron +// rockchip_mux_api_set(G3_POWER_ON_IOMUX_NAME, G3_POWER_ON_IOMUX_MODE); + // PG0: 3G Radio On/Off +// rockchip_mux_api_set(G3_RADIO_ON_OFF_IOMUX_NAME, G3_RADIO_ON_OFF_IOMUX_MODE); +// msleep(10); + + /*3G Modem Power On*/ + int ret = gpio_request(G3_POWER_ON, NULL); + if(ret != 0) + { + gpio_free(G3_POWER_ON); + printk(">>>>>> G3_POWER_ON gpio_request err \n "); + return ret; + } + gpio_direction_output(G3_POWER_ON, G3_POWER_ENABLE); +// gpio_set_value(FB_LCD_CABC_EN_PIN, GPIO_LOW); + +// GPIOSetPinDirection(G3_POWER_ON, GPIO_OUT); +// GPIOSetPinLevel(G3_POWER_ON, G3_POWER_ENABLE); + msleep(100); + gpio_free(G3_POWER_ON); + + /*3G Modem Radio On*/ +// GPIOSetPinDirection(G3_RADIO_ON_OFF, GPIO_OUT); +// GPIOSetPinLevel(G3_RADIO_ON_OFF, G3_RADIO_ENABLE); +// msleep(100); + + /*3G Modem Reset Controll if needed*/ +// if(G3_RESET){ +// GPIOSetPinDirection(G3_RESET, GPIO_OUT); +// GPIOSetPinLevel(G3_RESET, G3_RESET_ENABLE); +// msleep(120); +// GPIOSetPinLevel(G3_RESET, G3_RESET_DISABLE); +// } + return 0; +} + +static int modem_disable(void){ + printk("%s[%d]: %s\n", __FILE__, __LINE__, __FUNCTION__); + // PG1: 3G reset +// rockchip_mux_api_set(G3_RESET_IOMUX_NAME, G3_RESET_IOMUX_MODE); + // PB0: 3G poweron +// rockchip_mux_api_set(G3_POWER_ON_IOMUX_NAME, G3_POWER_ON_IOMUX_MODE); + // PG0: 3G On/Off +// rockchip_mux_api_set(G3_RADIO_ON_OFF_IOMUX_NAME, G3_RADIO_ON_OFF_IOMUX_MODE); +// msleep(10); + +#if 1 + int ret = gpio_request(G3_POWER_ON, NULL); + if(ret != 0) + { + gpio_free(G3_POWER_ON); + printk(">>>>>> G3_POWER_ON gpio_request err \n "); + return ret; + } + gpio_direction_output(G3_POWER_ON, G3_POWER_DISABLE); +#else + /*3G Modem Power off*/ + GPIOSetPinDirection(G3_POWER_ON, GPIO_OUT); + GPIOSetPinLevel(G3_POWER_ON, G3_POWER_DISABLE); +#endif + msleep(100); + gpio_free(G3_POWER_ON); + + /*3G Modem Radio off*/ +// GPIOSetPinDirection(G3_RADIO_ON_OFF, GPIO_OUT); +// GPIOSetPinLevel(G3_RADIO_ON_OFF, G3_RADIO_DISABLE); +// msleep(10); + + /*3G Modem Reset enable if needed*/ +// if(G3_RESET){ +// GPIOSetPinDirection(G3_RESET, GPIO_OUT); +// GPIOSetPinLevel(G3_RESET, G3_RESET_ENABLE); +// } + return 0; +} + +static int modem_sleep(void){ + printk("%s[%d]: %s\n", __FILE__, __LINE__, __FUNCTION__); + + return 0; +} + +static int modem_init(void){ + return modem_disable(); +} + +struct rk29_modem_t rk29_modem = { + .name = "ThinkWill_ME800", + .enable = modem_enable, + .disable = modem_disable, + .sleep = modem_sleep, + .init = modem_init, +}; + +static int __init rk29_modem_init(void) +{ + return rk29_modem_register(&rk29_modem); +} + +static void __exit rk29_modem_exit(void) +{ + rk29_modem_unregister(&rk29_modem); +} + + +late_initcall(rk29_modem_init); +//module_init(rk29_modem_init); +module_exit(rk29_modem_exit); + +MODULE_AUTHOR("lintao lintao@rock-chips.com"); +MODULE_DESCRIPTION("ROCKCHIP modem driver"); +MODULE_LICENSE("GPL"); + + diff --git a/drivers/misc/rk29_modem/rk29_modem.c b/drivers/misc/rk29_modem/rk29_modem.c new file mode 100755 index 000000000000..0a3279d8298d --- /dev/null +++ b/drivers/misc/rk29_modem/rk29_modem.c @@ -0,0 +1,145 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include /* permission constants */ + +#include +#include + +#include "rk29_modem.h" + +struct rk29_modem_t *g_rk29_modem = NULL; + +extern void rk29_host11_driver_enable(void); +extern void rk29_host11_driver_disable(void); + +static ssize_t modem_status_write(struct class *cls, const char *_buf, size_t _count) +{ + struct rk29_modem_t *rk29_modem = g_rk29_modem; + + int new_mode = simple_strtoul(_buf, NULL, 16); + printk("[%s] new_mode: %s\n", __func__, _buf); + + if(rk29_modem == NULL){ + printk("!!!! g_rk29_modem is NULL !!!!\n"); + return _count; + } + + if(new_mode == rk29_modem->cur_mode){ + printk("[%s] current already in %d mode\n", __func__, new_mode); + return _count; + } + + switch(new_mode){ + case MODEM_DISABLE: + if(rk29_modem->disable){ + printk("modem disable!\n"); +// rk29_host11_driver_disable(); + // mdelay(10); + rk29_modem->disable(); + rk29_modem->cur_mode = new_mode; + } + break; + + case MODEM_ENABLE : + if(rk29_modem->enable){ + printk("modem enable!\n"); +// rk29_host11_driver_enable(); +// mdelay(100); + rk29_modem->enable(); + rk29_modem->cur_mode = new_mode; + } + break; + + case MODEM_SLEEP: + if(rk29_modem->sleep){ + printk("modem sleep!\n"); + rk29_modem->sleep(); + rk29_modem->cur_mode = new_mode; + } + break; + + default: + printk("[%s] invalid new mode: %d\n", __func__, new_mode); + break; + } + + return _count; +} + +static ssize_t modem_status_read(struct class *cls, char *_buf) +{ + struct rk29_modem_t *rk29_modem = g_rk29_modem; + +// printk("Modem type: %s, cur_mode = %d\n", rk29_modem->name, rk29_modem->cur_mode); + + return sprintf(_buf, "%d\n", rk29_modem->cur_mode); +} + +static struct class *rk29_modem_class = NULL; +static CLASS_ATTR(modem_status, 0666, modem_status_read, modem_status_write); + +int modem_is_turn_on() +{ + return (g_rk29_modem->cur_mode != 0); +} + +void turn_off_modem() +{ + modem_status_write( NULL, "0", sizeof("0") ); +} + +void turn_on_modem() +{ + modem_status_write( NULL, "1", sizeof("1") ); +} + +int rk29_modem_register(struct rk29_modem_t *rk29_modem){ + int ret = -1; + + if(rk29_modem == NULL) + return -1; + +#if 1 + if(rk29_modem->enable) rk29_modem->enable(); +#else + if(rk29_modem->disable) rk29_modem->disable(); +#endif + rk29_modem_class = class_create(THIS_MODULE, "rk291x_modem"); + if(rk29_modem_class == NULL){ + printk("create class rk291x_modem failed!\n"); + goto err1; + } + + ret = class_create_file(rk29_modem_class, &class_attr_modem_status); + if(ret != 0){ + printk("create rk291x_modem class file failed!\n"); + goto err2; + } + + g_rk29_modem = rk29_modem; + + return 0; + +err2: + class_destroy(rk29_modem_class); +err1: + return ret; +} + +void rk29_modem_unregister(struct rk29_modem_t *rk29_modem){ + /* disable 3G modem */ + if(rk29_modem->disable) + rk29_modem->disable(); + + class_remove_file(rk29_modem_class, &class_attr_modem_status); + class_destroy(rk29_modem_class); + + rk29_modem_class = NULL; +} + diff --git a/drivers/misc/rk29_modem/rk29_modem.h b/drivers/misc/rk29_modem/rk29_modem.h new file mode 100755 index 000000000000..5e681291e709 --- /dev/null +++ b/drivers/misc/rk29_modem/rk29_modem.h @@ -0,0 +1,41 @@ +#ifndef _rk29_MODEM_H +#define _rk29_MODEM_H + +/* Modem states */ +#define MODEM_DISABLE 0 +#define MODEM_ENABLE 1 +#define MODEM_SLEEP 2 +#define MODEM_MAX_STATUS 3 + +/*===================lintao@rock-chips====================*/ +#define G3_POWER_ON RK29_PIN6_PB1//GPIOPortB_Pin0 +//#define G3_POWER_ON_IOMUX_NAME GPIOB0_SPI0CSN1_MMC1PCA_NAME +//#define G3_POWER_ON_IOMUX_MODE IOMUXA_GPIO0_B0 +#define G3_POWER_ENABLE GPIO_HIGH +#define G3_POWER_DISABLE GPIO_LOW +/*===================================================*/ +//#define G3_RADIO_ON_OFF GPIOPortG_Pin0 +//#define G3_RADIO_ON_OFF_IOMUX_NAME GPIOG0_UART0_MMC1DET_NAME +//#define G3_RADIO_ON_OFF_IOMUX_MODE IOMUXA_GPIO1_C0 +//#define G3_RADIO_ENABLE GPIO_HIGH +//#define G3_RADIO_DISABLE GPIO_LOW +/*====================================================*/ +//#define G3_RESET GPIOPortG_Pin1 +//#define G3_RESET_IOMUX_NAME GPIOG1_UART0_MMC1WPT_NAME +//#define G3_RESET_IOMUX_MODE IOMUXA_GPIO1_C1 +//#define G3_RESET_ENABLE GPIO_LOW +//#define G3_RESET_DISABLE GPIO_HIGH +/*====================================================*/ +struct rk29_modem_t { + char *name; + int cur_mode; + int (*enable)(void); + int (*disable)(void); + int (*sleep)(void); + int (*init)(void); +}; + +int rk29_modem_register(struct rk29_modem_t *rk29_modem); +void rk29_modem_unregister(struct rk29_modem_t *rk29_modem); + +#endif diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 774814d7a2c9..325750a3bf38 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c @@ -866,6 +866,10 @@ static struct usb_device_id option_ids[] = { { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xFFED, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xFFFE, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xFFEB, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0xF006, 0xff, 0xff, 0xff) }, { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_AC100)}, { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) }, { USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) }, @@ -905,6 +909,16 @@ static struct usb_device_id option_ids[] = { { USB_DEVICE(CINTERION_VENDOR_ID, 0x0047) }, { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100) }, { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */ + +// cmy: + { USB_DEVICE(0x0685, 0x6000) }, + { USB_DEVICE(0x1E89, 0x1E16) }, + { USB_DEVICE(0x7693, 0x0001) }, + { USB_DEVICE(0x1D09, 0x4308) }, + { USB_DEVICE(0x1234, 0x0033) }, + { USB_DEVICE(0xFEED, 0x0001) }, + { USB_DEVICE(ALCATEL_VENDOR_ID, 0x0017) }, + { } /* Terminating entry */ }; MODULE_DEVICE_TABLE(usb, option_ids); -- 2.34.1