OCI2C-TPXX补丁方法

说明

本方法提供一种对 I2C 设备实施 Hotpatch 补丁的解决方案。本方法不涉及 I2C 补丁具体过程和细节。有关更多的 I2C 方面内容详见:

补丁原理和过程

  • 禁止原 I2C 设备。详见《二进制更名与预置变量》。

    /*
     * GPI0 enable
     */
    DefinitionBlock("", "SSDT", 2, "OCLT", "GPI0", 0)
    {
        External(GPEN, FieldUnitObj)
        // External(GPHD, FieldUnitObj)
        Scope (\)
        {
            If (_OSI ("Darwin"))
            {
                GPEN = 1
                // GPHD = 2
            }
        }
    }
    
  • 新建一个 I2C 设备 TPXX,将原设备所有内容移植到 TPXX 中。

  • 修正 TPXX 有关内容:

    • 原 I2C 设备名称全部替换为 TPXX

    • 修正 _STA 部分为:

      Method (_STA, 0, NotSerialized)
      {
          If (_OSI ("Darwin"))
          {
              Return (0x0F)
          }
          Else
          {
              Return (Zero)
          }
      }
      
    • 修正禁止原 I2C 设备时用到的变量的有关内容,使其符合逻辑关系。

    • 修正涉及到操作系统变量 OSYS 的有关内容,使其符合逻辑关系。

  • 排除错误。

  • I2C 补丁。

示例 (Dell Latitude 5480,设备路径:\_SB.PCI0.I2C1.TPD1)

  • 使用《预置变量法》禁止 TPD1

    Scope (\)
    {
        If (_OSI ("Darwin"))
        {
            SDS1 = 0
        }
    }
    
  • 新建设备 TPXX,将原 TPD1 所有内容移植到 TPXX 中。

    External(_SB.PCI0.I2C1, DeviceObj)
    Scope (_SB.PCI0.I2C1)
    {
        Device (TPXX)
        {
           原TPD1内容
        }
    }
    
  • 修正 TPXX 内容

    • 所有 TPD1 替换为 TPXX

    • 补丁中 _STA 部分替换为:

      Method (_STA, 0, NotSerialized)
      {
          If (_OSI ("Darwin"))
          {
              Return (0x0F)
          }
          Else
          {
              Return (Zero)
          }
      }
      
    • 查找 SDS1 (禁止 TPD1 时用到的变量),将原 If (SDS1...) 修改为 If (one)

    • 查找 OSYS,删除(注释掉)以下内容:

      //If (LLess (OSYS, 0x07DC))
      //{
      //    SRXO (GPDI, One)
      //}
      

      注:OSYS 小于 0x07DC 时,I2C 设备不工作(0x07DC代表 Windows8)。

  • 添加外部引用 External... 修补所有错误。

  • I2C 补丁(略)

results matching ""

    No results matching ""