“扩展板LED灯驱动移植”的版本间的差异
来自华清远见研发中心
(→实验原理) |
(→实验步骤) |
||
(未显示同一用户的2个中间版本) | |||
第34行: | 第34行: | ||
==实验目的== | ==实验目的== | ||
+ | 了解LED工作原理,掌握使用内核LED灯驱动控制LED灯的方法。 | ||
+ | |||
==实验平台== | ==实验平台== | ||
+ | 华清远见开发环境,FS-MP1A平台 | ||
+ | |||
==实验步骤== | ==实验步骤== | ||
+ | <ol> | ||
+ | <li>导入交叉编译工具链</li> | ||
+ | linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi | ||
+ | |||
+ | <li>内核配置</li> | ||
+ | |||
+ | 内核中对于gpio驱动LED提供了标准的驱动,只要在内核中配置对应选项即可,驱动路径为: | ||
+ | drivers/leds/leds-gpio.c | ||
+ | 由于内核中已经配置GPIO LED驱动,这里列出配置选项供参考。 | ||
+ | <pre> | ||
+ | linux@ubuntu:$ make menuconfig | ||
+ | Device Drivers ---> | ||
+ | [*] LED Support ---> | ||
+ | <*> LED Class Support | ||
+ | <*> LED Support for GPIO connected LEDs | ||
+ | </pre> | ||
+ | |||
+ | <li>修改设备树</li> | ||
+ | 参考linux内核文档: | ||
+ | Documentation/devicetree/bindings/leds/leds-gpio.txt | ||
+ | 修改设备树文件: | ||
+ | arch/arm/boot/dts/stm32mp157a-fsmp1a-extended.dts | ||
+ | 在根节点下添加led相关内容,红色字体部分为添加内容:<br> | ||
+ | |||
+ | <div style="background-color:#F8F8F8;border:1px solid #E5E5E5;font-family: monospace,Courier;"> | ||
+ | /{<br> | ||
+ | model = "HQYJ STM32MP157 FSMP1A EXTENDED Discovery Board";<br> | ||
+ | compatible = "st,stm32mp157", "st,stm32mp157a-fsmp1a-extended";<br> | ||
+ | <font color="#F00"> | ||
+ | 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"; | ||
+ | : }; | ||
+ | }; | ||
+ | </font><br> | ||
+ | }; | ||
+ | </div> | ||
+ | <li>重新编译内核和设备树文件</li> | ||
+ | make -j4 uImage dtbs LOADADDR=0xC2000040 | ||
+ | <li>更新系统内核和设备树</li> | ||
+ | <li>测试</li> | ||
+ | 系统启动后可以查看目录/sys/class/leds | ||
+ | <pre> | ||
+ | root@fsmp1a:# ls /sys/class/leds/ | ||
+ | led1 led2 led3 | ||
+ | </pre> | ||
+ | led1、led2和led3三个目录分别和设备树种三个节点的名称一致,在这几个目录下内容如下 | ||
+ | <pre> | ||
+ | root@fsmp1a:~# ls /sys/class/leds/led1/ | ||
+ | brightness device max_brightness power subsystem trigger uevent | ||
+ | </pre> | ||
+ | 其中向brightness文件写入1或0即可实现LED灯的控制 | ||
+ | <pre> | ||
+ | root@fsmp1a:~# echo 0 > /sys/class/leds/led1/brightness | ||
+ | root@fsmp1a:~# echo 0 > /sys/class/leds/led2/brightness | ||
+ | root@fsmp1a:~# echo 0 > /sys/class/leds/led3/brightness | ||
+ | root@fsmp1a:~# echo 1 > /sys/class/leds/led3/brightness | ||
+ | root@fsmp1a:~# echo 1 > /sys/class/leds/led2/brightness | ||
+ | root@fsmp1a:~# echo 1 > /sys/class/leds/led1/brightness | ||
+ | </pre> | ||
+ | 观察LED灯状态变化 | ||
+ | </ol> |
2021年3月23日 (二) 11:15的最新版本
实验原理
打开扩展板原理图对照扩展板可以看到扩展板有四个LED灯,其中LED4为底板电压指示灯,LD1、LD2、LD3为可控LED,原理如下:
有图可知,当LED1为高电平是三极管Q3导通,这时发光二极管LD1会被点亮,同理当LED2和LED3为高电平时LD2、LD3会被点亮。
查看原理图可知LED1、LED2、LED3分别对应STM32MP157芯片的PE10、PF10、PE8如下图:
根据网络编号可最终追至CPU对应管脚,由于上图已经可以明确LED灯对应管脚。
原理图网络编号 | 对应管脚 | 管脚功能 | 管脚功能码 |
---|---|---|---|
LED1 | PE10 | GPIO | ANALOG |
LED2 | PF10 | GPIO | ANALOG |
LED3 | PE8 | GPIO | ANALOG |
实验目的
了解LED工作原理,掌握使用内核LED灯驱动控制LED灯的方法。
实验平台
华清远见开发环境,FS-MP1A平台
实验步骤
- 导入交叉编译工具链
- 内核配置
- 修改设备树
- 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";
- };
- 重新编译内核和设备树文件
- 更新系统内核和设备树
- 测试
linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
内核中对于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
参考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 {
};
};
make -j4 uImage dtbs LOADADDR=0xC2000040
系统启动后可以查看目录/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/brightness root@fsmp1a:~# echo 0 > /sys/class/leds/led2/brightness root@fsmp1a:~# echo 0 > /sys/class/leds/led3/brightness root@fsmp1a:~# echo 1 > /sys/class/leds/led3/brightness root@fsmp1a:~# echo 1 > /sys/class/leds/led2/brightness root@fsmp1a:~# echo 1 > /sys/class/leds/led1/brightness
观察LED灯状态变化