本章主要讲了:首先注册设备号,然后注册cdev,最后是对操作函数的书写。
1.对于注册设备号。
对于设备号:分为主设备号,次设备号。占32位,高12位用于主设备号,后20位用于此设备号。主设备号主要指向设备驱动程序,次设备号主要指向具体的设备
设备号的分配:静态分配和动态分配。通常用动态分配。权衡的办法是用脚本对静态分配与动态分配进行选择。
通常注册设备号会在/proc/devices /dev/ 中会有相应的节点
涉及到的函数及结构:
#include <linux/type.h>
dev_t
int MAJOR(dev_t dev);
int MINOR(dev_t dev)
dev_t MKDEV(unsigned int major,unsigned int minor)
#include <linux/fs.h>
int register_chrdev_region(dev_t first,unsigned int count ,char *name);
int alloc_chrdev_region(dev_t *dev,unsigned int firstminor,unsigned int count,char *name);
void unregister_chrdev_region(dev_t first,unsigned int count);
2.对于注册cdev
有三个数据结构:struct file_operations 、 struct file 、struct inode
其中struct file_operations中主要是指向对文件进行操作的函数指针
struct file中主要是对文件open后的一些性质,如权限、偏移量、标志位等
struct inode中有两个比较重要的域用于驱动程序,一个是设备号,一个是struct cdev。后者用于内核的使用
对于后者,通常内核分配一定的内核空间,然后初始化struct cdev,然后注册该结构,一旦注册内核就可以使用对该文件的操作函数了。因而在注册前,需将操作函数准备就绪。
涉及到的函数及结构:
struct file_operations;
struct file;
struct inode;
#include <linux/cdev.h>
struct cdev *cdev_alloc(void);
void cdev_init(struct cdev *dev,struct file_operations *fops);
int cdev_add(struct cdev *dev,dev_t num,unsigned int count);
void cdev_del(struct cdev*dev)
3.操作函数