1.实验原理
打开扩展板原理图对照扩展板可以看到扩展板有四个
LED
灯,其中
LED4
为底板电压指示灯,LD1
、
LD2
、
LD3
为可控
LED
,原理如下:

有图可知,当
LED1
为高电平是三极管
Q3
导通,这时发光二极管
LD1
会被点亮,同理 当 LED2
和
LED3
为高电平时
LD2
、
LD3
会被点亮。
查看原理图可知
LED1
、
LED2
、
LED3
分别对应
STM32MP157
芯片的
PE10
、
PF10
、
PE8 如下图:

根据网络编号可最终追至 CPU 对应管脚,由于上图已经可以明确 LED 灯对应管脚。
2.实验步骤
1) 导入交叉编译工具链
linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
2) 内核配置
内核中对于
gpio
驱动
LED
提供了标准的驱动,只要在内核中配置对应选项即可,驱动路径为:
drivers/leds/leds-gpio.c
由于内核中已经配置 GPIO LED 驱动,这里列出配置选项供参考。
linux@ubuntu:$ make menuconfig
Device Drivers --->
[*] LED Support --->
<*> LED Class Support
<*> LED Support for GPIO connected LEDs
3) 修改设备树
参考
linux
内核文档:
Documentation/devicetree/bindings/leds/leds-gpio.txt
修改设备树文件:
arch/arm/boot/dts/stm32mp157a-fsmp1a-extended.dts
在根节点下添加
led
相关内容,红色字体部分为添加内容:
/ {
model = "HQYJ STM32MP157 FSMP1A EXTENDED Discovery Board";
compatible = "st,stm32mp157", "st,stm32mp157a-fsmp1a-extended";
led {
compatible = "gpio-leds";
led1 {
label = "led1";
gpios = <&gpioe 10 GPIO_ACTIVE_HIGH>;
default-state = "off";
};
led2 {
label = "led2";
gpios = <&gpiof 10 GPIO_ACTIVE_HIGH>;
default-state = "off";
};
led3 {
label = "led3";
gpios = <&gpioe 8 GPIO_ACTIVE_HIGH>;
default-state = "off";
};
};
};
4) 重新编译内核和设备树文件
make -j4 uImage dtbs LOADADDR=0xC2000040
5) 更新系统内核和设备树
6) 测试
系统启动后可以查看目录
/sys/class/leds
root@fsmp1a:# ls /sys/class/leds/led1 led2 led3
led1
、
led2
和
led3
三个目录分别和设备树种三个节点的名称一致,在这几个目录下内容
如下
root@fsmp1a:~# ls /sys/class/leds/led1/brightness device max_brightness power subsystem trigger uevent
其中向
brightness
文件写入
1
或
0
即可实现
LED
灯的控制
root@fsmp1a:~# echo 0 > /sys/class/leds/led1/brightnessroot@fsmp1a:~# echo 0 > /sys/class/leds/led2/brightnessroot@fsmp1a:~# echo 0 > /sys/class/leds/led3/brightnessroot@fsmp1a:~# echo 1 > /sys/class/leds/led3/brightnessroot@fsmp1a:~# echo 1 > /sys/class/leds/led2/brightnessroot@fsmp1a:~# echo 1 > /sys/class/leds/led1/brightness
观察
LED
灯状态变化