字符驱动
//////////////前边主要是说的是杂项设备驱动的注册,下边是字符驱动/////////////////
2018.2.26
申请字符类设备号。
设备号有好多种,今天学的是字符类设备号的申请,字符类设备号分为主设备号,和从设备号,下边的连接里边的东西可以参考一下。
http://blog.sina.com.cn/s/blog_707dde150102wp10.html
设备号申请有两个常用的函数,一个是静态申请register_chrdev_region(),一个是动态申请alloc_chrdev_region(),下边是简单的介绍。
1.头文件
#include 设备函数所在的头文件
#include MKDEV转义数据设备号类型宏定义
#include 定义字符类设备
2.注册函数说明
静态注册int register_chrdev_region(dev_t from, unsigned count, const char *name)
Form :要分配设备编号范围的初始值。
Count:连续编号范围 。
*Name:编号关联设备名称
Form用的是 dev_t类型定义,MKDEV(dev_magor, dev_minior);这个函数获得,这个函数有两个参数,一个是主设备号,一个是从设备号。
常见的用法
通过外部传参将参数主从设备号传进去。
打印主从设备号,或得form这个参数,进行设备注册。
动态注册int alloc_chrdev_region(dev_t *dev,unsigned int firstminor,unsigned int count,char *name);
*dev: 返回的设备编号,需要通过MMOR()获取主设备号。
Firstminor: 请求最小的次编号
Count: 请求连续设备编号的总和
*name: 设备名称
简单用法
不写了。
当然还有个行数,设备号卸载函数
unregister_chrdev_region(MKDEV(dev_magor, dev_minior), dev_minor_num);
这个是注销静态申请的,第一个主设备号,第二个连续设备号和。
unregister_chrdev_region(dev_magor,dev_minor_num);
这个是注销动态申请的,第一个主设备号,第二个连续设备号和。
2018.3.2
设备节点已经注册完了,下边写的是字符类设备的注册,在杂项设备中没有涉及到一个class这个类,因为系统已经打包好了,不用我们去管了,但是字符驱动就需要自己去写了。
上边图片就是杂项设备的设备,但是char的都是自己定义了,下边是介绍。
这个是class的结构体
Class类的创建函数 class_create()
第一个参数是owner,一般是 THIS_MODULE
第二个参数苏是name,要定义的class的名称。
下便是使用方式:
struct class *myclass;
myclass = class_create(THIS_MODULE, CLASS_NAME);
开始内存分配void *kmalloc(size_t size, int flags);
头文件#include
Size内存大小
Flags一般常用 GFP_KERNEL