【问题标题】:Get property of driver's parent (or ancestor)获取驱动程序父级(或祖先)的属性
【发布时间】:2012-09-24 14:02:38
【问题描述】:

我有一个用于连接 USB 的自定义 SCSI 设备的驱动程序,它实现了一些供应商特定的命令。每个 USB 设备承载多个 SCSI LUN。这工作非常愉快,但是根据设备对 SCSI LUN 进行分组存在问题,因为从IOSCSILogicalUnitNub 级别向下(我的驱动程序继承自),没有将 LUN 链接在一起的识别功能(有 SCSI 逻辑单元号,但每个新设备都会发生冲突;它们都有一个单元 0x0)。

我想做一些事情,比如根据 USB locationID 字段(或任何其他唯一键)将它们全部链接,但我不知道如何在仅给出 io_service_t 的情况下获取父 USB 设备匹配的 SCSI 驱动程序。这也最好在应用程序端完成,而不是在驱动程序中完成,因为应用程序需要跟踪哪些服务具有哪些 LUN 以及由哪个处理程序实例打开。

IO Registry 中的层次结构是:

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

【问题讨论】:

    标签: macos usb device-driver scsi kernel-extension


    【解决方案1】:

    如果您设备的 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

    【讨论】:

    • 这似乎正是我想要的,但它在父母 (_thing_you_want = NULL) 中找不到任何东西,尽管它会很乐意找到驱动程序本身的属性,例如 IOClass .
    • kIORegistryIterateRecursively 还需要作为最终参数中的 OR'd 标志,以便函数查找高于父级的驱动程序。
    猜你喜欢
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多