linux平台设备驱动

[Linux外设驱动详解]11. 平台设备驱动(Platform Driver) 本文介绍了Linux内核中的平台设备驱动(Platform Driver)框架,主要内容包括: 平台设备驱动概述:用于管理片上外设(SoC内置外设),提供统一的注册和匹配机制。 平台总线(platform_bus):虚拟总线,负责平台设备和驱动的匹配,包含核心数据结构platform_bus_type。 平台设备(platform_device):描述硬件设备的结构体,包含资源定义(内存、中断等)。 平台驱动(platform_driver):设备驱动结构体,包含probe/remove等操作函数。 设备与 阅读详情
 一、platform_device的使用流程:声明struct platform_device *p_device

 

 

Platform_device的使用1、平台设备,通过struct platform_device 来进行描述。 struct platform_device {const char * name; //平台设备的名称 int id;//设备的ID,当ID=-1的时候,表示设备名称只有一个,否则表示设备编号struct device dev; u32 num_resources; struct resource * resource;struct platform_device_id *id_entry; };2、其中platform_device内包含两个重要的结构体,一个是struct device 该结构体描述设备相关的信息设备之间的层次关系以及设备与总线驱动的关系。struct device { struct device *parent;//指向父设备节点struct device_private *p;//描述的是klist,struct klist是对struct list_head的扩展,在此它的作用是连接设备列表中的孩子列表。Struct klist_node表示它的兄弟节点。struct kobject kobj;const char *init_name; /* initial name of the device */struct device_type *type; /*device_type结构表示设备的类型。一个设备类或者总线可以包含不同类型的设备,例如“分区”和“磁盘” , “鼠标”和“事件” 。device_type就可以标识某个设备类型和该设备的特有信息,它就等同于kobject结构中的kobj_type一样。如果name数据成员被指定,那么uevent成员函数就会把它包含在DEVTYPE变量中。*/struct semaphore sem; /* 该信号量用于同步其驱动 */struct bus_type *bus; /*设备所在的总线,指向所连接的总线 */struct device_driver *driver; /* 管理该设备的驱动 */void *driver_data; /* 设备的私有数据指针*/void *platform_data; /* Platform specific data, device core doesn't touch it */ struct dev_pm_info power; #ifdef CONFIG_NUMAint numa_node; /* NUMA node this device is close to */ #endifu64 *dma_mask; /*指向设备DMA屏蔽字。*/u64 coherent_dma_mask;/* Like dma_mask, but for alloc_coherent mappings as not all hardware supports 64 bit addresses for consistent allocations such descriptors. */struct device_dma_parameters *dma_parms;struct list_head dma_pools; /* dma pools (if dma'ble)聚集的DMA缓冲池 */struct dma_coherent_mem *dma_mem; /* 设备一致性DMA的屏蔽字 override *//* arch specific additions */ struct dev_archdata archdata;dev_t devt; /* dev_t, creates the sysfs "dev" */spinlock_t devres_lock; 设备自旋锁,用于互斥访问设备 struct list_head devres_head;struct klist_node knode_class; struct class *class;struct attribute_group **groups; /* optional groups */void (*release)(struct device *dev);释放设备描述符的回调函数。 };3、通过struct resource结构体来描述struct resource { resource_size_t start; resource_size_t end ;//资源起始的和结束的物理地址const char *name;//资源的名称 unsigned long flags;;//资源的类型,比如MEM,IO,IRQ类型struct resource *parent, *sibling, *child;;//资源链表的指针 }; 4、platform_device的使用1)声明该结构体struct platform_device *my_buttons_dev;//给该结构体分配空间和初始化。传入的参数为设备名字和设备ID,当ID=-1的时候表明该设备名称唯一my_buttons_dev = platform_device_alloc("my_buttons", -1);声明平台设备的资源struct resource static struct resource key_resource[]= { [0] = {.start = IRQ_EINT1, .end = IRQ_EINT1, .flags = IORESOURCE_IRQ, },[1] = { .start = IRQ_EINT2, .end = IRQ_EINT2, .flags = IORESOURCE_IRQ,}, }; //使用下面函数将该资源添加到平台设备里面去,使用该函数,会为 platform_device 中的resource结构体指针分配空间并且赋值//参数为 (struct platform_device *pdev,struct resource *res, unsigned int num)platform_device_add_resources(my_buttons_dev,key_resource,6); 3)//向系统注册该设备ret = platform_device_add(my_buttons_dev); if(ret)platform_device_put(my_buttons_dev); 并且在退出函数里面将该平台设备注销void platform_device_unregister(struct platform_device *pdev)


Linux驱动开发(5):平台设备驱动 本节实验使用到 EBF6ULL-PRO 开发板上的 RGB 彩灯我们需要将字符设备中的硬件信息提取出来,独立成一份代码,将其作为平台设备,注册到内核中。点亮LED灯,需要控制与LED灯相关的寄存器, 包括GPIO时钟寄存器,IO配置寄存器,IO数据寄存器等,这里的资源,实际上就是寄存器地址,可以使用IORESOURCE_MEM进行处理;除了这些之外,还需要提供一些寄存器的偏移量,我们可以利用平台设备的私有数据进行管理。#define CCM_CCGR1 0x020C406C //时钟控制寄存器。 阅读详情

相关推荐

Linux内核笔记(驱动篇)之 【平台设备驱动模型】

平台设备的资源包括内存、中断、IO端口等。这些资源通常在设备树中进行定义,设备树中的每个设备节点都可以定义其所需的资源信息。以内存资源为例,设备树中定义内存资源的方法如下:其中,memory节点是内存资源的名称,reg属性定义了内存资源的地址和大小。

哆哆jarvis的博客 638

linux设备驱动中ADC的使用

内核源代码arch\arm\plat-s3c24xx\s3c2410-clock.c /* standard clock definitions */ static struct clk init_clocks_off[] = { { .name = "nand", .id = -1, .parent = &clk_h, .enable = s3c2410_clkco

草原骑士的专栏 2556

【OpenCV】手眼标定实战:从原理到calibrateHandEye的完整实现

本文详细解析了机器人视觉中的手眼标定原理与实战,重点介绍了如何使用OpenCV的calibrateHandEye函数实现从数据采集到结果验证的完整流程。文章深入剖析了AX=XB核心方程,区分了眼在手上与眼在手外两种配置,并提供了详细的代码示例与避坑指南,帮助开发者精准建立相机与机械臂末端的坐标转换关系,是机器人精准抓取的关键技术。

weixin_29046611的博客 508

【Linux驱动】平台设备驱动

在之前的字符设备程序中驱动程序,我们只要调用open()函数打开了相应的设备文件,就可以使用read()/write()函数, 通过file_operations这个文件操作接口来进行硬件的控制。这种驱动开发方式简单直观,但是从软件设计的角度看,却是一种十分糟糕的方式。它有一个严重的问题,就是设备信息和驱动代码杂糅在一起,在我们驱动程序中各种硬件寄存器地址随处可见。本质上,这种驱动开发方式与单片机的驱动开发并没有太大的区别,一旦硬件信息发生变化甚至设备已经不在了,就必须要修改驱动源码。

C/C++软件工程师、嵌入式软件工程师、物联网研发工程师、C/C++讲师、物联网讲师、嵌入式讲师、鸿蒙讲师---欢迎大家一起交流(私信添加博主微信) 1846

ANSYS Workbench对称分析进阶:手把手教你用Pre-Meshed Cyclic Region处理外部导入的复杂网格模型

本文详细介绍了ANSYS Workbench中Pre-Meshed Cyclic Region功能在处理外部导入复杂网格模型时的应用。通过循环对称分析技术,可显著减少计算资源消耗,特别适用于叶轮机械、齿轮组等周期性结构分析。文章深入解析了该功能的底层逻辑,并提供了从NASTRAN文件导入的离心压缩机叶轮案例,帮助工程师克服网格匹配难题。

weixin_28630185的博客 312

DPM|03Injection设置

摘要:本文介绍了CFD软件Fluent中粒子注入的设置方法。粒子注入是将离散颗粒引入连续相的过程,可用于模拟灰尘、燃料液滴等。设置流程包括:选择粒子类型(质量less、惰性等)、定义注入点属性(坐标、时间、粒径等)、处理多组分粒子、使用文本文件批量定义复杂注入。文中还详细说明了要考虑的湍流影响,包括随机追踪法模拟湍流扩散,以及粒子旋转建模等注意事项。最后介绍了多种注入类型和粒子类型,并强调在湍流系统中需设置足够的尝试次数以确保结果准确性。

qq_28258217的博客 2228

linux驱动 平台设备驱动模型

文章目录一、设备驱动模型的三大组件1. 总线1. 总线、设备、驱动关系2. 总线数据结构 bus_type3.bus_type声明实例4.总线私有数据bus_type_private5.总线注册bus_register()2. 总线属性和总线方法1. 总线的属性bus_attribute2. 创建和删除总线属性3. 总线上的方法3. 设备1. device结构体2. 设备注册和注销3. 设备属性4. 驱动1. 设备驱动device_driver2. 驱动举例3. 驱动程序注册和注销4. 驱动的属性二、平台设

weixin_42109053的博客 7016

VS Code + EIDE + Clangd 构建 Keil/MDK 嵌入式开发新范式

嵌入式C/C++开发长期受限于传统IDE的语法理解弱、导航卡顿、跨工程复用难等问题。Clangd作为基于AST的现代语言服务器,结合EIDE对Keil uVision和ARM MDK工程文件(.uvprojx)的深度解析能力,可将编译配置、芯片型号、内存模型、扩展关键字等语义精准翻译为标准compile_commands.json,从而实现智能跳转、宏展开识别、结构体实时展开等高阶编辑体验。该方案不替换Keil/MDK编译与烧录流程,仅升级代码理解层,天然兼容STC8051、STM32 Cortex-M、G

weixin_34321753的博客 352

【Linux】平台设备驱动

驱动代码中最好不要使用全局变量,因为驱动一般是支持多设备的,如果有全局变量会有冲突。字符设备驱动中在open函数中可以使用container_of拿到设备信息,但是杂项设备驱动中怎么拿到设备信息暂时未知。

目标:MVP 1380

Win11系统下Notepad++右键菜单失效?3种修复方法实测有效(附注册表备份指南)

本文针对Windows 11系统中Notepad++右键菜单失效的常见问题,提供了三种经过实测有效的修复方法。核心解决方案包括使用官方NppShell.dll重新注册、手动修复注册表项以及系统级问题排查,并详细说明了操作前的注册表备份指南,确保修复过程安全可靠。

m2n3b4v5c6的博客 328

【华为OD机试真题 2025C卷】895、贪心歌手 | 机试真题+思路参考+代码解析 (C++、Java、Py、C语言、JS)

【华为OD机试真题 2025C卷】895、贪心歌手 | 机试真题+思路参考+代码解析 (C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,如何备战华

KJ.JK 963

Linux——平台设备及其驱动

要满足 Linux 设备模型,就必须有总线、设备和驱动。但是有的设备并没有对应的物理总线,比如 LED、RTC 和蜂鸣器等。为此,内核专门开发了一种虚拟总线一-platfomm总线,用来连接这些没有物理总线的设备或者一些不支持热插拔的设备,DM9000 网卡设备就是挂接在这条总线上的。

qq_52479948的博客 1846

YooAsset 学习

YooAssets使用教程

weixin_44884538的博客 1659

linux驱动开发篇(四)—— platform平台设备驱动

linux系列目录: linux基础篇(一)——GCC和Makefile编译过程 linux基础篇(二)——静态和动态链接 ARM裸机篇(一)——i.MX6ULL介绍 ARM裸机篇(二)——i.MX6ULL启动过程 ARM裸机篇(三)——i.MX6ULL第一个裸机程序 ARM裸机篇(四)——重定位和地址无关码 ARM裸机篇(五)——异常和中断 linux系统移植篇(一)—— linux系统组成 linux系统移植篇(二)—— Uboot使用介绍 linux系统移植篇(三)—— Linux 内核使用介绍 li

sinat_31039061的博客 6065

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Linux驱动开发笔记(三)平台设备驱动

随着科技的飞速发展,平台设备已成为现代计算机系统不可或缺的重要组成部分。无论是智能手机、平板电脑,还是嵌入式系统、数据中心服务器,平台设备都承载着系统运行的核心功能。因此,平台设备驱动的开发与优化,对于保障系统稳定性、提升性能以及满足用户日益增长的需求具有至关重要的作用。在接下来的章节中,我们将详细介绍该驱动的设计思路、实现原理、功能特性以及使用方法,希望能够为广大读者提供有价值的参考和借鉴。//定义一个resource结构体,用于存放上述的寄存器地址,提供给驱动使用。

sincerelover的博客 2003

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Linux中的平台设备驱动模型

在 Linux 的设备驱动模型中,关心总线、设备和驱动这 3 个实体,总线将设备和驱动绑定。在系统每注册一个设备的时候,会寻找与之匹配的驱动;相反的,在系统每注册一个驱动的时候,会寻找与之匹配的设备,而匹配由总线完成。   平台设备匹配的依据是:          1)根据平台设备结构和平台驱动结构中的name成员进行匹配。-- 一个设备对应一个驱动          2)根据平台设备结构中的n...

仗劍走天涯 2384

OV9734 DATASHEET,完整规格书

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

Linux平台设备框架驱动

平台设备框架(platform)是将一个驱动分为设备层和驱动层两个部分,通过总线模型将设备和驱动进行绑定。在系统中每注册一个设备,都会与之匹配一个驱动,同样的,每注册一个驱动也会与之匹配一个设备。通常 Linux 设备和驱动通常都需要挂接在一种总线上,对于本身依附于 PCI、 USB、 I2 C、 SPI 等的设备而言,这自然不是问题,但是在嵌入式系统里面, SOC 系统中集成的独立的外设控制器、挂接在 SOC 内存空间的外设等却不依附于此类总线。

weixin_44453694的博客 1652

Linux平台设备驱动

Linux内核使用总线来处理设备,总线连接了CPU与这些设备。有些总线足够智能,并内嵌了可发现性逻辑以枚举连接到总线上的设备。在引导阶段的初期,Linux内核会请求这些总线提供它们所枚举的设备以及这些设备正常工作所需的资源(如中断线和内存区域)​。PCI、USB和SATA总线都属于这种可发现性总线的范畴。但实际情况往往并不能如我们所愿。有许多设备,CPU仍然无法检测到。其中大部分不可发现的设备位于芯片内部,尽管有些设备位于慢速或低级总线上,这些总线并不支持设备发现。

zhuzewennamoamtf的博客 765

Linux平台设备驱动模型详解

摘要 本文以Rockchip RK3568芯片的PWM驱动为例,深入分析Linux平台设备驱动模型。通过研究drivers/pwm/pwm-rockchip.c源码,阐述了平台设备、总线、驱动程序之间的关系,重点探讨了设备树节点到平台设备的转换机制、设备与驱动的匹配绑定流程,揭示了平台总线的软件实现本质。文章详细解析了PWM驱动的核心数据结构、功能函数及关键机制,包括寄存器锁定、原子性更新等特性,为理解Linux平台设备驱动开发提供了实践参考。 关键词:Linux驱动、平台设备、设备树、PWM驱动

siny_hj的博客 1328

Linux驱动编程 - platform平台设备驱动总线

Linux系统中的platform平台设备驱动

hinewcc的博客 1719

【linux】驱动-7-平台设备驱动

目录前言7. 平台设备驱动7.1 平台总线7.1.1 平台总线注册和匹配方式7.1.2 源码分析7.2 平台设备7.2.1 platform_device7.2.2 设备信息7.2.3 注册/注销平台设备7.3 平台驱动7.3.1 platform_driver7.3.2 注册/注销平台驱动7.3.3 平台驱动获取设备信息参考 前言京东优惠券 https://m.fenfaw.net/ 区分设备驱动模型和平台设备驱动模型。设备驱动模型 可以理解为 总线、设备、驱动。平台设备驱动模型 就是那些 Linux .

nidongla的博客 747

S3C2440驱动篇—Linux平台设备驱动

Linux平台设备驱动中platform_device、platform_driver怎么在驱动中实现

Zechin的专栏 3458

linux设备驱动开发详解_Linux设备驱动开发 - 平台设备驱动

Linux2.6的内核中引入了一种新的设备驱动模型-平台(platform)设备驱动,平台设备驱动分为平台设备(platform_device)和平台驱动(platform_driver),平台设备的引入使得Linux设备驱动更加便于移植。一、平台设备平台设备结构体:struct platform_device { const char * name; ...

weixin_39840733的博客 232

Linux platform平台设备驱动

Linux platform平台设备驱动

opang的博客 2197
上一篇: Linux 中的 VFS 文件系统机制
下一篇: platform平台设备学习
ADC0809608
博客等级 码龄17年 44粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值