前言
在上一篇试用报告中聊到完全可以在开发板上开发开发板上面用的程序,而且,可以达到最优的兼容性,但是也如同我们的开发PC肯定也要比使用PC的配置高一些,我们的开发板目前是2+16的配置,目前可用空间还有10G左右,使用肯定是没问题了,但是开发却担心空间不够,所以开发最好还是要买4+32的配置。
官方推荐的是使用NFS来拓展,但是因为有TF卡槽,所以我就尝试是否可以使用TF卡来拓展空间,但是发现插上TF卡后,就无法启动系统了,于是我开始寻求问题到底出现在哪里?
内核分析
其实,我们在探究以前可以先进行猜测一下,必然是RK3576的UBOOT如果探测到TF卡,优先TF卡启动了,但是为了确定问题,我们需要连接TTL来查看输出,配置是1500000比特率,使用PUTTY就可以查看了,因为比特率比较高,所以最好用上一些正经的USB2TTL芯片,我用的是自己做的CH340C的板子,先看一下输出。

下面的StartUSB可以不必看,关键在于
mmc1 is current device
由此可以断定问题之所在,既然已经找到了问题,那么我们试着把系统做到TF卡上面试试。
首先我们需要打开Debian固件,解压后进入tools\windows\RKDevTool\rockdev目录当中,然后将rk3588-mkupdate.bat复制一份命名mkupdate.bat,修改一下:
mklink /J Image ..\\..\\..\\..\\rockdev
Afptool -pack ./ Image\\update.img
RKImageMaker.exe -RK3576 Image\\MiniLoaderAll.bin Image\\update.img update.img -os_type:androidos
del Image\\update.img
pause
第一句是将Image映射到固件文件夹中
第二句和第三句是制作TF卡烧写固件
第四句是删除中间文件
同样将RK3588-package-file复制改名成package-file
# NAME Relative path
#
#HWDEF HWDEF
package-file package-file
bootloader Image/MiniLoaderAll.bin
parameter Image/parameter.txt
uboot Image/uboot.img
boot Image/boot.img
rootfs Image/rootfs.img
recovery Image/recovery.img
backup RESERVED
将OEM和userdata注释掉,然后执行mkupdate.bat,等待一会儿即可完成了。

然后我们需要下载一个工具SDDiskTool_v1.78,一会儿我也会把该工具分享到论坛当中。

然后进行烧写,烧写参数如图,先点恢复磁盘,再进行开始创建,烧写后然后插入到开发板中,很快即可启动成功了。
然后就惊奇的发现虽然成功进入系统,但是为何进入的是EMMC的系统?
虽然,已经达到了预期效果,但是我们还是应该研究一下为何进入的是EMMC系统。
瑞芯微Linux启动的流程一般是SPL->uboot->kernel->rootfs,那么首先看看内核启动参数把。
cat /proc/cmdline

可以看到启动是通过PARTUUID来启动的,那么我们试着修改一下启动参数试试,于是我下载官方的提供的3月份的kernel,编译烧写,然后就惊奇的发现,连EMMC系统都启动不了了。
恰好我想起来,官方还提供了4月份的Ubuntu系统,果断下载进行烧写到EMMC中,然后就发现官方提供的Ubuntu系统有BUG啊,然后试着把Debian系统的boot.img烧写进去,就可以正常启动了。
所以,这里需要注意一下的是,如果烧写官方的Ubuntu系统无法启动后,请替换Debian系统的boot.img,然后就可以正常使用了
果断去社区,加QQ群联系官方,不得不说官方非常nice,说是最近版本更新太快,没有跟上输出,很快等了两天就将5月份的kernel更新上来了,然后进行编译,强制使用/dev/mmcblk1p6来启动,然后就发现启动以后还是EMMC系统,再次查看cmdline发现已经更新到了root=/dev/mmcblk1p6了。
再次查看kernel输出,果然可以看到一句
EXT4-fs (mmcblk0p6): mounted filesystem with ordered data mode. Quota mode: disabled.
为啥启动参数是mmcblk1p6,但是实际启动的却是mmcblk0p6呢?
于是,我查看initramfs,把 rootfs.cpio.gz 解压后查看init,可惜是二进制文件,但大概问题出在了init文件这里,我用二进制文件查看发现里面有/dev/mmcblk0boot1,因为我已经达到了预期目标,就没继续下去,把我分析的思路记录下来,希望如果有人如果需要的话,可以提供一些参考。
所以插入TF卡后的启动流程如下:SPL(EMMC)->UBOOT(EMMC)->KERNEL(TF)->INITRAMFS(TF)->ROOTFS(EMMC)
其实,如果希望禁止TF卡启动的话,也可以通过TTL进入UBOOT后狂按Ctrl+C,然后修改启动参数也可以,我将uboot的环境参数也粘贴到这里:
arch=arm
autoload=no
baudrate=1500000
board=evb_rk3576
board_name=evb_rk3576
boot_a_script=load ${devtype} ${devnum}:${distro_bootpart} ${scriptaddr} ${prefix}${script}; source ${scriptaddr}
boot_extlinux=sysboot ${devtype} ${devnum}:${distro_bootpart} any ${scriptaddr} ${prefix}extlinux/extlinux.conf
boot_net_usb_start=usb start
boot_prefixes=/ /boot/
boot_script_dhcp=boot.scr.uimg
boot_scripts=boot.scr.uimg boot.scr
boot_targets=mmc1 mmc0 mtd2 mtd1 mtd0 usb0 pxe dhcp
bootargs=storagemedia=sd androidboot.storagemedia=sd androidboot.mode=normal
bootcmd=boot_android ${devtype} ${devnum};boot_fit;bootrkp;run distro_bootcmd;
bootcmd_dhcp=run boot_net_usb_start; if dhcp ${scriptaddr} ${boot_script_dhcp}; then source ${scriptaddr}; fi;
bootcmd_mmc0=setenv devnum 0; run mmc_boot
bootcmd_mmc1=setenv devnum 1; run mmc_boot
bootcmd_mtd0=setenv devnum 0; run mtd_boot
bootcmd_mtd1=setenv devnum 1; run mtd_boot
bootcmd_mtd2=setenv devnum 2; run mtd_boot
bootcmd_pxe=run boot_net_usb_start; dhcp; if pxe get; then pxe boot; fi
bootcmd_usb0=setenv devnum 0; run usb_boot
bootdelay=0
cpu=armv8
devnum=1
devtype=mmc
distro_bootcmd=setenv scsi_need_init; for target in ${boot_targets}; do run bootcmd_${target}; done
eth1addr=f2:d8:d3:24:6d:47
ethaddr=ee:d8:d3:24:6d:47
fdt_addr_r=0x48300000
gatewayip=192.168.3.1
ipaddr=192.168.3.222
kernel_addr_c=0x45480000
kernel_addr_r=0x40400000
mmc_boot=if mmc dev ${devnum}; then setenv devtype mmc; run scan_dev_for_boot_part; fi
netmask=255.255.255.0
partitions=uuid_disk=${uuid_gpt_disk};name=uboot,start=8MB,size=4MB,uuid=${uuid_gpt_loader2};name=trust,size=4M,uuid=${uuid_gpt_atf};name=misc,size=4MB,uuid=${uuid_gpt_misc};name=resource,size=16MB,uuid=${uuid_gpt_resource};name=kernel,size=32M,uuid=${uuid_gpt_kernel};name=boot,size=32M,bootable,uuid=${uuid_gpt_boot};name=recovery,size=32M,uuid=${uuid_gpt_recovery};name=backup,size=112M,uuid=${uuid_gpt_backup};name=cache,size=512M,uuid=${uuid_gpt_cache};name=system,size=2048M,uuid=${uuid_gpt_system};name=metadata,size=16M,uuid=${uuid_gpt_metadata};name=vendor,size=32M,uuid=${uuid_gpt_vendor};name=oem,size=32M,uuid=${uuid_gpt_oem};name=frp,size=512K,uuid=${uuid_gpt_frp};name=security,size=2M,uuid=${uuid_gpt_security};name=userdata,size=-,uuid=${uuid_gpt_userdata};
pxefile_addr_r=0x40600000
ramdisk_addr_r=0x4a200000
rkimg_bootdev=if mmc dev 1 && rkimgtest mmc 1; then setenv devtype mmc; setenv devnum 1; echo Boot from SDcard;elif mmc dev 0; then setenv devtype mmc; setenv devnum 0;elif mtd_blk dev 0; then setenv devtype mtd; setenv devnum 0;elif mtd_blk dev 1; then setenv devtype mtd; setenv devnum 1;elif mtd_blk dev 2; then setenv devtype mtd; setenv devnum 2;elif rknand dev 0; then setenv devtype rknand; setenv devnum 0;elif rksfc dev 0; then setenv devtype spinand; setenv devnum 0;elif rksfc dev 1; then setenv devtype spinor; setenv devnum 1;else;setenv devtype ramdisk; setenv devnum 0;fi;
scan_dev_for_boot=echo Scanning ${devtype} ${devnum}:${distro_bootpart}...; for prefix in ${boot_prefixes}; do run scan_dev_for_extlinux; run scan_dev_for_scripts; done;
scan_dev_for_boot_part=part list ${devtype} ${devnum} -bootable devplist; env exists devplist || setenv devplist 1; for distro_bootpart in ${devplist}; do if fstype ${devtype} ${devnum}:${distro_bootpart} bootfstype; then run scan_dev_for_boot; fi; done
scan_dev_for_extlinux=if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}extlinux/extlinux.conf; then echo Found ${prefix}extlinux/extlinux.conf; run boot_extlinux; echo SCRIPT FAILED: continuing...; fi
scan_dev_for_scripts=for script in ${boot_scripts}; do if test -e ${devtype} ${devnum}:${distro_bootpart} ${prefix}${script}; then echo Found U-Boot script ${prefix}${script}; run boot_a_script; echo SCRIPT FAILED: continuing...; fi; done
scriptaddr=0x40500000
scsi_boot=run scsi_init; if scsi dev ${devnum}; then setenv devtype scsi; run scan_dev_for_boot_part; fi
scsi_init=if ${scsi_need_init}; then setenv scsi_need_init false; scsi scan; fi
serial#=2fc91e113b041a65
serverip=192.168.3.123
soc=rockchip
stderr=serial,vidconsole
stdout=serial,vidconsole
usb_boot=usb start; if usb dev ${devnum}; then setenv devtype usb; run scan_dev_for_boot_part; fi
vendor=rockchip
Environment size: 4324/32764 bytes
拓展空间
进入系统后,我们首先试着用fdisk来看一下TF卡的分区。

挂载一下tf卡的/dev/mmcblk1p6,然后使用df -h来查看
sudo mount /dev/mmcblk1p6 /mnt/sdcard/
df -h

可以查看只有4.5G的空间,那么就重新分配一下空间吧。
sudo parted /dev/mmcblk1
然后使用print来查看分区情况。

根据我们之前的分析,可以断定4 5 6分区没有用,删掉然后创建一个新的分区
rm 4
rm 5
rm 6
mkpart

然后进行格式化
sudo mkfs.ext4 /dev/mmcblk1p4
然后再次挂载
sudo mount /dev/mmcblk1p4 /mnt/sdcard
再用df来查看空间可以看到100G的空间没有问题了

接下来我们更新一下/etc/fstab

然后重启后,使用df -h来查看,可以看到已经成功挂载了

烧写工具*附件:SDDiskTool_v1.78.zip