Linux平台设备驱动开发详解与实践

发布时间:2026/7/17 20:11:49

Linux平台设备驱动开发详解与实践
1. Linux平台设备驱动开发基础在嵌入式Linux开发中平台设备驱动(Platform Device Driver)是一种重要的驱动模型它专门用于管理那些没有物理总线的简单设备。这类设备通常包括LED、按键、蜂鸣器等常见外设。platform_driver_register()和platform_device_register()是Linux内核提供的两个核心API用于实现平台设备和驱动的注册与管理。1.1 平台设备与驱动的基本概念平台总线(Platform Bus)是Linux内核中的一种虚拟总线用于连接那些没有专用物理总线的设备。这种设计使得简单外设也能遵循Linux设备模型实现设备与驱动的分离。平台设备(Platform Device)通过platform_device结构体描述主要包含设备名称(name)设备ID(id)资源信息(resource)私有数据(platform_data)平台驱动(Platform Driver)通过platform_driver结构体描述核心成员包括probe/remove回调函数驱动名称(driver.name)兼容设备表(id_table)2. 平台设备注册详解2.1 platform_device结构体解析struct platform_device { const char *name; int id; struct device dev; u32 num_resources; struct resource *resource; const struct platform_device_id *id_entry; };关键字段说明name设备名称用于总线匹配id设备实例编号dev内嵌的device结构体resource设备资源数组num_resources资源数量2.2 设备资源定义设备资源通过struct resource描述struct resource { resource_size_t start; resource_size_t end; const char *name; unsigned long flags; };常用资源类型标志IORESOURCE_MEM内存映射资源IORESOURCE_IOI/O端口资源IORESOURCE_IRQ中断资源2.3 平台设备注册流程定义设备资源static struct resource pdev_res[] { [0] DEFINE_RES_MEM(0xFDD60000, 0x10), [1] DEFINE_RES_IRQ(32), };初始化platform_device结构体static struct platform_device pdev { .name sample-device, .id 0, .num_resources ARRAY_SIZE(pdev_res), .resource pdev_res, };注册设备int ret platform_device_register(pdev); if (ret) { pr_err(Failed to register platform device\n); return ret; }3. 平台驱动开发实践3.1 platform_driver结构体详解struct platform_driver { int (*probe)(struct platform_device *); int (*remove)(struct platform_device *); struct device_driver driver; const struct platform_device_id *id_table; };关键操作函数probe设备匹配成功后调用remove设备移除时调用3.2 驱动注册实现定义id_tablestatic const struct platform_device_id sample_ids[] { { sample-device, 0 }, { } }; MODULE_DEVICE_TABLE(platform, sample_ids);实现probe函数static int sample_probe(struct platform_device *pdev) { struct resource *mem; void __iomem *regs; mem platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!mem) { dev_err(pdev-dev, No memory resource\n); return -ENODEV; } regs devm_ioremap_resource(pdev-dev, mem); if (IS_ERR(regs)) return PTR_ERR(regs); /* 设备初始化代码 */ return 0; }注册平台驱动static struct platform_driver sample_driver { .driver { .name sample-driver, }, .probe sample_probe, .remove sample_remove, .id_table sample_ids, }; module_platform_driver(sample_driver);4. 设备与驱动的匹配机制4.1 匹配优先级平台总线匹配设备和驱动时按照以下优先级顺序设备树匹配(of_driver_match_device)ACPI匹配(acpi_driver_match_device)id_table匹配名称匹配(strcmp)4.2 匹配函数实现static int platform_match(struct device *dev, struct device_driver *drv) { struct platform_device *pdev to_platform_device(dev); struct platform_driver *pdrv to_platform_driver(drv); /* 设备树匹配 */ if (of_driver_match_device(dev, drv)) return 1; /* ACPI匹配 */ if (acpi_driver_match_device(dev, drv)) return 1; /* id_table匹配 */ if (pdrv-id_table) return platform_match_id(pdrv-id_table, pdev) ! NULL; /* 名称匹配 */ return (strcmp(pdev-name, drv-name) 0); }5. 实战案例LED平台驱动5.1 设备端实现/* 定义GPIO资源 */ static struct resource led_res[] { [0] DEFINE_RES_MEM(0xFDD60000, 0x10), [1] DEFINE_RES_MEM(0xFDD60004, 0x10), }; /* 定义私有数据 */ static unsigned int led_pin 7; /* 定义平台设备 */ static struct platform_device led_pdev { .name platform-led, .id 0, .num_resources ARRAY_SIZE(led_res), .resource led_res, .dev { .platform_data led_pin, }, };5.2 驱动端实现struct led_platform_data { unsigned int pin; }; static int led_probe(struct platform_device *pdev) { struct led_platform_data *pdata dev_get_platdata(pdev-dev); struct resource *mem; void __iomem *regs; /* 获取资源 */ mem platform_get_resource(pdev, IORESOURCE_MEM, 0); regs devm_ioremap_resource(pdev-dev, mem); /* 初始化GPIO */ iowrite32(ioread32(regs) | (1 pdata-pin), regs); /* 注册字符设备 */ /* ... */ return 0; } static struct platform_driver led_driver { .driver { .name platform-led, }, .probe led_probe, /* ... */ };6. 常见问题与调试技巧6.1 匹配失败排查检查/sys/bus/platform/devices和/sys/bus/platform/drivers目录确认设备和驱动的name字段一致检查probe函数是否被调用6.2 资源获取失败处理res platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { dev_err(pdev-dev, Failed to get MEM resource\n); return -ENXIO; } irq platform_get_irq(pdev, 0); if (irq 0) { dev_err(pdev-dev, Failed to get IRQ\n); return irq; }6.3 内存映射注意事项使用devm_ioremap_resource自动管理资源检查返回的指针是否有效注意资源的大小和对齐7. 现代Linux驱动开发实践7.1 设备树与平台设备的结合sample_device: sample-devicefdd60000 { compatible vendor,sample-device; reg 0xfdd60000 0x1000; interrupts 0 32 4; led-pin 7; };7.2 使用devm_系列函数管理资源/* 自动释放的资源管理 */ regs devm_ioremap_resource(pdev-dev, res); clk devm_clk_get(pdev-dev, NULL); irq devm_request_irq(pdev-dev, irq_num, handler, flags, name, dev);7.3 平台驱动的最佳实践充分利用设备树传递配置信息使用devres机制管理资源实现适当的电源管理回调提供sysfs接口进行调试和控制在实际开发中平台设备驱动模型为简单外设提供了标准化的管理方式使得驱动代码可以更好地与硬件信息分离提高了代码的可维护性和可移植性。通过合理使用platform_device_register()和platform_driver_register()开发者可以构建出符合Linux设备模型的优质驱动。

相关新闻

大型企业产品研发管理体系:用 IPD 打通战略、需求、研发与商业成功 (PPT)

大型企业产品研发管理体系:用 IPD 打通战略、需求、研发与商业成功 (PPT)

2026/7/17 20:11:49

研发管理最难的从来不是“把项目做完”,而是确保企业持续投入资源去做正确的产品,并以可预测的质量、成本和节奏把产品推向市场。大型企业要摆脱“立项靠拍板、需求靠口头、研发靠加班、上市靠运气”的循环,必须建立从市场洞察到生命周期经营…

AI Agent开发中的PLAN-AND-EXECUTE模式解析与实践

AI Agent开发中的PLAN-AND-EXECUTE模式解析与实践

2026/7/17 20:11:49

1. AI Agent开发中的PLAN-AND-EXECUTE模式解析在AI Agent开发领域,PLAN-AND-EXECUTE模式正在成为处理复杂任务的新范式。这种架构将传统ReAct(Reasoning and Action)代理的单步决策过程拆分为明确的规划阶段和执行阶段,就像建筑项…

MiniMax算法与Agent系统的技术演进及应用

MiniMax算法与Agent系统的技术演进及应用

2026/7/17 20:11:49

1. 项目概述:对话MiniMax择因的技术本质这个标题背后探讨的是当前人工智能领域最前沿的Agent技术发展路径。作为从业者,我理解这实际上是在讨论三个关键命题:第一,MiniMax这类新型AI架构的技术原理;第二,Ag…

12. 光刻机和半导体 ArF浸没光刻胶:水痕、气泡类浸没缺陷长效抑制

12. 光刻机和半导体 ArF浸没光刻胶:水痕、气泡类浸没缺陷长效抑制

2026/7/17 21:51:54

Sorting Logic: English (Global Standard) → Chinese (Original Context) → German (Precision Engineering) 12. ArF Immersion Photoresist: Suppression of Water Marks & Bubble-Induced Defects World-Class Hard Tech R&D Roadmap 2026 Version: 1.0 (Hardcor…

Linux包管理工具YUM详解:从基础配置到高级应用

Linux包管理工具YUM详解:从基础配置到高级应用

2026/7/17 21:51:54

1. YUM命令概述与核心价值在RPM系Linux发行版中,yum(Yellowdog Updater Modified)作为经典的包管理工具,其重要性不亚于Debian系的apt。我第一次接触yum是在2008年维护CentOS 5服务器时,当时就被它自动解决依赖关系的特…

同一个wifi里面是可以正常聊天的

同一个wifi里面是可以正常聊天的

2026/7/17 21:51:54

2个手机都是只打开了wifi,没有用5G网络

聊天功能整体架构

聊天功能整体架构

2026/7/17 21:51:54

1 以聊天功能作为基础,如果要其他功能,都需要打开聊天服务---------------而不是另外写服务,因为websocket如果在一个手机上面建立2个可能会出现问题。所以可能一个手机上面只能有一个websocket连接。但是其实如果你给2个id,那么也…

零基础入门 DeepSeek V4 Pro API 开发:从环境搭建、消息格式规范到翻译函数实战、少样本提示、多轮对话聊天机器人与常见报错全流程详解指南

零基础入门 DeepSeek V4 Pro API 开发:从环境搭建、消息格式规范到翻译函数实战、少样本提示、多轮对话聊天机器人与常见报错全流程详解指南

2026/7/17 21:51:54

全文速览(复习专用精简版) 本文面向零编程基础的新手,完整讲解如何用 Python 调用 DeepSeek V4 Pro 大模型 API。核心结论可直接背诵复习: DeepSeek V4 Pro 完全兼容 OpenAI 接口规范,使用官方openai Python SDK 即可…

云智能制造一体化平台【程序源代码】

云智能制造一体化平台【程序源代码】

2026/7/17 21:41:53

关键字:智能制造,零代码,SaaS,Spring Cloud Alibaba,Vue3,uni-app,MySQL,Mybatis-Plus, 工作流,ERP,MES,CRM,OA, 多租户项目介绍: 云智能制造一体化平台(含源码)开源组织推出的一站式 SaaS 智能制造管理平台…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/17 10:50:47

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/17 17:34:09

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/16 14:18:17

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…

Cursor终端插件生态避坑指南:23个实测低效插件黑名单,附3个自研轻量替代方案

Cursor终端插件生态避坑指南:23个实测低效插件黑名单,附3个自研轻量替代方案

2026/7/17 0:00:57

更多请点击: https://intelliparadigm.com 第一章:Cursor终端插件生态避坑指南概览 Cursor 作为基于 VS Code 内核构建的 AI 原生编辑器,其终端插件生态虽活跃,但存在兼容性断层、权限策略突变与调试链路断裂等典型风险。开发者常…

ChatGPT写作提示词效率革命:单条提示词响应质量提升3.8倍的关键变量(附可复用提示词矩阵表)

ChatGPT写作提示词效率革命:单条提示词响应质量提升3.8倍的关键变量(附可复用提示词矩阵表)

2026/7/17 0:00:57

更多请点击: https://codechina.net 第一章:ChatGPT写作提示词效率革命:单条提示词响应质量提升3.8倍的关键变量(附可复用提示词矩阵表) 提示词工程已从经验试错迈入变量驱动的科学阶段。实证研究表明,影响…

DeepSeek V4替换Codex底座模型的实践与优化

DeepSeek V4替换Codex底座模型的实践与优化

2026/7/17 0:00:57

1. 为什么选择用DeepSeek V4替换Codex的底座模型去年我在开发一个智能代码补全工具时,发现Codex的默认底座模型在复杂业务逻辑场景下表现不尽如人意。经过多次测试对比,DeepSeek V4在以下几个关键指标上展现出明显优势:代码补全准确率&#x…