驱动程序已经编译好了,现在把它安装到系统中去。
$ insmod ?–f ?test.o
如果安装成功,在 /proc/devices 文件中就可以看到设备 test,并可以看到它的主设备号。要卸载的话,运行 :
$ rmmod test
下一步要创建设备文件。
mknod /dev/test c major minor
c 是指字符设备,major 是主设备号,就是在 /proc/devices 里看到的。
用 shell 命令
$ cat /proc/devices
就可以获得主设备号,可以把上面的命令行加入你的 shell script 中去。
minor 是从设备号,设置成 0 就可以了。
我们现在可以通过设备文件来访问我们的驱动程序。写一个小小的测试程序。
#include 《stdio.h》
#include 《sys/types.h》
#include 《sys/stat.h》
#include 《fcntl.h》
main()
{
int testdev;
int i;
char buf[10];
testdev = open(“/dev/test”,O_RDWR);
if ( testdev == -1 )
{
printf(“Cann’t open file \n”);
exit(0);
}
read(testdev,buf,10);
for (i = 0; i 《 10;i++)
printf(“%d\n”,buf[i]);
close(testdev);
}
编译运行,看看是不是打印出全 1 ?
以上只是一个简单的演示。真正实用的驱动程序要复杂的多,要处理如中断,DMA,I/O port 等问题。这些才是真正的难点。上述给出了一个简单的字符设备驱动编写的框架和原理,更为复杂的编写需要去认真研究 LINUX 内核的运行机制和具体的设备运行的机制等等。希望大家好好掌握 LINUX 设备驱动程序编写的方法。
07
嵌入式驱动的结构分析
在 Linux 系统上编写驱动程序,说简单也简单,说难也难。难在于对算法的编写和设备的控制方面,是比较让人头疼的;说它简单是因为在 Linux 下已经有一套驱动开发的模式,编写的时候只需要按照这个模式写就可以了,而这个模式就是它事先定义好的一些结构体,在驱动编写的时候,只要对这些结构体根据设备的需求进行适当的填充,就实现了驱动的编写。