snifer

【原创】嵌入式字符设备驱动概述

0
阅读(1886)

成都六月天,阴沉沉的,最近在做驱动,今天给大家写一下相关的内容。

声明头文件:linux/cdev.h

struct cdev {

...

struct module *owner; //一般是THIS_MODULE

const struct file_operations *ops;//指向操作方法集,用于登记初始化、注销、控制等操作设备函数

dev_t dev; //设备号,用于查找设备

unsigned int count; //设备数量,一般是1.

};

4.2、主要的字符设备对象内核函数

/*

*功能:分配字符设备对象

*参数:

* void

*返回值:

*成功:指向字符设备对象的首地址指针;失败:NULL

*/

struct cdev *cdev_alloc(void);

/*

*功能:初始化字符设备对象

*参数:

* struct cdev *指向被初始化的字符设备对象

* const struct file_operations *指向操作方法集

*返回值:

* void

*/

void cdev_init(struct cdev *, const struct file_operations *);

/*

*功能:注册字符设备对象

*参数:

* struct cdev *指向被注册的字符设备对象

* dev_t设备号

* unsigned设备数量

*返回值:

*成功:0;失败:错误码

*/

int cdev_add(struct cdev *, dev_t, unsigned);

/*

*功能:注销字符设备对象

*参数:

* struct cdev *指向被注销的字符设备对象

*返回值:

* void

*/

void cdev_del(struct cdev *);

4.3、字符设备操作函数集

struct file_operations主要用来登记控制设备的接口,驱动设计者编写好控制设备的函数,登记在这个结构体里面,封装进cdev对象里,注册给用户层来用调用。

声明头文件:linux/fs.h

struct file_operations {

//模块所有者,一般是THIS_MODULE

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 *);

//异步读接口

ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);

//异步写接口

ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);

//轮询接口

unsigned int (*poll) (struct file *, struct poll_table_struct *);

//设备参数读写、状态读及控制接口

int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);//加内核锁接口

long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);//未加内核锁接口

long (*compat_ioctl) (struct file *, unsigned int, unsigned long);

//把内核空间映射给用户层的接口

int (*mmap) (struct file *, struct vm_area_struct *);

//打开设备接口

int (*open) (struct inode *, struct file *);

//刷新设备数据接口

int (*flush) (struct file *, fl_owner_t id);

//关闭设备接口

int (*release) (struct inode *, struct file *);

//异步通知接口

int (*fasync) (int, struct file *, int);

...

};

下面就讲设备号的用处了!



Baidu
map