第一个字符设备驱动程序

在编译模块之前首先要:配置并编译内核

板子中烧写的内核是打过补丁的linux-2.6.22.6,在编译驱动程序时,要在Makefile里指定使用的linux源码路径,也就是说驱动程序的编译依赖于内核源码,具体为啥不是很懂。

现在暂时理解为:既然驱动程序要编译为内核的一个可加载的模块,那模块总得知道它自己要加载到的是什么东西吧。

1、在si里面建立一个打过补丁的linux-2.6.22.6工程,里面有很多现成的驱动程序和函数原型可以参考。

2、新建一个.c文件,这个文件不用加入内核工程

3、按最简单的字符设备框架完成函数:xxx_init()  xxx_open()  xxx_write()  xxx_exit(),定义一个file_operations结构体,完成xxx_init xxx_exit函数的修饰:module_init(first_drv_init);module_exit(first_drv_exit);

  再加一个MODULE_LICENSE("GPL");

  在linux中执行命令insmod xxx.ko时,会调用xxx_init()函数向内核注册驱动程序。第一个参数是主设备号,如果不为0,字符驱动的主设备号就等于指定的主设备号;如果等于0,表示驱动程序的设备号由内核分配。

  使用cat /proc/devices命令可以看当前内核装载了哪些驱动程序,主设备号是多少。

  现在知道了驱动程序的主设备号。

  再使用mknod /dev/xxx c <主设备号> <次设备号>命令,可以创建设备文件。这样应用程序就可以使用open()、write()函数,通过搜索文件的主设备号,来最终调用驱动程序里实现的函数(xxx_read、xxx_write)了。

  

完成驱动程序的.c文件编写以后,需要修改Makefile:1、修改内核源码的路径  2、修改目标文件的名字xxx.ko

将两个文件上传服务器make一下就行了。

再执行命令insmod xxx.ko加载内核模块,执行cat /proc/devices查看主设备号,执行mknod /dev/xxx c <主设备号> <次设备号>创建设备文件

第一个驱动程序的问题:每次都要cat /proc/devices查看主设备号,再用mknod创建设备文件之后,应用程序才能用open函数打开这个设备文件,去调用驱动程序里的函数,非常麻烦。

原文地址:https://www.cnblogs.com/physworld/p/14806777.html