资讯详情

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. .polarity = {
  18. .rise_vclk = 1,
  19. .inv_hsync = 1,
  20. .inv_vsync = 0,
  21. .inv_vden = 0,
  22. },
  23. .init_ldi = NULL,
  24. };
复制代码
请注意,上述所有数据都来自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驱动,和些方法完全雷同。

标签: bzw04p26抑制二极管bzw04p17抑制二极管bzw04p64抑制二极管bzw04p128抑制二极管bzw22二极管bzw04p16b抑制二极管

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台