uClinux下的驱动和标准的,基于module的驱动还是有一些区别的,但不是太大。先明确几个概念:系统调用、主设备号、方法、内核
系统调用:编过linux下应用程序的人肯定知道,想使用linux下的设备是要通过调用一些C函数来实现的。
具体的说就是open( ),release( ),read( ),write( ),ioctrl( ),mmap( )等。这些C函数对应着linux下的系统调用,open,release,read,write,ioctrl,mmap等。系统调用是驱动的唯一用户。系统调用向内核要求使用某种设备,然后由内核决定调用那种驱动程序来使用硬件。
主设备号:前面说内核使用驱动程序,但内核如何把一种系统调用请求和某种具体的设备驱动相关联呢?这就要用到主设备号。
主设备号是内核用于识别某种设备驱动的唯一标志。例如fb0设备的主设备号是major 29,即是说,凡是主设备号为29的设备都是fb设备,都要调用fb驱动。驱动程序的注册其实就是将自己的驱动程序和主设备号相关联,然后让系统知道, “我在这里”。这样,内核就可以把系统调用请求转化为对相应设备驱动的具体函数调用。
方法:驱动程序应该是可重入的,应该只提供一种正确的使用硬件设备的方法,而不能干涉上层如何使用它。
内核:内核实质上是用户程序和底层驱动之间的一个中间层,它捕获系统调用、中断请求等等信息,调用相应的驱动程序或中断处理程序来进行。当然,这是仅仅站在驱动的角度上说的,实际上它还负责任务调度、内存管理,多线程同步等等工作。
下面,结合FrameBuffer驱动具体说一下在我们的开发平台上如何进行驱动的修改。
首先,我们要搞清楚fb驱动到底和什么文件有关。这种信息的来源主要有两个:
其一是makefile;
makefile 是一种嵌套结构,也就是说,上层很复杂的Makefile我们其实没有必要完全搞明白。具体的说,我们的fb驱动在linux2.6.x\drivers \video文件夹下面。那么,相关的makefile也肯定在这个文件夹下面。打开它,在其中找到了这样几行:
obj-$(CONFIG_FB) += fbmem.o fbmon.o fbcmap.o fbsysfs.o modedb.o softcursor.o
……….
obj-$(CONFIG_FB_BFIN_7171)+= bfin_ad7171fb.o bfin_ad7171fb_config.o videoupdate.o
很清楚的,我们可以看出,如果想加入FB驱动的话,就一定要生成fbmem.o fbmon.o fbcmap.o fbsysfs.o modedb.o softcursor.o这几个.o文件。根据编译规则,这些.o文件应该是由和他们同名的.c或.s文件生成的,在文件夹里寻找,很容易找到了 fbmem.c,fbmon.c,fbcmap.c等文件。
再看FB_BFIN_7171,它依赖于三个.o文件,也很容易找到他们的.c,.s文件。
这里要说明一下,我们实际上使用了新内核(来自ADI网站的Release版)中的源文件,bfin_ad7171fb_main.c 和rgb2ycbcr.S。
Makefile中的语句是
obj-$(CONFIG_FB_BFIN_7171) += bfin_ad7171fb.o
bfin_ad7171fb-objs := bfin_ad7171fb_main.o rgb2ycbcr.o
然后说一下CONFIG_FB_BFIN_7171的意义,这个变量是定义在Kconfig中的,Kconfig也是嵌套调用的,由make调用, video目录下也有相应的kconfig文件,可以打开看看,建议google “kconfig 语法”来获取更多信息。总之里面有这样一段:
config FB_BFIN_7171
bool "Blackfin ADI7171 video encoder on uClinux"
depends on FB && BFIN
help
This is the framebuffer device for a AD7171 video encoder
attached to a Blackfin on the PPI port.
If your Blackfin board has a 7171 select Y.
这样看的很清楚了吧,make menuconfig时读取kconfig,然后所做的配置就是给FB_BFIN_7171之类的bool变量赋值,这样,在make按照 makefile进行编译的时候,就能根据这些变量决定某些.o文件是不是必需的,要不要编译或检查更新。
