从微软GHC深度参与看科技人才战略与个人职业发展路径
2026/6/2 13:35:18
structled_classdev{// LED设备描述符constchar*name;// 设备名enumled_brightnessbrightness;// 当前亮度void(*brightness_set)(...);// 亮度设置函数structled_trigger*trigger;// 触发器指针// ...};structled_trigger{// 触发器描述符constchar*name;// 触发器名void(*activate)(...);// 激活回调structlist_headled_cdevs;// 关联的LED设备// ...};leds { compatible = "gpio-leds"; status = "okay"; led@0 { label = "heartbeat"; gpios = <&pio PC 0 GPIO_ACTIVE_HIGH>; linux,default-trigger = "heartbeat"; }; led@1 { label = "disk_core"; gpios = <&pio PC 1 GPIO_ACTIVE_HIGH>; linux,default-trigger = "mmc0"; }; led@2 { label = "watchdog_io"; gpios = <&pio PG 13 GPIO_ACTIVE_HIGH>; default-state = "off"; }; };| 特性 | led@0 (heartbeat) | led@1 (disk_core) | led@2 (watchdog_io) |
|---|---|---|---|
| 触发方式 | heartbeat | mmc0 | 无触发器 |
| 默认状态 | 心跳模式 | 存储活动时闪烁 | 常闭 |
| 硬件连接 | PC0引脚 | PC1引脚 | PG13引脚 |
| 控制逻辑 | 系统运行状态指示 | 存储设备活动指示 | 看门狗状态指示 |
| 用户控制 | /sys/class/leds/heartbeat | /sys/class/leds/disk_core | /sys/class/leds/watchdog_io |
voidled_set_brightness(structled_classdev*led_cdev,enumled_brightnessbrightness){// 硬件加速路径if(led_cdev->brightness_set)led_cdev->brightness_set(led_cdev,brightness);// 软件模拟路径elseschedule_work(&led_cdev->set_brightness_work);}| 触发器类型 | 实现文件 | 控制参数 | 典型应用场景 |
|---|---|---|---|
timer | ledtrig-timer.c | delay_on/delay_off | 周期性闪烁指示 |
heartbeat | ledtrig-heartbeat.c | invert | 系统运行状态指示 |
mmc0 | mmc_core.c | 无 | 存储设备活动指示 |
default-on | ledtrig-defon.c | 无 | 设备上电常亮 |
心跳触发器的四个相位:
staticintled_gpio_probe(structplatform_device*pdev){// 解析设备树for_each_child_of_node(np,child){structgpio_led*led=&leds[num_leds++];led->gpiod=devm_fwnode_get_gpiod_from_child(dev,NULL,child);led->cdev.name=of_get_property(child,"label",NULL);led->cdev.default_trigger=of_get_property(child,"linux,default-trigger",NULL);}// 注册LED设备for(i=0;i<num_leds;i++){ret=devm_led_classdev_register(dev,&leds[i].cdev);}}staticvoidgpio_led_set(structled_classdev*led_cdev,enumled_brightnessvalue){structgpio_led*led=container_of(led_cdev,structgpio_led,cdev);gpiod_set_value_cansleep(led->gpiod,value?LED_ON:LED_OFF);}staticstructled_triggermy_trigger={.name="custom",.activate=custom_activate,.deactivate=custom_deactivate,};staticint__initmy_trigger_init(void){returnled_trigger_register(&my_trigger);}# 查看所有LED设备ls/sys/class/leds/# 手动控制LEDecho1>/sys/class/leds/heartbeat/brightness# 点亮echotimer>/sys/class/leds/heartbeat/trigger# 切换触发器# 配置闪烁参数echo500>/sys/class/leds/heartbeat/delay_on# 亮500msecho500>/sys/class/leds/heartbeat/delay_off# 灭500ms| 应用场景 | 推荐方案 | 优势 |
|---|---|---|
| 工业控制面板 | GPIO直驱 + timer触发器 | 响应快,成本低 |
| 车载信息娱乐 | PWM驱动 + heartbeat | 亮度可调,状态直观 |
| 物联网设备 | I2C扩展芯片 + mmc触发器 | 节省引脚,集成度高 |
| 服务器系统 | 自定义触发器 | 实时反映系统健康状态 |
// 在suspend时关闭非必要LEDstaticintled_suspend(structdevice*dev){structgpio_led*led=dev->platform_data;if(!strcmp(led->cdev.name,"status_led"))led_set_brightness(&led->cdev,LED_OFF);return0;}LED驱动虽小,却承载着系统状态可视化的重任。掌握其核心机制,可让硬件设计如虎添翼。据统计,合理使用LED子系统可降低30%的GPIO控制代码量,提高系统可维护性。
扩展阅读: