Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux ACPI中I2C驱动程序应如何与HID PRP0001匹配_Linux_Linux Device Driver_Acpi - Fatal编程技术网

Linux ACPI中I2C驱动程序应如何与HID PRP0001匹配

Linux ACPI中I2C驱动程序应如何与HID PRP0001匹配,linux,linux-device-driver,acpi,Linux,Linux Device Driver,Acpi,我试图使用特定于设备的数据在ACPI中实例化,即使用Name(_DSD,…)和兼容字符串,例如,使用以下ASL摘录: 设备(TOF1){ 名称(“PRP0001”) 名称(“STMicroelectronics VL53L0X激光测距仪”) 名称(\u CRS,ResourceTemplate(){ I2C串行总线( 0x29, 控制器初始化, I2C_速度, 解决这个问题, “\\\ u SB.PCI0.I2C1.MUX2.CH01”, 0x00, 资源消费者,,) }) 名称(_DSD,包(

我试图使用特定于设备的数据在ACPI中实例化,即使用
Name(_DSD,…)
和兼容字符串,例如,使用以下ASL摘录:

设备(TOF1){
名称(“PRP0001”)
名称(“STMicroelectronics VL53L0X激光测距仪”)
名称(\u CRS,ResourceTemplate(){
I2C串行总线(
0x29,
控制器初始化,
I2C_速度,
解决这个问题,
“\\\ u SB.PCI0.I2C1.MUX2.CH01”,
0x00,
资源消费者,,)
})
名称(_DSD,包(){
TOUID(“daffd814-6eba-4d8c-8a91-bc9bbf4aa301”),
包(){
包(){“兼容”,“st,vl53l0x”},
}
})
}
我的印象是,如果我像在上述ASL中那样指定我的设备,我就不需要修改驱动程序(例如,通过添加ACPI匹配表),并且可以使用驱动程序中现有的OF匹配表来匹配设备。然而,这似乎只是部分正确。由于内核中的此检查,传感器无法探测:

if(!driver->id\u表&&
!i2c_acpi_match_设备(开发->驱动->acpi_match_表,客户端)&&
!i2c_的_match_设备(开发->驱动->的_match_表,客户端))
return-ENODEV;
我对该语句的解释是,设备驱动程序必须具有(i)ID表或(ii)匹配的ACPI ID表或(iii)匹配的ID表。VL53L0X既没有ID表也没有ACPI匹配表,因此我依赖于使用OF表进行匹配

现在,有两件事我很困惑。首先,我可以
printk(KERN_ERR“%s”,dev->driver->driver.name)
并看到我确实已经在查看正确的驱动程序,那么我们为什么还要再次检查驱动程序是否匹配呢


其次,如果匹配设备(开发人员->驱动程序->匹配表,客户端)的i2c\u无法匹配,那么到底是什么匹配首先导致能够
printk(KERN\u ERR“%s”,开发人员->驱动程序->驱动程序.name)
并看到驱动程序的正确名称?

并不是上述问题的答案,但是解决这个问题的一个方法是将ID表添加到驱动程序中

静态常量结构i2c_设备id vl53l0x_id[]{
{“vl53l0x”,0},
{ }
};
模块设备表(i2c,vl53l0x\U id);
静态结构i2c_驱动程序vl53l0x_驱动程序={
.司机={
.name=“vl53l0x-i2c”,
.of_match_table=st_vl53l0x_dt_match,
},
.probe_new=vl53l0x_probe,
.id_table=vl53l0x_id,
};
模块i2c驱动程序(vl53l0x驱动程序);
这将导致跳过问题中的检查。这不是一个很好的解决方案,因为I2C ID表没有传递给
probe\u new
,但是,它确实适用于这个驱动程序,因为没有进一步的配置要做


然而,据介绍
probe\u new

的评论和补丁来看,像这样匹配的i2c设备似乎被弃用了。是的,添加ID表是缓解这一问题的最简单方法(顺便说一句,您是否打算将其发送到上游?请这样做!),但真正的解决方法是您指出的那些行之间的某个地方。还要注意的是,即使对于
->probe_new()
驱动程序,添加ID表也不是一个坏主意,i.o.w.它不是一个批量。用户可以通过这种方式从用户空间枚举设备。您可以扩展您的答案,解释它为什么工作。因此,在您的情况下,
CONFIG\u OF=n
和OF match都会失败,因为ACPI和ID表都没有定义其余的都会失败。应重新检查此检查。我不知道在启用ACPI的环境中显式检查ACPI表背后的逻辑是什么,不检查PRP0001案例。在我的系统上,当涉及到
CONFIG\u OF=n
时,您是对的。如果你想补充一个快速的答案,我会接受它作为这个问题的答案。似乎有点奇怪,
CONFIG\u OF=n
禁用了PRP0001设备需要的功能,以便将其DSD属性(尤其是兼容字符串)与\u match\u表的
相匹配。因为PRP0001设备是一件事,所以似乎拥有ACPI支持应该在KConfig中自动启用
的配置…
配置这里是一件次要的事情。它不影响PRP0001。代码中有一个简单的错误。我现在有点太忙了,但我想我会在几周内留出一些时间来测试这个,并为我最近改进的其他几个驱动程序提交一些补丁(即,大部分将它们移动到统一设备属性API)。。。