F1C200S编译
一、查看荔枝派Nano的分区内容
- 分成了两个分区
- 将第一个分区通过mount进行挂载,查看到内容包括:主要是dtb设备树和zImage压缩的内核。由于u-boot不是是通过dd指令传输到指定的位置,因此这里不显示。还有一个scr,这是一个uboot启动时加载命令的提示,也需要放在第一个分区。
- 将第二个分区挂载,查看内容:主要是linux的根文件。
二、构建需要的文件并且烧录到SD卡
-
教程:主要参考荔枝派Nano
uboot教程:https://wiki.sipeed.com/soft/Lichee/zh/Nano-Doc-Backup/get_started/first_eat.html
boot.scr教程:https://wiki.sipeed.com/soft/Lichee/zh/Nano-Doc-Backup/build_sys/bootargs.html
dtb和zImage教程:https://wiki.sipeed.com/soft/Lichee/zh/Nano-Doc-Backup/build_sys/kernel.html
Linux根文件教程:https://wiki.sipeed.com/soft/Lichee/zh/Nano-Doc-Backup/build_sys/rootfs.html -
格式化SD卡
参考:https://wiki.sipeed.com/soft/Lichee/zh/Nano-Doc-Backup/build_sys/build_index.html
通过fldisk /dev/sdb进行操作,第一个分区32M,并且进行格式化。 -
烧录uboot
uboot通过dd指令进行烧录,uboot烧录教程:https://github.com/peng-zhihui/Planck-Pi。
需要通过dd烧录到8k位置。
sudo dd if=./u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8 &&
sync
- 写入其他文件
通过mount进行挂载,然后cp。
sudo mount /dev/sdb1 /mnt/sdcard/cd /mnt/sdcard/
sudo cp ~/f1c200s/u-boot/tools/boot.scr /mnt/sdcard/
cd /home/tju/f1c200s/Linux/arch/arm/boot
sudo cp ./zImage /mnt/sdcard/
sudo cp ./dts/suniv-f1c100s-licheepi-nano.dtb /mnt/sdcard/
ls /mnt/sdcard/
三、问题
- 可以进入uboot,但是进入不了linux内核?
**方法1:**手动加载内核和设备树
在U-Boot命令行中,您可以手动加载内核和设备树文件,确保它们位于正确的内存地址。例如:
load mmc 0:1 0x80008000 zImage
load mmc 0:1 0x80C00000 suniv-f1c100s-licheepi-nano.dtb
bootz 0x80008000 - 0x80C00000
执行这些命令后,系统应该进入Linux内核。但是报错了.
- 继续解决,发现是没有配置串口登录,参考:https://wiki.sipeed.com/soft/Lichee/zh/Nano-Doc-Backup/build_sys/rootfs.html
在烧录了之后,需要检查 rootfs文件下的 /etc/inittab 是否已有以下声明,一般来说没有,因此需要修改。之后按照上述手动加载就可以登录了。
ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100 # GENERIC_SERIAL // 串口登录使能
- 为什么要手动加载,不能够自动加载进入linux内核吗?GPT的回答如下,通过在uboot中输入如下指令确实可以解决。
可能的原因:
-
U-Boot 的
bootcmd
没有正确配置或保存:
在 U-Boot 中,bootcmd
环境变量指定了启动时自动执行的命令序列。如果这个变量没有正确设置或保存,U-Boot 就不会自动加载内核、设备树和根文件系统,而是等待手动输入命令。 -
U-Boot 环境变量未保存:
如果您在 U-Boot 中设置了bootcmd
环境变量,但没有保存(使用saveenv
),那么在重启 U-Boot 后这些设置会丢失,导致启动时不能自动执行。 -
启动命令配置不正确:
即使bootcmd
被正确配置,可能在命令中存在错误,导致内核、设备树文件未能正确加载。
解决方法:
1. 检查并设置 bootcmd
环境变量
确保您在 U-Boot 中正确设置了 bootcmd
环境变量。这个变量应该包含加载内核和设备树、以及启动内核的命令。例如,假设您的内核镜像 zImage
和设备树文件 suniv-f1c100s-licheepi-nano.dtb
存在于第一个分区,并且根文件系统在第二个分区(mmcblk0p2
)上,您可以将以下命令设置为 bootcmd
:
setenv bootcmd 'load mmc 0:1 0x80008000 zImage; load mmc 0:1 0x80C00000 suniv-f1c100s-licheepi-nano.dtb; bootz 0x80008000 - 0x80C00000'
这里的命令做了以下几件事:
- 从 SD 卡的第一个分区(
mmc 0:1
)加载内核镜像zImage
到内存地址0x80008000
。 - 从同一分区加载设备树文件
suniv-f1c100s-licheepi-nano.dtb
到内存地址0x80C00000
。 - 使用
bootz
命令启动内核。
2. 保存环境变量
设置完 bootcmd
后,您需要使用 saveenv
命令保存环境变量,这样它们在重启后才能生效:
saveenv
3. 重启 U-Boot
保存环境变量后,您可以使用以下命令重启系统:
reset
此时,U-Boot 应该会根据设置的 bootcmd
自动加载内核和设备树,启动 Linux 系统,而不需要手动执行命令。
- 重写boot.cmd,并替换原来的,看能否解决,相比于之前的去除了显示屏输出。
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 rootwait rw
load mmc 0:1 0x80008000 zImage
load mmc 0:1 0x80C00000 suniv-f1c100s-licheepi-nano.dtb
bootz 0x80008000 - 0x80C00000
但还是不行!
- 先这样吧,尝试下一个步骤,添加一个led