选择
OpenWRT在最近的时期分裂出了LEDE出来,因此这就涉及到了这两个的选择。
前段时间,编译过LEDE用于树莓派3,于是想着直接使用以前的LEDE,这样子省去了下载,毕竟在国内下载很多source code可能需要很长的时间,如果没有proxy的话。于是想着省些事情就用起来了以前的LEDE来编译,但是编译过程中出现了很多错误, 因此最终我决定切回到OpenWRT,并且使用master上面新的代码来移植编译。
代码仓库: https://github.com/tonyho/OpenWRT_iMX6UL
OpenWRT配置
本身LEDE与OpenWRT里面已经有一个imx6 Cortex-A9的arch支持,因此直接选择这个为base来做Porting与Compile较为合适。配置如下:
Compile Tuning
因为imx6ul是Cortex-A7,所以我们需要更改一下
选择好Target之后,我们需要做移植工作。
Target移植
内核移植
移植需要将内核更改一把,这个位于:
$ ls target/linux/imx6/
base-files config-3.14 config-4.4 files-4.4 image Makefile patches-4.4 profiles
其中config-XX是内核的.config文件,注意不要有modules,全部用builtin,否则将会出错。
然后patches-XX是对应内核的patches,我们不需要这些东西,所以不需要。
内核位置的指定
然后直接编译make即可。
编译的错误
1. DEPEND的问题
如果使用Prebuilt的toolchain可能会出现下面这个问题:
Package libnl-tiny is missing dependencies for the following libraries:
libc.so.6
那么就需要将libc.so添加到DEPENDS变量中。
2. 内核编译错误
内核比较老,但是GCC版本较高,会出现下面这个错误:
init/do_mounts_rd.o: In function `nop_flush_icache_all':
do_mounts_rd.c:(.text+0x0): multiple definition of `nop_flush_icache_all'
init/do_mounts.o:/ExtDisk/Projects/iMX6UL_OpenWRT/BSP_EVB/linux_3.14/init/do_mounts.c:610: first defined here
init/do_mounts_rd.o: In function `nop_flush_kern_cache_all':
do_mounts_rd.c:(.text+0x4): multiple definition of `nop_flush_kern_cache_all'
init/do_mounts.o:/ExtDisk/Projects/iMX6UL_OpenWRT/BSP_EVB/linux_3.14/init/do_mounts.c:610: first defined here
init/do_mounts_rd.o: In function `nop_flush_kern_cache_louis':
要解决这个问题,需要在内核的CFLAG中添加
-fgnu89-inline
这个问题可以参考:
http://unix.stackexchange.com/questions/250804/error-while-building-linux-kernel-for-versatile-board
3.内核编译的错误2
ERROR: module '/openwrt/build_dir/target-arm_cortex-a9+neon_musl-1.1.16_eabi/linux-imx6/linux-3.14/drivers/usb/gadget/udc/udc-core.ko' is missing.
出现问题是因为我们没有正确的配置kernel module对应的item,但是因为我们暂时不需要,所以直接将其干掉即可:
4. 并发编译出错
一般都是因为make的时候指定-jN的N过大导致。