MTK驱动配置

来源:互联网 发布:程序员职业规划 知乎 编辑:程序博客网 时间:2024/05/16 18:24

----------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-------
屏的类型,对应的还有CSTNOLED。目前主要是TFT
   QVGA_MAINLCD----
屏的分辨率


  
做了上述修改以后,编译时,lcd驱动就对应HUALIWEI_SSD1289_LCM文件夹里的驱动。文件夹里的5个文件,通常lcd_hw.h, lcd_sw_rnd不需要修改。lcd_sw_inc.h只是定义屏的分辨率。如下:
#ifdef __
MMI_MAINLCD_128X128__
#define LCD_WIDTH   128
#define LCD_HEIGHT  128
#elif (defined(__MMI_MAINLCD_128X160__))
#define LCD_WIDTH   128
#define LCD_HEIGHT  160
#elif (defined(__MMI_MAINLCD_176X220__))
#define LCD_WIDTH   176
#define LCD_HEIGHT  220
#elif (defined(__MMI_MAINLCD_240X320__))
#define LCD_WIDTH   240
#define LCD_HEIGHT  320
#endif

#define UI_DEVICE_WIDTH             LCD_WIDTH
#define UI_DEVICE_HEIGHT            LCD_HEIGHT
修改比较多的是lcd.clcd_sw.h
    Lcd_sw.h
        #define LCD_CMD_DMA_MODE---------
是否使用DMA方式?(DMA简单,速度快,通过MTK的寄存器进行操作,但灵活性差。非DMA方式,直接对地址操作,灵活性好,但速度会有影响。目前,一般都是用DMA方式)
          #define LCD_16BIT_MODE-----------------lcd
使用16位总线?(由硬件决定)

      /*
通过A0来区分处理器向lcd写的是命令还是数据。由硬件决定*/
          #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
5(R)+6(G)+5(B)*/
à/*与总线匹配  16-

/***********************SSD1289********************************/
        #define LCD_delay_SSD1289() /
        {/
                volatile kal_uint16 iI; /
                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,
   /*Engineering mode*/
   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()需要根据LCDdatasheet写。
ssd1289+2.2topsun-init.txt
LCD_Init_SSD1289()
{
    ……………….
        LCD_CtrlWrite_SSD1289(0x0000);
        LCD_DataWrite_SSD1289(0x0001);

        LCD_CtrlWrite_SSD1289(0x0003);
        LCD_DataWrite_SSD1289(0xa8a4);
    …………………
}

/*
这个函数就是将一块特定区域的数据显示到LCD
startx------X
起始点坐标   starty------Y起始点坐标
endx-------X
结束点坐标   endy-------Y结束点坐标*/
void LCD_BlockWrite_SSD1289(kal_uint16 startx,kal_uint16 starty,kal_uint16 endx,kal_uint16 endy)
{
             …………………….
             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 P51datasheet。这个是一般的lcd调试,特殊的不做描述。

在硬件没有问题的情况下,lcd没有点亮,可做如下动作:
1
        LCD_Init_SSD1289()函数下加
{
lcd_drive_ic_id = LCD_DataRead_SSD1289;
/*
看读出来的lcd数据是否正确,判断处理器和lcd的通讯是否正常*/
}
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文件。
一般硬件会提供如下
        C0        C1        C2        C3        C4
R1        UP        7        Right        9        VOL+
R2       
左软件        OK        Down        3        VOL-
R3        SEND        0        8        #       
播放/暂停
R4        Left        1        2       
右软        快退
R5        *        4        5        6       
快进

软件只需要填进去就可以了。
const keypad_struct  keypad_custom_def = {         
{
        /* row 0 */
                DEVICE_KEY_SK_LEFT,     /*row0  colume0*/
                DEVICE_KEY_SEND,        /*row0  colume1*/
                DEVICE_KEY_SK_RIGHT,
                DEVICE_KEY_UP,
                DEVICE_KEY_VOL_UP,
                DEVICE_KEY_NONE,
                DEVICE_KEY_END,

                /* row 1 */
                DEVICE_KEY_1,
                DEVICE_KEY_4,
                DEVICE_KEY_7,
                DEVICE_KEY_MENU,
                DEVICE_KEY_VOL_DOWN,
                DEVICE_KEY_NONE,
                DEVICE_KEY_END,

                /* row 2 */
                DEVICE_KEY_2,
                DEVICE_KEY_5,
                DEVICE_KEY_8,
                DEVICE_KEY_DOWN,
                DEVICE_KEY_NONE,
                DEVICE_KEY_NONE,
                DEVICE_KEY_END,

                /* row 3 */
                DEVICE_KEY_3,
                DEVICE_KEY_6,
                DEVICE_KEY_9,
                DEVICE_KEY_LEFT,
                DEVICE_KEY_FUNCTION,
                DEVICE_KEY_NONE,
                DEVICE_KEY_END,

                /* row 4 */
                DEVICE_KEY_STAR,
                DEVICE_KEY_0,
                DEVICE_KEY_HASH,
                DEVICE_KEY_RIGHT,
                DEVICE_KEY_NONE,
                DEVICE_KEY_NONE,
                DEVICE_KEY_END,

                /* row 5 */
                DEVICE_KEY_NONE,
                DEVICE_KEY_NONE,
                DEVICE_KEY_NONE,
                DEVICE_KEY_NONE,
                DEVICE_KEY_NONE,
                DEVICE_KEY_NONE,
                DEVICE_KEY_END
        },
        Custom_Keypress_Period,   /**
开机键长按的时间/               
        DEVICE_KEY_END       /*
开机键*/
};

三:音频PA开关 afe.c
void AFE_SwitchExtAmplifier( char sw_on )
{
        if( sw_on )  /*
打开喇叭*/
   {
         GPIO_WriteIO( 1, 5 );----------
使用的是GPIO5,每个项目会不同,需根据硬件修改
}
   else /*
关闭喇叭*/
           {
          GPIO_WriteIO( 0, 5 );
           }
}

原创粉丝点击