荔枝派开发环境搭建过程
一、前言
笔者最近为了熟悉 neon
以及 arm汇编
这些指令集,打算搭建一个在下 arm
下的开发环境,但考虑使用qemu
始终不如真实环境好用,机缘巧合之下发现有一个尘封已久的荔枝派,那么打算用荔枝派开发板做来作为实验环境,顺便为后面玩玩驱动做准备。
事前准备如下:
- 虚拟机:ubuntu18.04()
- 开发板:荔枝派zero
二、搭建过程
2.1 安装编译工具链
从下面的链接中下载交叉编译链,笔者使用的是7.4.1版本
https://releases.linaro.org/components/toolchain/binaries/latest/arm-linux-gnueabihf/
安装工具链的过程相对简单,笔者不多赘述,其工作主要是下载、解压、设置环境变量
2.2 uboot
- 荔枝派的uboot可以直接从网址中使用
git
拷贝下来,建议参考荔枝派的wiki
来进行
- 使用下面的指令将 uboot 拷贝到本地
git clone https://github.com/Lichee-Pi/u-boot.git -b v3s-current
- 然后进入目录使用下面指令来编译uboot
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LicheePi_Zero_defconfig#默认配置
make ARCH=arm menuconfig#进入配置菜单,如果没有额外需求可以不使用该命令
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12#生成uboot-with-spl.bin
如果没有意外,应当此时可以生成一个uboot-with-spl.bin
2.2 linux
为了能够使用网卡驱动进行网络通信,笔者选择了4.14-y的版本,该版本支持网卡驱动
- 从github上 https://github.com/Lichee-Pi/linux.git 下载linux
git clone https://github.com/Lichee-Pi/linux.git -b zero-4.14.y
- 进入目录并配置编译选项
make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm licheepi_zero_defconfig
- 为linux配置网卡驱动
使用 make ARCH=arm menuconfig
然后进入以下目录,就可以看到全志的网卡GMAC
使能选项了,将其选上
->Device Drivers
->Network device support
->Ethernet driver support
->STMicroelectronics devices
->STMicroelectronics 10/100/1000/EQOS Ethernet driver
- 修改设备树,在你使用的设备树下增加下面的代码,笔者使用的是
sun8i-v3s-licheepi-zero.dts
&emac {
phy-handle = <&int_mii_phy>;
phy-mode = "mii";
allwinner,leds-active-low;
status = "okay";
};
- 编译linux内核,一般情况下会生成设备树,如果没有则使用第二条命令
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs#编译设备树
- 编写boot.cmd启动脚本,然后使用工具生成
boot.src
。其中your_dtb
是使用的设备树,笔者使用的是sun8i-v3s-licheepi-zero.dtb
your_ubootpath/tool/mkimage -C none -A arm -T script -d boot.cmd boot.scr
#boot.cmd
setenv bootargs console=tty0 console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 rw
setenv bootm_boot_mode sec
load mmc 0:1 0x41000000 zImage
load mmc 0:1 0x41800000 your_dtb
bootz 0x41000000 - 0x41800000
2.3 文件系统
笔者使用的是 buildroot
来构建文件系统,简单又快捷
- 下载buildroot并解压
wget https://buildroot.org/downloads/buildroot-2017.08.tar.gz
- 为了方便一点,笔者这里使用了荔枝派提供的配置,下载下面的配置并拷贝到buitroot下命名为
.config
https://fdvad021asfd8q.oss-cn-hangzhou.aliyuncs.com/migrate/buildroot.config
- 进入buildroot目录,选择需要的配置,关于buildroot如何配置请自行查阅资料
make menuconfig
配置时需要查看linux的内核版本,可以直接查看linux的Makefile,开头就是。
这里笔者使用了自定义工具链选项
,填入工具链地址(路径到gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabihf
即可,不需要进入bin目录),工具链前缀arm-linux-gnueabihf
,不需要带横杆
CPU内核选择对应的版本, ABI选择编译工具链对应的版本比如, 浮点策略选择VFPv4
- 为了省去不必要的下载操作,使用该版本的buildroot并配置dl包可以省去下载软件的工作,链接如下, 下载解压后放在buildroot下并命名为
dl
编译,直接
make
即可,注意环境变量LD_LIBRARY_PATH
不能被改写。编译时需要等待一段时间,生成的文件在output/images/rootfs.tar
如果发生下面的错误,需要修改ext4文件系统的生成包大小
Could not allocate block in ext2 filesystem while populating file system
2.4 分区烧录
到下面的链接下查看脚本 write_all.sh
即可知道分区烧录的方法
2.5 使用SSH
- 在buildroot中选择下面的选项,生成ssh
System configuration --->
(Aplex) System hostname
(Welcome to Aplex) System banner
[*] Enable root login with password
Target packages --->
Networking applications --->
[*] openssh
- 找到 /etc/inittab 文件,将下面的代码
console::respawn:/sbin/getty -L console 0 vt100 # GENERIC_SERIAL
修改为
console::respawn:-/bin/sh
修改之后需要重启
- 发生下面错误,并一直无法登录
WARNING: Your password has expired. You must change your password now and login again!
使用下面的命令
cat /etc/shadow
如果出现下面的情况则会登录无效
root:$1$m.jegaqA$vA.rBTVryyUAcRvyZ2gOL1:0:0:99999:7:::
telnetd:$1$N4uZUEcU$yotoDExxgGXs6PE7PQuIR1:0:0:99999:7:::
honey:$1$SwtHyL/h$MsEX6Vnqz/qhwDsivDqD20:0:0:99999:7:::
sshd:$1$elylgRon$FOHgkwpPMcNI5s.iL8ZS/.:0:0:99999:7:::
需要手动修改为
root:$1$m.jegaqA$vA.rBTVryyUAcRvyZ2gOL1:15695:5:99999:7:5:20000:
telnetd:$1$N4uZUEcU$yotoDExxgGXs6PE7PQuIR1:15695:5:99999:7:5:20000:
honey:$1$SwtHyL/h$MsEX6Vnqz/qhwDsivDqD20:15695:5:99999:7:5:20000:
sshd:$1$elylgRon$FOHgkwpPMcNI5s.iL8ZS/.:15695:5:99999:7:5:20000:
- 如果SSH无法登录,请尝试修改ip地址
2.6 尝试搭建gef环境
gef是调试工具gdb的增强脚本,笔者尝试在荔枝派上搭建该开发环境,但最后失败了,不过还是记录下这其中的经历,以便各位遇到类似问题的读者可以查询
在buildroot下使用选择python3并编译生成
将buildroot生成的python头文件
pyconfig.h
拷贝编译器的头文件检索路径
编译器头文件检索路径: your_compiler_path/lib/gcc/arm-linux-gnueabihf/7.4.1/include/
头文件路径:buildroot/output/build/python3-3.6.1/pyconfig.h
将libpython3.6m
的动态库和静态库拷贝编译器的库文件检索路径
编译器库文件检索路径: your_compiler_path/lib/gcc/arm-linux-gnueabihf/7.4.1/
路径:buildroot/output/build/python3-3.6.1/libpython3.6m.*
使用下面命令查询编译器头文件和库的搜索路径
echo 'main(){}'|arm-linux-gnueabihf-gcc -E -v -
COMPILER_PATH 表示的头文件检索路径, LIBRARY_PATH表示的是库文件检索路径,这 2 个都是环境变量
下载 gdb 源码,并解压
使用下面命令进行配置,最后的
-with-python=python3
非常重要,gef 是python脚本,需要让gdb支持python
./configure --host=arm-linux-gnueabihf --prefix=your_install_path -with-python=python3
编译gdb,将gdb通过网络文件系统来执行
最后笔者使用gef增强脚本时,python缺少很多库,这里提供pip安装的思路,使用下面的语句下载相关的包
wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-19.6.tar.gz#md5=c607dd118eae682c44ed146367a17e26
wget --no-check-certificate https://pypi.python.org/packages/source/p/pip/pip-8.0.2.tar.gz#md5=3a73c4188f8dbad6a1e6f6d44d117eeb
分别是 setuptools
和pip
,将 2 者通过 nfs 在开发板上访问
- 在开发板上进入这 2 个工具的解压目录,并执行下面的语句
python3 setup.py build
python3 setup.py install
- 修改下面文件
vi /etc/resolv.conf
添加腾讯的dns服务器
nameserver 119.29.29.29
nameserver 182.254.116.116
- 使用date修改系统时间,因为 pip 安装会校验时间
date -s year-month-day
date -s hour:minute:second
- 通过pip3下载相应的包,但这里因为荔枝派的内存太小,pip安装的过程需求的内存太大,无法通过 pip 来安装相应的包,即使使用了选项
--no-cache-dir
也不行。笔者尝试通过手动编译python包,但目前没有找到解决办法,如果有读者知道方法,还请不吝赐教
参考链接
《添加ssh》 https://blog.csdn.net/weixin_30546933/article/details/95322998
《Python交叉编译》https://blog.csdn.net/c1194758555/article/details/73888960
《交叉编译工具链中库和头文件的搜索路径》https://blog.csdn.net/laoyouji/article/details/100112958
《安装pip3》https://www.cnblogs.com/jadexia/p/7797791.html
《荔枝派官方wiki》 zeor.lichee.pro
《荔枝派官方wiki》 nano.lichee.pro