黑蘋果定制聲卡驅動(ALC892)轉載
教程以ALC892 為例,主要針對筆記本的聲卡。由於筆記本聲卡經常同一型號的聲卡驅動並不能通用,往往需要自己定制。台式機大多沒有這個問題,只需要用AppleALC-master 生成通用聲卡即可,通用聲卡不好用的可以藉鑑本篇文章的思路。(台式機或者嫌麻煩的,可以直接跳到第八節,直接進行編譯,如果不完美再進行定制)
目錄:
一、定制驅動目標文件
二、定制聲卡信息提取
三、所需工具
四、codec 提取方法
五、修改configdata 信息
六、推導節點及Platforms.xml 修改
七、製作輔助文件
八、編譯聲卡驅動
九、實現聲卡驅動
十、總結
一、定制驅動目標文件
完全自製聲卡驅動,主要是要製作4 個文件:
1.Applealc-master——resources——alc892 中Platforms.xml.zlib (節點文件)
2.Applealc-master——resources——alc892 中layout1.xml. zlib(layoutID 文件)
3.Applealc-master—>resources—>alc892—>info.Plist
( 描述聲卡以及對layout 和Platforms 文件位置、id 的說明)
4.Applealc-master—>resources—>pinconfigs.kext— >contents—>info.Plist
( 包含codecID 和layoutID 相關值)
1.Applealc-master——resources——alc892 中Platforms.xml.zlib (節點文件)
2.Applealc-master——resources——alc892 中layout1.xml. zlib(layoutID 文件)
3.Applealc-master—>resources—>alc892—>info.Plist
( 描述聲卡以及對layout 和Platforms 文件位置、id 的說明)
4.Applealc-master—>resources—>pinconfigs.kext— >contents—>info.Plist
( 包含codecID 和layoutID 相關值)
二、定制聲卡信息提取
1 、提取聲卡codec
2 、verbit 獲取你的聲卡configdata 和節點信息
3 、推導自己的Platforms 節點
2 、verbit 獲取你的聲卡configdata 和節點信息
3 、推導自己的Platforms 節點
三、所需工具
1 、Ubuntu 系統。
2 、verbit 將codec 生成verbs.txt 文件。鏈接:verbit.zip 3、zlib 轉換器鏈接:已包含修改好的Platforms.xml 以及zlib 轉換器 4 、AppleALC-master 聲卡驅動鏈接:vit9696 大神最新AppleALC-master需要最新lilu.kext 配合,並且需要完整lilu 才行(lilu 中不能缺少Resources 文件夾)鏈接:vit9696 大神最新Lilu-master
2 、verbit 將codec 生成verbs.txt 文件。鏈接:verbit.zip 3、zlib 轉換器鏈接:已包含修改好的Platforms.xml 以及zlib 轉換器 4 、AppleALC-master 聲卡驅動鏈接:vit9696 大神最新AppleALC-master需要最新lilu.kext 配合,並且需要完整lilu 才行(lilu 中不能缺少Resources 文件夾)鏈接:vit9696 大神最新Lilu-master
四、codec 提取方法
1 、U 盤安裝Ubuntu 系統網上很多需要在U 盤中寫入鏡像,其實現在的Ubuntu 也有類似WinPE 的功能,將下載好的安裝包解壓到U 盤中即可。開機啟動時引導進入U 盤的Ubuntu 系統出現Ubuntu 的系統選項,選擇Try Ubuntu without installing
ubuntu 系統選項.jpg
進入Ubuntu 系統的桌面打開我的電腦,進入路勁proc/asound/card1 ,將文件夾裡面的所有名為codec# 開頭的文件都複製出來,其中一個就是你的聲卡codec ,千萬不要把HDMI 音頻的文件複製出來了(如果card1 沒有就一定在card0 文件夾,筆記本一般都在card1 中)
2 、進入macOS 系統中,將提取的Codec.txt 改名為codec_dump.txt 放在桌面上,將verbit.zip 解壓到桌面,打開終端輸入:
cd desktop ./verbit codec_dump.txt > verbs.txt 獲得verbs. txt (部分朋友獲取的為空白,是因為兩個命令一起使用的結果)注意:部分聲卡終端輸入命令會得到一個錯誤文件,文件的內容如下:
cd desktop ./verbit codec_dump.txt > verbs.txt 獲得verbs. txt (部分朋友獲取的為空白,是因為兩個命令一起使用的結果)注意:部分聲卡終端輸入命令會得到一個錯誤文件,文件的內容如下:
Codec: Realtek ALC269VC
Address: 0
AFG Function
Id : 0 x1 (unsol 1 )
Id : 0 x1 (unsol 1 )
需要刪除codec_dump.txt 文件中的這行數據AFG Function Id: 0x1 (unsol 1) ,也要把空格刪除完。再執行一次命令,得到正確的verbit.txt 文件。( 感謝Lenged 發現問題)
verbs.png
打開codec.txt 搜索上面的紅框中的Node ,找到每個Node 下面的Pin Default 那行,看看中間是否有[N/A] ,將有[N/A] 的將“ 節點信息“ 中的一行刪除。
刪除後,紅框中的modified verbs 每行四個數,一共7 組就是需要的configdata (codec.txt內搜索EAPD 字樣,存在EAPD ,必須在configdata 最後加入一組01470C02 )
五、修改configdata 信息
①第一組
第一組.png
紅框中是接口的順序。數字越低那麼優先權就越高。如果有[N/A] 的接口既是無用的接口可以設成f 。
內置麥克風—— Mic at Int N/A 內置揚聲器——Speaker at Int N/A 線路輸出—— line out 外置麥克風—— Mic at Ext Rear 線路輸入—— Line In at Ext Rear 耳機—— HP Out at Ext Rear
SPDIFOut —— SPDIF Out at Ext Rear
SPDIFOut —— SPDIF Out at Ext Rear
如果你的聲卡有line out 節點那麼
Mic at Int N/A =5
Speaker at Int N/A =1
line out =2
Mic at Ext Rear =6
Line In at Ext Rear =5
HP Out at Ext Rear =3
SPDIF Out at Ext Rear =4
Speaker at Int N/A =1
line out =2
Mic at Ext Rear =6
Line In at Ext Rear =5
HP Out at Ext Rear =3
SPDIF Out at Ext Rear =4
如果無line out 則
Mic at Int N/A =4
HP Out at Ext Rear =2
Mic at Ext Rear = 5
Line In at Ext Rear =4
Speaker at Int N/A =1
SPDIF Out at Ext Rear =3
HP Out at Ext Rear =2
Mic at Ext Rear = 5
Line In at Ext Rear =4
Speaker at Int N/A =1
SPDIF Out at Ext Rear =3
( 耳機優先級一定要低於內置揚聲器,外置麥克風一定要低於內置麥克風,默認開啟的是內置揚聲器和麥克風,第四組數據把耳機設置為0 ,既插入檢測。這樣就可以實現自動切換了。)
②第二組
第二組.png
line out 設置為f ,其餘皆為0
③第三組
第三組.png
第三組為接口顏色,這個改不改無所謂,我是默認沒改
0 = Unknown
1 = Black
2 = Grey
3 = Blue
4 = Green
5 = Red
6 = Orange
7 = Yellow
8 = Purple
9 = Pink
A – D = Reserved
E = White
F = Other
1 = Black
2 = Grey
3 = Blue
4 = Green
5 = Red
6 = Orange
7 = Yellow
8 = Purple
9 = Pink
A – D = Reserved
E = White
F = Other
④第四組
第四組.png
接口為0 ,表示當接口被檢測到時使用。如果是筆記本的話內建的麥克風和揚聲器要設成1 ,即當耳機插入時,內建揚聲器靜音,耳機0 接口被檢測到就是用耳機。
Mic at Int N/A =1
Speaker at Int N/A =1
line out =0
Mic at Ext Rear =0
Line In at Ext Rear =0
HP Out at Ext Rear =0
SPDIF Out at Ext Rear =1
Speaker at Int N/A =1
line out =0
Mic at Ext Rear =0
Line In at Ext Rear =0
HP Out at Ext Rear =0
SPDIF Out at Ext Rear =1
⑤第五組
第五組.png
設定接口功能信息,按照以下進行修改
0 = Line Out
1 = Speaker
2 = HP Out
3 = CD
4 = SPDIF Out
5 = Digital Other Out
6 = Modem Line Side
7 = Modem Handset Side
8 = Line In
9 = AUX
A = Mic In
B = Telephone
C = SPDIF In
D = Digital Other In
E = Reserved
F = Other
1 = Speaker
2 = HP Out
3 = CD
4 = SPDIF Out
5 = Digital Other Out
6 = Modem Line Side
7 = Modem Handset Side
8 = Line In
9 = AUX
A = Mic In
B = Telephone
C = SPDIF In
D = Digital Other In
E = Reserved
F = Other
Mic at Int N/A =a
Speaker at Int N/A =1
line out =0
Mic at Ext Rear =8 (ALC892 需要通過line in 實現外置mic )
Line In at Ext Rear =8
HP Out at Ext Rear = 2
SPDIF Out at Ext Rear =4
Speaker at Int N/A =1
line out =0
Mic at Ext Rear =8 (ALC892 需要通過line in 實現外置mic )
Line In at Ext Rear =8
HP Out at Ext Rear = 2
SPDIF Out at Ext Rear =4
⑥第六組
第六組.png
連接裝置類型
0 = Unknown
1 = 1/8″ stereo/mono
2 = 1/4′ stereo/mono
3 = ATAPI internal
4 = RCA
5 = Optical
6 = Other Digital
7 = Other Analog
8 = Multichannel Analog (DIN)
9 = XLR/ Professional
A = RJ-11 (Modem)
B = Combination
F = Other 通常接口是1/8″ stereo/mono ,SPDIF 是Optical 。筆記本內建的接口是ATAPI internal 。(這只是描述,對驅動沒有本質影響,我默認沒有修改。)
1 = 1/8″ stereo/mono
2 = 1/4′ stereo/mono
3 = ATAPI internal
4 = RCA
5 = Optical
6 = Other Digital
7 = Other Analog
8 = Multichannel Analog (DIN)
9 = XLR/ Professional
A = RJ-11 (Modem)
B = Combination
F = Other 通常接口是1/8″ stereo/mono ,SPDIF 是Optical 。筆記本內建的接口是ATAPI internal 。(這只是描述,對驅動沒有本質影響,我默認沒有修改。)
⑦第七組
第七組.png
0 為插入接口的,如外置麥克風、耳機等。
( 如果codec_dump 出來有[N/A] 的就是無用的port ,數字為4 。)
9 為給筆記本內建,像內置揚聲器、內置麥克風等
( 如果codec_dump 出來有[N/A] 的就是無用的port ,數字為4 。)
9 為給筆記本內建,像內置揚聲器、內置麥克風等
Mic at Int N/A =9
Speaker at Int N/A =9
line out =0
Mic at Ext Rear =0
Line In at Ext Rear =0
HP Out at Ext Rear =0
SPDIF Out at Ext Rear =0
Speaker at Int N/A =9
line out =0
Mic at Ext Rear =0
Line In at Ext Rear =0
HP Out at Ext Rear =0
SPDIF Out at Ext Rear =0
⑧第八組
第八組.png
插口所在位置
0 = Rear (後)
1 = Front (前)
8=HDMI
9=ATAPI (內建)(這只是描述,對驅動沒有本質影響,我默認沒有修改。)
0 = Rear (後)
1 = Front (前)
8=HDMI
9=ATAPI (內建)(這只是描述,對驅動沒有本質影響,我默認沒有修改。)
將八組數據修改後進行整理得到configdata 值( 每個參數中保留一位空格) :
01271c50 01271d01 01271ea6 01271f90 01471c10 01471d01 01471e17 01471f90 01771c20 01771d10 01771e01 01771f01 01871c60 01871d10 01871ea1 01871f01 01a71c50 01a71d10 01a71e81 01a71f01 01b71c30 01b71d10 01b71e21 01b71f01 01e71c40 01e71d11 01e71e45 01e71f01 01470C02
01271c50 01271d01 01271ea6 01271f90 01471c10 01471d01 01471e17 01471f90 01771c20 01771d10 01771e01 01771f01 01871c60 01871d10 01871ea1 01871f01 01a71c50 01a71d10 01a71e81 01a71f01 01b71c30 01b71d10 01b71e21 01b71f01 01e71c40 01e71d11 01e71e45 01e71f01 01470C02
六、推導節點及Platforms.xml 修改
接口的節點信息.png
紅框中為接口節點。
想要實現接口功能需要推導節點,一般為3 個節點實現一個接口功能,且節點一般不重複。其中輸入為反向推導,輸出為正向推導,即輸入時接口節點是最後一個節點,輸出時接口節點是第一個節點(codec 中的節點值為16 進制,Platforms.xml 中需要轉換成10 進制)
① 輸入以Mic at int (內置麥克風)為例在codec_dump.txt 搜索0x12 ,搜索到2 個0x12 ,一個為節點本身即Node 0x12 ,一個在關聯節點0x22 下
0x22 節點.png
0x12 節點.png
然後在codec_dump.txt 搜索0x22 ,搜索到2 個0x22 ,一個為節點本身即Node 0x22 ,一個在關聯節點0x09 下
0x09 節點.png
0x22 節點.png
按照輸入節點反向推導,獲得內置麥克風的節點為:
十六進制:0x09 → 0x22 → 0x12 十進制:9 → 34 → 18
十六進制:0x09 → 0x22 → 0x12 十進制:9 → 34 → 18
②輸出以Speaker at Int N/A (內置揚聲器)為例在codec_dump.txt 搜索0x14 ,搜索到4 個0x14 ,首先找到節點本身即Node 0x14
0x14 節點.png
找到connection 中有關聯節點0x0c
在codec_dump.txt 搜索0x0c ,搜索到6 個0x0c ,首先找到節點本身即Node 0x0c
0x0c 節點.png
找到connection 中有關聯節點0x02 ,0x0b ,在已選節點不重複的前提下,優先選擇數字小,即0x02 節點按照輸出節點正向推導,獲得內置揚聲器的節點為:
十六進制:0x14 → 0x0c → 0x02 十進制:20 → 12 → 2
由此推導出所有節點,由於節點很多,可能出現有共同關聯的節點,且沒有其他節點,則更換上個節點,重新推導,直到沒有重複的為止。
推導節點.png
2 、修改Platforms.xml 根據我的Platforms.xml 進行修改即可
Platforms.png
PathMap 下一共三大項:
0 為輸入,1 為輸出,2 為SPDIF
0 為輸入,1 為輸出,2 為SPDIF
輸入項分為三大項:
0 為內置mic ,1 為linein ,2 為外置mic (ALC892 外置mic 通過linein 實現,由此刪除外置mic 項)
0 為內置mic ,1 為linein ,2 為外置mic (ALC892 外置mic 通過linein 實現,由此刪除外置mic 項)
輸出項分為三大項:
0 為耳機,1 為內置揚聲器,2 位lineout
0 為耳機,1 為內置揚聲器,2 位lineout
以內置mic 為例:內置mic 底層三項代表三個節點,將之前推導的三個節點按順序輸入到NodeID 中,在內置mic 節點添加boost 項,設置為3 ,可以減少mic 雜音的情況(外置mic 和linein 的節點也可以添加boost 項)。
屏幕快照2017-12-01 12.16.04.png
以此類推,所有節點修改完畢後,在PathMapID 中輸入你的聲卡型號,Platforms.xml 完畢,保存後用zlib 轉換器轉換成Platforms.xml.zlib 格式。
七、製作輔助文件
1 、Applealc-master——resources——alc892 中的info.Plist 用來描述你的聲卡以及對layout 和Platforms 文件位置、id 的說明
ALC892 的codecID 為283904146 ,這是0x10ec0892 十六進制轉換過來的。在codec_dump 開頭中可以找到,macos 的計算器有進制轉換功能。然後修改layouts 第一項,修改id 為1 ,path 地址改為你做好的layouts.xml.zlib 文件,Platforms 設置方式一樣。(全篇LayoutID 統一為1 ,也可統一為其他數字)
ALC892 的codecID 為283904146 ,這是0x10ec0892 十六進制轉換過來的。在codec_dump 開頭中可以找到,macos 的計算器有進制轉換功能。然後修改layouts 第一項,修改id 為1 ,path 地址改為你做好的layouts.xml.zlib 文件,Platforms 設置方式一樣。(全篇LayoutID 統一為1 ,也可統一為其他數字)
info.png
2 、Applealc-master——resources——pinconfigs.kext——contents 中的info.Plist 集合了所有聲卡的信息,我們只用保留需要的,為防止衝突,只修改第一項,其他都可以刪除。第一項中修改codec 為alc892 ,codecID 為283904146 ,這是0x10ec0892 十六進制轉換過來的。在codec_dump 開頭中可以找到,macos 的計算器有進制轉換功能。configData中修改為自己的configdata 即可。LayoutID 修改為1 (全篇LayoutID 所有統一為1 ,也可統一為其他數字)
info.png
3 、Applealc-master——resources——alc892 中layout1.xml.zlib 描述聲卡型號以及聲卡ID 信息首先向zlib 文件轉換為xml 文件才可以編輯 LayoutID 修改為1(全篇LayoutID 所有統一為1 ,也可統一為其他數字),修改codecID 為283904146 ,這是0x10ec0892 十六進制轉換過來的。在codec_dump 開頭中可以找到,macos 的計算器有進制轉換功能。 pathmapID 修改為892 。部分聲卡需要刪除lineout 項才能驅動,需要自行嘗試。
layout.png
最後確認一共需要修改和定制的為4 個文件:
1.Applealc-master——resources——alc892—>Platforms.xml.zlib
2.Applealc-master——resources——alc892—>layout1.xml.zlib
3 .Applealc-master—>resources—>alc892—>info.Plist
4.Applealc-master—>resources—>pinconfigs.kext—>contents—>info.Plist 全篇所有的layoutID 都為1 ,如果需要修改其他數字,需要注意layout 文件名也需要修改,如layout25.xmI.zlib
1.Applealc-master——resources——alc892—>Platforms.xml.zlib
2.Applealc-master——resources——alc892—>layout1.xml.zlib
3 .Applealc-master—>resources—>alc892—>info.Plist
4.Applealc-master—>resources—>pinconfigs.kext—>contents—>info.Plist 全篇所有的layoutID 都為1 ,如果需要修改其他數字,需要注意layout 文件名也需要修改,如layout25.xmI.zlib
這四個文件保存好以後,系統升級驅動失效時可獲取最新的AppleALC-master 文件重新編譯即可,十分方便。
八、編譯聲卡驅動
下載好最新的AppleALC-master 文件,由於10.12.6 之後需要lilu.kext 才能編譯並驅動聲卡,還需要下載最新的lilu.kext 放置在AppleALC-master 的根目錄,需要注意的是lilu.kext 中必須包含有Resources (部分lilu.kext 缺少該文件)將之前定制好的四個文件,放置在對應的位置,運行AppleALC-master 中的AppleALC.xcodeproj
運行xcode.png
如果出現紅色嘆號報錯,可能出現以下問題:
1 、缺少lilu.kext 文件或lilu.kext 中缺少resources 下的文件(查找最新lilu.kext ,並確保必須包含有Resources )
1 、缺少lilu.kext 文件或lilu.kext 中缺少resources 下的文件(查找最新lilu.kext ,並確保必須包含有Resources )
報錯1.png
2 、顯示缺少liluAPI ,說明lilu.kext 與AppleALC-master 版本不對應,在下載時確保最新或者版本說明中相互對應,確保相互兼容。
報錯2.png
九、實現聲卡驅動
將做好驅動和對應版本的lilu.kext 放到EFI—>CLOVER—>kexts—>10.13 文件夾中。然後在config.plist 中加入以下代碼:
< dict >
< key >Audio</ key >
< dict >
< key >Inject</ key >
< string >1</ string >
</ dict >
clover 注入ID 不能讓這個聲卡驅動正常工作所以這裡必須採用DSDT 注入ID 打開DSDT 搜索HDEF 插入函數
Method (_DSM, 4 , NotSerialized) // _DSM: Device-Specific Method`
{
Store (Package ( 0x0A )
{
“hda-gfx” ,
Buffer ( 0x0A )
{
“onboard-1”
},
“codec-id” ,
Buffer ( 0x04 )
{
0x92 , 0x08 , 0xEC , 0x10
//修改為自己的聲卡型號
},
“layout-id” ,
Buffer ( 0x04 )
{
0x01 , 0x00 , 0x00 , 0x00 //修改為自己的layoutID
},
“device-type” ,
Buffer ( 0x07 )
{
“ALC892” //修改為自己的聲卡型號
},
“PinConfigurations” ,
Buffer (Zero) {}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0) }
十、總結
以這種仿冒方式定制的聲卡,對於筆記本十分友好,同時也能很好的解決喚醒無聲以及雜音問題。以上教程是通過學習遠景貼並總結個人經驗寫成的,我個人定制聲卡驅動後沒有出現喚醒無聲以及雜音等問題,如果由以上問題沒有解決的,可以參考一下帖子參考。
太棒了,一定花了很長時間去製做。
回覆刪除