我对这件事的理解很少,所以请原谅我。根据我到目前为止收集的信息,Linux上的i2c子系统识别了附加的设备,然后以某种方式将它们与加载的驱动程序模块相匹配。在识别匹配的地方,它调用驱动程序的探测函数,该函数实际上启动了驱动程序设置。
我很难调试一个非功能摄像头;我可以看到i2c子系统看到了它的存在,并在/sys/bus/i2c/i2c-7
中为它构建了目录,而且我可以判断这个驱动程序的.probe_new()
函数没有被调用,因为我向它添加了一堆调试消息。因此,我猜想设备连接到驱动程序的步骤已经丢失,但是我不知道它是如何工作的。
有人能解释i2C子系统是如何执行设备->驱动程序匹配的吗?
编辑:
为了清楚起见,我知道驱动程序声明它名为"ov2680":
static const struct i2c_device_id ov2680[] = {
{"ov2680", 0},
{},
};
MODULE_DEVICE_TABLE(i2c, ov2680_id);
我不知道的是,i2c子系统如何从设备中获取一个值,以便将其与驱动程序中声明的设备id匹配?
发布于 2020-08-05 08:01:27
I S.C不支持设备枚举,因此内核提供了初始化I S/C设备的四种不同方法:
ov2680
实现这一点)、ACPI表或板文件(忽略后者,只提供向后兼容性);后者应该允许您强制探测设备,如果您知道它在总线上的地址:
echo ov2680 0x50 > /sys/bus/i2c/devices/i2c-7/new_device
一旦您验证了这一点,您就可以确定需要在哪里添加信息,以便设备自动初始化,或者使用基于设备的探测或基于总线的探测。内核文档(见上面的第一个链接)应该会让您朝着正确的方向前进。
基于您对OVTI2680
的评论,我怀疑这里的问题是有两个OmniVision OV2680驱动程序,drivers/media/i2c/ov2680.c
和drivers/staging/media/atomisp/i2c/atomisp-ov2680.c
。前者使用devicetree,后者使用ACPI,而OVTI2680
文件在您的i2c
目录中的存在表明后者正在加载。
https://unix.stackexchange.com/questions/602925
复制相似问题