Yosemite自带驱动不支持HD4400/HD4600 Mobile,但是支持HD4400/HD4600 Desktop。在Yosemite刚发布时,黑客们就找到了显卡注入加驱动补丁的方式让Yosemite识别HD4400/HD4600 Mobile,具体步骤这里就不赘述了。但是,这种方式是有副作用的,虽然没有人能够说清楚,但是,在我的环境中有两个明显的问题:

  • 蓝牙鼠标系统偏好设置界面崩溃
  • 部分和视频相关的应用程序崩溃,例如:搜狐影音。

好消息是,现有已经有其它方案可以解决此问题了,新方案无需对二进制驱动文件打补丁,其好处显而易见,一是系统更加稳定(以上我遇到的问题已解决),二是操作系统升级时无需重新给驱动打补丁。

本方案其原理是在设备与驱动中间层拦截替换PCIID,从而达到骗过系统的目的。如果对其原理有兴趣,不妨阅读项目源码:OS-X-Fake-PCI-ID

言归正传,具体步骤如下:

显卡注入

Clover

<key>Devices</key>
<dict>
 <key>FakeID</key>
 <dict>
   <key>IntelGFX</key>
   <string>0x04128086</string>
...
<key>Graphics</key>
<dict>
  <key>Inject</key>
  <dict>
   <key>Intel</key>
   <true/>
  </dict>
  <key>ig-platform-id</key>
  <string>0x0a260006</string>

我个人推荐使用Clover注入方式,当然,如果你没有使用Clover或不喜欢Clover注入方式,也可以选择DSDT/SSDT补丁方式实现,补丁如下:

into method label _DSM parent_adr 0x00020000 remove_entry;
into device name_adr 0x00020000 insert
begin
Method (_DSM, 4, NotSerialized)n
{n
    If (LEqual (Arg2, Zero)) { Return (Buffer() { 0x03 } ) }n
    Return (Package()n
    {n
        "device-id", Buffer() { 0x12, 0x04, 0x00, 0x00 },n
        "AAPL,ig-platform-id", Buffer() { 0x06, 0x00, 0x26, 0x0a },n
        "hda-gfx", Buffer() { "onboard-1" },n
        "model", Buffer() { "Intel HD 4600" },n
    })n
}n
end;

安装驱动

驱动包下载:OS-X-Fake-PCI-ID

将以上的zip包解压后,可以看到如下文件(根据需要选择Debug版或Release版):

  • FakePCIID.kext
  • FakePCIID_AR9280_as_AR946x.kext
  • FakePCIID_BCM94352Z_as_BCM94360CS2.kext
  • FakePCIID_HD4600_HD4400.kext
  • FakePCIID_Intel_HDMI_Audio.kext

FakePCIID.kext为必装,其它的驱动根据自己的硬件情况选装,本例中我们选择:FakePCIID_HD4600_HD4400.kext

重构缓存,重新启动系统,大功告成!

如果你使用外接蓝牙适配器,多数情况不会完美,例如:无法控制蓝牙设备的’打开/关闭’。毕竟我们不能保证我们使用的蓝牙适配器型号与白苹果完全一样,对于此类问题,我们可以借助苹果驱动的注入技术来解决。

这里先解释下什么是驱动注入。简单来讲,就是有些硬件设备虽然供应商或产品型号不同,但是其芯片与驱动却是相同的。也就是说,在很多情况下,苹果自带的驱动其实是可用的,只是苹果没考虑到众多的外接设备(毕竟人家不会支持黑苹果),因此,其并没有将各种设备的信息(例如:供应商ID与产品ID)写入驱动,从而造成由于驱动不能正确加载而带来的各种问题。由此可见,既然驱动可用,只是供应商ID与产品ID对不上,我们就可以写一个驱动,这个驱动只有一个Info.plist描述文件,此文件中加入我们设备的供应商ID与产品ID,同时,指明此设备所需要使用的驱动类文件(至于其具体的原因与原理,由于相对复杂,这里不赘述,其后博文详叙),这样就可以正确加载硬件设备驱动了。这种技术我们叫作驱动注入(Injector),那么如何实现呢?

获取设备信息

点击左上角的苹果图标,选择『关于本机』->『系统报告』,从左侧栏选择『蓝牙』,以我自己的环境为例,如图:

蓝牙

这里我们可以看到,供应商ID为0x0A12(十进制2578),产品ID为0x0001(十进制1)。

制作驱动

我们可以借助以下命令生成驱动文件:

mkdir ~/Desktop/YekkiBluetoothInjector.kext
mkdir ~/Desktop/YekkiBluetoothInjector.kext/Contents
cp /System/Library/Extensions/IOBluetoothFamily.kext/Contents/PlugIns/BroadcomBluetoothHostControllerUSBTransport.kext/Contents/Info.plist ~/Desktop/YekkiBluetoothInjector.kext/Contents/Info.plist
​

找到生成驱动中的Info.plist,在IOKitPersonalities下面添加如下代码(注意:填入上面得到的供应商ID与产品ID):

<key>Yekki Bluetooth 2.0 USB Dongle</key>
<dict>
	<key>CFBundleIdentifier</key>
	<string>com.apple.iokit.BroadcomBluetoothHostControllerUSBTransport</string>
	<key>IOClass</key>
	<string>BroadcomBluetoothHostControllerUSBTransport</string>
	<key>IOProviderClass</key>
	<string>IOUSBDevice</string>
	<key>idProduct</key>
	<integer>1</integer>
	<key>idVendor</key>
	<integer>2578</integer>
</dict>

安装驱动

根据个人喜好选择驱动安装方式,我个人喜欢使用Kext Wizard,这里不详述。记得安装完成后重新启动使其生效。