字符设备驱动程序——开发步骤(2)
cdev结构体
struct cdev{
struct module *owner; //THIS_MODULE
const struct file_operations *ops; //操作方法集
dev_t dev; //设备号
unsigned int count; //设备个数
struct list_head list;
}
dev_t 设备号
- 用来唯一标识设备的。
- 数据类型:32位无符号整型
- 主设备号(前12位) + 次设备号(后20位)
- MAJOR(dev_t dev) //主设备号
- MINOR(dev_t dev) //次设备号
- MKDEV(int ma,int mi) //根据主、次设备号生成设备号
struct file_operations ----->>>操作方法集
struct file_operations{
struct module *owner;
loff_t (*llseek) (struct file *,loff_t,int);
ssize_t (*read) (struct file *,char __user *,size_t,loff_t *);
ssize_t (*write) (struct file *,const char __user *,size_t,loff_t *);
unsigned int (*poll) (struct file *,struct poll_table_struct *);
long (*unlocked_ioctl) (struct file *,unsigned int ,unsigned long);
int (*mmap) (struct file *,struct vm_area_struct *);
int (*open) (struct inode *,struct file *);
int (*release) (struct inode *,struct file *);
int (*fasync) (int,struct file *,int);
}
//提供给应用层的操作方法集
0、分配(注册)设备号
[1]、自动分配设备号
/***********************************************************
*功能:分配设备号
*参数:dev dev_t类型定义的变量,取地址传参
baseminor 次设备号的起始
count 个数
name 名字
*返回值:成功返回0,失败返回负数错误码
***********************************************************/
int alloc_chrdev_region(dev_t *dev,unsigned baseminor,unsigned count,const char *name){
}
[2]、指定设备号注册
/***********************************************************
*功能:注册设备号
*参数:from 设备号(MKDEV(major,minor))
count 个数
name 名字
*返回值:成功返回0,失败返回负数错误码
***********************************************************/
int register_chrdev_region(dev_t from,unsigned count,const char *name){
}
[3]、注销设备号
/***********************************************************
*功能:注销设备号
*参数:from 设备号(MKDEV(major,minor))
count 个数
*返回值:void
***********************************************************/
void unregister_chrdev_region(dev_t from,unsigned count){
}
1、为dev结构体分配内存空间
/***********************************************************
*功能:为cdev结构体分配空间
*参数:void
*返回值:结构体指针,成功返回分配到的结构体地址,失败了返回NULL
***********************************************************/
struct cdev *cdev_alloc(void){
}
2、初始化cdev结构体
/***********************************************************
*功能:初始化cdev结构体
*参数:cdev cdev结构体指针
fops 操作方法集指针
*返回值:void
***********************************************************/
void cdev_init(struct cdev *cdev,const struct file_operations *fops){
}
3、添加(注册)字符设备到内核中,由内核统一管理
/***********************************************************
*功能:添加(注册)字符设备到内核中
*参数:p cdev结构体指针
dev 设备号
count 设备个数
*返回值:成功返回0,失败返回错误码
***********************************************************/
int cdev_add(struct cdev *p,dev_t dev,unsigned count){
}
4、删除(注销)字符设备
/***********************************************************
*功能:删除(注销)字符设备
*参数: p cdev结构体指针
*返回值:void
***********************************************************/
void cdev_del(struct cdev *p){
}