“扩展板LED灯驱动移植”的版本间的差异

来自华清远见研发中心
跳转至: 导航搜索
(创建页面,内容为“==实验原理== ==实验目的== ==实验平台== ==实验步骤==”)
 
实验步骤
 
(未显示同一用户的4个中间版本)
第1行: 第1行:
 
==实验原理==
 
==实验原理==
 +
打开扩展板原理图对照扩展板可以看到扩展板有四个LED灯,其中LED4为底板电压指示灯,LD1、LD2、LD3为可控LED,原理如下:
 +
 +
<center>[[Image:58-1-1.png]]</center><br>
 +
 +
有图可知,当LED1为高电平是三极管Q3导通,这时发光二极管LD1会被点亮,同理当LED2和LED3为高电平时LD2、LD3会被点亮。
 +
 +
查看原理图可知LED1、LED2、LED3分别对应STM32MP157芯片的PE10、PF10、PE8如下图:
 +
 +
<center>[[Image:58-1-2.png]]</center><br>
 +
 +
<center>扩展板与底板接口对照图</center>
 +
 +
根据网络编号可最终追至CPU对应管脚,由于上图已经可以明确LED灯对应管脚。
 +
{| align=center border=2
 +
|-
 +
! 原理图网络编号 !! 对应管脚 !! 管脚功能 !! 管脚功能码
 +
|-
 +
| LED1
 +
| PE10
 +
| GPIO
 +
| ANALOG
 +
|-
 +
| LED2
 +
| PF10
 +
| GPIO
 +
| ANALOG
 +
|-
 +
| LED3
 +
| PE8
 +
| GPIO
 +
| ANALOG
 +
|}
 +
 
==实验目的==
 
==实验目的==
 +
了解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,原理如下:

58-1-1.png

有图可知,当LED1为高电平是三极管Q3导通,这时发光二极管LD1会被点亮,同理当LED2和LED3为高电平时LD2、LD3会被点亮。

查看原理图可知LED1、LED2、LED3分别对应STM32MP157芯片的PE10、PF10、PE8如下图:

58-1-2.png

扩展板与底板接口对照图

根据网络编号可最终追至CPU对应管脚,由于上图已经可以明确LED灯对应管脚。

原理图网络编号 对应管脚 管脚功能 管脚功能码
LED1 PE10 GPIO ANALOG
LED2 PF10 GPIO ANALOG
LED3 PE8 GPIO ANALOG

实验目的

了解LED工作原理,掌握使用内核LED灯驱动控制LED灯的方法。

实验平台

华清远见开发环境,FS-MP1A平台

实验步骤

  1. 导入交叉编译工具链
  2. linux@ubuntu:$ source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
    
  3. 内核配置
  4. 内核中对于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
    
  5. 修改设备树
  6. 参考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";
    };

    };
    };

  7. 重新编译内核和设备树文件
  8. make -j4 uImage dtbs LOADADDR=0xC2000040
    
  9. 更新系统内核和设备树
  10. 测试
  11. 系统启动后可以查看目录/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灯状态变化