【问题标题】:Mac M1 get IOMobileFramebufferUserClient interfaceMac M1获取IOMobileFramebufferUserClient接口
【发布时间】:2021-06-23 01:00:09
【问题描述】:

我正在尝试访问 M1 Mac 的帧缓冲区接口。我知道它与其他 Mac 完全不同,因为这些新 Mac 使用 IOMobileFrameBuffer(来自 OS)而不是经典的 IOFrameBuffer。

所以我尝试使用这段代码来访问这个帧缓冲区,但没有成功。

func makeIterator() -> io_iterator_t {
    var port: mach_port_t = 0
    var status = IOMasterPort(mach_port_t(MACH_PORT_NULL), &port)
    guard status == KERN_SUCCESS else { return 0 }
    guard let match = IOBSDNameMatching(port, 0, "AppleMobileCLCD") else { return 0 }
    var iterator: io_iterator_t = 0
    status = IOServiceGetMatchingServices(port, match, &iterator)
    guard status == KERN_SUCCESS else { return 0 }
    return iterator
}

我也尝试过使用“IOMobileFramebuffer”、“AppleCLCD”和“IOMobileFramebufferUserClient”字符串,但匹配似乎不行。

我还尝试显示 ioreg 命令,它告诉我:

+-o IOMobileFramebufferUserClient

你知道我怎样才能找到访问这个用户客户端的字符串吗? 或者也许我对这段代码完全错误...... 我正在尝试在此界面中搜索设置一些亮度。我觉得效果不好,但我想试试……

谢谢!

【问题讨论】:

    标签: swift macos iokit


    【解决方案1】:

    您的匹配 (IOServiceGetMatchingServices) 调用未返回您要查找的对象的原因是您的匹配字典不正确。

    首先,让我们看看您感兴趣的对象的ioreg 输出(命令行:ioreg -w0 -irc IOMobileFramebuffer)。在我的 Mac Mini 上,它们看起来像这样:

    +-o AppleCLCD2  <class IORegistryEntry:IOService:IOMobileFramebuffer:IOMobileFramebufferService:IOMobileFramebufferAP:UnifiedPipeline2:AppleCLCD2, id 0x100000300, registered, matched, active, busy 0 (0 ms), retain 15>
    […]
    +-o AppleCLCD2  <class IORegistryEntry:IOService:IOMobileFramebuffer:IOMobileFramebufferService:IOMobileFramebufferAP:UnifiedPipeline2:AppleCLCD2, id 0x1000002bc, registered, matched, active, busy 0 (0 ms), retain 14>
    

    首先,IOBSDNameMatching 用于匹配在 BSD 子系统中具有等价物的设备(本质上,它们出现在 /dev/ 下),这仅适用于 macOS 上的几种设备,例如块存储设备和串口。 (如果它用于此目的的正确函数,您还需要按照文档说明将kIOMasterPortDefault 作为第一个参数传递。)

    我不确定您从哪里获得"AppleMobileCLCD",也许那是您系统上条目的名称(而不是Mac Mini 上的AppleCLCD2)。

    如果是这种情况,您需要使用IOServiceNameMatching 来创建匹配字典。

    但是,除非您有充分的理由,否则按名称匹配通常不是一个好主意;相反,使用 IOServiceMatching() 按类名匹配。所以,例如:

        guard let match = IOServiceMatching("IOMobileFramebuffer") else { return 0 }
    

    这应该可行。

    您通常无法匹配现有的 用户客户端 对象,例如您引用的 ioreg 行的对象,因为它们通常未注册匹配。 (它们显示为!registered)它们通常也没有任何可用的接口,因为它们它们的提供者对象的接口。

    IOMobileFramebuffer 没有记录在案的接口,但也许您仍然可以找到一些有用的东西。

    【讨论】:

    • 完美!效果很好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 2022-01-14
    • 2022-08-17
    • 2021-08-23
    • 2011-02-05
    • 2015-10-07
    相关资源
    最近更新 更多