EI Capitan 引入了依据SMBIOS信息限制USB端口的新机制,如果在不借助GenericUSBXHCI的前题下原来正常工作的USB端口在升级到10.11后不工作了,多半是由于此机制作怪。

加载USB Kexts

USB 2.0

/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBEHCIPCI.kext/Contents/Info.plist

EHCI Info

  • IONameMatch:用于匹配USB设备名,一般为EHC1 & EHC2。
  • port-count:最大USB端口地址(此处命名不合理)
  • port:USB端口地址
  • UsbConnector:接口类型(0:USB2 type-A, 3:USB3 type-A, 255: proprietary)

如上图,对于iMac13,只有一个USB设备(EHC1),此USB设备只有一个USB端口,USB端口地址为1,类型为proprietary。如果DSDT中USB设备与SMBIOS定义的不同,那么USB端口就不会工作了。

USB 2.0 & USB 3.0

/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBXHCIPCI.kext/Contents/Info.plist

AppleUSBXHCIPCI与AppleUSBEHCIPCI略有不同,AppleUSBXHCIPCI主要是依据IOPCIPrimaryMatch,也就是说依据USB 3设备在DSDT中的设备号。

XHCI Info

USB端口限制

USB如果要工作正常,要满足:

  • DSDT中USB设备名要与SMBIOS类型定义相同
  • DSDT中USB端口数量小于等于SMBIOS中定义的端口数
  • DSDT中USB端口地址与SMBIOS中定义的端口地址相同

注:对于USB 3.0设备,如果DSDT中的名子不是XHC1,那么,缺省就没有USB端口限制,当然,如果工作不正常,这就需要恢复USB端口限制功能,手工添加端口限制。

例如:MacBookPro 9,2 可用USB端口地址为:1, 2, 5, 6:

MacBookPro92

方法一:移除USB端口限制

对于 USB 3.0,你可以移除port-count与ports限制,或者干脆在DSDT中重命名USB设备名为XHC(任意名子,只要不是XHC1)。 一些SMBIOS,例如:iMac14,x 对于USB 2.0并没有端口限制,所以,如果由于USB 2.0端口不正常,可以尝试这些SMBIOS。

Remove Ports

方法二:扩展USB端口限制

  • 对于 USB 2.0,在DSDT中重命名USB设备名为EHC1/EHC2,或者直接改IONameMatch
  • 对于 USB 3.0, 在DSDT中重命名USB设备名为XHC1,或者更改IONameMatch

例如:下面DSDT中XHC1端口地址为:1, 2, 3, 4

XHC DSDT

然而,SMBIOS MacBookPro9,2 定义的端口地址为:1, 2, 5, 6

MacBookPro92

所以,需要手工添加端口地址:3, 4

Add Port

注:USB端口总数不能超过15个

注入 USB Kexts

为了避免升级造成的麻烦,我们可以使用驱动注入的方式实现USB修复。 如果是EHCI,在DSDT中重命名EHC1/EHC2,例如:EH01/EH02,这样原生的Apple kexts中的端口限制就失效了,然后编写一个injector kext为EH01/EH02添加USB端口信息。

对于XHCI,同样修改DSDT中的设备名XHC1,例如:XHC,然后然后编写一个injector kext为EH01/EH02添加USB端口信息。

下载:Info.plist

我试用的是最新的 0.135版

下载地址:MAME OS X

我的操作系统是 OSX EI Capitan 10.11.3 BETA,在运行游戏时出现黑屏的问题,经过查资料,解决方法如下:

打开Preferences,选择Video,Rendering Options -> Render frames using:选择[OpenGL] 设置

显示游戏界面后,要先设置游戏手柄的设置,点击游戏屏幕,点击:Tab键,进入设置界面,根据菜单设置即可!

分享一下我最喜欢的游戏:Tokio

有个Bash Shell脚本在Linux环境下运行正常,但是在OSX上运行报错。通过分析报错信息,发现问题是由于xargs命令在不同的平台上表现不同造成的。如果不想在OSX平台上修改脚本的情况下正常运行,就必须在脚本中调用Linux版本的xargs,那么如何在OSX运行Linux版本命令并且不与OSX相同的命令发生冲宊呢?经过研究,解决方法如下:

# Install GNU core utilities (those that come with OS X are outdated)
brew install coreutils

# Install GNU `find`, `locate`, `updatedb`, and `xargs`, g-prefixed
brew install findutils

# Install Bash 4
brew install bash

# Install gnu-tar, g-prefixed
brew install gnu-tar

# Install pcregrep. Learn it, live it, love it.
brew install pcre

安装完成后,OSX上就具有了Linux版本的相关命令了,不同的是,要运行Linux版本的命令就需要在命令前多加一个字母’g’,例如:gxargs。

接下来,如果想让脚本在Linux与OSX下都能正常运行,只需如下修改:

XARGS=xargs

if [[ $OSTYPE == "darwin"* ]]; then XARGS=gxargs;fi

最近忙着挣钱儿,没时间更新博客,兴趣重要,但是,给女儿挣奶粉钱更重要啊!

言归正传,苹果推送了固件更新补丁,对于我的黑苹果,当然是没有这个所谓的固件了,因此,就算是安装了这个更新,还是会在系统中显示有1个可用更新,我是个完美主义者,怎么能允许这种情况发生呢,今天无意间找到了解决办法,只需打开终端输入如下命令:

sudo softwareupdate --ignore MacBookProEFIUpdate2.7

妥了!

最近研究golang,而golang的调试功能要借助gdb,这个东东在golang的安装包中是没有的,需要自己搞定。过程如下:

安装GDB

最简单的方法就是借助brew,执行以下命令:

$ brew tap homebrew/dupes
$ brew install gdb

为GDB创建自签名证书

打开应用『钥匙访问』,从菜单上依次点击:『钥匙串访问』->『证书助理』->『创建证书』,

创建证书 注:证书类型选择『代码签名』和『让我覆盖这些默认值』

更改有效期 注:更改完『有效期』后,一直点『继续』直到点到『指定用于该证书的位置』这一页,如下图:

选择证书存放位置

主板 注:在『系统』中找到已创建的证书,右键点击『选择简介』

主板 注:在『信任』中将『代码签名』选择为『始终信任』

签名GDB

$ ps -e|grep taskgated
   78 ??         0:02.23 /usr/libexec/taskgated -s
 6699 ttys000    0:00.00 grep taskgated
$ sudo kill -9 78

$ codesign -s gdb-cert $(which gdb)

完成!我已在LiteIDE中测试通过!