工作需要,开始学习驱动开发。从课本上学习到的第一个简单的驱动开发及调试,记录如下。
建立源文件chardev.c,文件内容如下:
Makefile如下:
直接make,得到chardev.ko。
然后可以用insmod和rmmod转载和卸载该驱动。
运行insmod chardev.ko,然后我们cat /proc/devices查看设备信息,可以看到以下信息:
这里数字250对应代码中的MAJOR_NUM值,在insmod后如果看不到对应的信息(如250 chardev),原因是已经有这样的设备存在了,可以修改一个没有的值。
然后我们可以建立设备节点,mknod /dev/chardev c 250 0,那么在/dev下就可以找到对应的设备文件,此时我们就可以对这个设备文件进行操作。
以下是对设备文件/dev/chardev操作的测试代码chardevtest.c,这个测试工具打开设备文件,往设备文件中写入一个整数,然后再读取这个整数并显示:
直接gcc -o chardevtest chatdevtest.c编译成chardevtest,然后运行,运行时输入1,然后再读取设备值并显示在屏幕上。
注:
1.上面chardev_init()函数返回必须为0,否则会报-1 Device or resource busy的错误。
2.代码里有prink驱动打印的函数,内核打印函数只有在原屏幕上能打印出来,一般的终端登录工具上insmod和rmmod时将无法打印,此时会将
打印写到/var/log/message文件中。
3.在用测试程序打开文件时,驱动会调用read函数,从chardev_var中读取数值并显示。我们输入一个整数,然后驱动会调用write将数值写入chardev_var中。
这个过程可以(只能)在原屏幕上打印出来。
至此,测试结束。