xiaokkangg 发表于 2023-6-1 15:51

触摸版只能强制轮询模式?怎么办

机型是 联想 Flex5-15
触摸板的硬件名称是 MSFT0001
自己学着 YOGA-C940 的机型打了补丁。在中断模式下,那个触摸板非常卡顿。移动指针,一卡一卡的

这个机子和 C940 几乎一样的配置,只是这个是 15.6 寸,当然了,BIOS 有很大区别,因为 C940 是 YOGA 系列的

目前的情况是
中断模式下触摸板很卡顿,触摸屏没有反应

加入启动参数 -vi2c-force-polling 强制使用轮询模式,那么触摸屏与触控板都能正常工作

但是轮询模式吗,貌似比较消耗 CPU 资源。有没有大佬探讨下呢

我贴一下 dsl 代码

XPD0 触摸板
DefinitionBlock ("", "SSDT", 2, "Tasc11", "XPD0", 0x00000000)
{
    External (_SB_.GNUM, MethodObj)    // 1 Arguments
    External (_SB_.GPDI, FieldUnitObj)
    External (_SB_.INUM, MethodObj)    // 1 Arguments
    External (_SB_.PCI0.HIDD, MethodObj)    // 5 Arguments
    External (_SB_.PCI0.HIDG, IntObj)
    External (_SB_.PCI0.I2C0, DeviceObj)
    External (_SB_.PCI0.I2C0.I2CX, IntObj)
    External (_SB_.PCI0.I2CM, MethodObj)    // 3 Arguments
    External (_SB_.PCI0.TP7D, MethodObj)    // 6 Arguments
    External (_SB_.PCI0.TP7G, IntObj)
    External (_SB_.SHPO, MethodObj)    // 2 Arguments
    External (_SB_.TPDB, FieldUnitObj)
    External (_SB_.TPDH, FieldUnitObj)
    External (_SB_.TPDS, FieldUnitObj)
    External (_SB_.TPDT, FieldUnitObj)
    External (TPDB, FieldUnitObj)
    External (TPDH, FieldUnitObj)
    External (TPDM, FieldUnitObj)

    Scope (_SB.PCI0.I2C0)
    {
      Device (XPD0)
      {
            Name (HID2, Zero)
            Name (SBFB, ResourceTemplate ()
            {
                I2cSerialBusV2 (0x0000, ControllerInitiated, 0x00061A80,
                  AddressingMode7Bit, "NULL",
                  0x00, ResourceConsumer, _Y00, Exclusive,
                  )
            })
            Name (SBFG, ResourceTemplate ()
            {
                GpioInt (Level, ActiveLow, ExclusiveAndWake, PullDefault, 0x0000,
                  "\\_SB.PCI0.GPI0", 0x00, ResourceConsumer, ,
                  )
                  {   // Pin list
                        0x0000
                  }
            })
            Name (SBFX, ResourceTemplate ()
            {
                GpioInt (Level, ActiveLow, ExclusiveAndWake, PullDefault, 0x0000,
                  "\\_SB.PCI0.GPI0", 0x00, ResourceConsumer, ,
                  )
                  {   // Pin list
                        0x001B
                  }
            })
            Name (SBFI, ResourceTemplate ()
            {
                Interrupt (ResourceConsumer, Level, ActiveLow, ExclusiveAndWake, ,, _Y01)
                {
                  0x00000000,
                }
            })
            CreateWordField (SBFB, \_SB.PCI0.I2C0.XPD0._Y00._ADR, BADR)// _ADR: Address
            CreateDWordField (SBFB, \_SB.PCI0.I2C0.XPD0._Y00._SPE, SPED)// _SPE: Speed
            CreateWordField (SBFG, 0x17, INT1)
            CreateDWordField (SBFI, \_SB.PCI0.I2C0.XPD0._Y01._INT, INT2)// _INT: Interrupts
            Method (_INI, 0, NotSerialized)// _INI: Initialize
            {
                INT1 = GNUM (GPDI)
                INT2 = INUM (GPDI)
                SHPO (GPDI, One)
                _HID = "MSFT0001"
                HID2 = TPDH /* External reference */
                BADR = TPDB /* External reference */
                If ((TPDS == Zero))
                {
                  SPED = 0x000186A0
                }

                If ((TPDS == One))
                {
                  SPED = 0x00061A80
                }

                If ((TPDS == 0x02))
                {
                  SPED = 0x000F4240
                }

                Return (Zero)
            }

            Name (_HID, "XXXX0000")// _HID: Hardware ID
            Name (_CID, "PNP0C50" /* HID Protocol Device (I2C bus) */)// _CID: Compatible ID
            Name (_S0W, 0x03)// _S0W: S0 Device Wake State
            Method (_DSM, 4, Serialized)// _DSM: Device-Specific Method
            {
                If ((Arg0 == HIDG))
                {
                  Return (HIDD (Arg0, Arg1, Arg2, Arg3, HID2))
                }

                If ((Arg0 == TP7G))
                {
                  Return (TP7D (Arg0, Arg1, Arg2, Arg3, SBFB, SBFG))
                }

                Return (Buffer (One)
                {
                     0x00                                             // .
                })
            }

            Method (_STA, 0, NotSerialized)// _STA: Status
            {
                If (_OSI ("Darwin"))
                {
                  Return (0x0F)
                }
                Else
                {
                  Return (Zero)
                }
            }

            Method (_CRS, 0, NotSerialized)// _CRS: Current Resource Settings
            {
                If ((TPDM == Zero))
                {
                  Return (ConcatenateResTemplate (I2CM (I2CX, BADR, SPED), SBFG))
                }

                Return (ConcatenateResTemplate (I2CM (I2CX, BADR, SPED), SBFI))
            }
      }
    }
}

TPLX 触摸屏
DefinitionBlock ("", "SSDT", 2, "hack", "TPLX", 0x00000000)
{
    External (_SB_.ADBG, MethodObj)    // 1 Arguments
    External (_SB_.GNUM, MethodObj)    // 1 Arguments
    External (_SB_.GPLI, IntObj)
    External (_SB_.INUM, MethodObj)    // 1 Arguments
    External (_SB_.PCI0.HIDD, MethodObj)    // 5 Arguments
    External (_SB_.PCI0.HIDG, IntObj)
    External (_SB_.PCI0.I2C1, DeviceObj)
    External (_SB_.PCI0.I2C1.I2CX, IntObj)
    External (_SB_.PCI0.I2CM, MethodObj)    // 3 Arguments
    External (_SB_.PCI0.TP7D, MethodObj)    // 6 Arguments
    External (_SB_.PCI0.TP7G, IntObj)
    External (_SB_.SGOV, MethodObj)    // 2 Arguments
    External (_SB_.SGRA, MethodObj)    // 2 Arguments
    External (_SB_.SHPO, MethodObj)    // 2 Arguments
    External (_SB_.TPDH, FieldUnitObj)
    External (_SB_.TPDT, FieldUnitObj)
    External (TPID, IntObj)
    External (TPLB, IntObj)
    External (TPLH, IntObj)
    External (TPLM, IntObj)
    External (TPLS, IntObj)
   
    External (TPLT, FieldUnitObj)

    Scope (\)
    {
      If (_OSI ("Darwin"))
      {
            TPLT = 0x07
      }
    }
       
    Scope (_SB.PCI0.I2C1)
    {
      Device (TPLX)
      {
            Name (HID2, Zero)
            Name (SBFB, ResourceTemplate ()
            {
                I2cSerialBusV2 (0x0000, ControllerInitiated, 0x00061A80,
                  AddressingMode7Bit, "NULL",
                  0x00, ResourceConsumer, _Y03, Exclusive,
                  )
            })
            Name (SBFG, ResourceTemplate ()
            {
                GpioInt (Level, ActiveLow, Exclusive, PullDefault, 0x0000,
                  "\\_SB.GPI0", 0x00, ResourceConsumer, ,
                  )
                  {   // Pin list
                        0x0000
                  }
            })
            Name (SBFI, ResourceTemplate ()
            {
                Interrupt (ResourceConsumer, Level, ActiveLow, Exclusive, ,, _Y01)
                {
                  0x00000000,
                }
            })
            CreateWordField (SBFB, \_SB.PCI0.I2C1.TPLX._Y03._ADR, BADR)// _ADR: Address
            CreateDWordField (SBFB, \_SB.PCI0.I2C1.TPLX._Y03._SPE, SPED)// _SPE: Speed
            CreateWordField (SBFG, 0x17, INT1)
            CreateDWordField (SBFI, \_SB.PCI0.I2C1.TPLX._Y01._INT, INT2)// _INT: Interrupts
            
            Method (_INI, 0, NotSerialized)// _INI: Initialize
            {
                /*
                If ((OSYS < 0x07DC))
                {
                  SRXO (GPLI, One)
                } */

                INT1 = GNUM (GPLI)
                INT2 = INUM (GPLI)
                //If ((TPLM == Zero))
               // {
                  SHPO (GPLI, One)
                // }
               
                TPLT = 0x07

                If ((TPLT == One))
                {
                  _HID = "ATML3432"
                  HID2 = Zero
                  BADR = 0x4C
                  SPED = 0x00061A80
                  Return (Zero)
                }

                If ((TPLT == 0x02))
                {
                  _HID = "ATML2952"
                  HID2 = Zero
                  BADR = 0x4A
                  SPED = 0x00061A80
                  Return (Zero)
                }

                If ((TPLT == 0x03))
                {
                  _HID = "ELAN2097"
                  HID2 = One
                  BADR = 0x10
                  SPED = 0x00061A80
                  Return (Zero)
                }

                If ((TPLT == 0x04))
                {
                  _HID = "NTRG0001"
                  HID2 = One
                  BADR = 0x07
                  SPED = 0x00061A80
                  Return (Zero)
                }

                If ((TPLT == 0x05))
                {
                  _HID = "NTRG0002"
                  HID2 = One
                  BADR = 0x64
                  SPED = 0x00061A80
                  Return (Zero)
                }

                If ((TPLT == 0x06))
                {
                  _HID = "WCOM508E"
                  HID2 = One
                  BADR = 0x0A
                  If ((TPLS == Zero))
                  {
                        SPED = 0x00061A80
                  }

                  If ((TPLS == One))
                  {
                        SPED = 0x00061A80
                  }

                  If ((TPLS == 0x02))
                  {
                        SPED = 0x000F4240
                  }

                  Return (Zero)
                }

                If ((TPLT == 0x07))
                {
                  _HID = "WACF2200"
                  HID2 = TPLH /* \TPLH */
                  BADR = TPLB /* \TPLB */
                  If ((TPLS == Zero))
                  {
                        SPED = 0x000186A0
                  }

                  If ((TPLS == One))
                  {
                        SPED = 0x00061A80
                  }

                  If ((TPLS == 0x02))
                  {
                        SPED = 0x000F4240
                  }

                  Return (Zero)
                }
            }

            Name (_HID, "XXXX0000")// _HID: Hardware ID
            Name (_CID, "PNP0C50" /* HID Protocol Device (I2C bus) */)// _CID: Compatible ID
            Name (_S0W, 0x04)// _S0W: S0 Device Wake State
            Method (_DSM, 4, Serialized)// _DSM: Device-Specific Method
            {
                If ((Arg0 == HIDG))
                {
                  Return (HIDD (Arg0, Arg1, Arg2, Arg3, HID2))
                }

                If ((Arg0 == TP7G))
                {
                  Return (TP7D (Arg0, Arg1, Arg2, Arg3, SBFB, SBFG))
                }

                Return (Buffer (One)
                {
                     0x00                                             // .
                })
            }

            Method (_PS0, 0, NotSerialized)// _PS0: Power State 0
            {
                Sleep (0x64)
                SGOV (0x0603000E, One)
                Sleep (0x64)
                SGRA (0x06010003, One)
                ADBG ("touch panel ps0")
            }

            Method (_PS3, 0, NotSerialized)// _PS3: Power State 3
            {
                Sleep (0x64)
                SGRA (0x06010003, Zero)
                Sleep (0x64)
                SGOV (0x0603000E, Zero)
                ADBG ("touch panel ps3")
            }

            Method (_STA, 0, NotSerialized)// _STA: Status
            {
                If (_OSI ("Darwin"))
                {
                  Return (0x0F)
                }

                Return (Zero)
            }

            Method (_CRS, 0, NotSerialized)// _CRS: Current Resource Settings
            {
                If ((TPLM == Zero))
                {
                  Return (ConcatenateResTemplate (I2CM (I2CX, BADR, SPED), SBFG))
                }

                Return (ConcatenateResTemplate (I2CM (I2CX, BADR, SPED), SBFI))
            }
      }
    }
}

* 其他信息:原设备名是 TPD0 TPL0
不打补丁的情况下。IORegistryExplorer 也看不到这两个原设备被注册到系统里

MemX 发表于 2023-6-3 10:24

ssdt 预置参数GPDI试试
页: [1]
查看完整版本: 触摸版只能强制轮询模式?怎么办