mtk驱动修改.docx
- 文档编号:14919856
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:26
- 大小:21.58KB
mtk驱动修改.docx
《mtk驱动修改.docx》由会员分享,可在线阅读,更多相关《mtk驱动修改.docx(26页珍藏版)》请在冰点文库上搜索。
mtk驱动修改
----------MTK6225
一:
LCD
文件位于custom\drv\LCD
以华立维的一款240X320的屏为例介绍如何添加LCD驱动
gprs.mak
LCD_MODULE=HUALIWEI_SSD1289_LCM
MAIN_LCD_SIZE=240X320
Option
COM_DEFS_FOR_HUALIWEI_SSD1289_LCM=HUALIWEI_SSD1289_LCMSSD1289COLOR_LCDTFT_MAINLCDQVGA_MAINLCD
在custom\drv\LCD添加HUALIWEI_SSD1289_LCM文件夹,下面有5个文件。
文件名同MTK系统自带的(lcd.clcd_hw.hlcd_sw.hlcd_sw_inc.hlcd_sw_rnd.h)。
HUALIWEI--------------屏的厂家
SSD1289-----------------屏的驱动芯片
LCM----------------------屏
240X320-----------------屏的分辨率
COLOR_LCD----------彩色
TFT_MAINLCD-------屏的类型,对应的还有CSTN,OLED。
目前主要是TFT
QVGA_MAINLCD----屏的分辨率
做了上述修改以后,编译时,lcd驱动就对应HUALIWEI_SSD1289_LCM文件夹里的驱动。
文件夹里的5个文件,通常lcd_hw.h,lcd_sw_rnd不需要修改。
lcd_sw_inc.h只是定义屏的分辨率。
如下:
#ifdef__MMI_MAINLCD_128X128__
#defineLCD_WIDTH128
#defineLCD_HEIGHT128
#elif(defined(__MMI_MAINLCD_128X160__))
#defineLCD_WIDTH128
#defineLCD_HEIGHT160
#elif(defined(__MMI_MAINLCD_176X220__))
#defineLCD_WIDTH176
#defineLCD_HEIGHT220
#elif(defined(__MMI_MAINLCD_240X320__))
#defineLCD_WIDTH240
#defineLCD_HEIGHT320
#endif
#defineUI_DEVICE_WIDTHLCD_WIDTH
#defineUI_DEVICE_HEIGHTLCD_HEIGHT
修改比较多的是lcd.c和lcd_sw.h。
Lcd_sw.h
#defineLCD_CMD_DMA_MODE---------是否使用DMA方式?
(DMA简单,速度快,通过MTK的寄存器进行操作,但灵活性差。
非DMA方式,直接对地址操作,灵活性好,但速度会有影响。
目前,一般都是用DMA方式)
#defineLCD_16BIT_MODE-----------------lcd使用16位总线?
(由硬件决定)
#defineLCD_SSD1289_CTRL_ADDRLCD_PARALLEL0_A0_LOW_ADDR
#defineLCD_SSD1289_DATA_ADDRLCD_PARALLEL0_A0_HIGH_ADDR
#defineMAIN_LCD_CMD_ADDRLCD_SSD1289_CTRL_ADDR
#defineMAIN_LCD_DATA_ADDRLCD_SSD1289_DATA_ADDR
#defineMAIN_LCD_OUTPUT_FORMATLCM_16BIT_16_BPP_RGB565_1
#defineLCD_delay_SSD1289()\
{\
volatilekal_uint16iI;\
for(iI=0;iI<0x20;iI++);\
}
#ifdefLCD_CMD_DMA_MODE-------------DMA方式
#defineLCD_SEND_DMA_CMD(n)\
{\
while(LCD_IS_RUNNING);\
DISABLE_LCD_TRANSFER_COMPLETE_INT;\
DISABLE_ALL_LCD_LAYER_WINDOW;\
SET_LCD_ROI_CTRL_NUMBER_OF_CMD(n);\
ENABLE_LCD_ROI_CTRL_CMD_FIRST;\
SET_LCD_ROI_WINDOW_SIZE(0,0);\
START_LCD_TRANSFER;\
while(LCD_IS_RUNNING);\
}
#defineLCD_CtrlWrite_SSD1289(_data)\
{\
SET_LCD_CMD_PARAMETER(0,LCD_CMD,_data);\--------写的是命令
LCD_SEND_DMA_CMD
(1);\
}
#defineLCD_DataWrite_SSD1289(_data)\
{\
SET_LCD_CMD_PARAMETER(0,LCD_DATA,_data);\--------写的是数据
LCD_SEND_DMA_CMD
(1);\
}
#else----------非DMA方式
#defineLCD_CtrlWrite_SSD1289(_data)\
{\
*(volatilekal_uint32*)LCD_SSD1289_CTRL_ADDR=_data;\--------写的是命令
LCD_delay_SSD1289();\
}
#defineLCD_DataWrite_SSD1289(_data)\
{\
*(volatilekal_uint32*)LCD_SSD1289_DATA_ADDR=_data;\------------写的是数据
LCD_delay_SSD1289();\
}
#endif
#defineLCD_DataRead_SSD1289(*(volatilekal_uint16*)LCD_SSD1289_DATA_ADDR);
------用于读LCDid,兼容lcd用。
(这个需要硬件上接读lcd的信号)
Lcd.c
LCD_FuncsLCD_func_SSD1289={
LCD_Init_SSD1289,
LCD_PWRON_SSD1289,
LCD_SetContrast_SSD1289,
LCD_ON_SSD1289,
LCD_BlockWrite_SSD1289,
LCD_Size_SSD1289,
LCD_EnterSleep_SSD1289,
LCD_ExitSleep_SSD1289,
LCD_Partial_On_SSD1289,
LCD_Partial_Off_SSD1289,
LCD_Partial_line_SSD1289,
LCD_GetParm_SSD1289,
LCD_SetBias_SSD1289,
LCD_Contrast_SSD1289,
LCD_LineRate_SSD1289,
LCD_Temp_Compensate_SSD1289
#ifdef__LCD_ESD_RECOVERY__
LCD_ESD_check_SSD1289
#endif
};
voidLCD_FunConfig(void)
{
MainLCD=&LCD_func_SSD1289;
}
上层通过这个LCD_func_SSD1289来调用相应的lcd驱动函数的。
这个结构体里的很多函数不需要修改。
经常需要修改的有以下几个函数:
LCD_Init_SSD1289(),LCD_BlockWrite_SSD1289(),LCD_EnterSleep_SSD1289(),
LCD_ExitSleep_SSD1289()。
这其中,LCD_Init_SSD1289(),LCD_EnterSleep_SSD1289(),LCD_ExitSleep_SSD1289(),屏厂会提供,只需要按照写就可以了。
LCD_BlockWrite_SSD1289()需要根据LCD的datasheet写。
见ssd1289+2.2topsun-init.txt
LCD_Init_SSD1289()
{
……………….
LCD_CtrlWrite_SSD1289(0x0000);
LCD_DataWrite_SSD1289(0x0001);
LCD_CtrlWrite_SSD1289(0x0003);
LCD_DataWrite_SSD1289(0xa8a4);
…………………
}
voidLCD_BlockWrite_SSD1289(kal_uint16startx,kal_uint16starty,kal_uint16endx,kal_uint16endy)
{
…………………….
SET_LCD_CMD_PARAMETER(0,LCD_CMD,0x4E);---------表示寄存器
SET_LCD_CMD_PARAMETER(1,LCD_DATA,startx);----------表示寄存器中的值
SET_LCD_CMD_PARAMETER(2,LCD_CMD,0x4F);
SET_LCD_CMD_PARAMETER(3,LCD_DATA,starty);
SET_LCD_CMD_PARAMETER(4,LCD_CMD,0x44);
SET_LCD_CMD_PARAMETER(5,LCD_DATA,(((endx&0x00ff)<<8)|(startx&0x00ff)));
SET_LCD_CMD_PARAMETER(6,LCD_CMD,0x45);
SET_LCD_CMD_PARAMETER(7,LCD_DATA,starty);
SET_LCD_CMD_PARAMETER(8,LCD_CMD,0x46);
SET_LCD_CMD_PARAMETER(9,LCD_DATA,endy);
SET_LCD_CMD_PARAMETER(10,LCD_CMD,0x22);
ENABLE_LCD_TRANSFER_COMPLETE_INT;
ENABLE_LCD_ROI_CTRL_CMD_FIRST;
SET_LCD_ROI_CTRL_NUMBER_OF_CMD(11);
START_LCD_TRANSFER;
}
具体的寄存器意义,见datasheetSSD1289_1.1.pdf(P51)datasheet。
这个是一般的lcd调试,特殊的不做描述。
在硬件没有问题的情况下,lcd没有点亮,可做如下动作:
1)在LCD_Init_SSD1289()函数下加
{
lcd_drive_ic_id=LCD_DataRead_SSD1289;
}
2)LCD_Init_SSD1289()增大lcd复位时间
{
SET_LCD_CTRL_RESET_PIN;
LCD_Delay100us(1000);
CLEAR_LCD_CTRL_RESET_PIN;
LCD_Delay100us(1000);
SET_LCD_CTRL_RESET_PIN;
LCD_Delay100us(1000);
}
3)LCD_Init_SSD1289()添加测试代码
{
{
unsignedintm,n;
GPIO_ModeSetup(25,0);
GPIO_InitIO(1,25);
GPIO_WriteIO(1,25);
for(m=0;m<240;m++)
for(n=0;n<320;n++)
{
LCD_DataWrite_SSD1289(0xf800);
}
}-----------用于判断初始化代码是否正确
}
4)修改时序,主要是写的时序voidinit_lcd_interface(void)
{
SET_LCD_PARALLEL_CE2WR_SETUP_TIME((kal_uint32)3);
SET_LCD_PARALLEL_CE2WR_HOLD_TIME(4);
SET_LCD_PARALLEL_CE2RD_SETUP_TIME(3);
SET_LCD_PARALLEL_WRITE_WAIT_STATE(7);
SET_LCD_PARALLEL_READ_LATENCY_TIME(31);
SET_LCD_ROI_CTRL_CMD_LATENCY(10);
}
5)初始化正确的前提下,检查函数LCD_BlockWrite_SSD1289()。
这个时候,屏上应该有显示了。
只是显示不正常。
二:
键盘
通常只需要修改keypad_def.c文件。
一般硬件会提供如下
C0C1C2C3C4
R1UP7Right9VOL+
R2左软件OKDown3VOL-
R3SEND08#播放/暂停
R4Left12右软快退
R5*456快进
软件只需要填进去就可以了。
constkeypad_structkeypad_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,
DEVICE_KEY_1,
DEVICE_KEY_4,
DEVICE_KEY_7,
DEVICE_KEY_MENU,
DEVICE_KEY_VOL_DOWN,
DEVICE_KEY_NONE,
DEVICE_KEY_END,
DEVICE_KEY_2,
DEVICE_KEY_5,
DEVICE_KEY_8,
DEVICE_KEY_DOWN,
DEVICE_KEY_NONE,
DEVICE_KEY_NONE,
DEVICE_KEY_END,
DEVICE_KEY_3,
DEVICE_KEY_6,
DEVICE_KEY_9,
DEVICE_KEY_LEFT,
DEVICE_KEY_FUNCTION,
DEVICE_KEY_NONE,
DEVICE_KEY_END,
DEVICE_KEY_STAR,
DEVICE_KEY_0,
DEVICE_KEY_HASH,
DEVICE_KEY_RIGHT,
DEVICE_KEY_NONE,
DEVICE_KEY_NONE,
DEVICE_KEY_END,
DEVICE_KEY_NONE,
DEVICE_KEY_NONE,
DEVICE_KEY_NONE,
DEVICE_KEY_NONE,
DEVICE_KEY_NONE,
DEVICE_KEY_NONE,
DEVICE_KEY_END
},
Custom_Keypress_Period,
};
三:
音频PA开关afe.c
voidAFE_SwitchExtAmplifier(charsw_on)
{
if(sw_on)
{
GPIO_WriteIO(1,5);----------使用的是GPIO5,每个项目会不同,需根据硬件修改
}
else
{
GPIO_WriteIO(0,5);
}
}
四:
USB电源开关usb_custom.c
voidUSB_PowerControl(kal_boolenable)
{
#ifdef__USB_ENABLE__
GPIO_ModeSetup(35,0);--------使用的是GPIO35,每个项目会不同,需根据硬件修改
GPIO_InitIO(1,35);
if(enable==KAL_TRUE)
GPIO_WriteIO(1,35);
else
GPIO_WriteIO(0,35);
#endif
}
五:
lcd背光custom_equipment.c
kal_boolcustom_cfg_gpio_set_level(kal_uint8gpio_dev_type,kal_uint8gpio_dev_level)
{
caseGPIO_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_uint8level_array[6]={0,28,20,10,6,2};
savedMask=SaveAndSetIRQMask();
for(j=0;j { volatilekal_uint16delay; 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_boolcustom_cfg_gpio_set_level(kal_uint8gpio_dev_type,kal_uint8gpio_dev_level) { caseGPIO_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); } } 七: 振动custom_equipment.c kal_boolcustom_cfg_gpio_set_level(kal_uint8gpio_dev_type,kal_uint8gpio_dev_level) { caseGPIO_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; } 八: flash修改custom_MemoryDevice.h 首先硬件会提供项目中使用的flash型号或datasheet。 然后到mcu\tools \MemoryDeviceList\MemoryDeviceList_XXX..xls(一般是日期最靠前的那个)查找,是否有flash对应的型号。 如果有,表示软件支持这颗flash,如果没有,表示软件不支持这颗flash,那需要调加或需要MTK释放新的软件。 支持的话,需用将custom_MemoryDevice.h中添加对应的型号 #defineCS0_PART_NUMBERS71GL128NB0BFW9Z #defineCS1_PART_NUMBERS71GL128NB0BFW9Z 通常来说,开不了机,首先要检查flash是否配置正确。 九: ADC的配置adc_channel.c constkal_uint8ADC_VBAT=0; constkal_uint8ADC_VISENSE=1; constkal_uint8ADC_VBATTMP=2; constkal_uint8ADC_VCHARGER=3; constkal_uint8ADC_ACCESSORYID=5; constkal_uint8ADC_PCBTMP=4; #ifdefined(__CHARGER_USB_DETECT_WIHT_ONE_EINT__) constkal_uint8ADC_CHR_USB=6; #endif 如果需要修改,硬件工程师会提供ADC对应的功能。 十: 外部中断的配置eint_def.c constkal_uint8AUX_EINT_NO=0; constkal_uint8CHRDET_EINT_NO=EINT_CHANNEL_NOT_EXIST; #ifdefined(__PHONE_CLAMSHELL__)||defined(__PHONE_SLIDE__) constkal_uint8CLAMDET_EINT_NO=EINT_CHANNEL_NOT_EXIST; #endif #ifdef__USB_ENABLE__ constkal_uint8USB_EINT_NO=EINT_CHANNEL_NOT_EXIST; #else constkal_uint8USB_EINT_NO=EINT_CHANNEL_NOT_EXIST; #endif #ifdef__BT_SUPPORT__ constkal_uint8BT_EINT_NO=1; #endif #ifdefined(__CHARGER_USB_DETECT_WIHT_ONE_EINT__) constkal_uint8CHR_USB_EINT_NO=2; #endif #ifdef__SWDBG_SUPPORT__ cons
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- mtk 驱动 修改