当前位置:文档之家› MTK驱动学习文档

MTK驱动学习文档

MTK驱动学习文档
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_LCM SSD1289 COLOR_LCD TFT_MAINLCD QVGA_MAINLCD

在custom\drv\LCD添加HUALIWEI_SSD1289_LCM文件夹,下面有5个文件。文件名同MTK系统自带的(lcd.c lcd_hw.h lcd_sw.h lcd_sw_inc.h lcd_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__

#define LCD_WIDTH128

#define LCD_HEIGHT128

#elif(defined(__MMI_MAINLCD_128X160__))

#define LCD_WIDTH128

#define LCD_HEIGHT160

#elif(defined(__MMI_MAINLCD_176X220__))

#define LCD_WIDTH176

#define LCD_HEIGHT220

#elif(defined(__MMI_MAINLCD_240X320__))

#define LCD_WIDTH240

#define LCD_HEIGHT320

#endif

#define UI_DEVICE_WIDTH LCD_WIDTH

#define UI_DEVICE_HEIGHT LCD_HEIGHT

修改比较多的是lcd.c和lcd_sw.h。

Lcd_sw.h

#define LCD_CMD_DMA_MODE---------是否使用DMA方式?(DMA简单,速度

快,通过MTK的寄存器进行操作,但灵活性差。非DMA方式,直接对地址操作,灵活性好,但速度会有影响。目前,一般都是用DMA方式)

#define LCD_16BIT_MODE-----------------lcd使用16位总线?(由硬件决定)

#define LCD_SSD1289_CTRL_ADDR LCD_PARALLEL0_A0_LOW_ADDR

#define LCD_SSD1289_DATA_ADDR LCD_PARALLEL0_A0_HIGH_ADDR

#define MAIN_LCD_CMD_ADDR LCD_SSD1289_CTRL_ADDR

#define MAIN_LCD_DATA_ADDR LCD_SSD1289_DATA_ADDR

#define MAIN_LCD_OUTPUT_FORMAT LCM_16BIT_16_BPP_RGB565_1

#define LCD_delay_SSD1289()\

{\

volatile kal_uint16iI;\

for(iI=0;iI<0x20;iI++);\

}

#ifdef LCD_CMD_DMA_MODE-------------DMA方式

#define LCD_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);\

}

#define LCD_CtrlWrite_SSD1289(_data)\

{\

SET_LCD_CMD_PARAMETER(0,LCD_CMD,_data);\--------写的是命令LCD_SEND_DMA_CMD(1);\

}

#define LCD_DataWrite_SSD1289(_data)\

{\

SET_LCD_CMD_PARAMETER(0,LCD_DATA,_data);\--------写的是数据LCD_SEND_DMA_CMD(1);\

}

#else----------非DMA方式

#define LCD_CtrlWrite_SSD1289(_data)\

{\

*(volatile kal_uint32*)LCD_SSD1289_CTRL_ADDR=_data;\--------写的是命令

LCD_delay_SSD1289();\

}

#define LCD_DataWrite_SSD1289(_data)\

{\

*(volatile kal_uint32*)LCD_SSD1289_DATA_ADDR=_data;\------------写的是数据

LCD_delay_SSD1289();\

}

#endif

#define LCD_DataRead_SSD1289(*(volatile kal_uint16 *)LCD_SSD1289_DATA_ADDR);

------用于读LCD id,兼容lcd用。(这个需要硬件上接读lcd的信号)

Lcd.c

LCD_Funcs LCD_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

};

void LCD_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);

…………………

}

void LCD_BlockWrite_SSD1289(kal_uint16startx,kal_uint16 starty,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;

}

具体的寄存器意义,见datasheet SSD1289_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()添加测试代码

{

{

unsigned int m,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)修改时序,主要是写的时序void init_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左软件OK Down3VOL-

R3SEND08#播放/暂停

R4Left12右软快退

R5*456快进

软件只需要填进去就可以了。

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,

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

void AFE_SwitchExtAmplifier(char sw_on)

{

if(sw_on)

{

GPIO_WriteIO(1,5);----------使用的是GPIO5,每个项目会不同,需根据硬件修改

}

else

{

GPIO_WriteIO(0,5);

}

}

四:USB电源开关usb_custom.c

void USB_PowerControl(kal_bool enable)

{

#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_bool custom_cfg_gpio_set_level(kal_uint8gpio_dev_type, kal_uint8gpio_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_uint8level_array[6]={0,28,20,10,6,2}; savedMask=SaveAndSetIRQMask();

for(j=0;j

{

volatile kal_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_bool custom_cfg_gpio_set_level(kal_uint8gpio_dev_type, kal_uint8gpio_dev_level)

{

case GPIO_DEV_LED_KEY:

……………

}

一般通过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_bool custom_cfg_gpio_set_level(kal_uint8gpio_dev_type, kal_uint8gpio_dev_level)

{

case GPIO_DEV_VIBRATOR:

……………

}

一般通过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中添加对应的型号

#define CS0_PART_NUMBER S71GL128NB0BFW9Z

#define CS1_PART_NUMBER S71GL128NB0BFW9Z

通常来说,开不了机,首先要检查flash是否配置正确。

九:ADC的配置adc_channel.c

const kal_uint8ADC_VBAT=0;

const kal_uint8ADC_VISENSE=1;

const kal_uint8ADC_VBATTMP=2;

const kal_uint8ADC_VCHARGER=3;

const kal_uint8ADC_ACCESSORYID=5;

const kal_uint8ADC_PCBTMP=4;

#if defined(__CHARGER_USB_DETECT_WIHT_ONE_EINT__)

const kal_uint8ADC_CHR_USB=6;

#endif

如果需要修改,硬件工程师会提供ADC对应的功能。

十:外部中断的配置eint_def.c

const kal_uint8AUX_EINT_NO=0;

const kal_uint8CHRDET_EINT_NO=EINT_CHANNEL_NOT_EXIST;

相关主题
文本预览
相关文档 最新文档