support internal modem v0.10

This commit is contained in:
cmy
2011-01-27 22:17:43 -08:00
parent 623ebf9163
commit e8dca4daf3
8 changed files with 410 additions and 0 deletions

View File

@@ -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

View File

@@ -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/

View File

@@ -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

View File

@@ -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

View File

@@ -0,0 +1,146 @@
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/stat.h> /* permission constants */
#include <linux/io.h>
#include <linux/vmalloc.h>
#include <asm/io.h>
#include <asm/sizes.h>
#include <mach/iomux.h>
#include <mach/gpio.h>
//#include <asm/arch/iomux.h>
#include <linux/delay.h>
#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");

View File

@@ -0,0 +1,145 @@
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/stat.h> /* permission constants */
#include <asm/io.h>
#include <asm/sizes.h>
#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;
}

View File

@@ -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

View File

@@ -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);