日期:2014-05-16  浏览次数:20623 次

认认真真发一次,framebuffer 切换问题!!Android平台
Android平台,需要实现从LCD输出与DVI输出之间的切换,
在/dev/graphics下有三个fb,分别是fb0,fb1,fb2。

当我使用LCD作为默认输出时,我发现fb0是处理LCD输出的,fb1是用作DVI输出的。
当使用DVI作为默认输出时,fb0是DVI,fb1是LCD。

我可以通过 echo 0 > /sys/class/graphics/fb*使fb0,fb1都打开,Vsync信号和HSync信号都是正确的,clock信号也正确,但是只有一个地方会出现data信号,就是fb0。

那么,我怎么才可以实现data信号从fb0输出转到fb1的输出?

附上我的过程。
1. 使用framebuffer driver中带有的 swap_chan函数,我可以看到log out中,两个buffer的channel都是交换了,但是blank之后仍然只有fb0有数据,并没有改变什么。
2. 我使用fbcon.c中的一个函数。
在fbcon.c中有如下函数:
C/C++ code
/**
 *    set_con2fb_map - map console to frame buffer device
 *    @unit: virtual console number to map
 *    @newidx: frame buffer index to map virtual console to
 *      @user: user request
 *
 *    Maps a virtual console @unit to a frame buffer device
 *    @newidx.
 */
static int set_con2fb_map(int unit, int newidx, int user)


我以为这个函数的功能是实现 console 与 fb之间的映射,那我将原本的console与fb0的映射改成console与fb1的映射,是不是可以实现我所需要的功能呢?
遗憾的是,这个函数调用死机了。目前正在解决。
这个函数是可以用来实现此功能的吗?



谢谢各位给予指点或者参加讨论的朋友。
不管我上述内容的对与错,都希望有朋友可以帮忙解决。

------解决方案--------------------

不会挖!楼主加油,你一定能搞定的!

------解决方案--------------------
见个世面。呵呵。
------解决方案--------------------
我也顶一个..........
------解决方案--------------------
交换物理地址
数据流向自然就变了,比如流向a变成b LCD不断从a中取数据 DVI从b取数据,一看b中有数据,DVI就取了,mode不一样,一分析,分析不出来。--纯属个人观点

上层如果可以控制 下层肯定是可以实现的

楼主继续努力




------解决方案--------------------
1. 是不是 LCD、DVI分别有控制器?
在 fb_ioctl 函数中提供一个新的参数设置方法,可以切换模式,同时需要重新调用 mmap 函数重新映射显示数据缓冲区(需要 set_con2fb_map 函数中指定相应的)