我在 Lenovo Thinkpad x270 上运行 Ubuntu 20.04。不幸的是,集成网络摄像头“通常”无法检测到。Cheese 给出“未找到设备”,并且 lsusb 上没有网络摄像头的条目。奇怪的是,过去曾有过网络摄像头被激活的时刻,但通常在启动 cheese 后它就会崩溃。在其中一次情况下,lsusb 产生:
Bus 001 Device 028: ID 5986:111c Acer, Inc Integrated Camera
我在网上搜索了很久,但还是找不到如何激活网络摄像头的解决方案,所以我有点迷茫了。有人能帮忙吗?我要说的是,我不是 Linux 专家,只是一个普通的(学术)用户。
答案1
https://github.com/djrscally/miix-510-cameras 这为什么这么困难?
有几个问题:
The cameras are powered off by default behind a PMIC called a TPS68470, identified as INT3472 in the ACPI tables. The ACPI tables
没有为 PMIC 定义 I2cSerialBus2 部分,因此其驱动程序永远不会意识到它的存在。TPS68470 驱动程序实际上并没有将其打开;ACPI 表中定义了 3 条进入 PMIC 的 GPIO 线路,但它们默认处于关闭状态,并且 PMIC 驱动程序不会切换它们。它们也没有在 ACPI 表中命名,因此确定哪些是电源线,哪些是复位引脚并不是一件简单的事情。在我的情况下,1 和 2 是电源,0 是复位,因此可以像这样打开芯片:
$ sudo gpioset gpiochip0 122=1 143=1
在此步骤之前,PMIC 和相机的 i2c 接口都未启用,这意味着它们根本不会显示。设备打开后,您应该能够使用 i2cdetect 看到它:
$ sudo i2cdetect -r -y 7
这将返回类似这样的内容:
数值:0 1 2 3 4 5 6 7 8 9 10 abcdef 00:-- -- -- -- -- -- -- -- -- -- 0c -- -- -- -- -- -- -- --
10:10 -- -- -- -- -- -- -- -- -- -- -- -- -- --
20:-- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30:-- -- -- -- -- -- -- -- -- -- -- -- --
40:-- -- -- -- -- -- -- -- --
50:-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60:-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
-- --
OV2680 位于 0x10。TPS68470 是位于 0x48 的设备。我不知道 0x0c 是什么;这是为 oc5648 定义的两个可能地址之一,但打开该芯片的 PMIC 会显示它位于 0x36。谁在乎呢,真的。无论如何,现在相机已打开,您可以通过与传感器对话并询问其 ID 来验证这不是胡说八道。OV2680 数据表告诉我们它的 ID 位于寄存器 0x300a:
$ sudo i2ctransfer 7 w2@0x10 0x30 0x0a r2 警告!此程序可能会混淆您的 I2C 总线,导致数据丢失甚至更糟!我将向设备文件 /dev/i2c-7 发送以下消息:msg 0:addr 0x10,write,len 2,buf 0x30 0x0a msg 1:addr 0x10,read,len 2 继续吗?[y/N] y 0x26 0x80
该命令基本上是说“将两个字节(即 0x30 和 0x0a)写入总线 7 地址 0x10,然后读取两个字节”。我们写入的两个字节是我们感兴趣的寄存器的地址,我们了解到存储在那里的值是 0x26 和 0x80,即 2680!我们检测到了芯片,万岁。将其放入驱动程序中有点困难。在此驱动程序中打开 PMIC 的 GPIO 引脚实际上没有意义;这实际上应该进入该模块驱动程序。同样,我们需要获取 PMIC 提供的调节器和时钟。所有这些都需要 PMIC 具有驱动程序来提供它们。内核已经为这个 PMIC 提供了 gpio 驱动程序,但没有调节器或时钟驱动程序。英特尔的 lts 4.14 分支上有一些旧的驱动程序,所以我已经挪用了它们并对其进行了调整以编译到最新的内核中。