龙芯固件传参ACPI表简介
一、 什么是ACPI
ACPI是Hewlett-Packard, Intel, Microsoft, Phoenix, 和Toshiba共同制定的一个开放的行业规范。
ACPI由很多表组成,包括:RSDP,SDTH,RSDT,FADT,FACS,DSDT,SSDT,MADT,SBST,XSDT,ECDT,SLIT,SRAT。
linux系统下路径:/sys/firmware/acpi/tables/
本文重点关注DSDT
DSDT,Differentiated System Description Table,差分系统描述表,包含大部分硬件信息的主体表格。
二、系统下查看DSDT
在linux系统下,通过命令iasl
查看dsdt表的内容
- 安装命令
apt install iasl
- 查看DSDT内容,
iasl -d DSDT
,得到DSDT.dsl文件
备注: DSDT文件在/sys/firmware/acpi/tables/下,但不能在此目录下执行iasl命令,需要将DSDT拷贝到其他目录下执行。
操作过程:
三、龙芯固件ACPI表
龙芯UEFI固件里ACPI:
四、龙芯平台固件ACPI设备信息
固件中涉及文件: Platform.asl、PcieTree.asl
4.1 GPIO
4.1.1 LS3A6000桥片GPIO资源
Device (GPO1)
{
Name (_HID, "LOON0007") // _HID: Hardware ID
Name (_ADR, Zero) // _ADR: Address
Name (_UID, 1) // _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,
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",
0x0
},
Package (0x02)
{
"out_offset",
0x08
},
Package (0x02)
{
"in_offset",
0x0c
},
Package (0x02)
{
"gpio_base",
0x00
},
Package (0x02)
{
"in_start_bit",
0
},
Package (0x02)
{
"ngpios",
16
},
Package (0x02)
{
"gsi_idx_map",
Package (0x10)
{
0x0000,
0x0001,
0x0002,
0x0003,
0x0004,
0x0005,
0x0006,
0x0007,
0x0000,
0x0001,
0x0002,
0x0003,
0x0004,
0x0005,
0x0006,
0x0007,
}
}
}
})
}
4.1.2 LS7A2000桥片GPIO资源
Device (GPO0)
{
Name (_HID, "LOON0002") // _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
0x00000000100E0000, // Range Minimum
0x00000000100E0BFF, // Range Maximum
0x0000000000000000, // Translation Offset
0x0000000000000C00, // Length
,, , AddressRangeMemory, TypeStatic)
Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive, ,, )
{
0x0000007C,
0x0000007D,
0x0000007E,
0x0000007F,
0x0000007B,
}
})
Name (_DSD, Package (0x02) // _DSD: Device-Specific Data
{
ToUUID ("daffd814-6eba-4d8c-8a91-bc9bbf4aa301") /* Device Properties for _DSD */,
Package (0x06)
{
Package (0x02)
{
"conf_offset",
0x800
},
Package (0x02)
{
"out_offset",
0x900
},
Package (0x02)
{
"in_offset",
0xa00
},
Package (0x02)
{
"gpio_base",
32
},
Package (0x02)
{
"ngpios",
57
},
Package (0x02)
{
"gsi_idx_map",
Package (0x39)
{
0x0000,
0x0001,
0x0002,
0x0003,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004
}
}
}
})
}
4.2 I2C设备
4.2.1 I2C控制器
Device (I2C0)
{
Name (_HID, "LOON0004" /* AT Real-Time Clock */) // _HID: Hardware ID
Name (_UID, 0x0) // _UID: Unique ID
Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
{
QWordMemory (ResourceConsumer, PosDecode, MinFixed, MaxFixed, NonCacheable, ReadWrite,
0x0000000000000000, // Granularity
0x0000000010090000, // Range Minimum
0x0000000010090007, // Range Maximum
0x0000000000000000, // Translation Offset
0x0000000000000008, // Length
,, , AddressRangeMemory, TypeStatic)
Interrupt (ResourceConsumer, Level, ActiveHigh, Shared, ,, )
{
73,
}
})
}
Device (I2C1)
{
Name (_HID, "LOON0004" /* AT Real-Time Clock */) // _HID: Hardware ID
Name (_UID, 0x1) // _UID: Unique ID
Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
{
QWordMemory (ResourceConsumer, PosDecode, MinFixed, MaxFixed, NonCacheable, ReadWrite,
0x0000000000000000, // Granularity
0x0000000010090100, // Range Minimum
0x0000000010090107, // Range Maximum
0x0000000000000000, // Translation Offset
0x0000000000000008, // Length
,, , AddressRangeMemory, TypeStatic)
Interrupt (ResourceConsumer, Level, ActiveHigh, Shared, ,, )
{
73,
}
})
}
4.2.2 RTC设备
在I2C0 设备下挂载一个ds1229 rtc设备,设备地址是0x68
Device (RTC0)
{
Name (_HID, "PRP0001") // _HID: Hardware ID
Name (_UID, Zero) // _UID: Unique ID
Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
{
I2cSerialBusV2 (0x0068, ControllerInitiated, 0x00061A80,
AddressingMode7Bit, "\\_SB.I2C0", //重点:I2C0
0x00, ResourceConsumer, , Exclusive,
)
})
Name (_DSD, Package (0x02) // _DSD: Device-Specific Data
{
ToUUID ("daffd814-6eba-4d8c-8a91-bc9bbf4aa301") /* Device Properties for _DSD */,
Package (0x01)
{
Package (0x02)
{
"compatible",
"dallas,ds1339"
}
}
})
}
4.2.3 温度采集设备
在I2C1 设备下挂载一个LM75 温度采集设备,设备地址是0x48
Device (LM75)
{
Name (_HID, "PRP0001") // _HID: Hardware ID
Name (_UID, Zero) // _UID: Unique ID
Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
{
I2cSerialBusV2 (0x0048, ControllerInitiated, 0x00061A80,
AddressingMode7Bit, "\\_SB.I2C1", //重点:I2C1
0x00, ResourceConsumer, , Exclusive,
)
})
Name (_DSD, Package (0x02) // _DSD: Device-Specific Data
{
ToUUID ("daffd814-6eba-4d8c-8a91-bc9bbf4aa301") /* Device Properties for _DSD */,
Package (0x01)
{
Package (0x02)
{
"compatible",
"national,lm75"
}
}
})
}
4.3 SPI控制挂设备
文件PciDevice.asl里添加LS7A2000 spi 设备
4.3.1 LS7A2000上,spi控制器片选1, spidev设备
Device (SPI0)
{
Name (_ADR, 0x00160000)
Device (FLA0)
{
Name (_CID, Package ()
{
"SPT0001"
})
Name (_UID, one)
Name (_CRS, ResourceTemplate ()
{
SPISerialBusV2 (0x0001, PolarityLow, FourWireMode, 0x08,
ControllerInitiated, 100000000, ClockPolarityLow,
ClockPhaseFirst, "\\_SB.PCI0.SPI0",)
})
Name (_DSD, Package ()
{
ToUUID ("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
Package (0x00){}
})
}
}
4.3.2 LS7A2000上,spi控制器片选2上挂载csm300设备
Device (SPI0)
{
Name (_ADR, 0x00160000)
Device (FLA0)
{
Name (_HID, "PRP0001")
Name (_ADR, 1)
Name (_CRS, ResourceTemplate ()
{
SPISerialBusV2 (2, PolarityLow, FourWireMode, 8,
ControllerInitiated, 100000000, ClockPolarityLow,
ClockPhaseFirst, "\\_SB.PCI0.SPI0",)
})
Name (_DSD, Package (0x02)
{
ToUUID ("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
Package (0x01)
{
Package (0x02)
{
"compatible",
"zhiyuan,csm300"
}
}
})
}
}
4.4 GPIO按键
acpi表里添加4个GPIO按键
Device (GKEY)
{
Name (_HID, "PRP0001") // _HID: Hardware ID
Name (_CRS, ResourceTemplate ()
{
GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionInputOnly,
"\\_SB.GPO0", 0, ResourceConsumer) { 0 }
GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionInputOnly,
"\\_SB.GPO0", 0, ResourceConsumer) { 1 }
GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionInputOnly,
"\\_SB.GPO0", 0, ResourceConsumer) { 2 }
GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionInputOnly,
"\\_SB.GPO0", 0, ResourceConsumer) { 3 }
GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionInputOnly,
"\\_SB.GPO0", 0, ResourceConsumer) { 4 }
})
Name (_DSD, Package () // _DSD: Device-Specific Data
{
ToUUID ("daffd814-6eba-4d8c-8a91-bc9bbf4aa301") /* Device Properties for _DSD */,
Package ()
{
Package ()
{
"compatible",
"gpio-keys-polled"
},
Package ()
{
"poll-interval",
50
}
}
})
Device (KEY0)
{
Name (_DSD, Package () // _DSD: Device-Specific Data
{
ToUUID ("daffd814-6eba-4d8c-8a91-bc9bbf4aa301") /* Device Properties for _DSD */,
Package ()
{
Package ()
{
"label",
"GPIO Key0"
},
Package ()
{
"linux,code",
103
},
Package ()
{
"gpios",
Package ()
{ \_SB.GKEY, 0, 0, 0 }
}
}
})
}
Device (KEY1)
{
Name (_DSD, Package () // _DSD: Device-Specific Data
{
ToUUID ("daffd814-6eba-4d8c-8a91-bc9bbf4aa301") /* Device Properties for _DSD */,
Package ()
{
Package ()
{
"label",
"GPIO Key1"
},
Package ()
{
"linux,code",
108
},
Package ()
{
"gpios",
Package ()
{ \_SB.GKEY, 1, 0, 0 }
}
}
})
}
Device (KEY2)
{
Name (_DSD, Package () // _DSD: Device-Specific Data
{
ToUUID ("daffd814-6eba-4d8c-8a91-bc9bbf4aa301") /* Device Properties for _DSD */,
Package ()
{
Package ()
{
"label",
"GPIO Key2"
},
Package ()
{
"linux,code",
105
},
Package ()
{
"gpios",
Package ()
{ \_SB.GKEY, 2, 0, 0 }
}
}
})
}
Device (KEY3)
{
Name (_DSD, Package () // _DSD: Device-Specific Data
{
ToUUID ("daffd814-6eba-4d8c-8a91-bc9bbf4aa301") /* Device Properties for _DSD */,
Package ()
{
Package ()
{
"label",
"GPIO Key3"
},
Package ()
{
"linux,code",
106
},
Package ()
{
"gpios",
Package ()
{ \_SB.GKEY, 3, 0, 0 }
}
}
})
}
Device (KEY4)
{
Name (_DSD, Package () // _DSD: Device-Specific Data
{
ToUUID ("daffd814-6eba-4d8c-8a91-bc9bbf4aa301") /* Device Properties for _DSD */,
Package ()
{
Package ()
{
"label",
"GPIO Key4"
},
Package ()
{
"linux,code",
107
},
Package ()
{
"gpios",
Package ()
{ \_SB.GKEY, 4, 0, 0 }
}
}
})
}
}
4.5 其它控制器
无需改动设备(使用代码中默认配置):
- pwm设备
- uart设备
- can设备
- 内置rtc设备
- pcie设备
- lpc设备