字符设备驱动

1、字符设备驱动框架

1.1、字符设备

定义:只能以一个字节一个字节的方式读写的设备,不能随机的读取设备中的某一段数据,读取数据需要按照先后顺序。(字符设备是面向字节流的)

常见的字符设备:鼠标 键盘 串口 控制台

块设备:可以从设备的任意位置读取一定长度数据的设备。

常见的块设备:硬盘 磁盘 光盘 U盘 SD卡 TF卡

1.2、字符设备驱动框架

初始化流程

  1. 申请设备号(静态申请 动态申请)

  1. 创建一个字符设备

  1. 初始化字符设备

  1. 将设备号和字符设备关联起来

exit流程

  1. 删除字符设备

  1. 删除设备号

1.2.1 设备号

定义:设备号是设备在内核中的身份和标识,是内核区分不同设备的唯一信息,设备号是由主设备号和次设备号构成,主设备号表示一类设备,次设备号表示该类设备中的某一个设备。

设备号:是一个32bit的无符号整数,高12bit是主设备号,低20bit是次设备号。

内核函数和库函数的区别:库函数是语言本身的一部分,而系统函数是内核提供给应用程序的接口,属于系统的一部分。

1.2.2 申请设备号

申请设备号的两种方式:

静态申请

  • int register_chrdev_region(dev_t from, unsigned count, const char *name)

作用:静态申请设备号
from:设备号(由主次设备号构成)
count:子设备个数
*name:设备名称
返回值:0–>成功 非0–>失败
  • void unregister_chrdev_region(dev_t from, unsigned count)

作用:从内核中移除设备号
from:设备号(由主次设备号构成)
count:子设备个数

动态申请

  • int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)

作用:动态申请设备号
*dev:指向设备号的指针
baseminor:子设备的第一个编号
count:子设备个数
*name:设备名称
返回值:0–>成功 非0–>失败

1.2.3 创建字符设备

作用:创建一块用于存放字符设备的空间
返回值:是指向创建成功的字符设备的指针
  • void cdev_del(struct cdev *p)

作用:删除字符设备
*p:指向字符设备的指针

1.2.4 初始化字符设备 --> 绑定驱动方法

  • void cdev_init(struct cdev *cdev, const struct file_operations *fops)

作用:初始化字符设备
*cdev:指向字符设备的指针
*fope:指向操作字符设备的函数集的指针

1.2.5 字符设备与设备号关联

  • int cdev_add(struct cdev *p, dev_t dev, unsigned count)

作用:将字符设备和设备号关联,并将字符设备添加到内核中
*p:指向字符设备的指针
dev:设备号
count:子设备的个数
返回值:成功为0 失败非0
退出函数
  1. 删除设备 cdev_del

  1. 删除设备号unregister_chrdev_region

测试步骤

sudo insmod hello.ko

dmesg |tail -->250 0

cat /proc/devices–>查看设备号 250 0

sudo mknod /dev/haha0 c 250 0

ls -l /dev/haha*—>查看创建字符设备文件

sudo ./test–>open hahao ok!

dmesg |tail–>helloopen/helloClose

sudo rmmod hello.ko

sudo rm /dev/haha0

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值