- 8
- 0
- 约9.53千字
- 约 11页
- 2016-04-13 发布于浙江
- 举报
4412开发板android入门篇_字符设备驱动框架
字符设备驱动程序框架介绍
本章部分内容参看了《linux设备驱动详解》
第一部分为以前学习linux设备驱动详解一书时记录的一些字符设备常用函数及结构体,第二部分为以字符设备为模板写的LED驱动程序。
linux驱动程序一般分为三类:字符设备,块设备,网络设备
?
字符设备:
? ? ? ?字符设备以字节流的方式被访问,也即对字符设备的读写操作是以字节为单位的,字符设备的操作函数一般用到open,close,read,write等系统调用的函数。
常用的串口等设备的数据传输也是以字节为单位进行数据的交互。
块设备:
? ? ? ?在块设备上数据以块的方式被存放,比如flash,SD卡等上的数据以页为单位进行读写。对SD卡,硬盘等块设备的读写,应用程序可以使用open,open,
? ? ? ?close,read,write等系统调用函数对块设备以任意字节进行读写。
?
网络设备:
? ? ? ?网络设备同时具有字符设备,块设备的特点,数据的读写有一定的格式,以socket包的方式进行数据的传输。
编写设备驱动程序的一般步骤:
? ? ? 1.查看原理图硬件连接,查看控制设备数据手册,了解kernel中设备的操作函数集
? ? ? 2.在kernel中找到相似的设备驱动程序仿写。一般情况芯片商会提供相应芯片的驱动程序模板
? ? ? 3.实现驱动程序的初始化,及设备注册到kernel,创建设备节点
? ? ? 4.实现设备控制的操作函数集,如,常用的系统调用函数open,close,read,write等。
? ? ? 5.将驱动程序编译进kernel
? ? ? 6.编写应用测试驱动程序。
一.字符设备的常用函数
? ?1.驱动程序中设备的加载和卸载函数
module_init和module_exit,在写模块的时候这两个函数分别在insmod的时候和rmmod的时候调用。? ? ? 调用module_init函数用来向kernel中注册驱动程序,调用module_exit下载驱动程序。
二..字符设备常用函数和结构体
1.描述字符设备的结构体cdev
struct cdev {
?struct kobject kobj; ??
?struct module *owner;?
?const struct file_operations *ops;
?struct list_head list;
?dev_t dev; ? //设备号
?unsigned int count;
};
cdev结构体的dev_t 成员定义了设备号,为32 位,其中高12 位为主设备号,低?20 位为次设备号。
使用下列宏可以从dev_t获得主设备号和次设备号。
MAJOR(dev_t dev)
MINOR(dev_t dev)
而使用下列宏则可以通过主设备号和设备号生成dev_t。
MKDEV(int major, int minor)
2.操作cdev结构体用到的函数
?linux/fs/char_dev.c
此函数用于初始化cdev结构体的成员
void cdev_init(struct cdev *cdev, const struct file_operations *fops)
此函数为cdev结构体申请一块内存
struct cdev *cdev_alloc(void)
此函数向内核注册cdev
int cdev_add(struct cdev *p, dev_t dev, unsigned count)
此函数从内核删除cdev
void cdev_del(struct cdev *p)
3.设备号的申请与释放函数
为一个字符驱动一个或多个设备编号来使用是你请求的连续设备编号的总数是应当连接到这个编号范围的设备的名字; 它会出现在 /proc/devices 和 sysfs 中.返回值:成功返回0,出错返回负数用于设备号未知,向系统动态申请未被占用的设备号的情况该函数需要传递给它指定的第一个次设备号(一般为0)和要分配的设备数count,以及设备名,调用该函数后自动分配得到的设备号保存在dev中。
count:连续编号范围.??这个意思说假如major是248,count是2的话,249也就是相当于被使用的了
成功返回0,失败返回-1;
释放申请的设备号
void unregister_chrdev_region(dev_t from, unsigned count);
4.file_operations结构体
struct file_operations {
?struct module *owner; ?// 拥有该结构的模块的指针,一般为THIS_MODULES
?loff_t (*llseek) (struct f
原创力文档

文档评论(0)