Pine A64 Xenial Mate [20161215] 安装 kernel_headers + USB网卡驱动
起因是高二的时候,看到有100+ RMB的SBC,还能运行Android。
当时父亲还是比较支持我去体验一下新东西的,于是便央求着父亲给我买了一块。
彼时的Pine A64有三个版本,分别是内存512MB,1GB,2GB的。存储空间全部靠外插卡,系统也从此处启动。
当时省钱观念还是比较强的,在考虑用途的同时选择了折中的1GB版。
然后拿它打了半年的废狗,当时用的三棒手机连cpu都没写是哪家的
然而在后来才发现java是个内存怪兽,早知道就直接上2GB的了。
然而,现在2GB的变成了Long Term Supply
版,结构也重新被设计过,内存从DDR3L
换成了LPDDR3
,即低功耗版。
也就是说,现在的2GB的Pine A64已经不能使用以前的镜像了。
不过问题不大,现在看来玩玩GPIO,Python,以及搭建个小服务器什么的,性能还是绰绰有余的。
然后当时为了省钱,做了另一件事情——没有买配套的Wifi+Bluetooth模块。
其结果就是,每当要上网的时候,就要找个有网线的地方(捂脸)。
其实当时手头还是有usb的wifi模块的——万能的RTL88188EU
。
当时也试过在台式机上给这块网卡编译驱动,不过当时什么都不懂,看着教程一路make
,make install
就完事了。
后来才发现在半闭源的Android上编译驱动是件难事,而当时也几乎不懂Linux。
到了大学之后,有了更多的时间来研究这个东西,也学习了更多Linux和硬件相关的知识。
在全球巡回演唱会级别的咕咕之后,终于把这个问题解决。步骤如下:
其之一 获取内核源码
首先uname -a
一下,从里面找出内核版本kernel version
。我的是3.10.104
再到对应的内核仓库repository
去看一下,找到对应的发行版本release
。
仓库地址:https://github.com/longsleep/linux-pine64
点releases去查看所有的发行版本。找到对应的源码source code
包如下:
其中第四组数字为内核的修补号,对内核功能没有什么影响。这里选择最新的3.10.104-2-pine64
版本。
下载后,使用对应的命令解压,应有如下的目录结构:
其之二 编译内核
在此采用~/Desktop/linux-pine64-3.10.104-2-pine64
作为临时目录。
为稳妥起见其实是看不懂参数,获取当前内核的配置文件,作为接下来的配置文件。
cd ~/Desktop/linux-pine64-3.10.104-2-pine64
make mrproper # clean all previously generated file
cp /proc/config.gz .
gunzip config
mv config .config
就在源码的根目录下直接完成了配置。
然后就直接是make
编译生成内核。由于本人在编译gcc时深受-j
,即多线程multithreading
参数的折磨,再加上没贴散热片怕CPU烧掉,这里采用单线程编译。(当然有兴趣的可以试试-j
(自动设置为最大可用线程数)或者-jX
(指定为X线程编译))
放了一晚上(也不知道多久),编译完成。
其之三 安装内核头文件kernel_headers
这个编译镜像的人是真的让人服气,tmd一块开发板,你还把头文件排除在外,搞个红红的软链接soft link
放在镜像里。
结果,凡是想要编译和内核相关模块的全都搞不了,况且这东西还不知道apt上的general版能不能适配。
好在内核的开发者为我们提供了继续开发的希望,将其中一些工序写成了脚本提供出来,其中恰好有我们需要的。
https://github.com/longsleep/build-pine64-image/blob/master/kernel/install_kernel_headers.sh
没错就是上面这个。
我是直接把脚本的部分内容复制出来执行(为了学习理解),有用的部分从27行开始到最后都是。
理论上把28行删掉,就能够直接将脚本在Pine A64上运行,但是我没有测试。(本机编译不需要跨平台)
其实感觉差不多就是直接运行脚本了。。
我的配置如下:
LINUX_ARCH=arm64
CROSS_COMPILE=
DEST=
TARGET=$DEST/usr/src/linux-pine64-3.10.104-2-pine64
完成一系列命令后,kernel_headers
安装完成。
文件目录应当如下:
再在/lib/modules/<kernel-version>
下配置好相关的文件链接:
sudo rm -f build
sudo ln -s /usr/src/linux-pine64-3.10.104-2-pine64 $(pwd)/build
这样系统就能正常调用了。
由于系统自身的架构声明为aarch64
,实际使用的却是arm64
的配置文件,推荐进行以下操作:
sudo ln -s /usr/src/linux-pine64-3.10.104-2-pine64/arch/arm64 \
/usr/src/linux-pine64-3.10.104-2-pine64/arch/aarch64
就可以让某些应用程序编译时获得正确的配置文件。(下文即是其中之一)
其之四 编译网卡驱动
这一部分是写起来最快乐的,因为步骤和一般x86 PC上的没有任何区别。
make all
,sudo make install
,完事!
然后sudo modprobe 8188eu
即可加载驱动。
附注:
-
请务必确保在安装好的头文件目录下有一个
Module.symvers
文件,该文件用于链接符号和对应的操作码。 若是缺少的话,加载驱动会失败,且在dmesg
中会看到如下信息: 其中8188eu模块报出的是没有Module.symvers
文件时的错误,下面的R8188EU是操作正确下发出的信息。Module.symvers
由内核编译时动态生成,这也是前面为什么要编译内核的原因。 - 如果有已经配置好的内核源码的话,可以通过使用
make modules_prepare
进行编译驱动模块的辅助程序配置。 该命令可以解决的问题诸如scripts/basic/fixdep not found
一类的问题。
啊,写到下午一点,差不多写完了,肚子早饿了,吃饭去。