树莓派论坛

 找回密码
 立即注册

PI2编译天猫魔盘驱动,附编译好ko文件

ostrich 发表于 2015-3-13 16:12:17 | 显示全部楼层 |阅读模式
本帖最后由 ostrich 于 2015-3-30 11:01 编辑

rpi-update最新内核更新到3.18.10-v7+,同步更新驱动


为什么选择天猫魔盘而不是其它例如360WIFI,主要原因是因为其性能更好,直接上图,大家先看一下

参数对比

参数对比

天猫魔盘使用的是rtl8192eu的芯片,pi2自带有8192cu的驱动,所以如果要自己想使用天猫魔盘必须得自己编译驱动,一起和同事搞了两三天才弄出来,期间遇到了许多坑。

pi2 2015-02-16img自带的内核是3.18.7-v7+,首先还是先rpi-update升级内核到3.18.9-v7+
  1. rpi-update
复制代码
完成后先重启一下:
  1. rbeoot
复制代码
如果此时uname -r显示为3.18.9-v7+则代表升级成功。

接下来准备编译模块需要的内核树,这里可以用昨天同事已经改好的rpi-source,因为原作者已经说了不更新,不支持pi2二了,所以fork了一个改进版本,这个东西的目的就是根据当前系统版本内核的hash去github下载对应的内核源码
  1. $ wget https://raw.githubusercontent.com/lifanxi/rpi-source/master/rpi-source
  2. && chmod a+x rpi-source
复制代码
这里根据个人的网络情况,时间不等,内核源码包的大小大概在120Mb

准备工作做好了我们就可以进行模块编译了网卡驱动程序源码和编译过程请参照这里:
http://bbs.yunos.com/read/263281710

疑难排解

1. rpi-source报gcc版本不一致
截止2015-03-12,Raspbian最新的内核是用gcc 4.8编译的(可以查看/proc/version确认),而Raspbian中自带的gcc是4.6的,需要升级到4.8。因为4.8的gcc已经backport了,所以可以直接sudo apt-get install gcc-4.8 g++-4.8,然后用update-alternatives设置优先级即可。

2. 如果用rpi-source –skip-gcc忽略gcc版本检查,并强行用4.6的gcc会编译模块怎么样?
我的试验结果是模块可以编译,但在加载模块时会造成kernel oops,然后再用insmod/modprobe/rmmod/lsmod等命令时会挂住,只能重启解决。如果你编的模块是会自动加载的,重启前先把它删掉,不然启动时就会挂住。

3. rpi-source无法正常下载内核代码或Modules.symvers文件
有可能是你的内核版本太老,rpi-source只支持Raspberry Pi 3.10.37以上的内核。对于Raspberry Pi 2,它只支持3.18.6以上的内核。解决办法是先运行sudo rpi-update更新内核和固件,更新后请重启系统,然后再重新运行rpi-source。

4. 编译模块时报找不到arch/armv6l或arch/armv7l目录
尝试在make命令前加ARCH=arm参数,或尝试把/lib/modules/`uname -r`/build/arch中的arm软链为armv6l或armv7l后再编译。

背景知识:

1. Raspbian的内核包
不要按照使用Debian的习惯去找什么linux-image、linux-source之类的包,Raspbian的内核包是raspberrypi-bootloader,里面包含了内核、模块和一些启动文件,但没有Module.symvers和头文件。

2. rpi-update是啥
rpi-update是Raspbian内置的更新内核和相关固件的脚本,它的逻辑是去https://github.com/Hexxeh/rpi-firmware这个仓库下载最新的内核和固件,替换现有的版本。更新完成后会更新/boot/.firmware_revision,记下最新版本对应的Git Hash,以后rpi-update或rpi-source都会根据这个Hash去GitHub找对应文件。

3. Raspberry Pi的官方内核去哪里找
http://github.com/raspberrypi,里面的linux对应内核源代码,firmware是编译好的内核和相关文件。而rpi-update用的https://github.com/Hexxeh/rpi-firmware其实是firmware中部分文件的一个镜像,分出一个镜像仓库可以让rpi-update脚本的实现变得比较简单。

4. rpi-source做了些啥
根据rpi-update记录在/boot/.firmware_revision中的内核版本Git Hash(如果没有用rpi-update更新过内核,就从raspberrypi-bootloaderq包的changlog中解析出Hash),去raspberrypi/linux仓库中获取对应的源代码,把/lib/modules/`uname -r`/build和/lib/modules/`uname -r`/source对应的软链建好,从/proc/config.gz获取当前内核配置,去raspberrypi/firmware仓库中获取对应的Modules.symvers跟内核代码放在一起,然后make modules_prepare准备好编译模块所需要的内核树。

5. 改的rpi-source改了些啥
rpi-source的作者已经宣布不再维护这个脚本,并且这个脚本不支持Raspberry Pi 2,所以同事在GitHub上Fork了一份,做了以下改动:
  • 修改了脚本自动更新URL到同事Fork出来的版本;
  • 检查/proc/cpuinfo,判断当前硬件是Raspberry Pi还是Raspberry Pi 2;
  • 可以通过-b参数强行指定Raspberry Pi的硬件版本;
  • 根据不同的硬件,下载不同版本的Modules.symvers;
  • 如果用参数指定了要求用默认配置来配置内核树,则对不同硬件版本的Raspberry Pi调用不同的命令。


6. Raspberry Pi和Raspberry Pi 2的内核有啥区别
Raspberry Pi 2的SOC是BCM2709,基于ARM 7(armv7l),而一代是BCM2708,ARM 6(armv6l),所以二代的内核中用了一些armv7l中特有特性。目前在打包的时候两个版本内核文件是打包在一起的,只是用后缀7或v7来区别,启动的时候会按实际硬件选择。

7. Module.symvers是干嘛用的?
一句话讲不清,有兴趣请参考。总之,没有Module.symvers或用错了Module.symvers都可能会造成你加载模块时报Exec format error。如果你遇到了这样的情况,请确认rpi-source的执行过程中有没有失败的步骤。armv7l和armv6l版本的内核用的Module.symvers是不通用的,在raspberrypi/firmware中分别命名为Module.symvers和Modules7.symvers,但放到内核树中使用时需要命名为Module.symvers,如果是你自己准备内核树,务必要小心,我自己在这个问题上犯了错误,浪费了很多时间。当然,如果用同事改过的rpi-source,那它已经帮你搞定了这件事。

8. 同事用了rpi-update和rpi-source后编出来的模块还是无法加载。
目前同事用本文描述的方法编译了过天猫魔盘(rtl8192eu)、360随身WiFi 2(mt7601u)这两种无线网卡的驱动,都工作正常。如果你遇到了别的问题,不妨在这里留言,可以一起讨论一下。
另外,终级大法一定是重新完整的编译整个内核,不过如果你想在Raspberry Pi上完成这个工作,那必须等有充分的耐心。所以,最好是在PC上进行交叉编译。

附上编译好的天猫魔盘驱动,由于附件大小限制,发网盘。
3.18.9-v7+的驱动在这里:链接: http://pan.baidu.com/s/1kTKeg3H 密码: miij
3.18.10-v7+的驱动在这里:链接: http://pan.baidu.com/s/1i349EWP 密码: a2bn
关于驱动安装
  1. sudo install -p -m 644 8192eu.ko /lib/modules/3.18.9-v7+/kernel/drivers/net/wireless
  2. sudo depmod -a
  3. sudo insmod /lib/modules/3.18.9-v7+/kernel/drivers/net/wireless/8192eu.ko
复制代码
这个时候lsmod就可以看到列表里面有8192eu这一行了。iwconfig一下就可以看到:
  1. wlan0     IEEE 802.11bgn  ESSID:"WIFI_302"  Nickname:"<WIFI@REALTEK>"
  2.           Mode:Managed  Frequency:2.462 GHz  Access Point: C8:3A:35:4E:66:13   
  3.           Bit Rate:300 Mb/s   Sensitivity:0/0  
  4.           Retry:off   RTS thr:off   Fragment thr:off
  5.           Encryption key:****-****-****-****-****-****-****-****   Security mode:open
  6.           Power Management:off
  7.           Link Quality=73/100  Signal level=100/100  Noise level=0/100
  8.           Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
  9.           Tx excessive retries:0  Invalid misc:0   Missed beacon:0
复制代码
PS:给提成正常用户吧,看贴也太不方便了






树老大 发表于 2015-3-13 18:46:07 | 显示全部楼层
不错,赞一个。已经提升了。
dexlx 发表于 2015-3-17 23:42:26 | 显示全部楼层
赞一个。看的云里雾里。 太深奥了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版 | Archiver | 树莓派论坛 ( 粤ICP备15075382号-1 )