如何为笔记本电脑中不受支持的触摸板编写驱动程序?

如何为笔记本电脑中不受支持的触摸板编写驱动程序?

我在车库里发现了一台旧笔记本电脑(Lenovo IdeaPad U260),更换主板和 CPU 并安装 Ubuntu 18.04.3 LTS 后,它几乎和新笔记本电脑一样好。唯一的问题是触摸板不起作用,据我了解,它无法被识别。这是来自的输出lspci

00:00.0 Host bridge: Intel Corporation Core Processor DRAM Controller (rev 02)
00:02.0 VGA compatible controller: Intel Corporation Core Processor Integrated Graphics Controller (rev 02)
00:16.0 Communication controller: Intel Corporation 5 Series/3400 Series Chipset HECI Controller (rev 06)
00:1a.0 USB controller: Intel Corporation 5 Series/3400 Series Chipset USB2 Enhanced Host Controller (rev 05)
00:1b.0 Audio device: Intel Corporation 5 Series/3400 Series Chipset High Definition Audio (rev 05)
00:1c.0 PCI bridge: Intel Corporation 5 Series/3400 Series Chipset PCI Express Root Port 1 (rev 05)
00:1c.1 PCI bridge: Intel Corporation 5 Series/3400 Series Chipset PCI Express Root Port 2 (rev 05)
00:1c.2 PCI bridge: Intel Corporation 5 Series/3400 Series Chipset PCI Express Root Port 3 (rev 05)
00:1d.0 USB controller: Intel Corporation 5 Series/3400 Series Chipset USB2 Enhanced Host Controller (rev 05)
00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev a5)
00:1f.0 ISA bridge: Intel Corporation QS57 Chipset LPC Interface Controller (rev 05)
00:1f.2 SATA controller: Intel Corporation 5 Series/3400 Series Chipset 6 port SATA AHCI Controller (rev 05)
00:1f.3 SMBus: Intel Corporation 5 Series/3400 Series Chipset SMBus Controller (rev 05)
00:1f.6 Signal processing controller: Intel Corporation 5 Series/3400 Series Chipset Thermal Subsystem (rev 05)
02:00.0 Network controller: Intel Corporation Centrino Wireless-N 1000 [Condor Peak]
03:00.0 Ethernet controller: Qualcomm Atheros AR8151 v1.0 Gigabit Ethernet (rev c0)
ff:00.0 Host bridge: Intel Corporation Core Processor QuickPath Architecture Generic Non-core Registers (rev 05)
ff:00.1 Host bridge: Intel Corporation Core Processor QuickPath Architecture System Address Decoder (rev 05)
ff:02.0 Host bridge: Intel Corporation Core Processor QPI Link 0 (rev 05)
ff:02.1 Host bridge: Intel Corporation 1st Generation Core i3/5/7 Processor QPI Physical 0 (rev 05)
ff:02.2 Host bridge: Intel Corporation 1st Generation Core i3/5/7 Processor Reserved (rev 05)
ff:02.3 Host bridge: Intel Corporation 1st Generation Core i3/5/7 Processor Reserved (rev 05)

以及以下的输出cat /proc/bus/input/devices

I: Bus=0019 Vendor=0000 Product=0001 Version=0000
N: Name="Power Button"
P: Phys=PNP0C0C/button/input0
S: Sysfs=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:0f/PNP0C0C:00/input/input0
U: Uniq=
H: Handlers=kbd event0 
B: PROP=0
B: EV=3
B: KEY=10000000000000 0

I: Bus=0019 Vendor=0000 Product=0003 Version=0000
N: Name="Sleep Button"
P: Phys=PNP0C0E/button/input0
S: Sysfs=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:0f/PNP0C0E:00/input/input1
U: Uniq=
H: Handlers=kbd event1 
B: PROP=0
B: EV=3
B: KEY=4000 0 0

I: Bus=0019 Vendor=0000 Product=0005 Version=0000
N: Name="Lid Switch"
P: Phys=PNP0C0D/button/input0
S: Sysfs=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:0f/PNP0C0D:00/input/input2
U: Uniq=
H: Handlers=event2 
B: PROP=0
B: EV=21
B: SW=1

I: Bus=0019 Vendor=0000 Product=0001 Version=0000
N: Name="Power Button"
P: Phys=LNXPWRBN/button/input0
S: Sysfs=/devices/LNXSYSTM:00/LNXPWRBN:00/input/input3
U: Uniq=
H: Handlers=kbd event3 
B: PROP=0
B: EV=3
B: KEY=10000000000000 0

I: Bus=0011 Vendor=0001 Product=0001 Version=ab41
N: Name="AT Translated Set 2 keyboard"
P: Phys=isa0060/serio0/input0
S: Sysfs=/devices/platform/i8042/serio0/input/input4
U: Uniq=
H: Handlers=sysrq kbd event4 leds 
B: PROP=0
B: EV=120013
B: KEY=402000000 3803078f800d001 feffffdfffefffff fffffffffffffffe
B: MSC=10
B: LED=7

I: Bus=0019 Vendor=0000 Product=0000 Version=0000
N: Name="Ideapad extra buttons"
P: Phys=ideapad/input0
S: Sysfs=/devices/pci0000:00/0000:00:1f.0/PNP0C09:00/VPC2004:00/input/input11
U: Uniq=
H: Handlers=rfkill kbd event7 
B: PROP=0
B: EV=13
B: KEY=81000800100c03 4400000000300000 0 2
B: MSC=10

I: Bus=0003 Vendor=5986 Product=0195 Version=1423
N: Name="Lenovo EasyCamera: Lenovo EasyC"
P: Phys=usb-0000:00:1d.0-1.3/button
S: Sysfs=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/2-1.3:1.0/input/input12
U: Uniq=
H: Handlers=kbd event8 
B: PROP=0
B: EV=3
B: KEY=100000 0 0 0

I: Bus=0019 Vendor=0000 Product=0006 Version=0000
N: Name="Video Bus"
P: Phys=LNXVIDEO/video/input0
S: Sysfs=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/LNXVIDEO:00/input/input13
U: Uniq=
H: Handlers=kbd event9 
B: PROP=0
B: EV=3
B: KEY=3e000b00000000 0 0 0

I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="HDA Intel Mic"
P: Phys=ALSA
S: Sysfs=/devices/pci0000:00/0000:00:1b.0/sound/card0/input14
U: Uniq=
H: Handlers=event10 
B: PROP=0
B: EV=21
B: SW=10

I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="HDA Intel Headphone"
P: Phys=ALSA
S: Sysfs=/devices/pci0000:00/0000:00:1b.0/sound/card0/input15
U: Uniq=
H: Handlers=event11 
B: PROP=0
B: EV=21
B: SW=4

I: Bus=0003 Vendor=046d Product=c52f Version=0111
N: Name="Logitech USB Receiver"
P: Phys=usb-0000:00:1a.0-1.2/input0
S: Sysfs=/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:046D:C52F.000B/input/input36
U: Uniq=
H: Handlers=mouse0 event5 
B: PROP=0
B: EV=17
B: KEY=ffff0000 0 0 0 0
B: REL=1943
B: MSC=10

I: Bus=0003 Vendor=046d Product=c52f Version=0111
N: Name="Logitech USB Receiver Consumer Control"
P: Phys=usb-0000:00:1a.0-1.2/input1
S: Sysfs=/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.1/0003:046D:C52F.000C/input/input37
U: Uniq=
H: Handlers=kbd event6 
B: PROP=0
B: EV=1f
B: KEY=300ff 0 0 483ffff17aff32d bf54444600000000 1 130ff38b17c000 677bfad9415fed 9ed68000004400 10000002
B: REL=1040
B: ABS=100000000
B: MSC=10

因此,其中没有关于触摸板的任何内容,因此根据我的理解,我必须等待恰好支持它的内核更新。 (到目前为止,如果我有任何错误,请纠正我。)

我的问题是:有没有办法可以为它编写自己的驱动程序?我想答案在某种程度上是“是”,因为那些定期为 Linux 代码库做出贡献的人一直在推出驱动程序。如果是的话,那么我的后续问题将是:

  • 对于一个拥有丰富的 C 和类 C 语言开发经验以及一些嵌入式开发经验,但没有任何开发此类内容的经验的人来说,这是一项多么困难的任务?
  • 我需要联想方面提供哪些类型的适当文档/信息?
  • 谁能建议一些链接来帮助开发过程?即使这个触摸板的驱动程序已经存在,我也想自己弄清楚,出于学习目的和好奇心。
  • 据我了解,这是开发驱动程序,不一定要修改 Linux / 内核,所以理论上这应该与 Linux 操作系统的任何发行版兼容吗?或者我应该采取某些做法来使其与目标操作系统兼容?

希望这些问号不会太多而令人烦恼。预先感谢任何提供帮助的人!

编辑

输出lsusb

Bus 002 Device 004: ID 5986:0195 Acer, Inc 
Bus 002 Device 003: ID 046d:c52f Logitech, Inc. Unifying Receiver
Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0489:e00d Foxconn / Hon Hai Broadcom Bluetooth 2.1 Device
Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

这里也没有什么看起来像触摸板:(

答案1

有没有办法让我自己编写驱动程序?

是的当然。许多驱动程序都是这样编写的。

对于一个拥有丰富的 C 和类 C 语言开发经验以及一些嵌入式开发经验,但没有任何开发此类内容的经验的人来说,这是一项多么困难的任务?

应该是易于管理的,尽管您必须了解内核和相关子系统的工作方式。从现有的触摸板驱动程序中读取代码应该会有所帮助。

我需要联想方面提供哪些类型的适当文档/信息?

触摸板的寄存器级文档。哪一个是困难的部分,因为您可能不会从联想获得任何信息。

另一种方法是逆向工程,例如现有的 Windows 驱动程序。这可能非常耗时。

谁能建议一些链接来帮助开发过程?

谷歌搜索“linux 内核模块教程初学者”之类的东西,以及变体。

据我了解,这是开发驱动程序,不一定要修改 Linux / 内核,所以理论上这应该与 Linux 操作系统的任何发行版兼容吗?

您将为特定的 Linux 内核版本编写内核模块(“驱动程序”)。因此,这将与您正在使用的具有相同 API 的所有 Linux 版本兼容,但如果 API 发生变化,我们就必须进行更改(或者不适用于具有不同 API 的过去内核)。

所以里面没有任何关于触摸板的东西

触摸板可能不是 PCI 设备。它可以通过 USB、某些内部串行端口、甚至通过 I2C/SMBUS 进行连接。或者它可能通过以下方式使用某种专有的通信方法欧共体。您可能会也可能不会在 BIOS ACPI 表中找到提示。

由于触摸板连接接口如此不同,它们是最难为其编写驱动程序的设备之一,除非您有适当的文档。

相关内容