Linux 有/无设备树下 platform_driver 驱动框架
文章目录
- platform 驱动框架
- platform 设备框架
- 有设备树下驱动开发注意事项
- 宏___一行代码创建 platform_driver
platform 驱动框架
首先,定义一个 platform_driver 结构体变量
/* platform_driver */ static struct platform_driver xxx_driver = {.driver = {/* .name: 无设备树匹配方式 *//* .of_match_table:有设备树匹配方式 */},.probe = xxx_probe,.remove = xxx_remove, };
然后,实现结构体中的各个成员变量,重点是实现匹配方法以及 probe 函数
当驱动和设备匹配成功以后 probe 函数就会执行
具体的驱动程序在 probe 函数里面编写,比如字符设备驱动等等
定义并初始化好 platform_driver 结构体变量以后,要在驱动入口函数里面调用 platform_driver_register 函数向 Linux 内核注册一个 platform 驱动
/** driver: 要注册的 platform 驱动* return: 负数,失败;0,成功*/ int platform_driver_register (struct platform_driver *driver);
在驱动卸载函数中通过 platform_driver_unregister 函数卸载 platform 驱动
void platform_driver_unregister(struct platform_driver *drv);
对于一个完整的驱动程序,必须提供有设备树和无设备树两种匹配方法
无设备树: 使用
xxx_driver.driver.name
进行设备匹配有设备树: 使用
xxx_driver.driver.of_match_table
进行设备匹配key: 匹配列表必须以空项结尾,
{ /* Sentinel */ }
/* 匹配列表 */ static const struct of_device_id xxx_of_match[] = {{ .compatible = "xxx" },{ /* Sentinel */ } };/* 声明 inputkey_of_match 设备匹配表 */ MODULE_DEVICE_TABLE(of, xxx_of_match);/* * platform 平台驱动结构体*/ static struct platform_driver xxx_driver = {.driver = {.name = "xxx",.of_match_table = xxx_of_match,},.probe = xxx_probe,.remove = xxx_remove, };
probe 和 remove 的实现
/* platform probe 函数,驱动与设备匹配成功以后此函数就会执行 */ static int xxx_probe(struct platform_device *dev) {int ret = 0;.../* 完成字符设备注册初始化等 */...return 0; }/* platform remove 函数 */ static int xxx_remove(struct platform_device *dev) {int ret = 0;.../* 完成字符设备删除注销等 */...return 0; }
platform 设备框架
platform_device 这个结构体表示 platform 设备
/* @description : 释放flatform设备模块的时候此函数会执行 * @param - dev : 要释放的设备 * @return : 无*/ static void xxx_release(struct device *dev) {printk("xxx device released!\r\n"); }/* 设备资源,xxx 所用寄存器信息 */ static struct resource xxx_resources[] = {[0] = {},[1] = {}, }/* platform 设备结构体 */ static struct platform_device xxx_device = {.name = "xxx", /* 与驱动相匹配 */.id = -1,.dev = {.release = xxx_release, /* 卸载设备时执行 */},.num_resources = ARRAY_SIZE(xxx_resources), /* 设备资源长度 */.resource = xxx_resources, /* 设备资源 */ };
platform_device 同样是 模块初始化-退出 框架
static int __init xxxdevide_init(void) {/* 注册 platform 设备 */return platform_device_register(&xxx_device); }static void __exit xxxdevide_exit(void) {/* 注销 platform 设备 */platform_device_unregister(&xxx_device); }/* 模块入口/出口 */ module_init(xxxdevide_init); module_exit(xxxdevide_exit); /* LICENSE AND AUTHOR */ MODULE_LICENSE("GPL"); MODULE_AUTHOR("tao"); MODULE_INFO(intree, "Y");
有设备树下驱动开发注意事项
ST 针对 STM32MP1 提供的 Linux 系统中,其 pinctrl 配置的电气属性只能在 platform 平台下被引用,前面的实验都没用到 platform,所以 pinctrl 配置是不起作用的!
对于 STM32MP1 来说,在使用 pinctrl 的时候需要修改一下 pinctrl-stm32.c 这个文件。
设备树问题
新的设备节点获取方式
宏___一行代码创建 platform_driver
Linux 自带 LED 驱动使用如下一行代码创建一个平台驱动
module_platform_driver(gpio_led_driver);
展开:
static int __init gpio_led_driver_init(void)
{ return platform_driver_register (&(gpio_led_driver));
}
module_init(gpio_led_driver_init);
static void __exit gpio_led_driver_exit(void)
{ platform_driver_unregister (&(gpio_led_driver) );
}
module_exit(gpio_led_driver_exit);
Linux 有/无设备树下 platform_driver 驱动框架相关推荐
- Linux驱动_设备树下LED驱动
前言 学习完设备树基础知识后,完成设备树下LED驱动实验 一.修改设备树文件 在设备书根/节点下添加子节点led信息: alphaled {status = "okay";comp ...
- Linux 设备树下的 platform 驱动实验基于正点原子IMX6ULL开发板
1 设备树下的 platform 驱动简介 platform 驱动框架分为总线.设备和驱动,其中总线不需要我们这些驱动程序员去管理,这个是 Linux 内核提供的,我们在编写驱动的时候只要关注于设备和 ...
- 【正点原子MP157连载】第三十五章 设备树下的platform驱动编写-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7
1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...
- 设备树下的platform 驱动编写
目录 设备树下的platform 驱动简介 硬件原理图分析 实验程序编写 修改设备树文件 platform 驱动程序编写 编写测试APP 运行测试 编译驱动程序和测试APP 运行测试 上一章我们详细的 ...
- 设备树下的platform驱动编写
文章目录 一.设备树下的platform驱动简介 1.在设备树中创建设备节点 2.编写 platform 驱动的时候要注意兼容属性 3.编写platform驱动 二.硬件原理图分析 三.实验程序编写 ...
- I.MX6ULL ARM驱动开发---设备树下的platfrom设备驱动
引言 最新的 Linux 内核已经支持了设备树,因此在设备树下如何编写 platform 驱动就显得尤为重要,本章我们就来学习一下如何在设备树下编写 platform 驱动. 一.设备树下的 pl ...
- Linux 设备树下的 platform 驱动示例
1.简介 基于总线.设备和驱动这样的驱动框架,Linux 内核提出来 platform 这个虚拟总线,相应的也有 platform 设备和 platform 驱动. Linux 总线设备和驱动模式 2 ...
- Linux利用platform_driver和设备树实现PWM驱动
Linux利用platform_driver和设备树实现PWM驱动 字符设备PWM驱动 一.PWM驱动的硬件资源 1.PWM工作原理 2.PWM电路原理 3.PWM内部结构 二.具体代码 1.设备树 ...
- 【正点原子Linux连载】第四十四章 设备树下的LED驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0
1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...
最新文章
- C++乘法的int越界问题
- Mysql从5.0升级到 5.1.73
- PostgreSQL 10.1 手册_部分 III. 服务器管理_第 21 章 数据库角色_21.4. 删除角色
- 【JavaScriptjQuery】返回顶部
- Linux驱动小技巧 | 利用DRIVER_ATTR实现调用内核函数
- 一年级学情分析计算机,小学一年级语文学情分析范文
- Java设计模式(四)——再谈观察者模式
- 【读】这一次,让我们再深入一点 - TCP协议
- java 中的通讯之HTTP协议
- 数据仓库系列之元数据管理
- ai面试的优缺点_面试看脸?颜值低会不会被AI刷掉......
- c语言case用多重语句,switch多重选择
- 在字符串s的第n个字符后面插入字符串t
- 孔雀东南飞用mysql存储_【原】一个真实的故事,现实版的《孔雀东南飞》
- Contest1389 - 2018年第三阶段个人训练赛第四场.	Transit Tree Path(DFS)
- Linux C 网络编程 仿照网盘的功能
- linux下rpm包安装MySQL
- SQL由入门到精通的学习
- IntelliJ IDEA—SVN的配置及使用
- 伯克利的ICO计划能否帮助其解决住房短缺问题?
热门文章
- 三星java世界x108_我对三星X100/X108的使用感受
- 数钱游戏——聪明的放弃
- 变频器的工作原理和功能应用
- 走亲访友不慌!手把手教你怎样用Mask R-CNN和Python做一个抢车位神器
- Linux操作系统之—所有端口详解大全手册
- 后门之王:谈一谈加密算法中的数学后门
- 陪伴是最长情的告白,民生保险“链”接万家告白征集
- jQuery deferred 使用方式的歪解
- 中文计数法亿兆京垓秭穰沟涧正载
- av_rescale_q_rnd”: 不能将参数 4 从“int”转换为“AVRounding” 1 转换为枚举