【龙芯固件】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/
acpi

本文重点关注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拷贝到其他目录下执行。

操作过程:
iasl

三、龙芯固件ACPI表

龙芯UEFI固件里ACPI:
loongarch 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设备
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LS大猫

感谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值