前言
在使用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秒后变高