mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 12:17:12 +09:00
support internal modem v0.10
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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/
|
||||
|
||||
46
drivers/misc/rk29_modem/Kconfig
Normal file
46
drivers/misc/rk29_modem/Kconfig
Normal 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
|
||||
|
||||
16
drivers/misc/rk29_modem/Makefile
Normal file
16
drivers/misc/rk29_modem/Makefile
Normal 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
|
||||
|
||||
|
||||
146
drivers/misc/rk29_modem/modem_rockchip_demo.c
Executable file
146
drivers/misc/rk29_modem/modem_rockchip_demo.c
Executable 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");
|
||||
|
||||
|
||||
145
drivers/misc/rk29_modem/rk29_modem.c
Executable file
145
drivers/misc/rk29_modem/rk29_modem.c
Executable 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;
|
||||
}
|
||||
|
||||
41
drivers/misc/rk29_modem/rk29_modem.h
Executable file
41
drivers/misc/rk29_modem/rk29_modem.h
Executable 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
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user