2. 开发环境搭建

本章的主要目的是搭建驱动章节所需的开发环境。下方为笔者的开发环境示意图。

1
2
3
4
 编程环境                 编译环境                    运行环境
  PC(i5)       SSH       服务器(E5)       NFS       鲁班猫板卡
Windows10  ──────────   Ubuntu20.04   ──────────   Ubuntu22.04
 VSCode

首先我们要明白程序最终是运行在板卡上,编译环境不一定是板卡,这就涉及了编译结果的 文件传输;板卡运行环境为arm64架构,而编译环境一般不是这架构,这就涉及了 交叉编译环境搭建;笔者使用的环境是PC,而服务器不在身边(通常也没人会把服务器放身边),这就需要 远程便携开发。后面将详细讲解这些环境的搭建。

如果您没有服务器,也没关系,可以用VMWare或者VirtualBox搭建个Ubuntu20.04虚拟机,也可以直接装双系统。这部分内容这里就不详细介绍了。

下面是用户普遍会用到的开发环境示意图。

1
2
3
4
 编程环境               编程/编译环境                 运行环境
   PC                     虚拟机         NFS        鲁班猫板卡
Windows10  ──────────   Ubuntu20.04   ──────────   Ubuntu22.04
 VSCode                   VSCode

其中多数人可能会选择在虚拟机进行编程和编译,这也是可以的。

2.1. 搭建文件传输环境

关于文件传输,可以参考《[野火]LubanCat-H618系列板卡快速使用手册》中的 《文件传输与NFS网络文件系统》 章节。

在Linux驱动开发过程中,推荐使用NFS共享目录,在局域网内,某些小伙伴也需要编译出来的结果,也可以使用SCP传输。关于NFS共享目录可以查看 《NFS搭建》 内容。

具体操作如下:

2.1.1. 鲁班猫服务端操作

#安装NFS服务端
sudo apt install -y nfs-kernel-server
#配置/etc/exports,添加共享的目录
sudo vim /etc/exports
#在文件最后一行添加需要共享的目录
/home/cat *(rw,sync,no_root_squash,no_subtree_check)

#重启NFS服务
#重新加载/etc/exports
sudo /etc/init.d/nfs-kernel-server reload
#重启nfs服务
sudo /etc/init.d/nfs-kernel-server restart
#查看挂载点
showmount -e
../../../_images/NFS-lubancat.png

2.1.2. 服务器端操作

如果你的环境是Ubuntu虚拟机/物理机,也可能跟着操作。

#安装NFS客户端
sudo apt install -y nfs-common
#查看鲁班猫共享的目录,IP为鲁班猫板卡IP
showmount -e 192.168.103.120
#使用mount命令挂载鲁班猫共享目录到服务器/mnt目录下
sudo mount -t nfs 192.168.103.120:/home/cat /mnt

#如果不需要挂载,可以运行下面命令取消挂载
sudo umount /mnt

2.2. 搭建编译环境

下面的操作需要在编译的主机上进行,笔者的是在服务器上操作。

安装相关库和工具,执行以下命令:

sudo apt update
sudo apt install gcc make  git  bc libssl-dev liblz4-tool device-tree-compiler bison flex u-boot-tools gcc-aarch64-linux-gnu

#查看aarch64-linux-gnu-gcc版本
aarch64-linux-gnu-gcc -v

注意

aarch64-linux-gnu-gcc版本不能太高,太高可能会导致后续编译内核时报错。

2.2.1. 交叉编译器工具包

交叉编译器是后续编译内核时会用到的工具,该工具的选择会直接影响内核编译的结果。虽然上述已经 apt install gcc-aarch64-linux-gnu 了,但不确定安装的gcc-aarch64-linux-gnu交叉编译器会不会因为版本太高等问题导致内核编译失败。

2.2.2. 野火官方推荐的编译器

野火官方推荐的是gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu版本的编译工具链。

mkdir gcc-linaro && cd gcc-linaro
#获取编译工具链
git clone https://github.com/LubanCat/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.git

#修改~/.bashrc文件,永久保存环境变量
vim ~/.bashrc
#将下面的环境变量放在文件末尾,需要根据实际指定编译工具链的绝对路径
export PATH=/root/gcc-linaro/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin:$PATH
#重新加载配置
source ~/.bashrc

#查看编译工具链,如果COLLECT_LTO_WRAPPER变量为指定的路径,即配置成功
aarch64-linux-gnu-gcc -v
../../../_images/aarch64-gcc-6-install.png

2.2.3. 其他版本编译器

不同版本的交叉编译的工具包,可从官网下载: https://releases.linaro.org/components/toolchain/binaries/

下面以gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz为例。

../../../_images/aarch64-gcc-7.png
#进入创建了的gcc-linaro文件夹
cd ~/gcc-linaro/
#将复制的链接拷贝到wget之后。
wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
#解压你下载的tar.xz文件
tar xvJf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz

#修改~/.bashrc文件,永久保存环境变量
vim ~/.bashrc
#将下面的环境变量放在文件末尾,需要根据实际指定编译工具链的绝对路径
export PATH=/root/gcc-linaro/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:$PATH
#重新加载配置
source ~/.bashrc

#查看编译工具链,如果COLLECT_LTO_WRAPPER变量为指定的路径,即配置成功
aarch64-linux-gnu-gcc -v

修改后~/.bashrc文件如下:

../../../_images/aarch64-gcc-7-env.png

aarch64-linux-gnu-gcc版本如下:

../../../_images/aarch64-gcc-7-install.png

2.3. 远程便携开发

该部分内容可参考 《VSCode便携开发和GCC编译程序》 。如果你是直接在Ubuntu物理机/虚拟机上进行开发,可以去官网下载Linux版VSCode,后面的内容可以不看。

下面以PC电脑使用VSCode软件SSH远程连接服务器为例。软件和插件的安装在上述参考文档已经说明,下面主要演示免密登录。

注意

下面的演示自动登录的是普通用户。

2.3.1. PC端操作(Windows)

1
2
3
4
5
6
7
#打开PC的命令提示符或者powershell
#输入
ssh-keygen -t rsa

#然后连续回车直到结束

#找到.ssh这个文件夹,打开id_rsa_pub这个文件

如下图

未找到图片

可以用记事本打开,打开后把里面的内容复制好。

2.3.2. 服务器端操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#连接Ubuntu服务器/虚拟机
#在命令行上输入
ssh-keygen -t rsa

#然后连续回车直到结束
#可以看到/home/cat目录下会有.ssh文件夹
#然后进入该文件夹,就可以看到生成的公钥和私钥
cd .ssh/

#然后我们可以创建一个文件authorized_keys
vim authorized_keys

#把刚刚从记事本上复制的内容粘贴到里面,然后保存退出