14_Linux设备树下的platform驱动编写

这篇具有很好参考价值的文章主要介绍了14_Linux设备树下的platform驱动编写。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

设备树下的platform驱动简介

运行测试


设备树下的platform驱动简介

platform驱动框架分为总线、设备和驱动,其中总线不需要我们这些驱动程序员去管理,这个是Linux内核提供的,我们在编写驱动的时候只要关注于设备和驱动的具体实现即可。在没有设备树的Linux内核下,我们需要分别编写并注册platform_device和 platform_driver,分别代表设备和驱动。在使用设备树的时候,设备的描述被放到了设备树中,因此platform-device就不需要我们去编写了,我们只需要实现 platform_driver 即可。在编写基于设备树的platform驱动的时候我们需要注意一下几点:

1.在设备树中创建设备节点

毫无疑问,肯定要先在设备树中创建设备节点来描述设备信息,重点是要设置好compatible属性的值,因为platform总线需要通过设备节点的compatible属性值来匹配驱动!这点要切记。比如,我们可以编写如下所示的设备节点来描述我们本章实验要用到的LED这个设备:

14_Linux设备树下的platform驱动编写,Linux驱动,linux,U-boot,arm开发,设备树,嵌入式硬件

 示例中的gpioled节点,注意第4行的compatible属性值为“atkalpha-gpioled”,因此一会在编写platform驱动的时候of_match_table属性表中要有“atkalpha-gpioled”。

2.编写platform驱动的时候要注意兼容属性

在使用设备树的时候platform驱动会通过of_match_table来保存兼容性值,也就是表明此驱动兼容哪些设备。所以, of_match_table将会尤为重要,比如本例程的platform驱动中platform_driver就可以按照如下所示设置:

14_Linux设备树下的platform驱动编写,Linux驱动,linux,U-boot,arm开发,设备树,嵌入式硬件

14_Linux设备树下的platform驱动编写,Linux驱动,linux,U-boot,arm开发,设备树,嵌入式硬件

 第1~4行,of_device_id表,也就是驱动的兼容表,是一个数组,每个数组元素为of_device_id类型。每个数组元素都是一个兼容属性,表示兼容的设备,一个驱动可以跟多个设备匹配。这里我们仅仅匹配了一个设备,那就是中创建的gpioled这个设备。

第2行的compatible值为"atkalpha-gpioled",驱动中的compatible属性和设备中的compatible属性相匹配,因此驱动中对应的probe函数就会执行。注意第3行是一个空元素,在编写of_device_id的时候最后一个元素一定要为空!

第6行,通过MODULE_DEVICE_TABLE声明一下leds_of_match这个设备匹配表。

第11行,设置platform_driver中的of_match_table匹配表为上面创建的leds_of_match,至此我们就设置好了platform驱动的匹配表了。

3.编写platform驱动

基于设备树的platform驱动和无设备树的platform驱动基本一样,都是当驱动和设备匹配成功以后就会执行probe函数。需要在probe函数里面执行字符设备驱动那一套,当注销驱动模块的时候remove函数就会执行,都是大同小异的。

platform驱动程序编写

14_Linux设备树下的platform驱动编写,Linux驱动,linux,U-boot,arm开发,设备树,嵌入式硬件

14_Linux设备树下的platform驱动编写,Linux驱动,linux,U-boot,arm开发,设备树,嵌入式硬件

14_Linux设备树下的platform驱动编写,Linux驱动,linux,U-boot,arm开发,设备树,嵌入式硬件

14_Linux设备树下的platform驱动编写,Linux驱动,linux,U-boot,arm开发,设备树,嵌入式硬件

14_Linux设备树下的platform驱动编写,Linux驱动,linux,U-boot,arm开发,设备树,嵌入式硬件

14_Linux设备树下的platform驱动编写,Linux驱动,linux,U-boot,arm开发,设备树,嵌入式硬件

14_Linux设备树下的platform驱动编写,Linux驱动,linux,U-boot,arm开发,设备树,嵌入式硬件

14_Linux设备树下的platform驱动编写,Linux驱动,linux,U-boot,arm开发,设备树,嵌入式硬件

14_Linux设备树下的platform驱动编写,Linux驱动,linux,U-boot,arm开发,设备树,嵌入式硬件

14_Linux设备树下的platform驱动编写,Linux驱动,linux,U-boot,arm开发,设备树,嵌入式硬件

14_Linux设备树下的platform驱动编写,Linux驱动,linux,U-boot,arm开发,设备树,嵌入式硬件

 第33~112行,传统的字符设备驱动,没什么要说的。

第120-164行, platform驱动的probe函数,当设备树中的设备节点与驱动之间匹配成功以后此函数就会执行,原来在驱动加载函数里面做的工作现在全部放到probe函数里面完成。

第171~180 行,remobe 函数,当卸载 platform驱动的时候此函数就会执行。在此函数里面释放内存、注销字符设备等,也就是将原来驱动卸载函数里面的工作全部都放到remove函数中完成。

第183-186行,匹配表,描述了此驱动都和什么样的设备匹配,第184行添加了一条值为"atkalpha-gpioled"的compatible属性值,当设备树中某个设备节点的compatible属性值也为“atkalpha-gpioled”的时候就会与此驱动匹配。

第189-196行,platform_driver驱动结构体,191行设置这个platform驱动的名字为“ imx6ulled”,因此,当驱动加载成功以后就会在/sys/bus/platform/drivers/目录下存在一个名为“imx6uled”的文件。

第192行设置of_match_table为上面的led_of_match。

第203-206行,驱动模块加载函数,在此函数里面通过platform_driver_register向Linux内核注册led_driver驱动。

第213-216行,驱动模块卸载函数,在此函数里面通过platform_driver_unregister从Linux内核卸载 led_driver 驱动。

运行测试

14_Linux设备树下的platform驱动编写,Linux驱动,linux,U-boot,arm开发,设备树,嵌入式硬件

驱动模块加载完成以后到/sys/bus/platform/drivers/目录下查看驱动是否存在,在leddriver.c中设置led_driver(platform_driver类型)的name字段为"imx6ul-led",因此会在/sys/bus/platform/drivers/目录下存在名为"imx6ul-led”这个文件,结果如图所示:

14_Linux设备树下的platform驱动编写,Linux驱动,linux,U-boot,arm开发,设备树,嵌入式硬件

 同理,在/sys/bus/platform/devices/目录下也存在led的设备文件,也就是设备树中gpioled这个节点,如图所示:

14_Linux设备树下的platform驱动编写,Linux驱动,linux,U-boot,arm开发,设备树,嵌入式硬件

 驱动和模块都存在,当驱动和设备匹配成功以后就会输出如图所示一行语句:

14_Linux设备树下的platform驱动编写,Linux驱动,linux,U-boot,arm开发,设备树,嵌入式硬件

 驱动和设备匹配成功以后就可以测试LED灯驱动了,输入如下命令打开LED灯:

14_Linux设备树下的platform驱动编写,Linux驱动,linux,U-boot,arm开发,设备树,嵌入式硬件

 在输入如下命令关闭LED灯:

14_Linux设备树下的platform驱动编写,Linux驱动,linux,U-boot,arm开发,设备树,嵌入式硬件

 观察一下LED灯能否打开和关闭,如果可以的话就说明驱动工作正常,如果要卸载驱动的话输入如下命令即可:

14_Linux设备树下的platform驱动编写,Linux驱动,linux,U-boot,arm开发,设备树,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-569188.html

到了这里,关于14_Linux设备树下的platform驱动编写的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【genius_platform软件平台开发】第九十七讲:linux设备驱动中信号(signal函数)的异步通知机制

    意思是: 一旦设备就绪,则主动通知应用程序 ,这样应用程序根本就不需要查询设备状态,这一点非常 类似于硬件上“中断”的概念 ,比较准确的称谓是“ 信号驱动的异步I/O ”。信号是在软件层次上对 中断机制的一种模拟 ,在原理上,一个进程收到一个信号与处理器收到一

    2024年02月08日
    浏览(63)
  • 【IMX6ULL驱动开发学习】14.Linux驱动开发 - GPIO中断(设备树 + GPIO子系统)

    代码自取 【14.key_tree_pinctrl_gpios_interrupt】: https://gitee.com/chenshao777/imx6-ull_-drivers 主要接口函数: 1. of_gpio_count (获得GPIO的数量) 2. kzalloc (向内核申请空间) 3. of_get_gpio (获取GPIO子系统标号) 4. gpio_to_irq (根据GPIO子系统标号得到软件中断号) 5. request_irq (根据软件中断号

    2024年02月12日
    浏览(51)
  • Linux驱动开发:platform总线驱动

    目录 1、为什么需要platform总线 2、设备端:platform_device 2.1 platform_device结构体 2.2 注册 2.3 注销 3、驱动端:platform_driver 3.1 platform_driver结构体 3.2 注册 3.3 注销 4、总线 4.1 bus_type  4.2 platform_bus_type 5、匹配 5.1 匹配规则,platform_match 5.2 platform_device匹配流程 5.3 platform_driver匹配

    2024年02月03日
    浏览(45)
  • <Linux开发>驱动开发 -之-platform 驱动

    <Linux开发>驱动开发 -之-platform 驱动 交叉编译环境搭建: <Linux开发> linux开发工具-之-交叉编译环境搭建 uboot移植可参考以下: <Linux开发> -之-系统移植 uboot移植过程详细记录(第一部分) <Linux开发> -之-系统移植 uboot移植过程详细记录(第二部分) <Linux开发>

    2024年02月12日
    浏览(60)
  • 正点原子嵌入式linux驱动开发——U-boot图形化配置及其原理

    经过之前对uboot的学习可以知道: uboot可以通过stm32mp15_trusted_defconfig来配置,或者通过文件stm32mp1.h来配置uboot 。还有 另外一种配置uboot的方法,就是图形化配置 ,以前的uboot是不支持图形化配置,只有Linux内核才支持图形化配置。不过不知道从什么时候开始,uboot也 支持图形

    2024年02月07日
    浏览(47)
  • platform驱动编写

    驱动文件 测试文件

    2024年02月11日
    浏览(40)
  • 基于设备树的platform驱动之LED(平台设备驱动)

    platform 设备驱动是在驱动的分离与分层这样的软件思路下诞生的。   platform 驱动框架分为总线、设备和驱动。 总线 :是 Linux 内核提供的,不需要我们这些驱动程序员去管理。我们在编写驱动的时候只要关注于设备和驱动的具体实现即可。 设备、驱动 :在没有设备树的

    2023年04月26日
    浏览(40)
  • 详解AT24CXX驱动开发(linux platform tree - i2c应用)

    目录 概述 1 认识AT24Cxx 1.1 AT24CXX的特性 1.2 AT24CXX描述 1.2.1 引脚 1.2.2 容量描述 1.2.3 设备地址 1.3 操作时序 1.3.1 写单个字节时序 1.3.2 写page字节时序 1.3.3 读取当前数据时序 1.3.4 随机读取数据 1.3.5 连续读取多个数据 2 驱动开发 2.1 硬件接口 2.2 代码实现 2.2.1 查看设备信息 2.2.2 编写

    2024年02月22日
    浏览(47)
  • Linux设备驱动程序(一)——设备驱动简介

    这一部分主要是用来介绍 Linux 设备驱动程序的一些基本概念,包括:Linux 设备驱动程序的作用、内核功能的划分、设备和模块的分类以及版本编号。 设备驱动程序就像一个个的“黑盒子”,使某个特定硬件响应一个定义良好的内部编程接口,这些操作完全隐藏了设备的工作

    2024年02月05日
    浏览(88)
  • 【Linux】【驱动】第一个相对完整的驱动编写

    这个章节会讲述去直接控制一个GPIO,高低电平。 因为linux不允许直接去操作寄存器,所以在操作寄存器的时候就需要使用到函数:ioremap 和iounmap 来作为寄存器的声明和注销 ioremap 做为地址的声明,如下图使用 CCM_CCGR1 = ioremap(0x20C406C, 4); iounmap 作为取消声明。 iounmap(CCM_CCGR1);

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包