这段时间学习了关于设备驱动的知识,这里给自己做个总结,给大家做个参考(所有的代码参考自国嵌)。
驱动分类:字符设备驱动,网络接口驱动,块设备驱动。
驱动程序的安装方法:模块,编译进内核。
Linux用户程序通过设备文件来使用驱动程序操作字符设备和块设备。主设备号用来反映设备的类型,此设备号用来区分同类型的设备。一般的流程是在PC上写好驱动程序,编译出模块之后拷贝到目标开发板上/lib/modules目录下(方法有很多种不详细说了,我是挂载根文件的),接着使用insmod加载进内核。
注意:模块的内核需要和开发板上的内核一致。
在PC上可以使用 modinfo查看已经编译好的模块信息
license: GPL
author: David Xie
depends:
vermagic: 2.6.32.2-FriendlyARM mod_unload ARMv4
parm: mem_major:int
开发板上可以使用 uname -r 的命令查看系统内核
[root@FriendlyARM 2.6.32.2-FriendlyARM]# uname -r
2.6.32.2-FriendlyARM
以下是使用到的Makefile的源码:
ifneq ($(KERNELRELEASE),)
obj-m := memdev.o
else
KDIR := /opt/FriendlyARM/mini2440/linux-2.6.32.2
all:
make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers modul*
endif
KDIR变量表示内核所在目录,要求与开发板上的内核的一致。
加载进内核之后可以使用cat /proc/devices查看主设备号(主设备号的分配有静态和动态之分,动态分配的主设备是未知的,需要查看之后才能建立设备文件),接着可以根据设备号建立设备文件了,以字符设备为例mknod /dev/memdev0 c 251 0,其中memdev0为设备文件名,c表示字符设备,251为主设备号,0为次设备号。这样就建立起了设备文件和驱动程序的联系了,我们可以通过/dev/memdev0设备文件来开发应用程序。