概述
1 GPIO简介
GPIO(General-purpose input/output),即通用型之输入输出,可以让使用者自由控制。GPIO的PIN脚依可以作为通用输入(GPI)或通用输出(GPO)或通用输入与输出(GPIO)。GPIO可以用于输入、输出或其他特殊功能,那么就需要对应的寄存器来选择这些功能。对于输入,一定可以通过读取某个寄存器来确定引脚电位的高低;对于输出,一定可以通过写入某个寄存器来让这个引脚输出高电位或者低电位;对于其他特殊功能,则有另外的寄存器来控制它们。一般在linux下已经有gpiolib提供通用接口来控制,刻个厂家需要提供底层驱动,即寄存器控制,用户既可以通过dts添加驱动进行,在系统下对gpio进行操作。也可以在系统下通过工具(如devmem)直接操作对应的寄存器实现对GPIO的控制。
2 GPIO驱动
aspeed默认配置已经有gpio的驱动(CONFIG_GPIOLIB=y,CONFIG_GPIO_ASPEED=y),如果其他CPU没有需要自己添加。
3 GPIO控制
进入BMC系统后可以看到/sys/class/gpio/下文件,gpiochip804表示的是gpio的base节点,base值是804,创建gpio节点使用“echo <value> > /sys/class/gpio/export”,删除gpio节点使用“echo <value> > /sys/class/gpio/uneexport”,新创建gpio节点的value值需要依据804进行计算得到。
3.1 获取gpiobase
cat /sys/devices/platform/ahb/ahb:apb/1e780000.gpio/gpio/*/base
3.2 创建gpio节点
创建一个GPIOA4的设备节点
echo 810 > /sys/class/gpio/export
创建节点后,默认GPIOA6为输出,高电平有效, 并且此时的GPIO输出的高电平。
3.3 设置有效状态
一般电路做了上拉处理,因此逻辑“1”是低电平,而逻辑“0”是高电平,因此需要设置active_low值为“1”,即低电平有效。
echo 1 > /sys/class/gpio/gpio810/active_low
设置actove_low值为1(或大于1)后,可以看到value值已经变为0,即高电平对应值为0 。
3.3 输如设置
设置GPIOA4位输入
echo in > /sys/class/gpio/gpio808/direction
设置edge值(中断触发模式)
echo rising > /sys/class/gpio/gpio808/egde
echo falling > /sys/class/gpio/gpio808/egde
echo both > /sys/class/gpio/gpio808/egde
rising——上升沿
falling——下降沿
both——轮训
3.4 输出设置
设置GPIOA6位输出
echo out > /sys/class/gpio/gpio810/direction
设置输出并设置输出电平
echo low > /sys/class/gpio/gpio810/direction
echo high > /sys/class/gpio/gpio810/direction
low ——输出为低电平
high——输出为高电平
设置value值:
echo out > /sys/class/gpio/gpio810/value
3.5 GPIO offset表
GPIO类别 | Offset1 | GPIO类别 | Offset1 | GPIO类别 | Offset1 |
GPIOA | 0 | GPIOK | 80 | GPIOU | 160 |
GPIOB | 8 | GPIOL | 88 | GPIOV | 168 |
GPIOC | 16 | GPIOM | 96 | GPIOW | 176 |
GPIOD | 24 | GPION | 104 | GPIOX | 184 |
GPIOE | 32 | GPIOO | 112 | GPIOY | 192 |
GPIOF | 40 | GPIOP | 120 | GPIOZ | 200 |
GPIOG | 48 | GPIOQ | 128 |
|
|
GPIOH | 56 | GPIOR | 136 |
|
|
GPIOI | 64 | GPIOS | 144 |
|
|
GPIOJ | 72 | GPIOT | 152 |
|
|
4 GPIO控制脚本
系统下创建init_gpio.sh脚本内容如下:
#!/bin/bash
##create by master 20210404
GPIO_BASE=$(cat /sys/devices/platform/ahb/ahb:apb/1e780000.gpio/gpio/*/base)
function init_gpio() {
if [ $# -ne 2 ]; then
echo "set_gpio_active_low: need both GPIO# and initial level";
return;
fi
if [ ! -d "/sys/class/gpio/gpio${1}" ];then
echo $1 > /sys/class/gpio/export
fi
echo 1 > /sys/class/gpio/gpio${1}/active_low
echo ${2} > /sys/class/gpio/gpio${1}/direction
}
# GPIOA4, active high
init_gpio $((${GPIO_BASE} + 4)) low
# GPIOA6, active low
init_gpio $((${GPIO_BASE} + 4)) high
# GPIOG4, in
init_gpio $((${GPIO_BASE} + 48 + 4)) in
最后
以上就是勤奋茉莉为你收集整理的OpenBmc开发14:gpio管理1 GPIO简介2 GPIO驱动3 GPIO控制4 GPIO控制脚本 的全部内容,希望文章能够帮你解决OpenBmc开发14:gpio管理1 GPIO简介2 GPIO驱动3 GPIO控制4 GPIO控制脚本 所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复