系统下通过GPIO标准接口操作3A5000的GPIO0-15时,提示无效参数
echo 11 > /sys/class/gpio/export
bash:echo:写错误:无效的参数。
原因:ACPI表只上传了桥片上的GPIO资源,且gpio_base默认值为16,即桥片上的gpio是从16号为起始号进行编号。因此系统下只能操作gpio16开始的设备。即gpio16对应7A1000的GPIO0,gpio17对应7A1000的GPIO01...。
以3A5000+7A1000平台为例,ACPI传参规范约定:
芯片组集成的普通 GPIO 的_HID为“ LOON0002” ,
处理器集成的 GPIO 的_HID为 “LOON0007”
root@loongson-pc:/home/loongson# cat /sys/class/gpio/
export gpio17/ gpiochip16/ unexport
系统默认只能看到7A的gpio设备
root@loongson-pc:/home/loongson# cat /sys/class/gpio/gpiochip16/label
LOON0002:00
root@loongson-pc:/home/loongson#
acpi表中添加cpu的gpio传参方法如下:
Device (GPO1)
{
Name (_HID, "LOON0007") // _HID: Hardware ID
Name (_ADR, Zero) // _ADR: Address
Name (_UID, One) // _UID: Unique ID
Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
{
QWordMemory (ResourceConsumer, PosDecode, MinFixed, MaxFixed, NonCacheable, ReadWrite,
0x0000000000000000, // Granularity
0x000000001FE00500, // Range Minimum
0x000000001FE00517, // Range Maximum
0x0000000000000000, // Translation Offset
0x0000000000000018, // Length
,, , AddressRangeMemory, TypeStatic)
Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive, ,, ) //中断号资源
{
0x00000010, //cpu中断线 + 16
0x00000011,
0x00000012,
0x00000013,
0x00000014,
0x00000015,
0x00000016,
0x00000017,
}
})
Name (_DSD, Package (0x02) // _DSD: Device-Specific Data
{
ToUUID ("daffd814-6eba-4d8c-8a91-bc9bbf4aa301") /* Device Properties for _DSD */,
Package (0x07)
{
Package (0x02)
{
"conf_offset", // 寄存器起始地址相对基地址偏移
Zero
},
Package (0x02)
{
"out_offset", //输出寄存器相对基地址偏移
0x08
},
Package (0x02)
{
"in_offset", //输入寄存器相对基地址偏移
0x0C
},
Package (0x02)
{
"gpio_base", //GPIO 在内核中的起始编号
Zero
},
Package (0x02)
{
"in_start_bit", //??
Zero
},
Package (0x02)
{
"ngpios", //共有32个gpio
0x20
},
Package (0x02)
{
"gsi_idx_map",
Package (0x20)
{
Zero,
One,
0x02,
0x03,
0x04,
0x05,
0x06,
0x07,
Zero,
One,
0x02,
0x03,
0x04,
0x05,
0x06,
0x07,
Zero,
One,
0x02,
0x03,
0x04,
0x05,
0x06,
0x07,
Zero,
One,
0x02,
0x03,
0x04,
0x05,
0x06,
0x07,
Zero,
One,
0x02,
0x03,
0x04,
0x05,
0x06,
0x07
}
}
}
})
}
添加上述3A-gpio传参后,内核启动:LOON0007注册失败
[ 0.044506] gpio gpiochip1: GPIO integer space overlap, cannot add chip
[ 0.044509] gpiochip_add_data_with_key: GPIOs 0..31 (LOON0007:00) failed to rr
egister, -16
注册失败的原因:7a1000的gpio起始编号与cpu的重复。
解决方法:将固件ACPI传参中将7a的gpio base改为32后,内核注册LOON0007成功。
gpiochip0 对应CPU的GPIO设备,gpiochip32对应7A1000的GPIO设备。
即在loongnix系统下,CPU的32个GPIO从0-31编号;7A的GPIO从32开始编号。
root@loongson-pc:/home/loongson# ls /sys/class/gpio/
export gpiochip0/ gpiochip32/ unexport
系统下使用标准接口设置GPIO
1.如果系统没有 /sys/class/gpio 目录
需要配置内核:
Device Drivers -
GPIO support ->[*] /sys/class/gpio/...(sysfs interface)
2./sys/class/gpio 使用说明:
2.1 创建gpio设备节点
echo 38 > /sys/class/gpio/export 就会生成目录 /sys/class/gpio/gpio38/
2.2 输出功能:
echo out > /sys/class/gpio/gpio38/direction 设置为输出
echo 1 > /sys/class/gpio/gpio38/value 设置输出高电平
2.3 输入功能:
echo in > /sys/class/gpio/gpio38/direction 设置为输入
2.4 中断功能:
echo rising > /sys/class/gpio/gpio38/edge 设置为上升沿触发
2.5 删除gpio设备节点
echo 38 > /sys/class/gpio/unexport 关闭本次设置。