Linux VGA驱动移植实验
2015-06-19 18:27
465 查看
[align=left]有了前面的LCD驱动的框架,再移植VGA驱动就相当的容易了。默认在光盘中已经支持了多款VGA驱动,我们在此基础上增加分辨率为1440*900的驱动。[/align]
[align=left]在kernel/drivers/video/samsung/x4412_lcds.c中添加结构体vga_1440_900:[/align]
/* VGA-1440X900 */
static struct s3cfb_lcd vga_1440_900 = {
.width = 1440,
.height = 900,
.bpp = 32,
.freq = 60,
.timing = {
.h_fp = 48,
.h_bp = 80,
.h_sw = 32,
.v_fp = 3,
.v_fpe = 1,
.v_bp = 17,
.v_bpe = 1,
.v_sw = 6,
},
.polarity = {
.rise_vclk = 1,
.inv_hsync = 1,
.inv_vsync = 0,
.inv_vden = 0,
},
.init_ldi = NULL,
};
复制代码
[align=left] 注意,上面的所有数据全来源于VGA的VESA标准,调试其他任意的VGA驱动,其参数都需要遵循VESA标准。[/align]
[align=left]在结构体数组x4412_lcd_config中添加1440*900的信息:[/align]
static struct {
char * name;
struct s3cfb_lcd * lcd;
} x4412_lcd_config[] = {
{ "ek070tn93", &ek070tn93},
{ "vs070cxn", &vs070cxn},
{ "vga-1024x768", &vga_1024_768},
{ "vga-1280x1024", &vga_1280_1024},
{ "vga-1440x900", &vga_1440_900},
{ "vga-1920x1200", &vga_1920_1200},
};
复制代码
[align=left] 在kernel/drivers/video/samsung/s3cfb_ops.c的s3cfb_map_default_video_memory函数中,默认存在如下程序:[/align]
memset(fb->screen_base, 0, fix->smem_len);
复制代码
[align=left] 修改为:[/align]
memset(fb->screen_base, 0, fix->smem_len/3);
复制代码
[align=left] 这是内核关于不同分辨率的视频缓存存在的BUG。[/align]
[align=left] 编译内核后,更新内核映像,同时进入uboot后,修改uboot环境变量,执行指令如下:[/align]
setenv bootargs "lcd=vga-1440x900 tp=ft5x06-1024x600 cam=ov2655 mac=00:09:c0:ff:ee:58"
复制代码
[align=left] 这时,在x4412_lcds.c的lcd_setup函数会通过uboot传递给内核的环境变量自动匹配LCD参数,真正实现一个内核管理多个LCD屏及多个分辨率的VGA的功能。到此,针对1440*900的VGA分辨率的驱动移植完毕,移植其他类型的LCD或其他分辨率的VGA驱动,和些方法完全雷同。[/align]
[align=left]在kernel/drivers/video/samsung/x4412_lcds.c中添加结构体vga_1440_900:[/align]
/* VGA-1440X900 */
static struct s3cfb_lcd vga_1440_900 = {
.width = 1440,
.height = 900,
.bpp = 32,
.freq = 60,
.timing = {
.h_fp = 48,
.h_bp = 80,
.h_sw = 32,
.v_fp = 3,
.v_fpe = 1,
.v_bp = 17,
.v_bpe = 1,
.v_sw = 6,
},
.polarity = {
.rise_vclk = 1,
.inv_hsync = 1,
.inv_vsync = 0,
.inv_vden = 0,
},
.init_ldi = NULL,
};
复制代码
[align=left] 注意,上面的所有数据全来源于VGA的VESA标准,调试其他任意的VGA驱动,其参数都需要遵循VESA标准。[/align]
[align=left]在结构体数组x4412_lcd_config中添加1440*900的信息:[/align]
static struct {
char * name;
struct s3cfb_lcd * lcd;
} x4412_lcd_config[] = {
{ "ek070tn93", &ek070tn93},
{ "vs070cxn", &vs070cxn},
{ "vga-1024x768", &vga_1024_768},
{ "vga-1280x1024", &vga_1280_1024},
{ "vga-1440x900", &vga_1440_900},
{ "vga-1920x1200", &vga_1920_1200},
};
复制代码
[align=left] 在kernel/drivers/video/samsung/s3cfb_ops.c的s3cfb_map_default_video_memory函数中,默认存在如下程序:[/align]
memset(fb->screen_base, 0, fix->smem_len);
复制代码
[align=left] 修改为:[/align]
memset(fb->screen_base, 0, fix->smem_len/3);
复制代码
[align=left] 这是内核关于不同分辨率的视频缓存存在的BUG。[/align]
[align=left] 编译内核后,更新内核映像,同时进入uboot后,修改uboot环境变量,执行指令如下:[/align]
setenv bootargs "lcd=vga-1440x900 tp=ft5x06-1024x600 cam=ov2655 mac=00:09:c0:ff:ee:58"
复制代码
[align=left] 这时,在x4412_lcds.c的lcd_setup函数会通过uboot传递给内核的环境变量自动匹配LCD参数,真正实现一个内核管理多个LCD屏及多个分辨率的VGA的功能。到此,针对1440*900的VGA分辨率的驱动移植完毕,移植其他类型的LCD或其他分辨率的VGA驱动,和些方法完全雷同。[/align]
相关文章推荐
- linux安装cmake
- [原创]CentOS下Radius服务器搭建
- centos 删除指定文件之外的其他文件
- [原创]CentOS实现智能DNS
- linux之tar命令
- [原创]CentOS下Mysql的日志回滚
- linux 信号量之SIGNAL 0
- [原创]CentOS下Mysql双机互为备份
- linux常用命令手册
- Centos下源码包安装lamp常见的几个小问题
- linux epoll模型
- Linux gdb调试器用法全面解析
- CentOS Linux iptables 防火墙
- Linux——文件拷贝
- Linux防火墙的关闭和开启
- linux中断延迟之tasklet
- Linux——杀掉进程
- 解决gnuplot中'Terminal type set to 'unknown'不能显示绘图的问题
- linux和windows下用setsockopt设置SO_SNDTIMEO,SO_RCVTIMEO的参数的一点区别
- Linux下磁盘分区、挂载