• Linux VGA驱动移植实验【转】


    本文转载自:http://m.blog.csdn.net/bzw73/article/details/46564275

    有了前面的LCD驱动的框架,再移植VGA驱动就相当的容易了。默认在光盘中已经支持了多款VGA驱动,我们在此基础上增加分辨率为1440*900的驱动。
    在kernel/drivers/video/samsung/x4412_lcds.c中添加结构体vga_1440_900:
    1. /* VGA-1440X900 */
    2. static struct s3cfb_lcd vga_1440_900 = {
    3.          .width         = 1440,
    4.          .height        = 900,
    5.          .bpp  = 32,
    6.          .freq  = 60,
    7.          .timing = {
    8.                    .h_fp = 48,
    9.                    .h_bp          = 80,
    10.                    .h_sw         = 32,
    11.                    .v_fp = 3,
    12.                    .v_fpe         = 1,
    13.                    .v_bp          = 17,
    14.                    .v_bpe        = 1,
    15.                    .v_sw         = 6,
    16.          },
    17.         
    18.          .polarity = {
    19.                    .rise_vclk      = 1,
    20.                    .inv_hsync      = 1,
    21.                    .inv_vsync      = 0,
    22.                    .inv_vden       = 0,
    23.          },
    24.          .init_ldi = NULL,
    25. };
    复制代码
           注意,上面的所有数据全来源于VGA的VESA标准,调试其他任意的VGA驱动,其参数都需要遵循VESA标准。
    在结构体数组x4412_lcd_config中添加1440*900的信息:
    1. static struct {
    2.          char * name;
    3.          struct s3cfb_lcd * lcd;
    4. } x4412_lcd_config[] = {
    5.          { "ek070tn93",             &ek070tn93},
    6.          { "vs070cxn",               &vs070cxn},
    7.          { "vga-1024x768",       &vga_1024_768},
    8.          { "vga-1280x1024",     &vga_1280_1024},
    9.          { "vga-1440x900",      &vga_1440_900},
    10.          { "vga-1920x1200",     &vga_1920_1200},
    11. };
    复制代码
           在kernel/drivers/video/samsung/s3cfb_ops.c的s3cfb_map_default_video_memory函数中,默认存在如下程序:
    1. memset(fb->screen_base, 0, fix->smem_len);
    复制代码
           修改为:
    1. memset(fb->screen_base, 0, fix->smem_len/3);
    复制代码
           这是内核关于不同分辨率的视频缓存存在的BUG。
           编译内核后,更新内核映像,同时进入uboot后,修改uboot环境变量,执行指令如下:
    1. setenv bootargs "lcd=vga-1440x900 tp=ft5x06-1024x600 cam=ov2655 mac=00:09:c0:ff:ee:58"
    复制代码
           这时,在x4412_lcds.c的lcd_setup函数会通过uboot传递给内核的环境变量自动匹配LCD参数,真正实现一个内核管理多个LCD屏及多个分辨率的VGA的功能。到此,针对1440*900的VGA分辨率的驱动移植完毕,移植其他类型的LCD或其他分辨率的VGA驱动,和些方法完全雷同。
  • 相关阅读:
    10 个深恶痛绝的 Java 异常。。
    为什么公司宁愿 25K 重新招人,也不给你加到 20K?原因太现实……
    推荐一款代码神器,代码量至少省一半!
    Spring Cloud Greenwich 正式发布,Hystrix 即将寿终正寝。。
    hdu 3853 LOOPS(概率 dp 期望)
    hdu 5245 Joyful(期望的计算,好题)
    hdu 4336 Card Collector(期望 dp 状态压缩)
    hdu 4405 Aeroplane chess(概率+dp)
    hdu 5036 Explosion(概率期望+bitset)
    hdu 5033 Building (单调栈 或 暴力枚举 )
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/7479834.html
Copyright © 2020-2023  润新知