文章目录

  • 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,
    };
    
  • proberemove 的实现

    /* 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 驱动框架相关推荐

  1. Linux驱动_设备树下LED驱动

    前言 学习完设备树基础知识后,完成设备树下LED驱动实验 一.修改设备树文件 在设备书根/节点下添加子节点led信息: alphaled {status = "okay";comp ...

  2. Linux 设备树下的 platform 驱动实验基于正点原子IMX6ULL开发板

    1 设备树下的 platform 驱动简介 platform 驱动框架分为总线.设备和驱动,其中总线不需要我们这些驱动程序员去管理,这个是 Linux 内核提供的,我们在编写驱动的时候只要关注于设备和 ...

  3. 【正点原子MP157连载】第三十五章 设备树下的platform驱动编写-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  4. 设备树下的platform 驱动编写

    目录 设备树下的platform 驱动简介 硬件原理图分析 实验程序编写 修改设备树文件 platform 驱动程序编写 编写测试APP 运行测试 编译驱动程序和测试APP 运行测试 上一章我们详细的 ...

  5. 设备树下的platform驱动编写

    文章目录 一.设备树下的platform驱动简介 1.在设备树中创建设备节点 2.编写 platform 驱动的时候要注意兼容属性 3.编写platform驱动 二.硬件原理图分析 三.实验程序编写 ...

  6. I.MX6ULL ARM驱动开发---设备树下的platfrom设备驱动

    引言   最新的 Linux 内核已经支持了设备树,因此在设备树下如何编写 platform 驱动就显得尤为重要,本章我们就来学习一下如何在设备树下编写 platform 驱动. 一.设备树下的 pl ...

  7. Linux 设备树下的 platform 驱动示例

    1.简介 基于总线.设备和驱动这样的驱动框架,Linux 内核提出来 platform 这个虚拟总线,相应的也有 platform 设备和 platform 驱动. Linux 总线设备和驱动模式 2 ...

  8. Linux利用platform_driver和设备树实现PWM驱动

    Linux利用platform_driver和设备树实现PWM驱动 字符设备PWM驱动 一.PWM驱动的硬件资源 1.PWM工作原理 2.PWM电路原理 3.PWM内部结构 二.具体代码 1.设备树 ...

  9. 【正点原子Linux连载】第四十四章 设备树下的LED驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

最新文章

  1. C++乘法的int越界问题
  2. Mysql从5.0升级到 5.1.73
  3. PostgreSQL 10.1 手册_部分 III. 服务器管理_第 21 章 数据库角色_21.4. 删除角色
  4. 【JavaScriptjQuery】返回顶部
  5. Linux驱动小技巧 | 利用DRIVER_ATTR实现调用内核函数
  6. 一年级学情分析计算机,小学一年级语文学情分析范文
  7. Java设计模式(四)——再谈观察者模式
  8. 【读】这一次,让我们再深入一点 - TCP协议
  9. java 中的通讯之HTTP协议
  10. 数据仓库系列之元数据管理
  11. ai面试的优缺点_面试看脸?颜值低会不会被AI刷掉......
  12. c语言case用多重语句,switch多重选择
  13. 在字符串s的第n个字符后面插入字符串t
  14. 孔雀东南飞用mysql存储_【原】一个真实的故事,现实版的《孔雀东南飞》
  15. Contest1389 - 2018年第三阶段个人训练赛第四场. Transit Tree Path(DFS)
  16. Linux C 网络编程 仿照网盘的功能
  17. linux下rpm包安装MySQL
  18. SQL由入门到精通的学习
  19. IntelliJ IDEA—SVN的配置及使用
  20. 伯克利的ICO计划能否帮助其解决住房短缺问题?

热门文章

  1. 三星java世界x108_我对三星X100/X108的使用感受
  2. 数钱游戏——聪明的放弃
  3. 变频器的工作原理和功能应用
  4. 走亲访友不慌!手把手教你怎样用Mask R-CNN和Python做一个抢车位神器
  5. Linux操作系统之—所有端口详解大全手册
  6. 后门之王:谈一谈加密算法中的数学后门
  7. 陪伴是最长情的告白,民生保险“链”接万家告白征集
  8. jQuery deferred 使用方式的歪解
  9. 中文计数法亿兆京垓秭穰沟涧正载
  10. av_rescale_q_rnd”: 不能将参数 4 从“int”转换为“AVRounding” 1 转换为枚举