Linux驱动开发(4)——总线驱动

一、platform总线

Platform:虚拟总线平台,Linux专门用来管理外设(LED、按键、GPIO、I2C、SPI 等)。platform 总线架构将驱动系统抽象为以下三部分:

  • 设备(Device) :描述硬件设备的资源信息,如寄存器地址、GPIO 编号等,通常由设备树定义,内核启动时将.compatible自动转换为 platform_device 结构。
  • 总线(Bus):负责设备与驱动的匹配,platform 总线内置匹配规则,自动将合适的驱动与设备绑定。
  • 驱动(Driver) :包含对设备的操作方法,如 proberemove 等回调函数,实现具体硬件控制逻辑,对应 platform_driver 结构。

1、设备(device):设备树节点

cs 复制代码
设备节点{
    .compatible = "标识,设备名称";
};

platform_device{  //内核启动后将设备节点转换为此结构体
    struct device dev; //设备信息,eg:of_node存放设备节点
};

2、驱动(driver):platfrom_deriver结构

cs 复制代码
struct platform_driver drvname{
    .probe = probe,    //驱动与设备匹配成功执行
    .remove = remove,  //驱动与设备分离执行
    .driver = {        //驱动核心信息
        .name =  "设备名",
        .of_match_table =  ,//可多个设备匹配一个驱动
    },
    id_table = ,
};


int probe(struct platform_device *);
int remove(struct platform_device *);
struct device_driver driver;
struct of_device_id of_match_table[] = {
    {.compatible = "标签,设备名"},      //与设备节点中的compatible匹配
    {},         //空结尾,防越界
};
struct platform_driver_id id_table[]={
    {.name = "设备名"},
    {},
};

3、总线(bus):platform_bus_type匹配结构

.match = 设备与驱动匹配规则:

  • platform_device中的override与驱动名一致
  • 设备节点中的.compatible选项与驱动of_match_table一致
  • 设备树中的设备名与驱动中的id_tables一致
  • 设备名和驱动名一致

二、platform常用API函数

1).函数:platform_driver_register(&drv);

  • 功能:向内核注册一个平台驱动,将其绑定到platform虚拟总线上,并触发匹配设备的功能。
  • 参数:@drv --- 驱动platform_driver结构体

2).函数:platform_driver_unregister(&drv);

  • 功能:分离驱动与设备

2).函数:int of_get_named_gpio(struct device_node *np, const char *propname, int index);

  • 功能:获得设备树中的gpio节点
  • 参数:@np --- 设备树节点(pdevice->dev.of_node),@propname --- 属性名,@index --- reg数组下标
相关推荐
智者知已应修善业9 小时前
【用一片74LS139和一片74Ls00,设计带高电平有效使能输入端的3线-8线译码器】2023-10-16
驱动开发·经验分享·笔记·硬件架构·硬件工程
Ghost Face...1 天前
LS2K PCIe驱动开发全链路解析
驱动开发
Joseph Cooper1 天前
Linux Power Management 子系统:从 suspend/resume 到 Runtime PM、PM QoS
linux·驱动开发·linux kernel·嵌入式linux·电源管理
d111111111d1 天前
移植MQTT到STM32
驱动开发
码踏樱花1 天前
navicat17安装包和破解
驱动开发
senijusene2 天前
基于 MX6UL 的 DHT11 温湿度传感器 驱动开发
驱动开发
charlie1145141912 天前
嵌入式Linux驱动开发(8)——内存映射 I/O - 别拿物理地址当指针用
linux·开发语言·驱动开发·c·imx6ull
Wallace Zhang2 天前
SimpleFOC源码学习09(v2.3.2) - 磁编码器MagneticSensorSPI.cpp与MagneticSensorSPI.h
驱动开发·stm32·simplefoc·foc电机控制
Freak嵌入式2 天前
亲测可用!可本地部署的 MicroPython 开源仿真器
ide·驱动开发·嵌入式·仿真·micropython·upypi