微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > S5PV210(TQ210)学习笔记——LCD驱动编写

S5PV210(TQ210)学习笔记——LCD驱动编写

时间:11-28 来源:互联网 点击:

  1. lcd_info->lcd_info->screen_base=dma_alloc_writecombine(NULL,
  2. lcd_info->fix.smem_len,(dma_addr_t*)&(lcd_info->fix.smem_start),GFP_KERNEL);
  3. *vidw00add0b0=lcd_info->fix.smem_start;
  4. *vidw00add1b0=lcd_info->fix.smem_start+lcd_info->fix.smem_len;
  5. *shodowcon=0x1;
  6. //开启状态
  7. *wincon0|=1;
  8. *vidcon0|=3;
  9. /*注册fb_info*/
  10. ret=register_framebuffer(lcd_info);
  11. returnret;
  12. }
  13. staticvoidlcd_exit(void){
  14. unregister_framebuffer(lcd_info);
  15. dma_free_writecombine(NULL,lcd_info->fix.smem_len,
  16. (void*)lcd_info->screen_base,(dma_addr_t)lcd_info->fix.smem_start);
  17. iounmap(shodowcon);
  18. iounmap(vidw00add1b0);
  19. iounmap(vidw00add0b0);
  20. iounmap(vidosd0c);
  21. iounmap(vidosd0b);
  22. iounmap(vidosd0a);
  23. iounmap(wincon0);
  24. iounmap(vidtcon2);
  25. iounmap(vidtcon1);
  26. iounmap(vidtcon0);
  27. iounmap(vidcon1);
  28. iounmap(vidcon0);
  29. iounmap(gpd0dat);
  30. iounmap(gpd0con);
  31. iounmap(gpf3con);
  32. iounmap(gpf2con);
  33. iounmap(gpf1con);
  34. iounmap(gpf0con);
  35. framebuffer_release(lcd_info);
  36. }
  37. module_init(lcd_init);
  38. module_exit(lcd_exit);
  39. MODULE_LICENSE("GPL");

将上面的代码在自己的内核环境下编译,然后下载到开发板上试运行即可。

在安装驱动程序前执行指令:

  1. ls/dev/fb*

如果有fb0或者其他fb*存在,应该修改内和配置,取消其他fb的配置,如果看不到fb*设备,则可以按照如下步骤进行测试。
测试前还需要修改下内核配置,有两个原因:

(1) 内核默认配置下不支持Frame buffer

(2) 我们的驱动程序中用到了三个函数:

  1. .fb_fillrect=cfb_fillrect,
  2. .fb_copyarea=cfb_copyarea,
  3. .fb_imageblit=cfb_imageblit,

这三个函数是引用的内核中的函数,不是我们自行实现的。

鉴于上面两个原因,我们需要配置内核支持Frame buffer和列举出的三个函数,另外,内核中并没有直接配置支持这三个函数的选项,权宜之计,修改下drivers/video目录下的Kconfig文件,在config FB项中添加

  1. selectFB_CFB_FILLRECT
  2. selectFB_CFB_COPYAREA
  3. selectFB_CFB_IMAGEBLIT

添加时一定保证格式正确,参考下该文件下的其他配置项即可。配置完成后执行make menuconfig作如下配置:

  1. DeviceDrivers--->
  2. Graphicssupport--->
  3. <*>Supportforframebufferdevices--->

配置后保存配置,编译内核并将编译好的内核下载到开发板或者NFS运行,同时将编译好的LCD驱动程序拷贝到开发板运行环境中进行安装,如果驱动文件名为lcd.ko,则执行:

  1. insmodlcd.ko

这时,你可以看到屏幕被重新初始化了。虽然LCD已经初始化了,但是不知道如何进行测试,可以按照韦东山老师视频中讲述的方法进行LCD驱动测试,但是我们移植的3.8.3内核默认不支持字库,还需要作其他配置,我是用画线的方式测试的屏幕,这里我讲一下我用的测试方法:

(1) 在Linux主机上编译下面的C++程序

  1. #include
  2. unsignedlongbuffer[480][800]={0};
  3. voidput_long_hex(unsignedlongv){
  4. for(inti=0;i!=4;++i){
  5. std::cout.put(static_cast(0xff&(v>>(8*(3-i)))));
  6. }
  7. }
  8. intmain(){
  9. for(inti=0;i!=480;++i){
  10. buffer[i][0]=0x00ff0000;
  11. buffer[i][799]=0x0000ff00;
  12. }
  13. for(inti=0;i!=800;++i){
  14. buffer[0][i]=0xff000000;
  15. buffer[479][i]=0x00ffff00;
  16. }
  17. for(inti=0;i!=480;++i){
  18. for(intj=0;j!=800;++j){
  19. put_long_hex(buffer[i][j]);
  20. }
  21. }
  22. }

编译指令如下:

  1. g++-omainmain.cpp

然后如下方式执行程序:

  1. ./main>/nfsroot/rootfs/test.img

我是直接将文件生成在NFS的根文件系统下了,你也可以用其他方式将生成的文件拷贝到开发板运行环境内,然后执行如下指令:

  1. cattest.img>/dev/fb0

这时,就可以在屏幕上看到一个矩形且矩形的四条边颜色不相同。

如果想将驱动编译进内核,并在启动时可以看到小企鹅,可以将上面的驱动拷贝到内核的drivers/video/目录下,命名为tq210_fb.c,然后在该目录下做如下修改:

(1)修改Kconfig,添加TQ210的LCD驱动配置选项

在config FB_S4C项的后面添加如下内容:

  1. configFB_TQ210
  2. tristate"TQ210lcdsupport"
  3. dependsonFB
  4. selectFB_CFB_FILLRECT
  5. selectFB_CFB_COPYAREA
  6. selectFB_CFB_IMAGEBLIT
  7. ---help---
  8. CurrentlythesuportisonlyfortheTQ210

(2)修改Makefile,添加如下内容:

  1. obj-$(CONFIG_FB_TQ210)+=tq210_fb.o

(3)退回到内核根目录下,执行make menuconfig并按如下方式配置内核

  1. DeviceDrivers--->
  2. Graphicssupport--->
  3. <*>Supportforframebufferdevices--->
  4. <*>TQ210lcdsupport
  5. [*]Bootuplogo--->
  6. [*]StandardblackandwhiteLinuxlogo
  7. [*]Standard16-colorLinuxlogo
  8. [*]Standard224-color

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top