繁体   English   中英

Mac M1获取IOMobileFramebufferUserClient接口

[英]Mac M1 get IOMobileFramebufferUserClient interface

我正在尝试访问 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 <class IOMobileFramebufferUserClient, id 0x1000007fb, ,registered, ,matched, active, busy 0, retain 5>

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

谢谢!

您的匹配 ( IOServiceGetMatchingServices ) 调用未返回您正在寻找的 object 的原因是您的匹配字典不正确。

首先,让我们看一下您感兴趣的对象的ioreg output(命令行: 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 上的几种设备,例如块存储设备和串行端口。 (如果它正确的 function 用于此目的,您还需要按照文档说明将kIOMasterPortDefault作为第一个参数传递。)

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

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

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

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

这应该有效。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM