LA平台ACPI中添加CPU的GPIO传参配置

系统下通过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    关闭本次设置。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值