说明
linux小白的开发笔记,防止以后忘记了,大家可以参考一下。
如果下面给出的命令不熟悉的话建议百度一下。
笔者使用的linux发行版是ubuntu-20.04.6,其他版本的应该也可以但是可能会遇到很多莫名其妙的错误。
以荔枝派nano为例,开始移植从TF卡启动的buildroot根文件系统。TF卡大小也不用太大,应该有16G都够用了,因为移植完也才用了1个G不到,剩下的做应用开发估计都绰绰有余了。
依赖工具
刚安装完系统,可以使用以下命令更新包管理
sudo apt update
由于在虚拟机里面不好操作,可以使用mobaxterm工具来远程ssh登录,需要安装这两个工具登录ssh,然后使用命令ifconfig
查到的IP地址就可以用mobaxterm登录了。
sudo apt install ssh net-tools -y
接下来才开始安装依赖工具,需要用到的是这些vim git gcc make cmake rsync build-essential bc swig libncurses-dev libpython3-dev libssl-dev python3-distutils android-tools-mkbootimg python python-dev flex bison
。
使用以下命令安装
sudo apt install vim git gcc make cmake rsync build-essential bc swig libncurses-dev libpython3-dev libssl-dev python3-distutils android-tools-mkbootimg python python-dev flex bison -y
交叉编译工具
- 下载交叉编译工具
wget http://releases.linaro.org/components/toolchain/binaries/7.2-2017.11/arm-linux-gnueabi/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz
- 解压缩
sudo tar -xvf gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi.tar.xz -C /opt/
- 配置环境
sudo vim /etc/bash.bashrc
- 在文件的最后插入如下代码
PATH="$PATH:/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin"
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
- 更新环境文件
source /etc/bash.bashrc
- 验证
arm-linux-gnueabi-gcc -v
如果你们也和我一样有一点强迫症 那我觉的这个事情太酷辣,可以把下载的压缩文件删了。
TF卡分区
这个简单说一下,网上有很多教程,这一步不使用mobatexrm工具,直接进到虚拟机里面因为图形化操作比较方便。
- 安装分区工具
sudo apt install gparted -y
在所有应用里面找到GParted并打开,右上角有个下拉框,切换到/dev/sdb,然后下面就是分区情况先把所有分区都删除,每个分区都这样操作除了unallocated分区,右键选择Delete,如果选不了就选unmount再Delete,删完后记得点击上面的绿色钩子,最后会剩下一个unallocated分区。
接下来开始重新分区,右键unallocated分区选择new,在New size里面填入32,在File system里面选择fat16,点击add即可生成第一个分区。再次右键unallocated分区,直接点击add就可以生成第二个分区了,完成后还需要点击上面的绿色钩子。第一个分区放内核文件和设备树文件,第二个分区放根文件系统。
u-boot移植
- 先在
~/
目录下新建一个文件夹,并且进入这个目录
mkdir f1c100s
cd f1c100s
- 从github上获取u-boot由于github不好上所以可以用加速网站,只需在
https://github.......
的前面加上这个加速网站就可以了https://mirror.ghproxy.com/
,克隆u-boot
git clone https://mirror.ghproxy.com/https://github.com/Lichee-Pi/u-boot.git -b nano-v2018.01
- 接下来就是进入u-boot目录,查看分支,选择分支,选择完后以后每次进来都不用再选
cd u-boot
git branch -a
git checkout nano-lcd800480
- 配置图形化配置文件
make licheepi_nano_defconfig
- 进入图形化配置界面
make menuconfig
懒得截图了,配置成下面这样就可以了,该输入y的输入y,该输入参数的输入参数,注意在删除参数时直接退格是不行的,需要按住ctrl键再退格,()里面的就是参数需要复制粘贴进去。
[*]Enable boot arguments
(setenv bootargs console=tty0 console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 rw)
[*]Enable a default value for bootcmd
(load mmc 0:1 0x80008000 zImage;load mmc 0:1 0x80c08000 suniv-f1c100s-licheepi-nano.dtb;bootz 0x80008000 - 0x80c08000;)
- 编辑这个文件,里面有内容需要注释掉
vim include/configs/suniv.h
注释内容如下,加一个#if 0 #endif
就可以了,或者直接删掉也行。
#if 0
#define CONFIG_VIDEO_LOGO
#define CONFIG_VIDEO_BMP_LOGO
#define CONFIG_BOOTCOMMAND "sf probe 0 60000000; " \
"sf read 0x80C00000 0x100000 0x4000; " \
"sf read 0x80008000 0x110000 0x400000; " \
"bootz 0x80008000 - 0x80C00000"
#endif
- 可以编译了,-j4为多线程编译可以加快编译的速度,j多少取决于你有多少个cpu可以使用
nproc
命令查看有多少个,我的是4个所以就是j4,大概需要编译1-2分钟,编译完成后目录下会有一个这样的文件u-boot-sunxi-with-spl.bin
make -j4
- 插入TF卡烧录u-boot
sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8
kerner移植
- 回到
~/f1c100s
目录下
cd ~/f1c100s
- 这一步开始下载内核文件,需要手动下载,发现用
git
克隆的话会出错暂时不知道怎么解决,源码链接如下
https://github.com/Lichee-Pi/linux/tree/nano-5.2-tf
在window下下载,然后通过mobaterm上传到虚拟机的f1c100s
目录下。
- 解压缩并且进入目录
unzip linux-nano-5.2-tf.zip
cd linux-nano-5.2-tf
- 下载图形化配置文件并且覆盖掉原本的文件
wget http://dl.sipeed.com/LICHEE/Nano/SDK/config
cp config .config
- 先进入配置再直接退出保存,然后开始编译,大概需要编译3-4分钟
make menuconfig
make -j4
- 插入TF卡烧录内核
把分区1挂载到/mnt
目录下
sudo mount /dev/sdb1 /mnt
复制内核文件到/mnt
目录下
sudo cp arch/arm/boot/zImage /mnt/
复制设备树编译文件到/mnt
目录下
sudo cp ./arch/arm/boot/dts/suniv-f1c100s-licheepi-nano.dtb /mnt/
保存
sync
取消挂载
sudo umount /dev/sdb1
buildroot移植
- 回到
~/f1c100s
目录下
cd ~/f1c100s
- 下载buildroot文件并解压
wget --no-check-certificate https://buildroot.org/downloads/buildroot-2017.08.tar.gz
tar xvf buildroot-2017.08.tar.gz
- 进入目录
cd buildroot-2017.08
- 进入图形化配置界面
make menuconfig
配置成下面这样就可以了,System hostname
下的选项第一个是主机名,第二个是欢迎界面语,第三个登录密码。
Target options
Target Architecture (ARM (little endian))
Toolchain
C library (glibc)
[*] Enable C++ support
[*] Enable Fortran support
[*] Enable compiler link-time-optimization support
[*] Enable compiler OpenMP support
[*] Enable graphite support
System configuration
(lmnb) System hostname
(Welcome to LMNB) System banner
(123456) Root password
- 尝试编译
make
很遗憾报错了,报错内容大概
省略
make[5]: *** [Makefile:1915: fseeko.o] Error 1
省略
freadahead.c: In function ‘freadahead’:
省略
解决办法
cd output/build/host-m4-1.4.18
sed -i 's/IO_ftrylockfile/IO_EOF_SEEN/' lib/*.c
echo "#define _IO_IN_BACKUP 0x100" >> lib/stdio-impl.h
cd -
make
需要联网编译,编译了1个多小时终于编译完了,荔枝派官网上说编译这个好像不能用-j4。
- 插入TF卡烧录根文件系统
sudo mount /dev/sdb2 /mnt
sudo tar xvf output/images/rootfs.tar -C /mnt/
sync
sudo umount /dev/sdb2
交叉编译第一个程序
注意这个编译程序的需要用根文件系统里面自带的交叉编译工具,用前面配置的那个是不行的
同样的打开前面配置环境的文件,在PATH="$PATH:/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin"
的后面加上:~/f1c100s/buildroot-2017.08/output/host/bin
也就是这样PATH="$PATH:/opt/gcc-linaro-7.2.1-2017.11-x86_64_arm-linux-gnueabi/bin:~/f1c100s/buildroot-2017.08/output/host/bin"
,再更新环境文件就可以了
随便一个目录下都行创建一个hello.c文件,写入代码
#include <stdio.h>
int main(int n, char **p)
{
if(n > 1)
{
printf("Hello");
for(int i=1;i<n;i++)
{
printf(" %s", p[i]);
}
printf("\n");
}
else
{
printf("Hello world!\n");
}
return 0;
}
然后编译,目录下就会生成一个hello执行文件
arm-buildroot-linux-gnueabi-gcc -o hello hello.c
再次像烧录根文件系统那样烧录hello文件到TF卡的第二分区里面
sudo mount /dev/sdb2 /mnt
sudo cp hello /mnt/root/
sync
sudo umount /dev/sdb2
荔枝派nano插入tf卡上电通过串口0调试,对应引脚l连接usb转ttl,就连这两根线就行,用usb供电
PE0 ==> TX
PE1 ==> RX
然后输入用户名root
,再输入密码123456
即可登录
输入ls
命令可查看到目录下有个hello文件,执行它还不行,需要权限输入chmod +x hello
命令即可。
#./hello
#Hello world!
#./hello lmnb66
#Hello lmnb66
总结
参考:CSDN,百度,b站,荔枝派官网,挖坑网
很明显这样烧录程序太麻烦了,后面介绍如何通过usb转虚拟网卡,实现ssh登录,然后可以通过tftp上传程序文件了或者在mobatexrm也可以。
断更了,先忙一阵子毕设