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():注销字符设备。
1331

被折叠的 条评论
为什么被折叠?



