我有一个用于USB连接的自定义SCSI设备的驱动程序,它实现了一些特定于供应商的命令。每个 USB 设备承载多个 SCSI LUN。这工作得很愉快,但是根据设备对 SCSI LUN 进行分组存在问题,因为从IOSCSILogicalUnitNub
级别向下(我的驱动程序继承自),没有将 LUN 链接在一起的识别功能(有 SCSI 逻辑单元号,但这些单元号对于每个新设备都会发生冲突;它们都有一个单元0x0)。
我想做一些事情,比如根据 USB locationID
字段(或任何其他唯一密钥)将它们全部链接起来,但我不知道如何获取父 USB 设备,因为只有匹配的 SCSI 驱动程序io_service_t
。这也最好在应用程序端完成,而不是在驱动程序中完成,因为应用程序需要跟踪哪个服务具有哪些 LUN 以及由处理程序的哪个实例打开。
IO 注册表中的层次结构为:
MyUSB-SCSI Device@fd130000
|-IOUSBCompositeDriver
|-Mass Storage Class Interface@0 (has location ID 0xfd130000)
|-IOUSBMassStorageClass
|-IOSCSILogicalUnitNub@0 (has SCSI LUN number, unique in this device, but not globally)
| |-com_Company_driver_MyDriver (my driver)
| |-IOBlockStorageServices
| |-Manuf Device Media (these are strings from the device firmware)
| |-IOMediaBSDClient
|
|-IOSCSILogicalUnitNub@0
|-com_Company_driver_MyDriver
|-IOBlockStorageServices
|-Manuf Device Media
|-IOMediaBSDClient
如果设备的io_service_t位于变量 _device 中,则代码如下所示:
CFTypeRef _thing_you_want = IORegistryEntrySearchCFProperty(_device, kIOServicePlane, CFSTR("locationID"), NULL, kIORegistryIterateParents);
转到此处获取更多信息:
http://developer.apple.com/library/mac/#documentation/devicedrivers/conceptual/AccessingHardware/AH_IOKitLib_API/AH_IOKitLib_API.html