字符设备驱动编写流程以及大概框架

本文详细阐述了在Linux环境下,如何编写字符设备驱动的基本步骤和核心框架,涵盖了从驱动注册到设备操作函数的实现,同时提及了混杂设备驱动的相关概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux设备驱动:
Linux设备驱动分为以下三类:
(1)字符设备:键盘,打印机
(2)块设备:硬盘,NAND
(3)网络设备:网卡


对于字符设备是最基本,最常见的设备:
对字符设备的驱动主要完成以下动作:
1、定义一个结构体static struct file_operations变量,其内定义一些设备的open,read,write,close等控制函数
2、在结构体外分别实现结构体中定义的这些函数
3、向内核中注册或删除驱动模块


块设备与字符设备的驱动结构是不同的,但是对于用户来说没有什么区别,块设备比字符设备要复杂,在I/O操作上极为不同表现在缓冲,I/O调度,请求队列等。
1、操作的硬件接口实现不一样;
2、数据块的数据有一定的格式


网络设备不同于字符和块设备,但是有字符和快设备的部分功能


字符设备注册有两种方式,可以以混杂设备注册:


字符设备步骤:
(1)分配cdev: struct cdev *cdev_alloc(void);
(2)初始化cdev: void cdev_init(struct cdev *cdev, const struct file_operations *fops);
(3)添加cdev: int cdev_add(struct cdev *p, dev_t dev, unsigned count)


在2.6版本之前字符设备注册方式:
int register_chrdev(unsigned int major,const char*name,struct file_operations *fops);
其中参数major如果等于0,则表示采用系统动态分配的主设备号;不为0,则表示静态注册。
major 是感兴趣的主设备号, name 是驱动的名子(出现在 /proc/devices), fops 是缺省的 file_operations 结构. 
一个对 register_chrdev 的调用为给定的主编号注册 0 - 255 的次编号,并且为每一个建立一个缺省的 cdev 结构. 
使用这个接口的驱动必须准备好处理对所有 256 个次编号的 open 调用( 不管它们是否对应真实设备 ), 
它们不能使用大于 255 的主或次编号.register_chrdev函数的major参数如果等于0,则表示采用系统动态分配的主设备号。
它所做的事情为:
(1). 注册设备号, 通过调用 __register_chrdev_region() 来实现
(2). 分配一个cdev, 通过调用 cdev_alloc() 来实现
(3). 将cdev添加到驱动模型中, 这一步将设备号和驱动关联了起来. 通过调用 cdev_add() 来实现
(4). 将第一步中创建的 struct char_device_struct 对象的 cdev 指向第二步中分配的cdev. 由于register_chrdev()是老的接口,这一步在新的接口中并不需要.


注销接口函数
int unregister_chrdev(unsignedintmajor,constchar*na
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值