linux驱动:使用设备树点亮led灯

LED驱动框架思维导图

​1. 设备树配置#**

gpioled {
    compatible = "alientek,led";       // 匹配驱动中的of_device_id
    led-gpio = <&gpio0 RK_PC0 GPIO_ACTIVE_HIGH>; // GPIO引脚定义
    status = "okay";                   // 设备启用状态
};

​关键属性:
compatible:驱动匹配标识符,需与驱动代码中的of_device_id一致。
led-gpio:指定GPIO控制器、引脚号及激活电平(GPIO_ACTIVE_HIGH/LOW)。
status:控制设备是否启用(okay或disabled)。
2. 模块初始化(module_init)​

struct device_node *node = of_find_node_by_path("/gpioled"); // 查找设备树节点

​2.1 设备树解析
of_find_node_by_path():通过路径定位设备树节点。
of_property_read_string():读取status属性,判断设备是否启用。
of_get_named_gpio():提取GPIO编号(如RK_PC0的全局编号)。
​2.2 GPIO初始化
gpio_request():申请GPIO资源,防止冲突。
gpio_direction_output():配置GPIO为输出模式,并设置初始电平(如0=低电平)。
​2.3 设备号管理
​静态分配:
dev_t dev = MKDEV(255, 0); // 主设备号255,次设备号0
register_chrdev_region(dev, 1, “gpioled”);
​动态分配​(推荐):
alloc_chrdev_region(&gpioled.devid, 0, 1, “gpioled”);
​2.4 字符设备注册
cdev_init():绑定file_operations结构体(如open/read/write)。
cdev_add():将设备添加到内核,关联设备号。
​3. Sysfs接口创建
gpioled.class = class_create(THIS_MODULE, “gpioled”); // 创建设备类
device_create(gpioled.class, NULL, gpioled.devid, NULL, “gpioled”); // 创建设备节点
class_create():在/sys/class/下生成设备类目录(如gpioled)。
device_create():在/dev/生成设备节点(如/dev/gpioled),供用户空间访问。
​4. 用户空间交互
​文件操作函数​(需在file_operations中实现):
open():打开设备时初始化硬件。
write():接收用户指令(如echo 1 > /dev/gpioled),调用gpio_set_value()控制LED。
release():释放资源。
​5. 模块退出(module_exit)​
gpio_free():释放GPIO资源。
device_destroy()/class_destroy():删除设备节点和类。
cdev_del()/unregister_chrdev_region():注销字符设备。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值