很久没搞嵌入式了,为了学习,买了正点的arm板子,芯片是Freescale的imx6ull。
为了更好的学习,决定放弃正点官网的资料,一切都从原网下载。
原料准备
imx6ull手册 | 官网下载 |
正点imx6ull的板子 | TB买的 |
一张小SD卡 | JD买的 |
交叉编译工具 | https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz |
ubuntu22虚拟机 | – |
uboot源码 | https://github.com/u-boot/u-boot.git |
linux源码 | https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.105.tar.xz |
busybox源码 | https://www.busybox.net/downloads/busybox-snapshot.tar.bz2(这是每日构建版本,不建议使用) |
1、交叉编译工具
我是把gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz 解压到/opt/arm-gcc下面
lq@lq-server /o/arm-gcc> ls
gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/
lq@lq-server /o/arm-gcc> pwd
/opt/arm-gcc
lq@lq-server /o/arm-gcc>
在环境变量的PATH
中追加/opt/arm-gcc/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin
2、uboot编译
编译
进入u-boot目录
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=build_imx6ull mx6ull_14x14_evk_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=build_imx6ull -j4
烧写
烧写build_imx6ull/u-boot-dtb.imx
到SD卡
把SD卡插入ubuntu,找到设备名称,我这里是sdd
sudo dd if=u-boot-dtb.imx of=/dev/sdd seek=2
把SD卡插到板子,并且修改拨码到SD卡启动,接上串口,波特率115200,然后上电
=>
U-Boot 2023.04-rc4-00044-gc84a00a647 (Mar 29 2023 - 04:45:19 +0800)
arm-linux-gnueabihf-gcc (Linaro GCC 7.5-2019.12) 7.5.0
GNU ld (Linaro_Binutils-2019.12) 2.28.2.20170706
=>
启动成功
3、linux 内核编译
修改设备树文件
进入linux源码目录
修改文件arch/arm/boot/dts/imx6ul-14x14-evk.dtsi b/arch/arm/boot/dts/imx6ul-14x14-evk.dtsi
将设备中的spi4修改为disabled
diff --git a/arch/arm/boot/dts/imx6ul-14x14-evk.dtsi b/arch/arm/boot/dts/imx6ul-14x14-evk.dtsi
index 1a18c41ce..e95503fcd 100644
--- a/arch/arm/boot/dts/imx6ul-14x14-evk.dtsi
+++ b/arch/arm/boot/dts/imx6ul-14x14-evk.dtsi
@@ -86,7 +86,7 @@ spi4 {
compatible = "spi-gpio";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_spi4>;
status = "disabled";
gpio-sck = <&gpio5 11 0>;
编译
make mrproper
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v6_v7_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4
搭建tftp服务器
ubuntu上
sudo apt install tftpd-hpa -y
修改配置文件
lq@lq-server ~/s/g/linux-5.15.103 (master)> cat /etc/default/tftpd-hpa
# /etc/default/tftpd-hpa
#
TFTP_USERNAME="lq"
TFTP_DIRECTORY="/home/lq/mnt/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure --create"
将TFTP_USERNAME改为当前用户名字
TFTP_DIRECTORY修改为一个自己喜欢的tftp目录
然后重启服务
sudo systemctl restart tftpd-hpa.service
传文件
经过编译,应该已经生成了我们所需要的两文件,内核镜像与设备树文件
lq@lq-server ~/s/g/linux-5.15.103 (master)> file ./arch/arm/boot/dts/imx6ull-14x14-evk.dtb
./arch/arm/boot/dts/imx6ull-14x14-evk.dtb: Device Tree Blob version 17, size=31740, boot CPU=0, string block size=2236, DT structure block size=29448
lq@lq-server ~/s/g/linux-5.15.103 (master)> file ./arch/arm/boot/zImage
./arch/arm/boot/zImage: Linux kernel ARM boot executable zImage (little-endian)
lq@lq-server ~/s/g/linux-5.15.103 (master)>
将这两个文件拷贝到tftp目录下
uboot加载镜像与设备树
板子接上网线,与ubuntu直连,进入uboot界面
设置uboot eth的MAC地址
=> setenv ethaddr 92:1b:93:f4:44:9a
设置uboot IP地址
=> setenv ipaddr 192.168.101.9
设置服务器地址
=> setenv serverip 192.168.101.3
然后ping一下,能通就说明是好的
=> ping ${serverip}
Using ethernet@20b4000 device
host 192.168.101.3 is alive
=>
先测试一下
=> setenv bootargs console=ttymxc0,115200
=> tftp 0x82000000 zImage;tftp 0x83000000 imx6ull-14x14-evk.dtb;bootz 0x82000000 - 0x83000000
这时候能看到内核启动,但最后会死在没有文件系统上
4、使用busybox构建根文件系统
在构建根文件系统前,需要选一个自己喜欢的目录作为根目录。
我这里用的是/home/lq/mnt/fsroot
libc拷贝
编译器会提供的它使用的libc库,拷过来就行,其目录在/opt/arm-gcc/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc
cp -a /opt/arm-gcc/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/* /home/lq/mnt/fsroot
编译busybox
进入busybox目录
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- install CONFIG_PREFIX=/home/lq/mnt/fsroot
创建rcS
创建文件/home/lq/mnt/fsroot/etc/init.d/rcS
并且添加
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
mount -t tmpfs none /var
mount -t tmpfs none /dev
/sbin/mdev -s
mkdir /var/log
添加执行权限
chmod +x /home/lq/mnt/fsroot/etc/init.d/rcS
NFS搭建
安装
sudo apt install -y nfs-kernel-server
修改配置
lq@lq-server ~/s/g/busybox (master)> cat /etc/exports
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)
#
/home/lq/mnt/fsroot 192.168.101.0/24(rw,sync,no_subtree_check)
重启服务
sudo systemctl restart nfs-kernel-server.service
修改uboot启动项
进入板子串口中
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs ip=${ipaddr}:${serverip}:${serverip}:255.255.255.0:eth0 nfsroot=${serverip}:/home/lq/mnt/fsroot,v3,tcp'
tftp 0x82000000 zImage;tftp 0x83000000 imx6ull-14x14-evk.dtb;bootz 0x82000000 - 0x83000000
[ 8.822822] hub 1-1:1.0: 4 ports detected
[ 11.552746] fec 20b4000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
[ 11.569253] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[ 11.585431] Sending DHCP requests .., OK
[ 17.092476] IP-Config: Got DHCP answer from 192.168.101.3, my address is 192.168.101.151
[ 17.101404] IP-Config: Complete:
[ 17.104783] device=eth0, hwaddr=e2:58:27:8b:c0:d1, ipaddr=192.168.101.151, mask=255.255.255.0, gw=192.168.101.3
[ 17.116521] host=eth0, domain=, nis-domain=(none)
[ 17.121832] bootserver=192.168.101.3, rootserver=192.168.101.3, rootpath=
[ 17.121929] nameserver0=192.168.101.3
[ 17.162705] ALSA device list:
[ 17.166606] No soundcards found.
[ 17.296678] VFS: Mounted root (nfs filesystem) readonly on device 0:16.
[ 17.312822] devtmpfs: mounted
[ 17.319162] Freeing unused kernel image (initmem) memory: 1024K
[ 17.338567] Run /sbin/init as init process
Please press Enter to activate this console.
~ # uname -r
5.15.103-gf1de6c2f53e3
启动成功