S5PC100芯片的linux-lcd驱动移植(基于2.6.35.13内核)

来源:互联网 发布:eviews3.1怎么导入数据 编辑:程序博客网 时间:2024/06/02 04:52

 

第一步:添加和添加平台资源:

1,在文件mach-smdkc100.c里面修改lcd平台资源(根据芯片手册)

   static struct s3c_fb_pd_win smdkc100_fb_win0 = {

/* this is to ensure we use win0 */

.win_mode        = {

.pixclock = 1000000000000ULL / ((8+43+1+480)*(4+10+12+272)*80),

.left_margin        = 8,

.right_margin        = 43,

.upper_margin        = 4,

.lower_margin        = 12,

.hsync_len        = 1,

.vsync_len        = 10,

.xres                = 480,

.yres                = 272,

},

.max_bpp        = 32,

.default_bpp        = 16,

};

这样的时序也行(根据芯片手册得到)

.win_mode = {
              .pixclock = 1000000000000ULL / ((2+2+41+480)*(2+10+2+272)*80),
              .left_margin = 2,
              .right_margin = 2,
              .upper_margin = 2,
              .lower_margin = 2,
              .hsync_len = 41,
              .vsync_len = 10,
              .xres  = 362,
              .yres  = 272,
          },
             .max_bpp = 32,
             .default_bpp = 16,

 

2修改drivers/video/Kconfig

修改:

depends on (FB && ARCH_S3C64XX)   //移植驱动的时候很多地方都要修改这个图形界面的依赖,不然图形界面相应的选项出不来

为:

depends on (FB && ARCH_S3C64XX) || (FB && ARCH_S5PC100)

 

3,配置内核的图形界面

     配置内核

$ make menuconfig

Device Drivers  --->

Graphics support  --->

              <*> Support for frame buffer devices  --->

<*>   Samsung S3C framebuffer support

Console display driver support  --->

                    <*> Framebuffer Console support

                    [*] Bootup logo  --->

此时编译内核,lcd基本移植完成

二、LCD,多窗口显示

    首先添加平台资源,照着win0的样子添加就好了。

   然后再平台数据结构体struct s3c_fb_platdata smdkc100_lcd_pdata添加一项win1

           .win[0]  = &smdkc100_fb_win0,
                    .win[1]  = &smdkc100_fb_win1,

  在驱动文件里添加对lcd win1的相关参数设置(内核默认只有一个win0   

-----------------------------------------------------------------------------------------

注册驱动的时候有个探测函数probe,而每个win0有一个关于自己参数设置的探测函数:

s3c_fb_probe_win(sfb, win, &sfb->windows[win]);

这里包括一些固定参数、可变参数的获取,和核对相关参数,分配显存,设置参数

最后注册

--------------------------------------------------------------------------------------------

  而对于每个win的参数设置集中在函数int s3c_fb_set_par(struct fb_info *info)

该函数的分析:

-------------------------------------------

switch (var->bits_per_pixel)

根据像素确定info->fix.visual(屏幕使用的色彩模式);

writel(0, regs + WINCON(win_no));(设置lcd的参数的时候关闭lcd

---------------------------------------------

info->fix.line_length = (var->xres_virtual * var->bits_per_pixel) / 8;

每行像素所占用的字节数

---------------------------------------------

if (win_no == 0)

use window 0 as the basis for the lcd output timings(基于win0的参数设置lcd的时序)

---------------------------------------------

write the buffer address(将分配的显存写入相关寄存器)

---------------------------------------------

关键点:

write 'OSD' registers to control position of framebuffer 

/*窗口位置与大小*/
         data = VIDOSDxA_TOPLEFT_X(0) | VIDOSDxA_TOPLEFT_Y(0);
         writel(data, regs + VIDOSD_A(win_no));(左上角的起始点)

 

data = VIDOSDxB_BOTRIGHT_X(s3c_fb_align_word(var->bits_per_pixel,var->xres - 1)) | VIDOSDxB_BOTRIGHT_Y(var->yres - 1);

writel(data, regs + VIDOSD_B(win_no));(右下角结束点)

 

data = var->xres * var->yres;

writel(data, regs + VIDOSD_C(win_no));(窗口的大小)

 

比如我的LCD,我将其分为两个窗口显示:

win0(362*272)win1116*272

我修改的部分代码如下:

if(win_no == 0){

 /*窗口位置与大小*/
         data = VIDOSDxA_TOPLEFT_X(0) | VIDOSDxA_TOPLEFT_Y(0);
         writel(data, regs + VIDOSD_A(win_no));

 data = VIDOSDxB_BOTRIGHT_X(361) |
            VIDOSDxB_BOTRIGHT_Y(271);

 writel(data, regs + VIDOSD_B(win_no));

 data = 362* 272;

 writel(data, regs + VIDOSD_C(win_no));
        }
        if(win_no == 1){

 /*窗口位置与大小*/
         data = VIDOSDxA_TOPLEFT_X(364) | VIDOSDxA_TOPLEFT_Y(0);
         writel(data, regs + VIDOSD_A(win_no)); //起始地址
 
         data = VIDOSDxB_BOTRIGHT_X(479) |VIDOSDxB_BOTRIGHT_Y(271);

 writel(data, regs + VIDOSD_B(win_no));//窗口结束地址
 
         data = 116*272;
 
         writel(data, regs + VIDOSD_D(win_no));  //窗口大小 
        }

 

这里要注意的是:

第一:窗口0永远在最上面,而且窗口0没有透明度设置。

第二:窗口1和窗口0的坐标最后不要交叉

第三:若是出现一个时序正常,另一个显示时序不正常,那试着改改显存,改为实际的显存

----------------------------------------------------

下面还有一些相关的color key设置

然后使能lcd开始工作

 

 

 

 

原创粉丝点击