嵌入式Linux驱动开发(一)chrdevbase虚拟字符设备
创始人
2024-05-31 13:50:38
0

Linux下三大驱动:字符设备,块设备,网络设备。一个硬件可以从属于不同的设备分类。

0. Linux应用程序对驱动程序的调用流程

在这里插入图片描述
在这里插入图片描述

  驱动加载成功后会在/dev目录下生成一个文件,对该文件的操作就是对设备的操作。当我们在用户态调用一个函数,会经过“系统调用(C库的一部分)”方法陷入内核空间,内核空间中有对应的驱动函数,由此实现控制。应用访问内核资源的三个方式:系统调用,异常(中断),陷入(软中断)
  Linux内核文件include/linux/fs.h中file_operations结构体保存了内核驱动操作函数集合。
  **Linux驱动有两种运行方式:①将驱动编译进内核,内核启动后自动运行;②驱动编译成.ko模块,内核启动后需要以“insmod”命令加载。**调试驱动一般编译为模块,避免每次都编译一遍linux。

1. 字符驱动设备

  字符设备是指逐字节流进行顺序读写操作的设备,比如LED,KEY,IIC,SPI,LCD等。

1.1 驱动模块加载卸载

字符驱动设备加载卸载函数模板:

static struct file_operations test_fops;  # 设备具体操作函数在这里面/* 驱动入口函数 */
static int __init xxx_init(void)          # 定义xxx_init驱动入口函数,使用__init修饰
{/* 入口函数具体内容 */int retvalue = 0;/* 注册字符设备驱动 */retvalue = register_chrdev(200, "chrtest", &test_fops);if(retvalue < 0){/* 字符设备注册失败,自行处理 */}return 0;
}/* 驱动出口函数 */
static void __exit xxx_exit(void)
{/* 出口函数具体内容 *//* 注销字符设备驱动 */unregister_chrdev(200, "chrtest");
}/* 将上面两个函数指定为驱动的入口和出口函数 */
module_init(xxx_init);      # 调用函数module_init注册xxx_init为驱动入口函数,加载驱动时调用
module_exit(xxx_exit);

模块加载命令:
①insmod:如果一个模块依赖另一个模块,必须先insmod依赖模块。
modprobe:会自动分析依赖并全部加载。
模块卸载命令:
rmmod:对应insmod。
②modprobe -r:对应modpeobe。全部卸载依赖可能导致其它模块受到影响。

1.2 字符设备加载卸载

  模块加载之后需要进行字符设备加载,字符设备注册一般在模块入口函数xxx_init中进行,注销在模块卸载函数xxx_exit中进行。函数原型为:

# major-主设备号	name-设备名	   fops-指向设备操作函数集合变量
static inline int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops)
static inline void unregister_chrdev(unsigned int major, const char *name)

  注册设备时必须确保主设备号没被占用,使用**“cat /proc/devices”查看当前已用设备号**。

1.3 设备具体操作函数

假设对设备有打开(open)关闭(release),读(read)写(write)操作的要求。
App中的函数就这样绑定到了驱动函数。

 static struct file_operations test_fops = {.owner = THIS_MODULE, .open = chrtest_open,.read = chrtest_read,.write = chrtest_write,.release = chrtest_release,
};

1.4 添加LICENSE和作者信息

MODULE_LICENSE("GPL");           # 必须添加,采用GPL协议
MODULE_AUTHOR("finches");        # 可加可不加

2. Linux设备号

  Linux中每个设备都有设备号,由主设备号次设备号组成。
  主设备号表示某一个具体的驱动,次设备号表示使用这个驱动的各个设备。设备号由dev_t数据类型表示(其实就是unsigned int 32类型),其中高12位主设备号,低20位次设备号。所以主设备号范围为0-4095。

2.1 主设备号分配

1)静态分配:开发者指定一个设备号,使用“cat /proc/devices”查看,没被占用就可以用。
2)动态分配:注册字符设备之前申请一个设备号,卸载时释放设备号。推荐使用。
 设备号申请函数:

int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)
# dev:保存申请到的设备号
# baseminor:次设备号起始地址,一个alloc_chrdev_region可以申请多个主设备号相同,次设备号不同的硬件
# count:申请设备数
# name:设备名

 设备号释放函数:

void unregister_chrdev_region(dev_t from, unsigned count)
# from:要释放的设备号
# count:从from开始,要释放的设备号数量

3. chrdevbase字符设备驱动开发实验

chrdevbase设备是一个虚拟设备,具有各100字节的读和写缓冲区。
1)编写驱动文件chrdevbase.c:
2)编写测试APP:

# open:pathname-要打开的设备或文件名。   flags-打开模式。
# 打开模式(必选的3个):O_RDONLY只读;O_WRONLY只写;O_RDWR读写。
# 返回值:打开成功返回文件的描述符
int open(const char *pathname, int flags)# read:fd-要读取的文件描述符。       buf:数据读取到该缓冲区。     count:要读取的字节数。
# 返回值:读取成功返回读取到的字节数,返回0代表读到了文件末尾。
ssize_t read(int fd, void *buf, size_t count)# write:fd-要进行写的文件描述符。
# 返回值:返回写入的字节数。        返回0表示没有写入任何数据。
ssize_t write(int fd, const void *buf, size_t count);# close:
int close(int fd);

3)编译驱动程序为.ko模块:
在这里插入图片描述
4)测试应用:

arm-linux-gnueabihf-gcc chrdevbaseApp.c -o chrdevbaseApp    # 编译
file chrdevbaseApp                                          # 查看应用信息

在ubuntu中将.ko和App拷贝到/lib/modules/4.1.15下,在开发板上运行:
1)加载驱动模块并检查

# 加载模块
modprobe chrdevbase.ko
# 若报错没有‘modules.dep’,输入‘depmod’命令即可自动生成# 查看当前存在的模块
lsmod# 查看系统所有设备
cat /proc/devices

2)创建设备节点文件

# 创建了chrdevbase节点文件,c表示字符设备,200为主设备号,0是次设备号
mknod /dev/chrdevbase c 200 0

3)设备操作测试
在这里插入图片描述
返回第一行:驱动程序中的chrdevbase_read函数输出信息
返回第二行:App输出的接收到的数据
4)卸载驱动模块

rmmod chrdevbase.ko

相关内容

热门资讯

环保发言稿 环保发言稿15篇  在我们平凡的日常里,我们都可能会用到发言稿,发言稿是作为在特定的情境中供口语表达...
《秋天的雨》的说课稿 《秋天的雨》的说课稿  一、说教材  (一)、教材分析  《秋天的雨》是义务教育课程标准实验教科书,...
会计论文的写作程序与要求 -... 会计论文的写作程序与要求 -论文完成会计论文的准备工作后,开始动手撰写论文,会计论文写作程序一般包括...
中学生学雷锋演讲稿 2017中学生学雷锋演讲稿  2017中学生学雷锋演讲稿【1】  老师们、同学们:  大家好!今天我...
毕业典礼上的讲话稿 毕业典礼上的讲话稿(汇编15篇)  在不断进步的社会中,我们都跟讲话稿有着直接或间接的联系,讲话稿是...
《六个馒头》说课稿 《六个馒头》说课稿3篇  引导语:作为一位不辞辛劳的人民教师,就有可能用到说课稿,写说课稿能有效帮助...
劳动委员的竞选稿 劳动委员的竞选稿(精选11篇)  在现在的社会生活中,我们越来越需要竞选稿,借助竞选稿可以让他人了解...
关于梦想的朗诵稿 关于梦想的朗诵稿(精选21篇)  在日常生活中,大家一定没少看到经典的朗诵稿吧,朗诵指大声朗读。就是...
《整理房间》说课稿 《整理房间》说课稿  一、说教材  1、教学内容  《整理房间》是北师大版一年级数学上册57页的内容...
成数与折扣数学说课稿 成数与折扣数学说课稿  教材说明  这是一节小学六年级的数学课。  学生分析  学生整体上思维敏捷,...
开班仪式的讲话稿 开班仪式的讲话稿(精选24篇)  在现实社会中,各种讲话稿频频出现,讲话稿是指把在一定场合下所要讲的...
全神贯注说课稿 全神贯注说课稿  作为一名专为他人授业解惑的人民教师,往往需要进行说课稿编写工作,说课稿是进行说课准...
区教研发言稿 区教研发言稿  现如今,需要使用发言稿的场合越来越多,发言稿是作为在特定的情境中供口语表达使用的文稿...
《认识面积》说课稿 《认识面积》说课稿  《认识面积》一课是学生正式学习平面几何的开始,是学生接下去学习面积单位和平面图...
高中语文评课稿 高中语文评课稿6篇高中语文评课稿1  一、如沐春风,教学形式与内容的统一  再次听XX老师授课,真有...
信息技术的评课稿 关于信息技术的评课稿  篇一:信息技术评课稿  听了两位信息技术教师的观摩课,总的感觉上得不错,很值...
小学生安全教育国旗下讲话稿 小学生安全教育国旗下讲话稿范文(通用3篇)  在社会发展不断提速的今天,越来越多地方需要用到讲话稿,...
小学数学一年级下册《认图形》... 小学数学一年级下册《认图形》说课稿范文  小学是我们整个学业生涯的基础,所以大家一定要培养良好的学生...
优秀学生发言稿 优秀学生发言稿  在现实社会中,我们使用上发言稿的情况与日俱增,发言稿的内容要根据具体情境、具体场合...
开学国旗下讲话稿 开学国旗下讲话稿(通用27篇)  在快速变化和不断变革的今天,我们都跟讲话稿有着直接或间接的联系,讲...