Linux驱动开发2:字符设备驱动

Linux驱动开发2:字符设备驱动

字符设备驱动开发流程

字符设备是 Linux 驱动中最基本的一类设备驱动,字符设备就是一个一个字节,按照字节流进行读写操作的设备,读写数据是分先后顺序的。比如最常见的点灯、按键、 IIC、 SPI, LCD 等等都是字符设备,这些设备的驱动就叫做字符设备驱动。

驱动就是获取外设、或者传感器数据,控制外设。数据会提交给应用程序。Linux驱动编译既要编写一个驱动,还要我们编写一个简单的测试应用程序,APP,Linux下驱动和应用是完全分开的。

字符设备的注册与注销

注册字符设备使用register_chrdev函数

函数原型:static inline int register_chrdev(unsigned int major, const char *name, const struct file_operations *fops)

major: 主设备号, Linux 下每个设备都有一个设备号,设备号分为主设备号和次设备号两部分
name:设备名字,指向一串字符串。
fops: 结构体 file_operations 类型指针,指向设备的操作函数集合变量。

注销字符设备使用 unregister_chrdev函数

函数原型:static inline void unregister_chrdev(unsigned int major, const char *name);
major: 要注销的设备对应的主设备号。
name: 要注销的设备对应的设备名。

设备号
Linux 中每个设备都有一个设备号,设备号由主设备号和次设备号两部分组成,主设备号表示某一个具体的驱动,次设备号表示使用这个驱动的各个设备

Linux 提供了一个名为 dev_t 的数据类型表示设备号

dev_t 其实就是 unsigned int 类型,是一个 32 位的数据类型,其中高 12 位为主设备号, 低 20 位为次设备号。

可以通过cat /proc/devices命令查看当前设备中已被使用的主设备号

在这里插入图片描述

字符驱动编写

字符设备驱动的编写主要就是驱动对应的open/close/read/write函数的编写,本质上就是对file_operations结构体的成员变量的实现。

在此给出结构体函数定义
在这里插入图片描述
完善实现file_operations结构体的成员变量open/close/read/write函数的实现后进行编译
在这里插入图片描述

编写应用程序进行测试

在这里插入图片描述
加载驱动后移植应用代码进行测试
在这里插入图片描述
输入命令手动创建驱动节点
在这里插入图片描述

输入命令测试chrdevbase驱动
在这里插入图片描述
最后给出一般流程下的完整字符设备驱动框架

字符驱动开发总流程
一、设备树定义
1、在设备树文件中定义节点示例:gpioled {#address-cells = <1>;#size-cells = <1>;compatible = "alientek,gpioled";pinctrl-names = "default";pinctrl-0 = <&pinctrl_gpioled>;led-gpios = <&gpio1 3 GPIO_ACTIVE_LOW>;status = "okay";};pinctrl_gpioled: gpiogrp {fsl,pins = <MX6UL_PAD_GPIO1_IO03__GPIO1_IO03	0x10b0	/* gpioled */	>;};二、驱动代码开发
1、module_init和module_exit
2、声明模块相关信息1-作者:MODULE_AUTHOR(author);2-描述:MODULE_DESCRIPTION(description);3-版本:MODULE_VERSION(version_string);4-设备表:MODULE_DEVICE_TABLE(table_info);5-别名:MODULE_ALIAS(alternate_name);6-开源协议:MODULE_LICENSE("GPL");
3、定义字符设备结构体
4、定义设备操作函数 file_operations
5、实现init函数流程1-注册字符设备,判断major是否已被指定Y:register_chrdev_region(dev_t from, unsigned count, const char *name)N:alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)	-> MAJOR,MINOR2-添加cdev字符设备cdev_init(struct cdev *cdev, const struct file_operations *fops) -> cdev_add(struct cdev *p, dev_t dev, unsigned count)3-创建class设备类	class_create(owner, const char *name)4-创建device设备device_create(struct class *class, NULL , dev_t devt, NULL, const char *name)5-获取设备树节点信息of_find_node_by_path(const char *path)5.1-获取对应的GPIOof_get_named_gpio(struct device_node *np, const char *propname, int index)5.2-申请IOgpio_request(unsigned gpio, const char *label)5.3-设置GPIO口输入输出模式并配置默认输出模式gpio_direction_output(unsigned gpio, int value)5.4-设置指定GPIO口电平值gpio_set_value(unsigned int gpio, int value)6-获取设备树属性信息of_property_read_string-字符串of_property_count_elems_of_size-获取数组大小of_property_read_u32_array-从数组中获取每个元素等7-实现write操作函数-从应用程序用户空间拷贝数据copy_from_user(void *to, const void __user *from, unsigned long n)//7-实现地址映射//	ioremap 或 of_iomap
6、实现exit函数流程1-释放GPIOgpio_free(unsigned gpio)//2-取消地址映射//	iounmap3-删除device设备device_destroy(struct class *class, dev_t devt)4-删除class设备类class_destroy(struct class *cls)5-注销cdev字符设备cdev_del(struct cdev *p)6-释放设备号unregister_chrdev_region(dev_t from, unsigned count)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914289.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914289.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RuoYi-Cloud 验证码处理流程

以该处理流程去拓展其他功能模块处理流程&#xff0c;进而熟悉项目开发代码一、思路JavaWeb流程主干线&#xff1a;发起请求、处理请求、响应请求二、登录页面在登录页面按键F12打开开发者工具&#xff0c;点击network&#xff0c;刷新页面&#xff0c;点击code&#xff0c;查看…

云计算三大服务模式深度解析:IaaS、PaaS、SaaS

架构本质&#xff1a;云计算服务模式定义了资源抽象层级和责任分担边界&#xff0c;形成从基础设施到应用的全栈服务金字塔。三种模式共同构成云计算的服务交付模型核心框架。一、服务模式全景图 #mermaid-svg-f0Klw2fbuhBQqJTh {font-family:"trebuchet ms",verdana…

【sql学习之拉链表】

1.拉链表理解 记录历史。记录一个事物从开始&#xff0c;一直到当前状态的所有变化的信息。字段说明&#xff1a; start_dt&#xff1a;该条记录的生命周期开始时间 end_dt&#xff1a;该条记录的生命周期结束时间 end_dt’9999/12/31’表示该条记录目前处于有效状态 如果查询当…

STM32中实现shell控制台(shell窗口输入实现)

文章目录 一、总体结构二、串口接收机制三、命令输入与处理逻辑四、命令编辑与显示五、历史命令管理六、命令执行七、初始化与使用八、小结在嵌入式系统开发中,使用串口Shell控制台是一种非常常见且高效的调试方式。本文将基于STM32平台,分析一个简洁但功能完整的Shell控制台…

区分三种IO模型和select/poll/epoll

部分内容来源&#xff1a;JavaGuide select/poll/epoll 和 三种IO模型之间的关系是什么&#xff1f;区分普通IO和IO多路复用普通IO&#xff0c;即一个线程对应一个连接&#xff0c;因为每个线程只处理一个客户端 socket&#xff0c;目标明确&#xff1a;线程中直接操作该 socke…

Actor-Critic重要性采样原理

目录 AC的数据低效性&#xff1a; 根本原因&#xff1a;策略更新导致数据失效 应用场景&#xff1a; 1. 离策略值函数估计 2. 离策略策略优化 3. 经验回放&#xff08;Experience Replay&#xff09; 4. 策略梯度方法 具体场景分析 场景1&#xff1a;连续策略更新 场…

【赠书福利,回馈公号读者】《智慧城市与智能网联汽车,融合创新发展之路》

「5G行业应用」公号作家团队推出《智慧城市与智能网联汽车&#xff0c;融合创新发展之路》。本书由机械工业出版社出版&#xff0c;探讨如何通过车城融合和创新应用&#xff0c;促进汽车产业转型升级与生态集群发展&#xff0c;提升智慧城市精准治理与出行服务效能。&#xff0…

5G NR PDCCH之处理流程

本节主要介绍PDCCH处理流程概述。PDCCH&#xff08;Physical Downlink Control Channel&#xff0c;物理下行控制信道&#xff09;主要用于传输DCI&#xff08;Downlink Control Information&#xff0c;下行控制信息&#xff09;&#xff0c;用于通知UE资源分配&#xff0c;调…

力扣网编程135题:分发糖果(贪心算法)

一. 简介本文记录力扣网上涉及数组方面的编程题&#xff1a;分发糖果。这里使用贪心算法的思路来解决&#xff08;求局部最优&#xff0c;最终求全局最优解&#xff09;&#xff1a;每个孩子只需要考虑与相邻孩子的相对关系。二. 力扣网编程135题&#xff1a;分发糖果&#xff…

每日mysql

什么是Mysql索引最左匹配原则&#xff1f;最左匹配原则是指&#xff0c;在复合索引中&#xff0c;查询条件需要从左到右和索引开始依次完全匹配的时候&#xff0c;复合索引才可以被有效使用。因为联合索引在建立b树的过程中是根据索引的顺序从左到右进行排序的&#xff0c;所以…

树莓派5-ollama-linux-arm64.tgz 下载

1.下载 由于官方下载速度太慢且容易失败&#xff0c;我这里上传了一份到云盘供大家下载&#xff1a; 通过网盘分享的文件&#xff1a;ollama-linux-arm64.tgz 链接: https://pan.baidu.com/s/1tx_OPpl-8O2HJfXlP4tXTg?pwdffwx 提取码: ffwx --来自百度网盘超级会员v4的分享 …

2024年团体程序设计天梯赛

比赛链接 https://ac.nowcoder.com/acm/contest/80027 A&#xff1a; JMU-1 考察搜索的能力百度一下可知&#xff0c;2024 年天梯赛总决赛的比赛日为4 月 20日 参考代码 //2024 年天梯赛总决赛的比赛日为4 月 20日 void solve(){//A20-7cout<<"H\n"; } B&…

基于CMMI的软件质量管理体系深度解析

核心理念&#xff1a;CMMI&#xff08;Capability Maturity Model Integration&#xff09;是通过过程改进驱动质量提升的体系化框架&#xff0c;其本质是建立可量化、可重复、可优化的工程管理能力一、CMMI体系框架与演进 #mermaid-svg-MdDBl2P8fSHYDHMc {font-family:"t…

2025年渗透测试面试题总结-2025年HW(护网面试) 44(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 2025年HW(护网面试) 44 1. SQL注入常用函数 2. SQLMap爆当前库名参数 3. Nmap探测系统参数 4. Nmap小写 …

【操作系统-Day 5】通往内核的唯一桥梁:系统调用 (System Call)

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…

完整 Spring Boot + Vue 登录系统

项目名称&#xff1a;springboot-vue-login-template✅ 功能一览模块功能后端Spring Boot MyBatis Plus JWT Shiro数据库MySQL 用户表前端Vue3 Element Plus Axios登录流程用户名/密码验证 → 返回 Token → 存储 LocalStorage权限控制拦截器校验 Token Shiro 角色权限跨…

Redis 基础详细介绍(Redis简单介绍,命令行客户端,Redis 命令,Java客户端)

1. Redis 简介Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存数据库&#xff0c;遵守 BSD 协议&#xff0c;它提供了一个高性能的键值&#xff08;key-value&#xff09;存储系统&#xff0c;常用于缓存、消息队列、会话存储等应用场景。1.1 特征丰富…

C/C++数据结构之多维数组

概述多维数组&#xff0c;实际上就是“数组的数组”。最常见的是二维数组&#xff0c;就像一个表格&#xff0c;拥有行和列。而三维数组则可以想象为多个这样的表格堆叠起来形成的一个立方体。依此类推&#xff0c;我们可以构建四维、五维甚至更高维度的数组。多维数组主要用于…

[Rust 基础课程]选一个合适的 Rust 编辑器

市面上现在有很多编辑器都可以开发 Rust&#xff0c;很多都是以安装 Rust 插件的形式来对 Rust 做支持&#xff0c;本课程使用 RustRover&#xff0c;如果你喜欢其他的编辑器&#xff0c;可以自己捣鼓下。 RustRover https://www.jetbrains.com/rust/ jetbrains 专门对于 Ru…

【零基础学AI】第37讲:提示词工程(Prompt Engineering)

本节课你将学到 理解提示词工程的核心原理 掌握5种实用的Prompt设计模式 学会优化提示词的评估方法 实现一个智能问答系统优化案例 开始之前 环境要求 Python 3.8安装包&#xff1a;pip install openai tiktokenOpenAI API密钥&#xff08;免费注册&#xff1a;https://plat…