注:該方法經測試支持12、13、14、15系統,但每次升級系統都需要下載最新的AppleALC-master進行重新編譯,并配合最新的lilu.kext才能正常驅動。
教程以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、提取聲卡codec
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
四、codec提取方法
1、U盤安裝Ubuntu系統
網上很多需要在U盤中寫入鏡像,其實現在的Ubuntu也有類似WinPE的功能,將下載好的安裝包解壓到U盤中即可。新版ubuntu出現了解壓后無法引導的情況,用制作U盤啟動盤的方法把鏡像寫入U盤就可以(記得提前把U盤數據轉移,會格盤的)。
開機啟動時引導進入U盤的Ubuntu系統
出現Ubuntu的系統選項,選擇Try Ubuntu without installing
進入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(部分朋友獲取的為空白,是因為兩個命令一起使用的結果)
注意:部分聲卡終端輸入命令會得到一個錯誤文件,
文件的內容如下:
Codec: Realtek ALC269VC
Address: 0
AFG Function Id: 0x1 (unsol 1)
需要刪除codec_dump.txt文件中的這行數據AFG Function Id: 0x1 (unsol 1),也要把空格刪除完。再執行一次命令,得到正確的verbit.txt文件。(感謝Lenged發現問題)
打開codec.txt搜索上面的紅框中的Node,找到每個Node下面的Pin Default那行,看看中間是否有[N/A],將有[N/A]的將“節點信息”中的一行刪除。
刪除后,紅框中的modified verbs每行四個數,一共7組就是需要的configdata(codec.txt內搜索EAPD字樣,存在EAPD,必須在configdata中該接口最后加入一組01470C02)
五、修改configdata信息
①第一組
紅框中是接口的順序。數字越低那么優先權就越高。如果有 [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
如果你的聲卡有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
如果無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
注:以上關聯,是我自行摸索出來的,僅供參考。感謝 @jomggx
提供出的建議,我將相對規范貼出來供參考
1.Mic(Mic at Int)
2.Line In
3.SPDIF In
4.IntSpeaker(Speaker at Int )
5.Headphone(HP Out at Ext Rear )
6.SPDIF Out
7.Ext Mic(Mic at Ext Rear)
8.Line Out
F.屏蔽
(耳機優先級一定要低于內置揚聲器,外置麥克風一定要低于內置麥克風,默認開啟的是內置揚聲器和麥克風,第四組數據把耳機設置為0,既插入檢測。這樣就可以實現自動切換了。)
有興趣的可以查看以下資料
https://www.insanelymac.com/forum/topic/149128-how-to-pinconfig-for-linux-users-%EF%BF%BD-realtek-alc883-example/
http://bbs.pcbeta.com/viewthread-1772989-1-1.html
②第二組
line out設置為f,其余皆為0
③第三組
第三組為接口顏色,這個改不改無所謂,我是默認沒改
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
④第四組
接口為 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
⑤第五組
設定接口功能信息,按照以下進行修改
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
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
⑥第六組
連接裝置類型
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。(這只是描述,對驅動沒有本質影響,我默認沒有修改。)
⑦第七組
0為插入接口的,如外置麥克風、耳機等。
(如果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
⑧第八組
插口所在位置
0 = Rear(后)
1 = Front(前)
8=HDMI
9=ATAPI (內建)
(這只是描述,對驅動沒有本質影響,我默認沒有修改。)
將八組數據修改后進行整理得到configdata值(每個參數中保留一位空格):
codec.txt內搜索EAPD,存在EAPD字樣的接口后加入 0XX70C02(XX為接口名)
01271c50 01271d01 01271ea6 01271f90
01471c10 01471d01 01471e17 01471f90 01470C02
01771c20 01771d10 01771e01 01771f01
01871c60 01871d10 01871ea1 01871f01
01a71c50 01a71d10 01a71e81 01a71f01
01b71c30 01b71d10 01b71e21 01b71f01 01b70C02
01e71c40 01e71d11 01e71e45 01e71f01
六、推導節點及Platforms.xml修改
鏈接:已包含修改好的Platforms.xml以及zlib轉換器
1、推導節點
紅框中為接口節點。
想要實現接口功能需要推導節點,一般為3個節點實現一個接口功能,且節點一般不重復。其中輸入為反向推導,輸出為正向推導,即輸入時接口節點是最后一個節點,輸出時接口節點是第一個節點(codec中的節點值為16進制,Platforms.xml中需要轉換成10進制)
注:部分朋友的揚聲器、mic等只有兩個節點,疑似接口功能被屏蔽,需要在linux下激活接口才能提取到信息。過程復雜,建議詳細查看黑果小兵的聲卡驅動定制教程,本教程已不適用。
①輸入以Mic at int(內置麥克風)為例在codec_dump.txt搜索0x12,
搜索到2個0x12,一個為節點本身即Node 0x12,一個在關聯節點0x22下
然后在codec_dump.txt搜索0x22,搜索到2個0x22,一個為節點本身即Node 0x22,一個在關聯節點0x09下
按照輸入節點反向推導,獲得內置麥克風的節點為:
十六進制:0x09 → 0x22 → 0x12
十進制:9 → 34 → 18
②輸出以Speaker at Int N/A(內置揚聲器)為例在codec_dump.txt搜索0x14,
搜索到4個0x14,首先找到節點本身即Node 0x14
找到connection中有關聯節點0x0c
在codec_dump.txt搜索0x0c,搜索到6個0x0c,首先找到節點本身即Node 0x0c
找到connection中有關聯節點0x02,0x0b,在已選節點不重復的前提下,優先選擇數字小,即0x02節點
按照輸出節點正向推導,獲得內置揚聲器的節點為:
十六進制:0x14 → 0x0c → 0x02
十進制: 20 → 12 → 2
由此推導出所有節點,由于節點很多,可能出現有共同關聯的節點,且沒有其他節點,則更換上個節點,重新推導,直到沒有重復的為止。
2、修改Platforms.xml
根據我的Platforms.xml進行修改即可
PathMap下一共三大項:
0為輸入(第一輸入項,外置mic可以實現自動切換的只需要一個輸入項,無法實現的需要第二輸入項),1為輸出(第一輸出項),2為SPDIF
輸入項分為三大項:
0為內置mic,1為linein,2為外置mic(ALC892外置mic通過linein實現,由此刪除外置mic項)
輸出項分為三大項:
0為耳機,1為內置揚聲器,2位lineout
以內置mic為例:內置mic底層三項代表三個節點,將之前推導的三個節點按順序輸入到NodeID中,在內置mic節點添加boost項(設置電平增效數值為1、2、3,數值3最大),設置為3,可以減少mic雜音的情況(外置mic和linein的節點也可以添加boost項)
部分機器會出現插入外置mic不識別的情況,其實只是外置mic無法自動切換導致無法顯示出來,需要調整將節點到第二類輸入項中來實現手動切換,如圖
以此類推,所有節點修改完畢后,在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,也可統一為其他數字)
2、Applealc-master——resources——pinconfigs.kext——contents中的info.Plist
集合了所有聲卡的信息,我們只用保留需要的,為防止沖突,只修改第一項,其他都可以刪除。第一項中修改codec為alc892,codecID為283904146,這是0x10ec0892十六進制轉換過來的。在codec_dump開頭中可以找到,macos的計算器有進制轉換功能。configData中修改為自己的configdata即可。LayoutID修改為1(全篇LayoutID所有統一為1,也可統一為其他數字)
3、Applealc-master——resources——alc892中layout1.xml.zlib
描述聲卡型號以及聲卡ID信息
首先向zlib文件轉換為xml文件才可以編輯
LayoutID修改為1(全篇LayoutID所有統一為1,也可統一為其他數字),修改codecID為283904146,這是0x10ec0892十六進制轉換過來的。在codec_dump開頭中可以找到,macos的計算器有進制轉換功能。
pathmapID修改為892。部分聲卡需要刪除lineout項才能驅動,需要自行嘗試。
外置mic需要修改電壓控制值來實現外置mic驅動。
搜索codec中外置mic下的vref值,vref含義為初始電壓基礎上增加的百分比,如圖為vref為50。當vref不為Hiz時,muteGPIO={(vref轉換為16進制)+"0100"+node id}轉換為10進制,codec中vref表示的是十進制,計算時轉為16進制。如:在節點 0x18發現vref_50,50轉換為16進制=32,則muteGPIO=(32010018)轉換為10進制=838926360;如果vref為Hiz,則muteGPIO=0
由于外置mic需要通過linein實現,因此修改linein中的muteGPIO為838926360
最后確認一共需要修改和定制的為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
這四個文件保存好以后,系統升級驅動失效時可獲取最新的AppleALC-master文件重新編譯即可,十分方便。
八、編譯聲卡驅動
下載好最新的AppleALC-master文件,由于10.12.6之后需要lilu.kext才能編譯并驅動聲卡,還需要下載最新的lilu.kext放置在AppleALC-master的根目錄,需要注意的是lilu.kext中必須包含有Resources(部分lilu.kext缺少該文件)
將之前定制好的四個文件,放置在對應的位置,運行AppleALC-master中的AppleALC.xcodeproj
如果出現紅色嘆號報錯,可能出現以下問題:
1、缺少lilu.kext文件或lilu.kext中缺少resources下的文件(查找最新lilu.kext,并確保必須包含有Resources)
2、顯示缺少liluAPI,說明lilu.kext與AppleALC-master版本不對應,在下載時確保最新或者版本說明中相互對應,確保相互兼容。
九、實現聲卡驅動
將做好驅動和對應版本的lilu.kext放到EFI—>CLOVER—>kexts—>10.13文件夾中。
然后在config.plist中加入以下代碼:
<dict>
<key>Audio</key>
<dict>
<key>Inject</key>
<string>1</string>
</dict>
在10.15系統升級后,部分朋友因為ALC聲卡驅動造成睡眠自動重啟,可以打入kexttopatch補丁
Find: 63 6F 6D 2E 61 70 70 6C 65 00 5F 5F 6B 65 72 6E 65 6C 5F 5F 00
Replace: 6E 6F 74 2E 61 70 70 6C 65 00 5F 5F 6B 65 72 6E 65 6C 5F 5F 00
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"http://修改為自己的聲卡型號
},
"PinConfigurations",
Buffer (Zero) {}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0) }
十、總結
以這種仿冒方式定制的聲卡,對于筆記本十分友好,同時也能很好的解決喚醒無聲以及雜音問題。以上教程是通過學習遠景貼并總結個人經驗寫成的,我個人定制聲卡驅動后沒有出現喚醒無聲以及雜音等問題,如果由以上問題沒有解決的,可以參考一下帖子。這里附上原貼,以及我個人的帖子
作者:13469977015002 傻瓜式仿冒聲卡驅動第二季(仿冒ALC892)
(適用于10.12和13)ALC892的經驗之談,簡化大神教程幫助喜歡動手仿冒的朋友
部分不適用于該教程的聲卡可以根據黑果小兵的教程進行嘗試,祝Good Lock。
黑果小兵:使用AppleALC聲卡仿冒驅動AppleHDA的正確姿勢