一:键盘
一般硬件会提供如下按键定义,软件只需要填进codegen.dws就可以了。
修改后,生成数组位于keypad_def.c文件中:
const keypad_struct keypad_custom_def = {
{
DEVICE_KEY_SK_LEFT,
DEVICE_KEY_SEND,
DEVICE_KEY_SK_RIGHT,
DEVICE_KEY_UP,
DEVICE_KEY_VOL_UP,
DEVICE_KEY_NONE,
DEVICE_KEY_END,
-------------------------------------
-------------------------------------
},
Custom_Keypress_Period,
};
二:音频PA开关 afe.c
gpio_afe_amplifier_pin:使用的GPIO ID,每个项目会不同,需根据硬件配置:AUD_EN
void AFE_SwitchExtAmplifier( char sw_on )
{
if( sw_on )
{
GPIO_WriteIO( 1, gpio_afe_amplifier_pin);
}
else
{
GPIO_WriteIO(0 , gpio_afe_amplifier_pin);
}
}
四:USB电源开关 usb_custom.c
使用的是GPIO35,每个项目会不同,需根据硬件修改。
void USB_PowerControl(kal_bool enable)
{
#ifdef __USB_ENABLE__
GPIO_ModeSetup(35, 0);
GPIO_InitIO(1, 35);
if (enable == KAL_TRUE)
GPIO_WriteIO(1,35);
else
GPIO_WriteIO(0,35);
#endif
}
五:lcd背光custom_equipment.c
kal_bool custom_cfg_gpio_set_level(kal_uint8 gpio_dev_type, kal_uint8 gpio_dev_level )
{
case GPIO_DEV_LED_MAINLCD:
……………
break;
}
lcd背光驱动,一般有以下两种方式:
1) PWM方式
GPIO_ModeSetup(25, 2);
PWM_level(gpio_dev_level);
2) gpio脉冲方式。这个根据背光芯片的要求,可能有所不同。
{
GPIO_ModeSetup(25, 0);
GPIO_InitIO(1, 25);
if (gpio_dev_level == LED_LIGHT_LEVEL0)
{
GPIO_WriteIO(0, 25);
BL_Delay50us(100);
}
else
{
kal_uint8 level_array[6] = {0, 28, 20, 10, 6, 2};
savedMask=SaveAndSetIRQMask();
for(j=0; j< level_array[gpio_dev_level]; j++)
{
volatile kal_uint16 delay;
GPIO_WriteIO(0,25);
for (delay =0;delay <5;delay++){}
GPIO_WriteIO(1, 25 );
for (delay =0;delay <5;delay++){}
}
RestoreIRQMask(savedMask);
BL_Delay50us(20);
}
}
六:键盘背光custom_equipment.c
kal_bool custom_cfg_gpio_set_level(kal_uint8 gpio_dev_type, kal_uint8 gpio_dev_level )
{
case GPIO_DEV_LED_KEY:
……………
break;
}
一般通过gpio口拉高拉低来开关。不同项目,gpio口可能不同。
{
GPIO_InitIO(1, 27);
GPIO_ModeSetup(27, 0);
if (gpio_dev_level == LED_LIGHT_LEVEL0)
{
GPIO_WriteIO(0,27);
}
else
{
GPIO_WriteIO(1,27);
}
}
七:振动
1.修改文件uem_gpio.c:
kal_bool custom_cfg_gpio_set_level(kal_uint8 gpio_dev_type, kal_uint8 gpio_dev_level )
{
case GPIO_DEV_VIBRATOR:
……………
break;
}
一般通过gpio口拉高拉低来开关。不同项目,gpio口可能不同。
{
GPIO_InitIO(1, 6);
GPIO_ModeSetup(6, 0);
if (gpio_dev_level == LED_LIGHT_LEVEL0)
{
GPIO_WriteIO(0,6);
}
else
{
GPIO_WriteIO(1,6);
}
break;
}
2.另外MTK6250平台,振动控制方式不同时,在文件dcl_pmu6250.c 中修改:
void dcl_pmu6250_init(void)
{
////////////////////////////////////////////////////////////////////////
//VIBR //Tiger.Liu added 20121221
pmu_set_ldo_buck(VIBR, LDO_BUCK_VOL_SEL, 5); //PMU_VOLT_03_000000_V
pmu6250_customization_init();
}
八:flash修改custom_MemoryDevice.h
首先硬件会提供项目中使用的flash型号或datasheet。然后到mcu/tools
/MemoryDeviceList/ MemoryDeviceList_XXX..xls(一般是日期最靠前的那个)查找,是否有flash对应的型号。如果有,表示软件支持这颗flash,如果没有,表示软件不支持这颗flash,那需要调加或需要MTK释放新的软件。
支持的话,需用将custom_MemoryDevice.h中添加对应的型号
#define CS0_PART_NUMBER S71GL128NB0BFW9Z
#define CS1_PART_NUMBER S71GL128NB0BFW9Z
通常来说,开不了机,首先要检查flash是否配置正确。
九:ADC的配置adc_channel.c/adc_channel.h
1.ADC校准参数修改,常用修改点(硬件提供):
ADC_CALIBRATION_SLOPE_CH0 -11:
ADC_CALIBRATION_OFFSET_CH0-11:
2.ADC中断修改,参照文件Eint_var.c:
const kal_uint8 ADC_VBAT = 0;
const kal_uint8 ADC_VISENSE = 1;
const kal_uint8 ADC_VBATTMP = 2;
const kal_uint8 ADC_VCHARGER = 3;
const kal_uint8 ADC_ACCESSORYID = 5;
const kal_uint8 ADC_PCBTMP = 4;
3.如果需要修改,硬件工程师会提供ADC对应的功能。
十:外部中断的配置eint_def.c
const kal_uint8 AUX_EINT_NO = 0;
const kal_uint8 CHRDET_EINT_NO = EINT_CHANNEL_NOT_EXIST;
#if defined(__PHONE_CLAMSHELL__) || defined(__PHONE_SLIDE__)
const kal_uint8 CLAMDET_EINT_NO = EINT_CHANNEL_NOT_EXIST;
#endif
#ifdef __BT_SUPPORT__
const kal_uint8 BT_EINT_NO = 1;
#endif
#if defined(__CHARGER_USB_DETECT_WIHT_ONE_EINT__)
const kal_uint8 CHR_USB_EINT_NO = 2;
#endif
#if defined(TOUCH_PANEL_SUPPORT) || defined(HAND_WRITING)
const kal_uint8 TOUCH_PANEL_EINT_NO = 3;
#endif
备注:
1.定义或者修改中断时,注意同时调整DEBOUNCE (去抖)值,值过小,可能会出现杂波导致异常中断的出现。
2.一般,EINT_CHANNEL_NOT_EXIST表示硬件上没有这个中断,也就是没有这个功能。如果需要修改,硬件工程师会提供相关的资料。
十一:触摸屏
触摸屏相关的文件有eint_def.c,touch_panel.c,touch_panel.h,touch_panel_buffer.h,
touch_panel_custom.c,touch_panel_custom.h,touch_panel_main.c,touch_panel_spi.c,
touch_panel_spi.h,touchscreen.c。
而对驱动来说,一般需要修改以下文件:
eint_def.c
#if defined(TOUCH_PANEL_SUPPORT) || defined(HAND_WRITING)
const kal_uint8 TOUCH_PANEL_EINT_NO = 3;
#endif
kal_uint8 custom_eint_sw_debounce_time_delay[EINT_MAX_CHANNEL] =
{
50,
0,
50,
0
};
touch_panel_spi.h
#define SPI_DIN_PIN 0
#define SPI_CLK_PIN 40
#define SPI_DOUT_PIN 42
#define SPI_CS_PIN 32
#define SPI_BUSY_PIN 30
触摸屏对应的控制引脚,由硬件决定
touch_panel.c
kal_uint32 ADC_X_START=370;
kal_uint32 ADC_X_END=3740;
kal_uint32 ADC_Y_START=300;
kal_uint32 ADC_Y_END=3690;
kal_uint32 SCREEN_X_START=0;
kal_uint32 SCREEN_X_END=240;
kal_uint32 SCREEN_Y_START=0;
kal_uint32 SCREEN_Y_END=320;
touch_panel_custom.h
#define TOUCH_PANEL_ADC_X_START 370
#define TOUCH_PANEL_ADC_X_END 3740
#define TOUCH_PANEL_ADC_Y_START 300
#define TOUCH_PANEL_ADC_Y_END 3690
#define TOUCH_PANEL_COORD_X_START 0
#define TOUCH_PANEL_COORD_X_END 239
#define TOUCH_PANEL_COORD_Y_START 0
#define TOUCH_PANEL_COORD_Y_END 319
touch_panel.c和touch_panel_custom.h的值是对应的。这个值不正确,会导致触摸屏不校准,触摸屏不能用。这个值可以简单得到;
touch_panel_custom.c
format下载完以后,点击触摸屏的左上脚(x_start,y_start)和右下脚(x_end,y_end),得到的值就是,可以通过log得到。
void tp_read_adc(kal_int16 *x, kal_int16 *y)
{
*y=serial_read_data();
*x=serial_read_data();
kal_prompt_trace(MOD_MMI,”!!!!!!! *x = %d *y = %d”,*x,*y);
}
十二:蓝牙,目前都是用BTMTK_MT6601
一般需要修改btmtk_config.c和eint_def.c
eint_def.c
#ifdef __BT_SUPPORT__
const kal_uint8 BT_EINT_NO = 1;
#endif
btmtk_config.c
#ifdef __BTMODULE_MT6601__
const unsigned char bt_gpio_setting[16] =
{ 34, 1, // power on : pin(if use GPO, please plus 100), pol
3, 1, // reset : pin(if use GPO, please plus 100), pol
1, 1, // bt2gsm : pin(EINT n), pol
49, 50, // rxd3, txd3
0xFF, 0xFF, // cts3, rts3
0xff, 0xff, // lpoclk, mode
51, 54, // PCM clk, PCM sync
52, 53 // PCM data output, PCM data input
};
#endif
蓝牙对应的控制引脚,由硬件决定
十三:FM
目前使用的FM有MT6188,SI4700,RDA5800。
MT6188的驱动对应的文件是MT6188.c。通常来说,只需要修改
#define CRYCLK 26 //GPIO26//这个脚不一定需要,根据硬件
#define LE 4 /// GPIO4
#define SDA 48 //GPIO48
#define SCL 47 //GPIO47
SI4700和RDA5800对应的驱动文件是SI4700。
一般需要的修改的也是控制引脚
#define RST 1
#define EN 4
#define SCLK 47
#define SDIO 48
#define FM_CLK 26
添加SI4700的驱动
gprs.mak
FM_RADIO_CHIP = SI4720 #MT6188
/fm_drv/下添加文件
SI4700_drv.c
/make/fm_drv/fm_drv.lis文件中添加
fm_drv/SI4700_drv.c
十四:camera
gprs.mak
CMOS_SENSOR = OV7670
camera相关的文件位于
/custom/drv/camera/DESHENG25_GEMINI_BB/
/custom/drv/yuv_sensor/
一般需要修改如下文件:
camera_hw.c
#define MODULE_POWER_PIN 34// camera电源脚
Sccb.h
#define SCCB_SERIAL_CLK_PIN 8 //SCL
#define SCCB_SERIAL_DATA_PIN 9 //SDA
/custom/drv/yuv_sensor/OV7670下的image_sensor.c,image_sensor.h
一般来说,image_sensor.c和image_sensor.h由camera厂商提供。
备注:如果要新添加一种camera驱动,如MGC0309。则:
1.gprs.mak中修改 CMOS_SENSOR = GC0309
2. /custom/drv/yuv_sensor/文件夹下添加文件夹GC0309。
文件夹下有如下文件:image_sensor.c, image_sensor.h,usbvideo_attr.c。
image_sensor.c和image_sensor.h由camera厂商提供,而usbvideo_attr.c一般不需要修改。
3.搜索GC0309(可以为原始基线的Camera模块) ,开关包含下的代码作同样添加,并修改。
4.如若编译下载后有问题,联系FAE调试效果。
十五:射频修改
一般修改如下几个文件:l1d_custom_rf.h,m12193.c,m12193.h,chr_parameter.c
1、常用参数修改点如下:
PDATA_GSM850_PR1-PDATA_GSM850_PT3:
PDATA_GSM_PR1-PDATA_GSM_PT3:
PDATA_DCS_PR1-PDATA_DCS_PT3:
PDATA_PCS_PR1--PDATA_PCS_PT3:
PSI_EE:
C_PSI_STA /* C_PSI_STA= sta^(-1) * (2^12), sta=7.002 */:
Custom_RF_XO_CapID:
APC_DC_OFFSET:
AGC_PATHLOSS_GSMXXXX:
GSMXXXX_RampData:
射频会提供相应的参数,只需要找到相应的位置,填进去。
十六:音频参数的修改nvram_default_audio.c
这个文件对应正常,耳机,免提模式下的音频参数。
GAIN_NOR_XXX 正常模式
GAIN_HED_XXX 耳机模式
GAIN_HED_XXX 免提模式
十七:初始gpio配置gpio_drv.c
这个函数对gpio口进行初始的配置。如果配置不正确,会引起耗流问题。根据硬件来写。
void GPIO_init(void)
{
}
十八:电池充电相关参数修改:
1.充电温度检测,选择关闭:
// Configuration of Checking
#define CHR_CHECK_BATT_TEMPKAL_FALSE //KAL_TRUE
2.充电电流限额设定(充电器/USB充电电流)
// Configuration of AC/USB Charge Current
#define CHR_AC_CHARGE_CURRENT PMU_CHARGE_CURRENT_450_00_MA //PMU_CHARGE_CURRENT_650_00_MA
#define CHR_USB_CHARGE_CURRENT PMU_CHARGE_CURRENT_450_00_MA