呵呵!在不同的开发板上,代码是不能通用的。尤其是对驱动来说。
编写显卡驱动,首先还是要看看显卡驱动要实现的功能。
Linux针对显卡常用的驱动方式是帧缓冲驱动。驱动和应用程序也用文件操作来交互(文件层-驱动层方式)。
帧缓冲设备对应文件名是/dev/fb*(framebuffer)这个形式。
驱动主要要实现这样几个操作:
fb_read 读 实现文件操作read
fb_write 写 实现文件操作write
fb_ioctl IO控制 实现文件操作ioctl
fb_mmap 映射 实现文件操作mmap
fb_open 打开 实现文件操作open
fb_release 关闭 实现文件操作close
以上操作被定义在file_operation的结构体变量fb_ops中。
具体实现的成员函数在linux/driver/video/fbmem.c中,这些函数实现具体硬件操作。
注意驱动层中还要有一个fb_info结构来存储显示设备的属性,根据具体用的显示设备来设置。
编写驱动主要要实现:
1.初始化函数
先根据显示解析度、色彩深度来申请缓冲,可以用kmalloc()来申请一段连续的空间;接着要初始化fb_info结构,根据实际设备设置属性,用register_framebuffer(&fb_info)注册到内核。
2.编写fb_info在fb_ops中对应的成员函数
对ucLinux,只需要实现下面3个函数
struct fb_ops
{
int(*fb_get_fix)(struct fb_fix_screen_info* fix,int con,struct fb_info* info);
int(*fb_get_var)(struct fb_fix_screen_info* fix,int con,struct fb_info* info);
int(*fb_set_var)(struct fb_fix_screen_info* fix,int con,struct fb_info* info);
}
这些是在include/linux/fb.h中定义的。用来获取和设置显示器信息,应用程序通过ioctl来调用这些函数。
3.读/写屏幕缓冲
打开/dev/fb1这样的显示设备,就可以操作了。例如最简单用cp dev/dev/fb temp就可以将屏幕内容写入temp这个文件;反之就将文件内容
在屏幕上面显示。
4.map(映射)
类似Windows的内存映射文件。Linux工作在保护模式,应用程序不能直接访问物理地址,Linux的文件操作file_operation中的mmap可以将文件内容映射到用户空间的一段虚拟地址。对帧缓冲设备也一样,也可以将屏幕缓冲区的物理地址映射到用户程序能够访问到的一段虚拟地址。映射之后就可以操作这段地址来在屏幕上绘图。不过ucLinux没有MMU,所以虚拟地址也是实地址了,不过对使用没有影响。
5.I/O控制
主要是用来设置屏幕的解析度,色彩深度等等。应用程序通过Ioctl()来与驱动交互,使用中主要还是调用2里面的函数。
具体的文件编写和连接到内核,就看这里吧!
如何在嵌入式Linux中增加自己的设备驱动程序
http://www.zntx.net.cn/viewthread.php?tid=15&extra=page%3D1http://www.zntx.net.cn/viewthread.php?tid=15&extra=page%3D1