嵌入式linux字符设备驱动
2019-07-12 17:50发布
生成海报
ARM Linux 驱动 抵岸科技
1. 我们需要先调用register_chrdev_region()或 alloc_chrdev_region()来向系统申请设备号
int register_chrdev_region( dev_t first, unsigned int count, char *name ); //函数通过已知的设备号first来注册字符设备区域。
int alloc_chrdev_region( dev_t *dev, unsigned int firstminor, unsigned int count, char *name ); //若需要动态分配设备号,则使用该函数,此处dev作为指针,为仅用于输出的参数,分配成功后保存已分配范围的第一个编号。firstminor通常为0,表示第一个次设备号。
2.释放设备号
void unregister_chrdev_region( dev_t first, unsigned int count );
3.注册完字符设备区域之后
需要使用cdev_init函数初始化cdev结构和 file_operations结构
cdev->owner = THIS_MODULE;
void cdev_init( struct cdev *cdev, struct file_operations *fops); //为cdev结构指针创建内存,并将cdev->ops=fops;(抵岸科技注:源代码中并未见创建内存。cdev_init依次做了:cdev填充0,初始化表头,kobject成员初始化,将cdev->ops=fops)
接着讲cdev加入到内核中 int cdev_add( struct cdev *dev, dev_t num, unsigned int count);
完成字符设备的注册过程
以上函数需要#include
4. 自动创建字符设备节点
下面的函数需要 #include .
struct class *myclass; //声明一个class结构用于创建字符设备节点
myclass = class_create(THIS_MODULE,"myclass"); //"myclass"为类名
device_create(myclass,NULL,devno,NULL,"leds%d",0); //通过myclass结构创建字符设备,第二个参数是设备的parent,第三个参
数是设备号,第四个参数是传入内核的驱动数据void *类型指针,如果没有可以设置成NULL,最后一个参数是const char* fmt, ...,就是
格式化参数,即leds0
完成上述过程后会在/dev中找到leds0设备
貌似以前的老版本会用到devfs_mk_cdev来创建设备节点,但是最后发现linux-2.6.33并没有这个函数,应该是被上述函数取代
了吧
5. 当然,还包括驱动Makefile的编写以及应用程序
几处比较有用的参考文章:
http://hi.baidu.com/hust_junejun/blog/item/d2dcfcedc09833d92e2e213f.html //比较全面
http://www.dzsc.com/data/html/2009-8-28/78412.html //自动生成字符设备节点
http://fanyihui1986.blog.163.com/blog/static/7844859200911325826783/ //小型总结
6.TIPS
printk(KERN_WARNING" this is the test ");
KERN_ALERT
KERN_WANING
KERN_INFO
KERN_ERR
等等不同优先级 宏,具体可以查阅linux设备驱动程序三,字符设备驱动一章。
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮