字符设备驱动程序——开发步骤(2)

字符设备驱动程序——开发步骤(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){
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值