|
楼主 |
发表于 2009-3-31 10:05:00
|
显示全部楼层
我现在在考虑是否可以把LCD模拟和LCD实现从源代码上分离.
当前考虑的解决方案是把LCD DMA的数据直接写到文件中.这样的话,skyeye这边可以只向文件中写像素,而LCD的显示部分就从skyeye中独立出来.以后如果要实现GUI 接口,类似VirtualBox或者vmware的集成界面,会容易很多. 因为不再需要skyeye源代码的支持. 另外skyeye得到的好处是不再需要GTK开发环境的支持,更容易移植. 我相信posix文件接口在几乎所有OS上都有实现.
举个例子:
我们有一个新的后端叫做skyeye_lcd_file类似skyeye_lcd_gtk
在skyeye_lcd.c中直接使用open read write(无缓存文件操作函数), 或者直接mmap文件到
虚拟空间. 一个我能想到的好处是如果要截屏之类的功能,就用gimp或者photoshop之类的软件直接打开这个文件就可以了(raw格式).
另外在LCD实现端, 可以用实现GTK/GDI/QUERTZ之类的API,实现也很简单
用mmap或者CreateFileMapping映射文件,直接拷贝到屏幕就可以(skyeye当前的实现就是这样子) ; 如果考虑到硬件加速实现,可以实现opengl, 使用glTexGen/glBindTexture 系列绑定为纹理,然后显示在屏幕.
另外需要一个文件也用mmap的方式映射到skyeye中,其中的内容是DMA格式信息.
typedef struct FBHDR{
ULONG header_size; //in unit of bytes
ULONG version;
ULONG width;
ULONG length;
ULONG depth;
ULONG format;
ULONG IsUpdate;
ULONG rectangle_x;
ULONG rectangle_y;
ULONG rectangle_width;
ULONG rectangle_length;
}Framebuffer_header;
这个东西有什么好处,在LCD显示部分,可以轮训IsUpdate成员检查FrameBuffer是否更新,而不用每隔多少时间强制跟新一次. 因为我们模拟arm指令实际上很慢, 实际处理LCD IO的时间并不是很多.通过轮训的方法可以很大程度上减少CPU时间. |
|