LTV350QV移植到linux2.6.33内核

来源:互联网 发布:算法推荐书籍python 编辑:程序博客网 时间:2024/06/05 18:41

一、修改/arch/arm/mach-s3c2410/mach-smdk2410.c文件

1、添加头文件

#include <mach/fb.h>
#include <mach/regs-lcd.h>
2、添加初始化s3c2410的LCD控制器时所需的参数(copy from /arch/arm/mach-s3c2410/mach-qt2410.c,稍作修改)。

static struct s3c2410fb_display qt2410_lcd_cfg[] __initdata = {
        {
                /* Config for 240x320 LCD */
                .lcdcon5 = S3C2410_LCDCON5_FRM565 |
                           S3C2410_LCDCON5_INVVLINE |
                           S3C2410_LCDCON5_INVVFRAME |
                           S3C2410_LCDCON5_PWREN |
                           S3C2410_LCDCON5_HWSWP,
                                                                               
                .type           = S3C2410_LCDCON1_TFT,
                .width          = 320,//略有修改
                .height         = 240,
                .pixclock       = 100000, /* HCLK/10 */
                .xres           = 320,
                .yres           = 240,
                .bpp            = 16,
                .left_margin    = 13,
                .right_margin   = 8,
                .hsync_len      = 4,
                .upper_margin   = 2,
                .lower_margin   = 7,
                .vsync_len      = 4,

        },
 };
static struct s3c2410fb_mach_info qt2410_fb_info __initdata = {
        .displays       = qt2410_lcd_cfg,
        .num_displays   = ARRAY_SIZE(qt2410_lcd_cfg),
        .default_display = 0,
                                                                                                              
        .lpcsel         = ((0xCE6) & ~7) | 1<<4,
};
3、添加LCD控制器的寄存器参数设置函数
static void __init smdk2410_init(void)
{
        s3c24xx_fb_set_platdata(&qt2410_fb_info);//加入液晶的配置文件
        set_s3c2410ts_info(&MY2410_ts_cfg);//加入触摸屏的配置文件
        s3c_i2c0_set_platdata(NULL);
        platform_add_devices(smdk2410_devices, ARRAY_SIZE(smdk2410_devices));
        smdk_machine_init();
}

 

5,修改arch/arm/mach-s3c2410/include/mach/regs-lcd.h文件
 root@yuanxh-desktop:/home/yuanxh/s3c2410/linux-2.6.26-9g24x0# vi include/asm-arm/arch-s3c2410/regs-lcd.h
 把#define S3C2410_LCDCON1_MMODE    (1<<7)修改成:
 //#define S3C2410_LCDCON1_MMODE    (1<<7)
 #define S3C2410_LCDCON1_MMODE    (0<<7)   // change by yuanxihua@21cn.com
 
6,修改drivers/video/s3c2410fb.c文件
 root@yuanxh-desktop:/home/yuanxh/s3c2410/linux-2.6.26-9g24x0# vi drivers/video/s3c2410fb.c
 在第51行的/* useful functions */后添加:
 /************************************************/
 //LTV350QV_FOE_V0.0
 
 #define LTV350QV_FOE       0x1d   //device ID
 
 typedef struct _LTV350qv_spi_data_{
  unsigned char    Device_ID;   //ID of the device
  unsigned int   Index;    //index of register
  unsigned long   Structure;  //structure to be writed
 }LTV350QV_SPI_Data;
 
 //micro for LTV350QV_FOE
 #define CS_H     __raw_writel(__raw_readl(S3C2410_GPCDAT) |(1<< 8), S3C2410_GPCDAT)//MAKE_HIGH(LTV350QV_CS)
 #define CS_L     __raw_writel(__raw_readl(S3C2410_GPCDAT)&~(1<< 8), S3C2410_GPCDAT)//MAKE_LOW(LTV350QV_CS)
 #define SCLK_H   __raw_writel(__raw_readl(S3C2410_GPCDAT) |(1<< 9), S3C2410_GPCDAT)//MAKE_HIGH(LTV350QV_SCL)
 #define SCLK_L   __raw_writel(__raw_readl(S3C2410_GPCDAT)&~(1<< 9), S3C2410_GPCDAT)//MAKE_LOW(LTV350QV_SCL)
 #define SDI_H    __raw_writel(__raw_readl(S3C2410_GPCDAT) |(1<<10), S3C2410_GPCDAT)//MAKE_HIGH(LTV350QV_SDI)
 #define SDI_L    __raw_writel(__raw_readl(S3C2410_GPCDAT)&~(1<<10), S3C2410_GPCDAT)//MAKE_LOW(LTV350QV_SDI)
 #define RST_H    __raw_writel(__raw_readl(S3C2410_GPDDAT) |(1<< 0), S3C2410_GPDDAT)//MAKE_HIGH(LTV350QV_RST)
 #define RST_L    __raw_writel(__raw_readl(S3C2410_GPDDAT)&~(1<< 0), S3C2410_GPDDAT)//MAKE_LOW(LTV350QV_RST)
 
 //***************************************************************
 //**********these functions for SUMSUN LTV350QV TFT LCD****************
 //***************************************************************
 static void LTV350QV_Short_Delay(u_char time)
 {
  ndelay(150);
 }
 /*
 static void LTV350QV_Rst(void)
 {
  RST_L;
  mdelay(1);
  RST_H;
  mdelay(1);
 }
 */
 static void LTV350QV_Register_Write(LTV350QV_SPI_Data regdata)
 {
  u_char i,temp1;
  u_int temp2;
  u_long temp3;
  unsigned long flags;           
 
  //write index
  temp1=regdata.Device_ID<<2 | 0<<1 | 0<<0;  //register index
  temp2=regdata.Index;
  temp3=(temp1<<24) | (temp2<<8);
 
  local_irq_save(flags);
 
  CS_L;
  LTV350QV_Short_Delay(1);
  for(i=0;i<24;i++)
   {
    SCLK_L;
    if(temp3 & (1<<(31-i)) )   //if is H
     SDI_H;
    else
     SDI_L;
    LTV350QV_Short_Delay(1);   //setup time
    SCLK_H;
    LTV350QV_Short_Delay(1);   //hold time
   }
  CS_H;
 
  LTV350QV_Short_Delay(5);
 
  //write instruction
  temp1=regdata.Device_ID<<2 | 1<<1 | 0<<0; //instruction
  temp2=regdata.Structure;
  temp3=(temp1<<24) | (temp2<<8);
 
  CS_L;
  LTV350QV_Short_Delay(1);
  for(i=0;i<24;i++)
   {
    SCLK_L;
    if(temp3 & (1<<(31-i)) )   //if is H
     SDI_H;
    else
     SDI_L;
    LTV350QV_Short_Delay(1);
    SCLK_H;
    LTV350QV_Short_Delay(1);
   }
  CS_H;
 
  local_irq_restore(flags);
 }
 /****************************************
 *  *
 ****************************************/
 static void LTV350QV_Write(u_int index, u_int regdata)
 {
  LTV350QV_SPI_Data WriteData;
 
  WriteData.Device_ID = LTV350QV_FOE;
  WriteData.Index  = index;
  WriteData.Structure = regdata;
 
  LTV350QV_Register_Write(WriteData);
 }
 /****************************************
 *  *power ON sequence
 ****************************************/
 static void LTV350QV_Power_ON(void)
 {
   LTV350QV_Write( 9, 0x0000);
   mdelay(150);
   LTV350QV_Write( 9, 0x4000);
   LTV350QV_Write(10, 0x2000);
   LTV350QV_Write( 9, 0x4055);
   mdelay(550);
   LTV350QV_Write( 1, 0x409d);
   LTV350QV_Write( 2, 0x0204);
  LTV350QV_Write( 3, 0x0100);
   LTV350QV_Write( 4, 0x3000);
   LTV350QV_Write( 5, 0x4003);
   LTV350QV_Write( 6, 0x000a);
   LTV350QV_Write( 7, 0x0021);
   LTV350QV_Write( 8, 0x0c00);
   LTV350QV_Write(10, 0x0103);
  LTV350QV_Write(11, 0x0301);
   LTV350QV_Write(12, 0x1f0f);
   LTV350QV_Write(13, 0x1f0f);
   LTV350QV_Write(14, 0x0707);
   LTV350QV_Write(15, 0x0307);
   LTV350QV_Write(16, 0x0707);
   LTV350QV_Write(17, 0x0000);
   LTV350QV_Write(18, 0x0004);
   LTV350QV_Write(19, 0x0000);
 
   mdelay(200);
   LTV350QV_Write( 9, 0x4a55);
   LTV350QV_Write( 5, 0x5003);
 }
 
 /**********************************
 *  *power OFF sequence
 **********************************/
 /*static void LTV350QV_Powen_OFF(void)
 {
  LTV350QV_Write( 9, 0x4055);// GON -> 0, POC -> 0
  LTV350QV_Write( 5, 0x4003);// DSC -> 0
   LTV350QV_Write(10, 0x0000);// VCOMG -> 0
   mdelay(20);
  LTV350QV_Write( 9, 0x4000);// AP[2:0] -> 000
 }*/
 static void s3c2440fb_init_ltv350qv(void)
 {
  __raw_writel(0xaa9556a9, S3C2410_GPCCON);  //Initialize VD[7:0],LCDVF[2:0],VM,VFRAME,VLINE,VCLK,LEND
              //LCDVF[0],[1],[2]---output;VD[0],[1],[2]----output.            
  __raw_writel(0xffffffff, S3C2410_GPCUP);   // Disable Pull-up register
    LTV350QV_Power_ON() ;     //init LCD model
  __raw_writel(0xaaaaaaaa, S3C2410_GPDCON);
  __raw_writel(0xffffffff, S3C2410_GPDUP);
 // __raw_writel(3, S3C2410_LCDINTMSK);    // MASK LCD Sub Interrupt
 // __raw_writel(0, S3C2410_TPAL);     // Disable Temp Palette
 // __raw_writel(0, S3C2410_LPCSEL);    // Disable LPC3600
 }
 
 
 在static int s3c2410fb_init_registers(struct fb_info *info)的 return 0;前添加:
 s3c2440fb_init_ltv350qv();

 

 


5、去除10分钟左右自动关闭显示的程序(实验时可以这么做,我猜应该是节能作用,并未深究。)。

copy from《2410 lcd(ltv350)驱动在2.6.14下的移植经历》:

“按seigpao大侠的做法,注释掉drivers/char/vt.c的blank_screen_t(unsigned long dummy)的函数内容,否则,lcd会在10分钟左右关掉显示。“
6、二、配置内核
Device Drivers  ---> 
    Graphics support  --->
        Display device support  --->
            <*> Display panel/monitor support
        <*> Support for frame buffer devices
        <*> S3C2410 LCD framebuffer support 
        Console display driver support  --->
            <*> Framebuffer Console support
            [*]   Framebuffer Console Rotation
            [*] Select compiled-in fonts
            [*]   VGA 8x8 font
            [*]   VGA 8x16 font
            [*]   Mini 4x6 font
            [*] Sparc console 8x16 font          
        [*] Bootup logo  --->
            --- Bootup logo
            [*]   Standard 224-color Linux logo  

7、开机画面的选择

(1)用 GIMP 图像编辑器打开你想要的图像文件,依次选择图像->模式->索引颜色,将颜色改为 224
色;至于图片大小,不要大于你的显示器分辨率就好(我只试过 80*80 和 320*240 的大小),最后将
文件保存为 ppm 格式(ASCii 码),文件名为:logo_linux_clut224.ppm。
(2)将 logo_linux_clut224.ppm 拷贝到/drivers/video/logo 文件夹下,替换原有的文件(记得备份啊,
以防万一)。

 

原创粉丝点击