恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Linux 驱动开发实战:从手写 LED 字符设备驱动到设备树
首页
资讯中心
/
Linux 驱动开发实战:从手写 LED 字符设备驱动到设备树
Linux 驱动开发实战:从手写 LED 字符设备驱动到设备树
发布时间:2026/10/14 3:22:56
前言学习Linux驱动LED是经典入门案例。本文从最基础的硬编码寄存器字符设备驱动过渡到设备树platform平台驱动完整梳理IMX6ULL上的实现思路理解软硬件解耦思想。一、传统字符设备驱动无设备树原理直接在驱动代码写死寄存器物理地址使用ioremap完成地址映射手动注册字符设备提供open/release/write接口应用层通过/dev/led操作LED。核心代码片段staticstructfile_operationsled_fops{.ownerTHIS_MODULE,.openled_open,.releaseled_release,.writeled_write,};staticint__initled_init(void){register_chrdev(LED_MAJOR,led,led_fops);gpio_baseioremap(GPIO_PHYS_ADDR,REG_SIZE);writel(OUT_MODE,gpio_baseGPIO_DIR);return0;}缺点硬件信息硬编码更换硬件就要修改驱动源码、重新编译模块可移植性差仅适合入门理解字符设备底层原理。二、设备树版本 platform 驱动工程标准写法设备树将硬件信息剥离到dts文件驱动只保留业务逻辑依靠compatible属性完成设备与驱动匹配实现软硬件分离。dts节点片段led_test { compatible myimx6ull,led; gpios gpio1 3 GPIO_ACTIVE_LOW; status okay; };平台驱动核心片段staticconststructof_device_idled_of_match[]{{.compatiblemyimx6ull,led},{}};staticstructplatform_driverled_platform_driver{.probeled_probe,.removeled_remove,.driver{.nameled-drv,.of_match_tableled_of_match,},};module_platform_driver(led_platform_driver);匹配成功后自动执行probe函数解析设备树GPIO属性、申请引脚资源并完成初始化。三、应用层测试代码fdopen(/dev/led,O_RDWR);write(fd,val,1);close(fd);写入1点亮LED写入0熄灭LED。四、完整实操流程修改dts添加led节点编译生成dtb并更新到开发板编写platform驱动Makefile编译生成ko模块开发板insmod加载驱动内核匹配设备树自动创建设备节点运行应用程序控制LED测试完毕rmmod卸载驱动五、两种方案对比传统字符设备代码简单适合初学硬件写死移植性差。设备树platform驱动工业主流方案硬件描述和驱动逻辑分离换硬件只需修改设备树不用改动驱动代码。六、常见问题compatible字符串驱动和设备树必须完全一致大小写敏感字符串不匹配会导致probe不执行GPIO电平极性容易颠倒GPIO_ACTIVE_LOW代表低电平点亮修改设备树后需要重新编译dtb只编译ko不会更新硬件配置内核模块版本要和开发板内核版本保持一致否则加载模块报错