[MID project] Daily Report from swangwu
redo mw2440 frame buffer in linux kernel and try to get better understanding of
frame buffer and LCDC register setting
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
回复 1# swangwu
1. 在应用程序实现动画效果。
2。针对画尺寸大的图形,出现很明显的一行一行刷新图形的现象,尝试解决。
参考开机LOGO没有出现以上刷新慢的现象,开机LOGO是先在显存里将图形画好,
然后,再将显存的物理地址写到LCDSADDR里;仔细阅读DATASHEET,可以设置
双缓存,设置LCDSADDR1/2寄存器来切换显存。尝试修改,但是没有成功。
解决画大尺寸图形刷新慢的方法
1。产生原因
参考以下连接
http://c51.cn/Article/mcuzh/200811/8851.html
当显存读写发生冲突时,LCD会产生雪花甚至黑屏,但没找到
刷屏慢的解释。之前我画图形是直接写frame buffer的,
没有考虑HBP,HPW,HFP,VBP,VPW,VFP,仔细阅读2440 datasheet P398,
LCDCDMA里有个28*4BYTES大小的FIFO,当FIFO里的数据空或部分空,LCDCDMA就要
从FRAME MEMORY请求数据(每次4*4BYTE大小),当MEMORY CONTROLLER的总线判决器
允许该请求,才会把数据从FRAME MEMORY传给LCDCDMA的FIFO。所以,如果发生FRAME MEMORY
的读写冲突,MEMORY CONTROLLER的总线判决器就可能不批准LCDCDMA的数据申请,就会发生
刷新延迟,雪花甚至黑屏。
2。解决办法以及实验结果
申请1块大小为480*272*2BYTES大小的内存,在该内存内事先画好图形;
画新图之前,读LINECNT的值,直到该值为0,将LCDSADDR1/2的DMA地址设为新内存的首地址,
新图就可以立刻刷到LCD屏上,几乎没有一行一行刷屏的现象。
值得注意的是,一定要等待LINECNT为0,才能操作FRAMEBUFFER,否则,会出现雪花和黑屏。
回复 1# swangwu
今天,编写调试上课讲的linux kernel 2440 frame buffer精解版驱动,熟悉了kernel驱动程序框架;大致阅读了6410datasheet display driver
和2D部分,准备6410 display driver驱动编写。
回复 1# swangwu
已完成,
1. 根据以下算法,
( Xi- X0)(Y1 - Y0)=(Yi - Y0)(X1 - X0)
做了已知两个点,画一条直线的函数,并作了判断1个点是否在一条直线上的函数。
遗留问题,斜率是负数的直线画的不正常, 斜率是正数的直线画的正常。
2。参考Bresenham's line algorithm,
写了anti-aliasing的画直线函数,实现正常。
TODO,
利用已实现的函数,实现画填充三角形。
回复 1# swangwu
已完成,
1。 完成画填充三角形的函数,大概测试了一下,没发生异常。算法如下,
1。1 已知3点,先使用画直线函数(采用Bresenham's line algorithm)将3条边画出,并生成3条边的坐标数组
1。2 将这3条边的数组按Y轴方向高度从小到大排序
1。3 依次遍历Y轴高度较小的两条边的每个点,并找到Y轴高度最大的边和这个点Y坐标相等的点(使用2分查找,数组是有序的),
使用画直线函数将这两个点连起来
2。将最近做的画线,图形缩放等函数放到专门的graphics_lib.c
TODO,
随机产生3个点,测试画填充三角形的函数,并测试每桢时间内,能画多少三角形。
回复 1# swangwu
DONE,
在g-bios里编写,调试LCD驱动程序。本想显示一幅480*272的16位3色图,
测试结果是白屏。
TODO,
希望明天能正常显示该图,并测试6410 display controller提供的利用硬件实现特殊图形效果的功能,比如,图形的overlay,alpha等.
回复 1# swangwu
Done,
查了两天g-bios的6410LCD 驱动, 终于在同组兄弟的帮助下,查到原因,是和LCDC pin脚相关的GPIO没有正确配置。
TODO,
编写测试kernel的6410 frame buffer 驱动。
回复 1# swangwu
Done,
今天,完成在linux kernel添加精简版的6410frame buffer驱动,并测试了fbv和mplayer
TODO,
明天,在g-bios里尝试添加6410 2D驱动。
回复 1# swangwu
今天,在g-bios里实现了图片缩放的算法,缩放比例是2的幂次,也就是比例 N=1,2,4,8,16,。。。
算法大致如下,
1.从0行开始,每隔N-1行,取1行
2。对所取行,从第0个pixel开始,每隔(N-1)个pixel,取1个pixel
已在application添加应用,该应用可以实现在LCD指定位置对图片缩放,准备先在应用程序实现动画效果。