Mac M1 获取 IOMobileFramebufferUserClient 接口

问题描述

我正在尝试访问 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,"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

你知道我如何找到访问这个用户客户端的字符串吗? 或者也许我对这段代码完全错了...... 我正在尝试在此界面中搜索设置一些亮度。我认为它不会奏效,但我想尝试...

谢谢!

解决方法

匹配 (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,retain 14>

首先,IOBSDNameMatching 用于匹配在 BSD 子系统中具有等效项的设备(本质上,它们出现在 /dev/ 下)这只是 macOS 上的几种设备的情况,例如块存储设备和串行端口。 (如果 是用于此目的的正确函数,则您还需要将 kIOMasterPortDefault 作为文档指示的第一个参数传递。)

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

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

然而,按名称匹配通常不是一个好主意,除非你有很好的理由;相反,使用 IOServiceMatching() 按类名匹配。因此,例如:

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

这应该有效。

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

IOMobileFramebuffer 没有文档化的接口,但也许您可以找到一些有用的东西来处理它。