积分 124 最后登录 2017-8-1 精华 1 阅读权限 0 主题 8 UID 381962 帖子 222 PB币 1312 威望 5 贡献 3 技术 30 活跃 2
折腾一族
UID 381962 帖子 222 PB币 1312 贡献 3 技术 30 活跃 2
沙发
发表于 2009-11-3 14:14:07
IP属地湖南
本帖最后由 mudzone 于 2009-11-8 11:33 编辑
三、修改AppleHDAHardwareConfigDriver.kext中的info.plist
如果你按一楼的方法取得了所有需要的基本数据,那么接下来就是开始编辑info.plist了。这里有两个方向,一个是制作仿冒驱动,一个是在原版驱动上修改。实际上这两个方向大同小异,因为要修改的地方都是相同的,只要知道了基本的原理,朝哪个方向走都是一样的。这里就以在原版基础上修改为例,最后在介绍如果做仿冒驱动。
AppleHDAHardwareConfigDriver.kext只有在snow leopard中才有,在leopard中是修改AppleHDAController.kext。修改它的主要目的就是让驱动认识声卡。
1、这里要说明的是修改用的工具,建议使用PlistEdit Pro,因为带有复制剪切等功能,方便编辑。
2、首先复制一份原版的applehda.kext,放在桌面上,右键显示包内容,进入contents文件夹,再进入pluglns文件夹,然后再右键AppleHDAHardwareConfigDriver.kext显示包内容,然后进入contents,打开里面的info.plist,这就是我们要修改的地方。我们要修改的位置在root-》IOKitPersonalities-》HDA Hardware Config Resource-》HDAConfigDefault里面,在原版的AppleHDAHardwareConfigDriver.kext里面一共有0-17共18个dictionary,我们要找一个和自己的声卡最接近的,你只能一个一个的打开看看了,举例子,我的声卡是alc888,最接近的就是在第11个,也就是名称是10的dectionary,展开可以看到codecID是283904133,这是10进制的,转化为16进制就是0x10EC0885,代表了alc885的声卡,那我就要在这个基础上修改了,其他的你可以删掉,只留下这个就行了,当然你也可不删掉其他的。
3、这里面一共有四个子项,分别是codecID、configData、funGroup、LayoutID。
曾近折腾仿冒驱动的人看到这里就会觉得眼熟了,尤其是那个LayoutID,我们在修改dsdt的时候总是听到高手们说layoutid一定要是什么什么的,其实就是这里决定的,这是12,其实你自己完全可以定义,只要和dsdt统一就可以了,这里我就不动了。
首先修改codecID。修改为自己的声卡的codecID,可以在codec_dump.txt找到,打开codec_dump.txt其中的Vendor Id就是codecID,我的是0x10ec0888,用mac自带的计算器转换为10进制就是283904136,用它替换原来的283904133就可以了。
然后我们再来修改configData。这时我们之前得到的configdata就有用了,把他直接粘贴过来就行了。这里要注意的是configdata的格式,要像下面这样01271c40 01271d00 01271ea3 01271f90 01471c10 01471d00 01471e13 01471f90 01571c50 01571d10 01571e21 01571f01 01871c30 01871d90 01871ea1 01871f01 01a71c60 01a71d30 01a71e81 01a71f01 01d71c20 01d71d80 01d71e16 01d71f40 01e71c70 01e71d10 01e71e45 01e71f01 复制代码 中间没有回车,只是每组数据之间用空格隔开。有的教程里面在configdata数据的开始和末尾还加入了“<”和“>”,这个只是因为编辑工具的不同,如果你用property list edit的话就要加入大于号和小于号,我现在用plistedit pro,就不用加了,加了反而会提示出错。
好了,我们就只修改这两个地方就完成了工作,其他的两个子项就让他们留在那里吧,除非你想改变layoutid值。保存吧!!!!
看看我们修改后的效果?别急,我们要先使用dsdt。关于dsdt的修改和编译网上有很多贴子介绍了,虽然不全面,但是已经够我们用了,这里我们就不详细介绍了。
打开dsdt文件,首先添加一个基本函数DTGP,你可以添加到整个dsdt的第一个“{”的后面,Method (DTGP, 5, NotSerialized)
{
If (LEqual (Arg0, Buffer (0x10)
{
/* 0000 */ 0xC6, 0xB7, 0xB5, 0xA0, 0x18, 0x13, 0x1C, 0x44,
/* 0008 */ 0xB0, 0xC9, 0xFE, 0x69, 0x5E, 0xAF, 0x94, 0x9B
}))
{
If (LEqual (Arg1, One))
{
If (LEqual (Arg2, Zero))
{
Store (Buffer (One)
{
0x03
}, Arg4)
Return (One)
}
If (LEqual (Arg2, One))
{
Return (One)
}
}
}
Store (Buffer (One)
{
0x00
}, Arg4)
Return (Zero)
} 复制代码 查找device(HDEF),如果没有,查找device(AZAL)然后把AZAL改为HDEF就行了。然后在device(HDEF)里面加入如下代码: Method (_DSM, 4, NotSerialized)
{
Store (Package (0x08)
{
"codec-id",
Buffer (0x04)
{
0x88, 0x08, 0xec, 0x10
},
"layout-id",
Buffer (0x04)
{
0x0C, 0x00, 0x00, 0x00
},
"device-type",
Buffer (0x29)
{
"Realtek ALC888/1200 @ Intel 82801IB ICH9"
},
"PinConfigurations",
Buffer (Zero) {}
}, Local0)
DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
Return (Local0)
} 复制代码 这里要注意的是codec-id就是我们在codec_dump.txt中看到的0x10EC0888,只是写法不同。layout-id就是我们之前的“12”,这里是16进制表示方法。如果你在AppleHDAHardwareConfigDriver的info.plist中改为其他的值了,这里就一定要改成一样的。device-type中可以修改为任何你想改的英文字符串,修改完记得要计算那个Buffer后的数值,可以用这个方法来取得:
双引号内的所有字符数量+空格数量+1,比如说"Realtek ALC888/1200 @ Intel 82801IB ICH9"字符加空格一起是40个,然后加1,就是41,转换为16进制就是0x29。你依葫芦画瓢就是了。至于那个pinconfigurations,就是像上边那样把,驱动会自动把它填满的。
好了,编译,把编译的dsdt.aml文件放入c:/Drawin里面(我是用bootthink做的引导),把刚刚才修改的applehda.kext用kexthelper安装到系统里面。重启,你就可以在系统概述-》音频里面看到你的声卡信息了,怎么样,是不是把你的声卡表示的很准确啊,而不是用别人的仿冒驱动时里面描述的很多插口都没有啊。
这立面的音频ID就是你的layoutID了
我们做了这么多的工作,很辛苦,但这些也仅仅是铺垫,真正的关键还在后面。
未完待续。。。。。。
展开阅读全文​