s3c6410 framebuffer 开发与调试(1)
本帖最后由 lincoln-shaw 于 2011-04-17 09:45 编辑
1: timing的配置
vclock 对应pixel clock 每vclock lcdc采样1pixcel数据写到lcd, 已知vclok可得reflashrate,已知reflashrate也可得vclock,转化关系是 1/w*h*vlock = reflashrate.
lcdc传输每行数据时,行变换时要求行与行传送数据之间要有一定时延(ling puls width)确保每行数据能够准确到达lcd,同时行内数据生效与行开始,行内数据传输结束到行结束都有一段时延,前者是line front porch,后者是line back portch
lcdc传输每frame数据时, 不同frame数据之间也需要一定时延(frame pules width)确保每frame数据能够准确到达lcd,同时frame内数据生效与frame开始,frame内数据传输结束到frame结束有一段时延,前者是frame front portch,后者是frame back porth
2: framebuffer驱动流程与原理
根据datasheet找到lcdc和dma的reg的物理地址,经过remmap地址映射获得lcdc和dma的reg的虚拟地址va,程序得到这写va便可以根据datesheet的参数(timeing, clock, format, resulotion等) 往这些reg里写值控制lcdc来把数据传输到lcd,另外还需要通过dma_alloc函数得到一块framebuffer,物理地址给dma用,虚拟地址给上层app用以将数据写入framebuffer,然后dma fetch这些数据输出到lcd
3: 在g-bios 实现硬件register的配置与调试,然后往framebuff里写3色图和bmp,jpg图像检验配置是否ok
配好GPIO, timing, mode, DMA后就在配置函数里直接往framebuff里全部写0x00数据,运行程序srceen出现斑纹,检查下DMA的地址寄存器,发现VIDW00ADD0B含有VBANK_F,VBASEU_F两个域, VBASEU_F好理解就是前面申请dma地址的前24bits,而VBANK_F却不清楚,不过按逻辑来说dma地址应该全部写进VIDW00ADD0B寄存器,结果果然把dma 全部写进VIDW00ADD0B就ok了,srceen显示程序想要输出的颜色了,画好3色图,想要往framebuff里画张图片,看了下g-bios,发现里面提供jpge lib可以解码jpeg图像,并且可以把解码后的图像数据写入framebuff,在之前的程序里调用g-bios里的jpge2decode()函数再调用g-bios里面的draw_logo函数,但结果输出效果确是在半个屏幕里连续反复显示2张logo,猜测可能是timing有了问题,检查了代码,看来下datesheet,timeing没错,再检查g-bios的jpge_decod 和draw_logo函数调用也没错,没办法,只能自己来画bmp图像,但图像的数据该如何获得呢?在os上写显示bmp图像的bmp图像时只需要调用open函数然后调用read 函数就能够获得bmp的数据了,现在没有open这些函数可调用,那该如何!不知一些图片软件是否具有把图片转化为文本文件的功能,在pc机上用gimp打开bmp图片,然后保存下果然有保存转化为source c code 文件的功能,获得了图片数据后在g-bios里就可以定义一个数据存放这些数据然后就可以往framebuff里写数据了!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
很详细……