linux ZYNQ 中使用 GPIO子系统leds-gpio驱动控制EMIO的LED灯

前言

在使用zynq是最初使用的是axi-gpio,但是想在linux应用层控制,当时网上也有相关的驱动,但是感觉不是自己想要的,自己就将axi-gpio在系统的gpio子系统中使用,发现驱动中失败,在传创建class/leds下的设备文件是出错,就想到了axi-gpio是不是不支持,将其改为gpio后成功,具体原因后续在补充。

1.使用axi-gpio

1.1vivado工程

引脚约束

1.2设备树配置

具体原因可能是axi-gpio不能这么使用,后续在补充,以下将记录从axi-gpio改为EMIO。

2.使用EMIO

2.1使用linux gpio指令测试

2.1.1修改vivado工程

2.1.2使用GPIO指令直接测试
2.1.2.1产看gpio的基础编号

进入目录:cd /sys/class/gpio/

查看:ls

其中903(gpiochip903)为gpio的基础编号;

2.1.2.1计算gpio编号

gpio的计算公式为base+mio+EMIO;

我的设备基础gpio编号为903,以LED_RED为例进行计算:

gpio编号为:903+54(mio:0-53,共54个)+ 5(EMIO(从零开始 4对应的是第5个)) = 962;

2.1.2.1导出gpio

导出:echo 962 > /sys/class/gpio/export;

2.1.2.1设置gpio的方向

设置方向:echo out > /sys/class/gpio/gpio962/direction;

2.1.2.1测试

echo 1 > /sys/class/gpio/gpio962/value;

2.2使用leds-gpio驱动测试

2.2.1修改设备树

设备树中的gpio编号需要注意,一般会写成即gpio_0中的编号,如下:

设备树中不能写上面的编号,需要加上54个MIO的编号,我就在这里出过问题,即:从54开始,54对应的是0,那么设备树如下配置:

2.2.2擦看驱动结果

进入目录:cd /sys/class/leds/

查看:ls

2.2.3测试

查看当前值:cat PS_RUN/brightness

设置0:

灯已熄灭

设置1:echo 1 > PS_RUN/brightness 

灯亮,

注意上面设置1或者255均可以,

3.leds-gpio设备树

3.1leds-gpio 设备树字段的说明:

3.2设置方式和电平的关系

3.3触发方式

触发方式linux,default-trigger = "default-off";

触发方式类型可以参考使用内核里面的支持项,源码在drivers\leds\trigger下面

drivers/leds/trigger/ledtrig-activity.c

drivers/leds/trigger/ledtrig-audio.c

drivers/leds/trigger/ledtrig-backlight.c

drivers/leds/trigger/ledtrig-camera.c

drivers/leds/trigger/ledtrig-cpu.c

drivers/leds/trigger/ledtrig-default-on.c

drivers/leds/trigger/ledtrig-disk.c

drivers/leds/trigger/ledtrig-gpio.c

drivers/leds/trigger/ledtrig-heartbeat.c

drivers/leds/trigger/ledtrig-mtd.c

drivers/leds/trigger/ledtrig-multi-control.c

drivers/leds/trigger/ledtrig-netdev.c

drivers/leds/trigger/ledtrig-oneshot.c

drivers/leds/trigger/ledtrig-panic.c

drivers/leds/trigger/ledtrig-pattern.c

drivers/leds/trigger/ledtrig-timer.c

drivers/leds/trigger/ledtrig-transient.c

3.4常用的有

timer heartbeat oneshot

3.5检测内核中是否有开启

CONFIG_LEDS_TRIGGER_TIMER=y

CONFIG_LEDS_TRIGGER_HEARTBEAT=y

CONFIG_LEDS_TRIGGER_BACKLIGHT=y

CONFIG_LEDS_TRIGGER_DEFAULT_ON=y

CONFIG_LEDS_TRIGGER_ONESHOT=y

3.6使用示例

以timer和oneshot举例

3.6.1timer

leds: leds {

        compatible = "gpio-leds";

        gpio_demo: gpio_demo {

            label = "gpio_demo";

            gpios = <&gpio0 RK_PC0 GPIO_ACTIVE_HIGH>;

            linux,default-trigger = "timer";

            default-state = "on";

        };

}

echo 500 > /sys/class/leds/gpio_demo/delay_on

echo 500 > /sys/class/leds/gpio_demo/delay_off

这样操作后GPIO电平就会高500ms低500ms

3.6.2oneshot

leds: leds {

        compatible = "gpio-leds";

        gpio_demo: gpio_demo {

            label = "gpio_demo";

            gpios = <&gpio0 RK_PC0 GPIO_ACTIVE_HIGH>;

            linux,default-trigger = "oneshot";

            default-state = "on";

        };

}

echo 1000 > /sys/class/leds/gpio_demo/delay_on

echo 1 > /sys/class/leds/gpio_demo/short

这样就会让电平变高1秒后变低

如果invert设置1后那么就是变低1秒后变高

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值