platform简单总结

Linux的platform设备驱动框架 前面我们讲了设备驱动的分离,并且引出了总线(bus)、驱动(driver)和设备(device)模型,比如 I2C、SPI、USB 等总线。但是在 SOC 中有些外设是没有总线这个概念的,但是又要使用总线、驱动和设备模型该怎么办呢?为了解决此问题,Linux 提出了 platform 这个虚拟总线,相应的就有 platform_driver 和 platform_device。这里的设备和驱动要怎么理解呢?设备是硬件设备的抽象表示。每个设备都有一个设备名称和一组功能。 阅读详情

1.platform_device结构体
 struct platform_device {
 const char * name;/* 设备名 */
 u32 id;
 struct device dev;
 u32 num_resources;/* 设备所使用各类资源数量 */
 struct resource * resource;/* 资源 */
 };
 设备的分配:
 struct platform_device *platform_device_alloc(const char *name, int id);  //name:设备名,id:设备
id,一般为-1 
设备的注册:
int platform_device_add(struct platform_device *pdev);  
对platform_device的定义通常在BSP的板文件中实现,在板文件中,将platform_device归纳
为一个数组:
static struct platform_device *smdk2410_devices[] __initdata = {
    &s3c_device_usb, 
    &s3c_device_lcd, 
    &s3c_device_wdt, 
    &s3c_device_i2c0, 
    &s3c_device_iis, 
}; 
最终通过 platform_add_devices()函数统一注册:
static void __init smdk2410_init(void) 
{ 
    s3c_i2c0_set_platdata(NULL); 
    platform_add_devices(smdk2410_devices, ARRAY_SIZE(smdk2410_devices)); 
    smdk_machine_init(); 
} 
platform_add_devices()函数可以将平台设备添加到系统中,这个函数的 原型为:
int platform_add_devices(struct platform_device **devs, int num);
 该函数的第一个参数为平台设备数组的指针,第二个参数为平台设备的数量,它内部调用了
 platform_device_register()函 数用于注册单个的平台设备。
 2.platform_driver包含具体的操作函数,通常需要由驱动实现:
 struct platform_driver {
  int (*probe)(struct platform_device *);
  int (*remove)(struct platform_device *);
  void (*shutdown)(struct platform_device *);
  int (*suspend)(struct platform_device *, pm_message_t state);
  int (*resume)(struct platform_device *);
  struct device_driver driver;
 };
看看驱动是怎么注册进去的:
int platform_driver_register(struct platform_driver *drv) 
{ 
    。。。
    return driver_register(&drv->driver); 
} 
int driver_register(struct device_driver *drv) 
{ 
    。。。。 
    ret = bus_add_driver(drv); 
    。。。 
} 
int bus_add_driver(struct device_driver *drv) 
{ 
    。。。
    if (drv->bus->p->drivers_autoprobe) { 
        error = driver_attach(drv); 
        if (error) 
            goto out_unregister; 
    } 
    。。。     
} 
int driver_attach(struct device_driver *drv) 
{ 
    return bus_for_each_dev(drv->bus, NULL, drv, __driver_attach); 
} 
来看__driver_attach这个函数,其中分别调用了driver_match_device,driver_probe_device函数。
static int __driver_attach(struct device *dev, void *data) 
{ 
    struct device_driver *drv = data; 
    if (!driver_match_device(drv, dev)) 
        return 0; 
    if (dev->parent)
       down(&dev->parent->sem); 
   down(&dev->sem); 
   if (!dev->driver) 
       driver_probe_device(drv, dev)
   up(&dev->sem); 
   if (dev->parent) 
       up(&dev->parent->sem); 
 
   return 0; 
}
匹配的时候调用的bus的match函数。匹配成功后调用驱动的probe函数。
int driver_probe_device(struct device_driver *drv, struct device *dev) 
{ 
    。。。 
    ret = really_probe(dev, drv); 
    。。。
} 
static int really_probe(struct device *dev, struct device_driver *drv) 
{ 
    。。。
    int driver_probe_device(struct device_driver *drv, struct device *dev) 
{ 
    。。。
    ret = really_probe(dev, drv); 
    。。。 
} 
static int really_probe(struct device *dev, struct device_driver *drv) 
{ 
    。。。 
       if (dev->bus->probe) { 
       ret = dev->bus->probe(dev); 
       if (ret) 
           goto probe_failed; 
   } else if (drv->probe) { 
       ret = drv->probe(dev); 
       if (ret) 
           goto probe_failed; 
   } 
   。。。
} 
由relly_probe函数可以看出,如果bus定义了probe函数,则调用bus的probe
函数;如果bus,没有定义而driver定义了probe函数,则调用driver的probe
函数。

 3.bus_type类型的platform_bus_type
(1)基本结构
  struct bus_type platform_bus_type = {
   name = “platform”,
   dev_attrs = platform_dev_attrs,
   match = platform_match,
   uevent = platform_uevent,
   pm = PLATFORM_PM_OPS_PTR,
 };
 EXPORT_SYMBOL_GPL(platform_bus_type);
 (2)match()表明了platform_device和platform_driver之间如何匹配
 static int platform_match(struct device *dev, struct device_driver *drv)
 {
   struct platform_device *pdev;                                                                                          
   pdev = container_of(dev, struct platform_device, dev);             
   return (strncmp(pdev->name, drv->name, BUS_ID_SIZE) == 0);          
 }
匹配platform_device和platform_driver主要看二者的name字段是否相同
(3)总线初始化
platform_bus_type是在系统初始化的时候初始化的,不用我们做什么工作:
.int __init platform_bus_init(void) 
{ 
    int error; 
    early_platform_cleanup(); 
    error = device_register(&platform_bus); 
    if (error) 
        return error; 
    error =  bus_register(&platform_bus_type); 
    if (error) 
        device_unregister(&platform_bus); 
    return error; 
} 
4.设备中的资源
flags可以为IORESOURCE_IO、 IORESOURCE_MEM、IORESOURCE_IRQ、IORESOURCE_DMA等
static struct resource ldd6410_dm9000_resource[] = {
[0] = {
.start = 0×18000000,
.end = 0×18000000 + 3,
.flags = IORESOURCE_MEM
},
[1] = {
.start = IRQ_EINT(7),
.end = IRQ_EINT(7),
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
}
};
获取资源:
db->addr_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
5.plat_data
对设备的硬件描述除了中断、内存、DMA通道以外,可能还会有一些配置信
息,而 这些配置信息也依赖于板,不适宜直接放置在设备驱动本身,因此,
platform也提供了platform_data的支持。例如:
static struct dm9000_plat_data ldd6410_dm9000_platdata = {
.flags = DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM,
.dev_addr = { 0×0, 0×16, 0xd4, 0×9f, 0xed, 0xa4 },
};
static struct platform_device ldd6410_dm9000 = {
.name = “dm9000″,
.id = 0,
.num_resources = ARRAY_SIZE(ldd6410_dm9000_resource),
.resource = ldd6410_dm9000_resource,
.dev = {
.platform_data = &ldd6410_dm9000_platdata,
}
};
获取plat_data:
struct dm9000_plat_data *pdata = pdev->dev.platform_data;
其中,pdev为platform_device的指针。

platform总线 1、什么是platform总线? 相对于USB、PCI、I2C、SPI等物理总线来说,platform总线是一种虚拟、抽象出来的总线,实际中并不存在这样的总线。那为什么需要platform总线呢?其实是Linux设备驱动模型为了保持设备驱动的统一性而虚拟出来的总线。因为对于usb设备、i2c设备、pci设备、spi设备等等,他们与cpu的通信都是直接挂在相应的总线下面与我们的cpu进行数据交互的,... 阅读详情

相关推荐

Linux platform总线

Linux platform总线 文章目录Linux platform总线一、总线概念二、platform驱动框架详解2.1 platform驱动框架2.2 platform_device和platform_driver的匹配规则2.3 platform_device中的资源描述三、platform驱动框架源码剖析四、platform驱动程序模板 一、总线概念 在Linux驱动模型中总要关心三个对...

JT同学的博客 1715

Bootx-Platform 开源项目使用教程

Bootx-Platform 开源项目使用教程 1. 项目介绍 Bootx-Platform 是一个基于 Spring Boot 框架打造的单体式应用脚手架,旨在提供整套服务模块,努力为打造全方位企业级开发解决方案。项目包含基础功能、消息通知、支付、工作流等模块,支持支付宝、微信、云闪付、现金和钱包等多种支付方式进行组合,可应用在不同业务场景中。目标是致力实现媲美商业版应用框架的目标。 2. 项目...

gitblog_00818的博客 920

java缴费源码-platform-plus:一个前后端分离的Java快速开发平台,基于SpringBoot2.X、Mybatis-Plus3

java缴费源码 服务器推荐配置 名称 CPU 内存 硬盘 价格 服务器(标准型S2机型 5M 双机) 2核 8G 50G 2970元/三年 MySQL高可用版 1核 1G 100G 423元/三年 COS资源包 大小 价格 标准型存储容量 200GB 1年 171元 下行流量 500GB 3个月 177元 项目说明 platform-plus是一个轻量级的,前后端分离的Java快速开发平台 JavaDoc: 前端地址: 使用案例 完整案例登记列表,请查看,欢迎登记更多的案例。 以下为部分案例: 江西省教育缴费云平台: 内务管理系统: 优势 严格遵循阿里编码规约开发,便于阅读及二次开发 支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多种数据库 实现前后端分离,通过token进行数据交互,前端再也不用关注后端技术 支持结合ELK实时日志分析系统,方便日志查询,问题排查,上线检查 灵活的权限控制,可控制到页面和按钮,满足绝大部分的权限需求 可在线生成vue、controller、ent

LINUX设备驱动模型之platform(平台)总线简介

@TOC 1、什么是platform(平台)总线? /********************************************************/ 内核版本:4.1.15(含设备树) 运行平台:IMX6ULL /********************************************************/ 相对于USB、PCI、I2C、SPI等物理总线来说,platform总线是一种虚拟、抽象出来的总线,实际中并不存在这样的总线。 那为什么需要platform总线呢

一只青木呀 2550

阿里云javasdk源码-platform-plus:平台加

阿里云java sdk源码 服务器推荐配置 服务器配置: CPU:2核 内存:8G 带宽:10M 购买说明:如果业务量较大,推荐双机部署。 MySQL高可用版配置: CPU:1核 内存:1G 硬盘:100G COS资源包: 标准型存储容量: 100GB 1年 88元 200GB 1年 171元 下行流量: 100GB 3个月 37元 200GB 3个月 71元 500GB 3个月 177元 项目说明 platform-plus是一个轻量级的,前后端分离的Java快速开发平台 JavaDoc: 前端地址: 优势 严格遵循阿里编码规约开发,便于阅读及二次开发 支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多种数据库 实现前后端分离,通过token进行数据交互,前端再也不用关注后端技术 支持结合ELK实时日志分析系统,方便日志查询,问题排查,上线检查 灵活的权限控制,可控制到页面和按钮,满足绝大部分的权限需求 可在线生成vue、controller、entity、xml、dao、serv

platform-plus是一个轻量级的,前后端分离的Java快速开发平台-微同商城商业版基础架构

微同商城商业版基础架构----一个前后端分离的Java快速开发平台,基于SpringBoot2.7.3、Mybatis-Plus3.5.0。支持 Oracle、MySQL、DB2、Postgre、MariaDB、H2、HSQL、SQLite、SQLServer2005、SQLServer 等多种数据库。

platform device/platform driver/platform bus解释整理

Platform Device and Drivers从我们可以了解Platform bus上面的驱动模型接口:platform_device,platform_driver。和PCI和USB这些大结构的总线不同,虚拟总线Platform bus使用最小结构来

lihaoweiV的专栏 1980

ChatUI vs Ant Design X 技术选型对比

维度ChatUI优势轻量级、易上手、完美兼容 Ant Design全能型框架、企业级扩展性、深度模型集成局限性功能单一、缺乏高级交互支持学习曲线陡峭、包体积较大最佳实践单独聊天窗口集成整体智能助手系统开发通过对比可见,ChatUI 适合快速实现基础对话功能,而Ant Design X 更适合构建复杂的 AI 驱动应用。实际选择时需结合项目规模、团队技术栈和对交互复杂度的需求综合评估。

四楼没电梯的专栏 2261

platform_bus,platform_driver,platform_bus

一、platform_bus 总线是处理器和一个或多个设备之间的通道,在设备模型中, 所有的设备都通过总线相连。总线可以相互插入。设备模型展示了总线和它们所控制的设备之间的实际连接。Platform总线是2.6 kernel中最近引入的一种虚拟总线,主要用来管理CPU的片上资源,具有更好的移植性,因此在2.6 kernel中,很多驱动都用platform改写了。 /linux/device.h

xp_super的专栏 888

从零到精通:ROS2 MoveIt2与MPC机械臂轨迹规划的完整配置流程

本文详细介绍了ROS2 MoveIt2与MPC机械臂轨迹规划的完整配置流程,从环境准备到高级功能扩展,帮助开发者实现精准控制。通过集成模型预测控制(MPC),机械臂能够优化复杂轨迹规划,处理动态避障,提升工业自动化效率。

juice的博客 705

ABB RobotWare数据包全版本归档与高效获取指南

记得去年有个汽车产线升级项目,客户现场用的是RobotWare 6.05.0166版本,而我的RobotStudio里只有最新的7.x系列。RobotWare数据包本质上就是ABB机器人的"操作系统镜像",不同版本的机器人控制器需要匹配特定版本的RobotWare。有个容易忽略的细节:偶数版本号(如6.04、6.06)通常比奇数版本更稳定,因为ABB的内部发布策略是偶数版用于正式产线,奇数版多用于测试新功能。最终实现了零停机升级,这个经验告诉我们:版本切换不是简单的覆盖安装,而是需要系统性的验证流程。

weixin_30764883的博客 277

platform

通过Platform机制开发发底层驱动的大致流程为: 定义 platform_device---注册 platform_device ---定义 platform_driver-----注册 platform_driver。 1. Platform_device 定义于 kernel/include/linux/platform_device.h中,struct platform_device {...

来一杯奶茶 418

GoAnywhere MFT 身份验证绕过漏洞(CVE-2024-0204)

GoAnywhere MFT 身份验证绕过漏洞(CVE-2024-0204)

weixin_43567873的博客 387

编写最简单的 Platform 驱动

Platform 驱动的本质非常简单——它只是 Linux 驱动模型(Device/Driver Model)的一种落地实现。为了拨开云雾,我们来编写一个最简单的 Platform 驱动,这篇文章将从原理到实操,带你走完 Platform 驱动的最小闭环,让你真正理解其核心思想。

专注Linux内核驱动开发15年+,致力于让天下没有难写的驱动。 941

C语言设计模式全面解析:从理论到28个实战示例

本文系统介绍了23种经典设计模式在C语言中的实现方法。通过结构体、函数指针等技巧,C语言可以优雅地模拟面向对象特性,实现代码复用与解耦。文章分类详解了创建型、结构型、行为型三大类模式,并提供了28个完整代码示例,包括单例、策略、观察者等核心模式的精简实现。这些模式在嵌入式系统、操作系统内核等场景中广泛应用,如状态机、事件驱动等。学习C语言设计模式的关键在于理解模式意图,掌握函数指针和结构体组合等技巧,并在实际项目中灵活运用。本文为C语言开发者提供了全面的设计模式参考指南。

数字人生 362

AD9914数字斜坡模式使用

类似的,如果DRG输出处于负斜率斜坡中间,DRCTL引脚由逻辑0变为逻辑1,那么DRG会立即切换成正斜率参数,恢复在两个限值之间振荡输出。当两个非驻留位同时设置时,每次DRG输出达到编程设定的上限值或下限值后(假定DRG过输出使能位(0x01[13])已设置),DROVER信号会产生一个正脉冲(两个DDS时钟周期)。不过,在非驻留操作中,DRG输出不一定保持在上下限值。例如,设置数字斜坡非驻留高位,则当达到上限值时,DRG会自动(立即)跳到下限值(这一过程并非以斜坡方式返回下限值,而是直接跳至下限值)。

wangjie36的博客 3862

platform device和platform driver

从Linux 2.6起引入了一套新的驱动管理和注册机制:Platform_device和Platform_driver。 Linux中大部分的设备驱动,都可以使用这套机制, 设备用Platform_device表示,驱动用Platform_driver进行注册。 Li

zoe的专栏 1592

YOLOv8改进 | Conv篇:基于FasterBlock与C2f结构的二次创新,参数量下降70万【附保姆级代码】

通过引入FasterBlock二次创新C2f结构,我们成功地对YOLOv8模型进行了优化,显著降低了其参数量,并提升了推理速度,而精度保持不变甚至有所提升。该模型在多个实际应用场景中展现出了优异的性能,尤其是在嵌入式设备、移动端和自动驾驶等领域,具有广泛的应用潜力。未来的研究将进一步优化模型结构,探索更多的应用场景,为目标检测技术的发展做出贡献。

一键难忘的博客 3214

Linux platform device 分析

比如amba-bus下的i2c master是属于其一级child,会add。但是i2c master下的child,属于二级child,就不在这里creat&add了。I2C master下的child则是有其他驱动creat&add,以后分析。device_add 之后,kernel device core 会匹配相关的driver,如果匹配成功,会调用 device_driver_attach,实现驱动probe,完成device的初始化(涉及到通用驱动框架,详细流程以后分析)。.........

滴滴答滴答 1351

[RK3568 Android11] 开发之蓝牙(AP6275S)

前言 蓝牙是一种支持设备短距离通信(一般10m内)的无线电技术,能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。利用“蓝牙”技术,能够有效地简化移动通信终端设备之间的通信,也能够成功地简化设备与因特网Internet之间的通信,从而数据传输变得更加迅速高效,为无线通信拓宽道路。 接下来是在RK3568上调试AP6275S模块蓝牙部分: 一、设备树dts配置 根据硬件原理图,找到对应的控制引脚,配置好dts: ...

~未来可期~ 4072

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

platform总线的简单使用

Linux从2.6起就加入了一套新的驱动管理和注册的机制platform平台总线,是一条虚拟的总线,设备用platform_device表示,驱动用platform_driver进行注册。相对于USB、PCI、I2C、SPI等物理总线来说,platform总线是一种虚拟、抽象出来的总线,实际中并不存在这样的总线。那为什么需要platform总线呢?其实是Linux设备驱动模型为了保持设备驱动的统一...

weixin_39821531的博客 724

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

platform框架(一)基于platform编写驱动

platform框架 下图是platform框架,其中左边是设备链表,右边是driver链表。至于该框架之上的kset,kobject等在后续章节进行描述。 Platform主要工作包含三部分,设备链表维护,driver链表维护,设备和driver的match操作。 其中设备链表维护即像链表中增加和删除元素,platform_device_register,platform_device_unr...

baidu_20359401的博客 2130

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Linux platform子系统【1】-PLATFORM(平台)总线详解

platform 总线

m0_46535940的博客 1380

linux platform驱动,LINUX设备驱动之platform总线

Eric Fang2010-01-19--------------------------------------------------------------本站分析linux内核源码,版本号为2.6.32.3--------------------------------------------------------------阅读本文之前,如果你对设备驱动模型还不了解,请先阅读本站设备驱...

weixin_34530164的博客 622

platform 设备

platform_device 并不是与字符设备、块设备并列的概念,而是Linux系统提供的一种管理设备的手段,所有SOC系统中集成的独立的外设控制器、挂接在SOC内存空间的外设等都属Platform设备。如把内部集成的I2C、PTC、SPI、LCD、看门狗控制器都归纳为Platform设备,而这些设备本身就是字符设备。由此可见Platform中的设备是不分字符设备还是块设备。 bus ...

gbmaotai的博客 598
上一篇: 栈的实现(顺序表和链表)
下一篇: linux中.config,makefile,kconfig
快乐的小鸟
博客等级 码龄14年 25粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值