Acer S3和Asus Zenbook在Ubuntu 12.04 / Mint 13下的蓝牙问题的解决

  • 内容
  • 评论
  • 相关

前段时间把家里的Acer S3的原装的Windows 7 Home干掉了,也换成了Linux Mint 13。一切正常,除了蓝牙功能不能用。由于一直忙着工作上的事,最近才有空搞定了这个问题。解决方式参考了linlap网站上教程(原帖地址传送门)。这个教程非常详细地说明了Acer S3上的Ubuntu/Mint和OpenSuSe的安装和优化的方法,但是对于蓝牙的问题只给了几个老鸟帖子的链接,里面是一堆Kernel Patch的代码,不熟悉的人看了会一头雾水,我抽时间把具体方法整理如下:

1、问题说明

我拿到的这个Acer S3的蓝牙模块是高通Atheros AR3012,华硕的Zenbook也是用的这个蓝牙模块。

Linux的内核模块影响这个设备的有两个:ath3k.ko和btusb.ko。

AR3012这个设备是接在USB总线上使用的,由于缺少正确的对应AR3012的USB Host Controller的Device ID,导致原始的内核的btusb.ko和ath3k.ko模块找不到设备,所以这两个模块都要打补丁。

2、打补丁前的准备工作

一般给内核打补丁的方法就是下载linux-source包,改代码,make blah blah blah。原帖也是这样说的,它给了Kernel Patch的代码的传送门,意思就是让大家打这个Patch,然后重新编译改过的内核,最后depmod -a生效改过的这两个内核模块。这个工程是很漫长的,光make就能跑几个小时。这里不推荐为了一个小小的蓝牙模块而去下整个linux-source编译的方法,费时费力。

有一个比较简单的方法:用linuxwireless.org网站上的linux内核无线通讯模块兼容包compat-wireless,这个包包含了几 乎所有原生内核2.6.27版本以后的无线设备的内核模块的代码和优化补丁,以及一堆编译脚本,可以单个设备的编译和安装,非常快速和便捷,推荐用这个 包。

下载地址传送门

推荐下载有snp后缀的那个包,是打过官方优化补丁的版本,没有后缀的包是原生内核的版本,大家酌情下载。

下载完成后,解压随便扔一个地方,进入目录后就要准备修改代码了。

3、改内核模块的代码

在Patch代码前必须要知道你机器上正确的对应AR3012的USB Host Controller的Device ID,否则就算改了也可能没用。具体方法是:

先用Fn+F3激活蓝牙模块(如果没有激活的话),然后用命令

sudo lsusb -v  > lsusb.out 
gedit lsusb.out

搜索单词Bluetooth,应该能找到如下信息(.... 是省略了部分内容):

Bus 001 Device 006: ID 04ca:3004 Lite-On Technology Corp.  
Device Descriptor:
 
....
  
idVendor           0x04ca Lite-On Technology Corp.
  
idProduct          0x3004 
 
....
  
iManufacturer           1 Atheros Communications
  
iProduct                2 Bluetooth USB Host Controller
  
iSerial                 3 Alaska Day 2006

04ca:3004就是我们要的正确的Device ID,这个ID可能不同版本的机器不一样的,所以需要用这个命令看一下。当然也可能都一样,Double-Check一下也没有什么不好,不是么?

进入drivers/bluetooth目录,用你喜欢的编辑器编辑ath3k.c文件,找到这样一行:

Atheros AR3012 with sflash firmware
在它下面加上我们刚刚找到的Device ID,注意最后有个逗号:
{ USB_DEVICE(0x04CA, 0x3004) },

再找到另外的一行:

static struct usb_device_id ath3k_blist_tbl[] = {

在它下面加上同样的Device ID,注意最后有个逗号:

{ USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },

保存ath3k.c文件后退出编辑器,这个模块的补丁打好了。

再打开同一个目录下的btusb.c文件,找到这样一行:

static struct usb_device_id blacklist_table[] = {

在这一行下面加上,注意最后有个逗号:

{ USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },

保存btusb.c文件后退出编辑器,这样两个模块的补丁都打好了。

3、编译和安装

因为这次打补丁只涉及到蓝牙设备,所以知道编译和安装更新后的蓝牙内核模块就可以了。

在解包的目录下执行:

make bt

结束后,如果没报错,继续:

make btinstall

这个脚本就安装了新的内核模块在 /lib/modules/{$uname -r}/updates目录下,这里{$uname -r}指的是正在用内核版本,脚本已经depmod好了,重启就可以正常使用了。

祝大家好运!

 

via/   blog.sina.com.cn/s/blog_692ee43d01013kwr.html