ETRD博客

为联发科Linkit-Smart-7688编译openwrt的方法

引言:

​ 正式接触linux实际上是今年年初,因为有个项目需要将程序运行在嵌入式平台,而在此之前我大学四年及工作两年几乎都游走在基于Cortex-M单片机的周边。在我印象中ARM开发板都是一块很臃肿很庞大的电路板,然而前阵子我偶然找到了联发科联合seed出的一款开源硬件Linkit Smart 7688平台,非常的小巧精致,然而它仍然可以运行一个Linux系统-openwrt。这篇文章给出了详细的为Linkit Smart 7688平台编译openwrt系统的方法,及可能遇到的问题的解决办法。

Linkit Smart 7688 简介

​ Linkit Smart 7688 基于联发科MT7688AN芯片设计,MT7688AN芯片核心为 MIPS24KEc,主频580MHz。Linkit Smart 7688 拥有32MB Flash,128MB DDR2 RAM,这个Flash和RAM的大小使得我们可以做很多普通单片机平台无非完成的工作。它还板载wifi、USB、SD卡接口,使得其可以进行丰富的扩展,它被称为一台可以放进口袋的linux机器。

QQ截图20170511191531

编译openwrt系统的动机

​ 实际上,联发科官方已经提供了一套现成 boot镜像、系统镜像、以及Linux和OS X上使用的交叉编译工具链。因此对于普通的应用来讲,既然已经有了现成的可运行的系统、我们只要通过交叉编译工具开发我们的应用程序就可以了,为什么还需要重新去花大量的时间去重新编译一次系统。我Google了很多linkit Smart 7688的入门资料,我们发现很多朋友一上来就是要重新编译系统,我就非常不能理解。我主张尽量使用现成的东西,因此拿到这款板子之后,我做的第一件事情是烧录官方提供的最新的系统镜像文件让板子运行起来,接着便开始使用交叉编译工具编译我项目的应用程序,我验证发现,这个项目的应用程序经过交叉编译后可以运行在这个板子上。因此我决定将它作为这个项目的一款首选平台,但是它的硬件串口数量似乎太少了,只有3个串口,有一个串口还默认是调试功能,但还好它有USB,完全可以通过CP210x进行串口扩展,然而我发现USB识别不了CP210x USB转串口芯片。实际上linux内核是已经包含了CP210x的驱动的,只是联发科提供的系统没有将其编译进去,因此我需要重新配置系统编译选项,将USB转串口的驱动程序编译到系统中,这是我要为MT7688重新编译openwrt系统的动机。

编译openwrt系统的准备

  • 如果你跟我一样没有太多的Linux的经验和概念,以前从未为嵌入式平台编译过Linux系统,那非常推荐先看一位叫jollen的台湾大神对 Linkit Smart 7688 的30分钟演讲(YouTube 需要科学上网观看),GitHub上有他挂的讲稿资料,他用30分钟的时间精炼的讲解和演示了一遍为7688编译openwrt的过程,虽然只有30分钟,但是值得反复观摩。
  • 准备一台安装了ubuntu的电脑,或者虚拟机,我使用的是ubuntu 14.04 LTS版本。需要用它来编译openwrt系统,它需要连接网络,因为编译过程需要从网络上下载大量的库文件。

编译过程

编译的流程主要参考并综合了联发科官方提供的步骤以及jollen提供的步骤

1、为ubuntu安装需要的包

1
$ sudo apt-get install git g++ make libncurses5-dev subversion libssl-dev gawk libxml-parser-perl unzip wget python xz-utils

2、使用git下载 OpenWrt的源码

1
$ git clone git://git.openwrt.org/15.05/openwrt.git

此时会从网络上下载openwrt的源码并以”openwrt”为文件夹名放在当前目录。

3、进入openwrt文件中,并为feeds准备配置文件

1
2
$ cd openwrt
$ cp feeds.conf.default feeds.conf

4、增加 Linkit Smart 7688 feed

1
$ echo src-git linkit https://github.com/MediaTek-Labs/linkit-smart-7688-feed.git >> feeds.conf

5、更新feed并安装相应的包

1
2
$ ./scripts/feeds update
$ ./scripts/feeds install -a

6、配置openwrt的系统编译选单

1
2
$ make prereq
$ make menuconfig

以下选项必须按照这个来选:

  • Target System: Ralink RT288x/RT3xxx
  • Subtarget: MT7688 based boards
  • Target Profile: LinkIt7688

然后接下来,其它选项就可以根据自己的需要来勾选了,比如需要USB的什么驱动,因为默认情况下只会编译几个常用的驱动,像我需要把自己需要的CP210x 的USB Series 驱动勾选上。

选择好之后保存并退出。

jollen说 make prereq 指令只在openwrt下载后需要做一次即可,以后直接执行 make menuconfig进行系统配置即可。

7、开始下达编译指令

1
$ make V=99

8、成功编译完成以后,生成的系统镜像文件在bin/ramips/目录下:

1
bin/ramips/openwrt-ramips-mt7688-LinkIt7688-squashfs-sysupgrade.bin

可以通过mt7688的web ui进行固件更新,或者将openwrt-ramips-mt7688-LinkIt7688-squashfs-sysupgrade.bin重命名为lks7688.img,然后通过U盘进行固件更新。

错误处理

​ 理想情况下,根据以上步骤就可以为7688编译出系统镜像文件了,但事情总不会那么顺利,会出现一些编译错误,这些错误可能是随着时间的发展,代码的更新而出来的。

  • 错误1:mt_wifi.ko_3.18.45:No Such file or directory

QQ截图20170510221119

MT7688的wifi驱动是由联发科在其GitHub上以编译好的文件形式提供的,并不提供源码,每次openwrt使用不同linux内核版本时,联发科就要相应提供对应内核版本的wifi驱动文件。而我们使用git获取openwrt的源码是最新的openwrt源码,它使用的linux内核版本是Linux-3.18.45。查看联发科GitHub提供的wifi_bin文件,发现最近的更新只到3.18.44这个版本:

QQ截图20170512092310因此,如果使用联发科提供的wifi驱动,只能使用上面对应的内核版本的openwrt代码,最新是3.18.44。查看openwrt的git更新简要日志

QQ截图20170512093743

发现是在2016-12-19这次提交时,内核更新到了3.18.45,因此我们需要将openwrt的源码版本回滚到2016-12-18这次使用3.18.44内核版本的最新提交,点击其commit按钮,查看:

QQ截图20170512094125

使用rsc1975网友提供的方法,可以将openwrt的源码版本回滚到2016-12-18这个版本,命令如下:

1
git checkout c170d84bbe08e0f049c99d3f376aae170a36458e -b pre_3_18_45

这个命令应该在上述步骤中,git 下载完openwrt源码,进入openwrt目录之后立即首先执行。

错误2:linux-3.18.44.tar.xz 源码下载失败

QQ截图20170512095142

原因是内核下载源的问题,下载源在 openwrt/scripts/download.pl 文件中进行配置:

QQ截图20170512095618

linux 内核官网已经发布公告,陆续停止ftp服务,download.pl文件中使用的内核下载源已经在2017年3月1号停止服务了,所以需要更新下载源为https://www.kernel.org/pub/...:

QQ截图20170512095658

错误3:还有一些软件包无法下载

QQ截图20170512101212

处理方法是找到正确的下载源,直接使用wget命令手动下载到openwrt/dl目录中:

例如上面报错的confuse-2.7.tar.gz手动下载方法:

1
wget http://pkgs.fedoraproject.org/repo/pkgs/libconfuse/confuse-2.7.tar.gz/45932fdeeccbb9ef4228f1c1a25e9c8f/confuse-2.7.tar.gz -O dl/confuse-2.7.tar.gz

我还报错了一个avrdude-6.1.tar.gz的包无法下载

1
wget http://mirror.lihnidos.org/GNU/savannah/avrdude/avrdude-6.1.tar.gz -O dl/avrdude-6.1.tar.gz

其它无法下载的包,下载源可以从Google上搜,les1ie网站的博主在无涯7688系统交叉编译过程这篇笔记中也提供了一些下载源,至少我上面不能下载的两个包在他提供的源里有,这里引用列出供参考:

1
2
3
4
5
https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.44.tar.xz
https://download.samba.org/pub/samba/stable/samba-3.6.25.tar.gz
http://pkgs.fedoraproject.org/repo/pkgs/libconfuse/confuse-2.7.tar.gz/45932fdeeccbb9ef4228f1c1a25e9c8f/confuse-2.7.tar.gz
https://www.kernel.org/pub/software/scm/git/git-2.3.5.tar.xz
http://mirror.lihnidos.org/GNU/savannah/avrdude/avrdude-6.1.tar.gz

重新整理编译过程

​ 上文中都是按照官方步骤,然后以发现问题,解决问题重新返回的顺序编写的,这里重新梳理一遍在已知问题情况下进行正确编译的流程:

1、为ubuntu安装必要的包

1
$ sudo apt-get install git g++ make libncurses5-dev subversion libssl-dev gawk libxml-parser-perl unzip wget python xz-utils

2、下载openwrt源码

1
$ git clone git://git.openwrt.org/15.05/openwrt.git

3、进入openwrt目录,回滚openwrt源码版本到使用3.18.44内核的旧版本

1
2
$ cd openwrt
$ git checkout c170d84bbe08e0f049c99d3f376aae170a36458e -b pre_3_18_45

4、为feed准备文件,增加 LinkIt Smart 7688 feed

1
2
$ cp feeds.conf.default feeds.conf
$ echo src-git linkit https://github.com/MediaTek-Labs/linkit-smart-7688-feed.git >> feeds.conf

5、更新feed并安装相应的包

1
2
$ ./scripts/feeds update
$ ./scripts/feeds install -a

6、配置openwrt的系统编译选单

1
2
$ make prereq
$ make menuconfig

7、修改kernel的下载源

1
2
$ cd scripts/
$ gedit download.pl

安装上面错误2处理方法中的进行修改。

8、下达编译指令

1
$ make V=99

编译过程中遇到无法下载的包报错,Google到下载源以后手动使用wget命令下载到/dl文件夹中,然后继续执行编译指令。

参考文献:

https://labs.mediatek.com/en/platform/linkit-smart-7688

https://docs.labs.mediatek.com/resource/linkit-smart-7688/en/downloads

https://www.youtube.com/watch?v=ywM_bPE7GDk&t=1377s

https://github.com/jollen/7688-embedded-linux

https://github.com/MediaTek-Labs/linkit-smart-7688-feed

https://github.com/jollen/blog/issues/3

https://git.openwrt.org/?p=15.05/openwrt.git;a=summary

https://github.com/MediaTek-Labs/linkit-smart-7688-feed/issues/37

https://github.com/openwrt/openwrt/issues/263

http://les1ie.com/2017/04/07/MT-7688%E7%B3%BB%E7%BB%9F%E7%BC%96%E8%AF%91%E8%BF%87%E7%A8%8B/