请教2440的camera 驱动中Display_Cam_Image中用memcpy将P模式DMA buffer中拷到LCD 显示buffer中
memcpy((void *)(FRAMEBUF_BASE+ (240*pos_y + pos_x) + y*240*2),(void *)buffer_rgb,(QCIF_XSIZE)*2);
1,2参数都是物理地址--WHY???
为什么不启用DMA传而用memcpy而且memcpy还没有经过地址映射????
(FRAMEBUF_BASE+ (240*pos_y + pos_x) + y*240*2)这应该是放场行同步信息的物理地址
buffer_rgb这个R G B值转换的存储buffer的物理地址。
理论上是启用了DMA传输走的地址就应该是FRAMEBUF_BASE+ (240*pos_y + pos_x) + y*240*2获取的地址
看看后面有没有用到DMA。这里只是一个值的转换。
个人理解的。可能有问题。。。等待牛人来解答
我跟你理解差不多 但就是没看到DMA操作 怀疑下的源码有问题 但下了好几个版本 都是用memcpy直接操作的...刚接触CE还望高手多指点!
不能显示出图像?可能不是驱动层的问题哦。检查下dirce上面的
就是可以显示图像 所以奇怪 为什么memcpy用 物理地址也可以将图像拷贝到LCD frame
_buffer中 (FRAMEBUF_BASE地址定义为0xac120000 buffer_rgb地址为P模式一个fifo地址)按理说应该将FRAMEBUF_BASE和buffer_rgb经映射才可以在memcpy中使用啊??但实际上没有映射也成功了 所以觉得奇怪 是不是我的理解有问题啊???
billy14 说的进入kernel mode设置 是没有的
xqhrs232 说的 COPY很快啊 的确 对于一帧图像用DMA 和memcpy 差别不是太大 但memcpy 是在MMU下使用的 所以传给它的参数应该是虚地址而不是物理地址 而语句 memcpy((void *)(FRAMEBUF_BASE+ (240*pos_y + pos_x) + y*240*2),(void *)buffer_rgb,(QCIF_XSIZE)*2) 中用的确是没有进过映射的物理地址 如果FRAMEBUF_BASE 和buffer_rgb 都落在slot0的free virtual space 可以不映射 但显然不是这样的 难道这两个地址就是虚地址???再次请高手讲解~~~~I will always looking forwards 高手‘s answer!!O(∩_∩)O~
不会吧,我这边好像有SetKMode(TRUE)啊,你把你的Display_Cam_Image函数复制上来看看!
billy14 说得对 Display_Cam_Image 应该有SetKMode(TRUE) 但我下的代码中只有在Copy_Cam_Image才调用SetKMode(TRUE)进行模式转换 Display_Cam_Image中没有可能漏掉了 这样用memcpy就合理了 但是我还想请问billy14 如果Display_Cam_Image前调用了SetKMode(TRUE) 再用memcpy这样可以的还有一个必然条件是FRAMEBUF_BASE和 buffer_rgb地址虚拟地址和物理地址完全一样 我这边没有看到这样的静态映射你那边有吗????可以贴出来看看不 谢~~~~~~~~~~~
不明白你问题是什么意思?
我记得wince提供了4GB的虚拟地址空间,0~0x7fffffff为用户空间,0x80000000~0xffffffff为内核空间。
在进入kmode之后,有转换
buffer_rgb += VIRTUAL_OFFSET;(VIRTUAL_OFFSET=0x7c000000)