一、linux内核中是将内存的某一块(驱动分配的)映射到用户空间,这样用户空间的图片以及视频数据就不需要从内存空间切换,就可以直接写入到内存中。其中申请的这块内存称为DMA内存,即直接内存访问,外设和内存直接传输数据而不需要CPU参与。
存放在DMA内存的数据,每满一帧就可以自动写入到硬件(LCD屏)中。所以我们也称LCD屏为帧缓冲设备, 即一块内存。
总结是:操作一块LCD设备,就是操作一块内存,这块内存也称作显存。
二、framebuffer子系统的框架
这里,主要关注是fbmen.c核心层和LCD控制器层!
主要开发dev.platform_data(包括LCD屏的参数)。
应用层
————————————————
fb通用层:知道映射,但是不知道如何分配显存
1,负责和用户交互
2,实现显存的映射
代码在drivers/video/fbmem.c
————————————————-
drivers/video/s3c-fb.c
lcd控制器层:知道分配显存,但是不知道如何映射
1,初始化lcd控制器
2,实现显存的分配
三、LCD接口电路
背光引脚:LXpwmTOUTO,这个引脚接到LCD屏的背光开关上,如果要LCD屏亮起来,提供一个高电平即可。
控制引脚:
LVSYNC表示垂直(帧)同步信号
LHSYCN表示水平同步信号
LVCLK表示像素时钟
LVDEN表示像素使能
四、看SOC的LCD接口时序图:
最后面的HOZVAL+1表示有效的图像数据
垂直输入时序图表(AT070TN92_LCD)
水平输入时序图表(AT070TN92_LCD)
分别对比上面两个时序图中的垂直同步信号VSYNC与VS,发现时序刚好相反,所以一般是改变VSYNC中的极性。
LCD屏的驱动移植——时序
在路径下root@ubuntu:~/s5pv210/kernel/linux-3.0.8/Documentation/fb#
vim framebuffer.tet
里面有驱动相关的命名
总结以上时序图,得出soc中LCD、LCD屏芯片手册、驱动三者时序配置对应关系:
soc lcd屏 驱动
垂直方向
VSPW tvpw 1<y<20 y=10 vsync_len
VBPD tvb-tvpw 23-tvpw 13 upper_margin
LINVAL tvd 480 yres
VFPD tvfp 22 lower_margin
水平方向
HSPW thpw 1<x<40 x=20 hsync_len
HBPD thb-thpw 46-thpw 26 left_margin
HOZVAL thd 800 xres
HFPD thfp 210 right_margin
五、移植的时候主要是设定自定义数据
arch/arm/mach-s5pv210/mach-smdkv210.c
根据参数修改如下
static struct s3c_fb_pd_win smdkv210_fb_win0 = {
.win_mode = {
.left_margin = 26,
.right_margin = 210,
.upper_margin = 13,
.lower_margin = 22,
.hsync_len = 20,
.vsync_len = 10,
.xres = 800,
.yres = 480,
},
.max_bpp = 32,
.default_bpp = 16, // 和应用有关
};
六、确保fb通用层和lcd控制器层的驱动已经存在:
make menuconfig
Device Drivers --->
Graphics support --->
<*> Support for frame buffer devices --->// fbmem.c(核心层)
<*> Samsung S3C framebuffer support // s3c-fb.c
Console display driver support --->
<*> Framebuffer Console support //将图片加载到显存中去显示
[*] Bootup logo --->//启动logo,可以判断是否配置成功
[*] Standard black and white Linux logo (NEW)
[*] Standard 16-color Linux logo (NEW)
[*] Standard 224-color Linux logo (NEW)//表示的是一张图片
七、开启背光:
路径:/home/ubuntu/s5pv210/kernel/linux-3.0.8/arch/arm/mach-s5pv210
vim mach-smdkv210.c
添加:
smdkv210_machine_init(void)
|
gpio_request(S5PV210_GPD0(0), "gpd0");
gpio_direction_output(S5PV210_GPD0(0),1);
gpio_free(S5PV210_GPD0(0));
然后编译内核:make zImage -j2
更新内核: cp -raf arch/arm/boot/zImage /tftpboot
重启开发板,设置地址set serverip 192.168.7.115
save
set bootcmd tftp 0x40008000 zImage \; bootm 0x40008000
save
设置挂载根文件系统:set bootargs root=/dev/nfs nfsroot=192.168.7.115:/opt/rootfs init=/Linuxrc console=ttySAC0,115200 ip=192.168.7.175
save
设置开发板ip:set ipaddr 192.168.7.175
save
具体设置流程可以参考我写的: linux驱动开发之交叉开发环境搭建详细流程(http://blog.csdn.net/weixin_37787043/article/details/79146888)
重启开发板,可以看到有企鹅的logo
附录:S5PV210数据手册及原理图(链接:https://pan.baidu.com/s/1pNhz2iB 密码:ptct)