簡體   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