最近在研究A33主线相关的资源,目前主线uboot和内核都对A33有极好的支持了,所以现在把我在使用过程中遇到的问题和使用方法做个记录,首先是下载主线uboot源码,网址为https://ftp.denx.de/pub/u-boot/
,我下载的版本为2022.10版本的,如下图所示
下载完成后,直接解压到我们的开发机器上即可,我这里默认使用的是Sinlinx_SinA33_defconfig
配置文件,将此文件复制为我们的配置文件名字即可。
然后配置好交叉编译环境,使用如下命令进行编译即可。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- Sinlinx_SinA33_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j8
编译没问题后如下图文件即为我们所需要的文件
接着需要确保怎么让机器能运行uboot代码,首先是要执行git clone https://github.com/linux-sunxi/sunxi-tools
去下载sunxi-tools工具,下载完成后直接进入目录进行make
即可得到工具,然后将机器进入到fel模式,机器识别到Allwinner USB Devices即可进行烧录工作,./sunxi-tools/sunxi-fel uboot u-boot/u-boot-sunxi-with-spl.bin
即可,成功运行uboot截图如下。
补上一张烧录的截图,记得一定要sudo权限,或者root用户下执行,不然会提示权限问题。
接下来就是调试uboot外设了,首先会一直打印如下图所示的信息,挺烦人的,而我们又用不到usb启动,所以接下来看看在哪里可以关闭如下操作。
修改如下地方即可,只保留EMMC启动方式。
diff --git a/u-boot/include/configs/sunxi-common.h b/u-boot/include/configs/sunxi-common.h
index 0f0ef4f64..0def14927 100644
--- a/u-boot/include/configs/sunxi-common.h
+++ b/u-boot/include/configs/sunxi-common.h
@@ -266,11 +266,7 @@
#define BOOT_TARGET_DEVICES(func) \
func(FEL, fel, na) \
- BOOT_TARGET_DEVICES_MMC(func) \
- BOOT_TARGET_DEVICES_SCSI(func) \
- BOOT_TARGET_DEVICES_USB(func) \
- BOOT_TARGET_DEVICES_PXE(func) \
- BOOT_TARGET_DEVICES_DHCP(func)
+ BOOT_TARGET_DEVICES_MMC(func)
#ifdef CONFIG_OLD_SUNXI_KERNEL_COMPAT
#define BOOTCMD_SUNXI_COMPAT \
接着我们调试下以太网,因为我们需要使用以太网来进行内核的调试,我这个A33使用的USB以太网模块为RTL8152模块,我这边是有个IO控制电压的,加上电压控制管脚即可,但是还是ping不通,这时候看下是不是电脑防火墙设置了,我这边是因为防火墙的问题,用的win11,照着如下图的设置就好了。
ping通的截图如下
这样以太网就算是可以使用了。接下来就可以使用tftp去启动内核试试了。
使用如下命令去使用tftp启动内核
tftp 0x46000000 zImage
tftp 0x49000000 sun8i-a33-sinlinx-sina33.dtb
bootz 0x46000000 - 0x49000000
指令运行结果如下图。到此uboot使用就介绍完成了。
附上内核启动的截图
这里内核没有设置根文件系统,所以系统其实是起不来的。等根文件系统起来后,我们就可以将我们的程序固化到emmc了,接下来我来讲一下我这边是如何固化程序到emmc的。首先使用tf卡启动系统后,使用fdisk /dev/mmcblk1
操作emmc进行分区,我们主要分两个区就行了,一个存放内核文件,一个用来存放根文件系统。进入如下图界面后,可以先使用d去删除原有的分区信息。
然后就是开始新建分区了。整个操作流程如下图
fdisk /dev/mmcblk1
Welcome to fdisk (util-linux 2.34).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x573b4052.
Command (m for help): d
No partition is defined yet!
Command (m for help): d
No partition is defined yet!
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-15269887, default 2048): 2048 //表示从emmc的第2048个扇区开始分配,一个扇区大小为512Byte,这里是为了不和uboot文件冲突,uboot默认给了1MB空间大小。
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-15269887, default 15269887): 22528 //这里是计算的容量大小,扇区开始 + 需要分配的大小对应的扇区总数。大小 = 2048 + 1024*1024*10/512
Created a new partition 1 of type 'Linux' and of size 10 MiB. //分配了10MB大小,
Partition #1 contains a vfat signature.
Do you want to remove the signature? [Y]es/[N]o: y
The signature will be removed by a write command.
Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2):
First sector (22529-15269887, default 24576): 22529
Last sector, +/-sectors or +/-size{K,M,G,T,P} (22529-15269887, default 15269887):
Created a new partition 2 of type 'Linux' and of size 7.3 GiB.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
使用命令查看下具体的分区信息。
如此分区就算好了,现在就是固化程序了,首先需要对分区的格式做下修改。我这里是ubuntu系统,默认没有mkfs.vfat
,执行命令 apt-get install dosfstools
即可安装,然后格式化分区1,使用如下命令
mkfs.vfat /dev/mmcblk1p1
成功结果如下图
接着格式化分区2,
然后就可以将文件放进去即可,首先是dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblk1 bs=1024 seek=8烧录uboot文件,,从emmc的第8*1024字节开始写入,扇区则为16,结果如下
接着是内核文件,首先讲分区挂载到临时目录 mount /dev/mmcblk1p1 ./temp/
然后复制对应的文件进去即可,具体操作细节见下图
然后是根文件系统,一样的先挂载分区到临时目录中,
如此,程序固化到emmc就算成功了。以后调试直接可以脱离sd卡进行升级固件了,我这里使用http获取文件,首先在开发机器上安装sudo apt-get install apache2
,后面我们放文件到开发机器的/var/www/html/
目录下即可,然后开发板上使用wget http://192.168.0.103/123.txt获取开发机器上的文件。服务器的ip和目录
开发板上获取成功的截图如下
后面使用这种方式去调试内核就方便了,不过这个要有网络能正常使用的情况下。