如果有问题,请加QQ群 891339868 进行交流
我使用的是firefly的rk3308b的板子,RK官方提供的sdk里面默认不支持使用tftp启动内核和设备树,这样在调试内核和设备树的时候,很不方便,所以找了个空闲时间,对uboot进行了修改,使用tftp启动内核和设备树,并且挂载nfs文件系统,同时安装ubuntu16.04,具体流程如下:
一、清空板子的flash,烧录RK官方的预bootloader(miniloader.bin)、trust.bin和默认的环境变量文件parameter.txt。这些都不需要做任何修改,直接用官方提供的文件就行。
二、修改官方的uboot,对uboot的修改主要有以下几个内容:
1、使能板子的网卡驱动,打开uboot的网络功能
firefly的rk3308b板子支持双网卡,一个是自带的mac,外加了一个phy,型号是rtl8201f,一个是usb转phy,这里我使用自带mac+phy的网卡。
网卡的驱动分了两部分,一个是mac的驱动,一个是phy的驱动,官方的uboot支持,配置一下就行了:
首先要是能uboot里面的驱动模型,具体的路径为Device Drivers --->[*] Enable Driver Model for Ethernet drivers:
其次使能rk3308b的mac的驱动,具体的路径为:Device Drivers --->[*] Network device support --->[*] Rockchip Synopsys Designware Ethernet MAC:
接着使能rk3308b的phy的驱动,具体的路径为:Device Drivers --->-*- Ethernet PHY (physical media interface) support --->[*] Realtek Ethernet PHYs support:
接着使能产生随机mac地址,要不然网卡不能使用,具体的路径为-*- Networking support ---> [*] Random ethaddr if unset:
接着要修改环境变量的存储方式,我这里使用的是EMMC,所以要设置为MMC,要不然设置的ip地址不能保存,具体的路径为Environment --->Select the location of the environment (Environment in an MMC device) ---> (X) Environment in an MMC device:
最后根据电路图修改uboot的设备树里面关于网口的描述,如下图所示:
可以看到使用的是rk3308-evb-debug-uart4.dts这个设备树文件,其实和rk3308b相关的文件就这么几个:
在这里主要是要修改rk3308.dtsi对网卡的配置描述,主要是在rk3308.dtsi这里面:
这里面大部分都不需要修改,使用默认的就行,真是pinctrl-0这个字段要根据实际使用的情况进行修改,从rk3308b的技术手册可以查到,它有两组rmii接口,如下图所示:
一组是GPIO1的PB5-PC5的功能4(设备树描述功能是从0 开始,所以是3),另外一组是GPIO4的PA0-PA5和PB4-PB7的功能3
firefly的rk3308b开发板使用的是第二组gpio。
在rk3308-evb-debug-uart4.dts这个文件里面使能一下mac就ok了,如下图所示:
修改过设备树后,要禁止uboot使用kernel设备树,在RK的sdk里面,为了提高uboot的兼容性,bootloader的第二阶段,默认使用了kernel的设备树,这样的话就可以实现一种uboot配置,可以适配同一型号芯片的多种板卡,提高uboot的兼容性。我在这里禁止了这一功能,以上的设备树配置就可以生效了,具体的配置路径为:ARM architecture --->[ ] Using dtb from Kernel/resource for U-Boot
到此,uboot的网卡就可以工作了,需要在环境变量中配置一下本机ip和serverip,来看一下实际效果:
2、增加uboot从tftp服务器启动内核、设备树的命令
先看一下RK的sdk里面uboot关于芯片的配置,主要是在uboot/include/configs/这个文件夹里面的,和rk3308相关的主要有以下几个文件:rockchip-common.h、rk3308_common.h、evb_rk3308.h,如下图所示:
从字面意思就可以猜出来,rockchip-common.h是rk处理器通用的配置,rk3308_common.h是rk3308处理器通用的配置,evb_rk3308.h是板级的配置,先来看一下这个板级配置:
第13行配置主要是记录uboot环境变量的位置,第26行配置是配置uboot的启动命令,RKIMG_BOOTCOMMAND在rockchip-common.h文件里面定义,如下图所示:
第159行的“boot_android ${devtype} ${devnum};”是rk官方的安卓分区格式的启动模式,目前是ROCKCHIP官方主流启动模式,第160行的“bootrk”是rk官方的早期启动模式,第162行的“run distro_bootcmd”是一种通用的启动方式,没有仔细研究,重点说一下第161行的"boot_tftp"命令,这个命令是我自己增加的,目的是自动使用tftp命令从宿主机下载内核和设备树数据,并启动的命令。具体的添加流程如下:
(1)、在uboot/cmd/这个文件夹里面添加boot_tftp.c,文件内容如下图所示:
(二)、在uboot/cmd/Makefile文件里面增加编译链接该文件的配置,如下图所示:
(三)、在uboot/cmd/Kconfig文件里面增加选中该命令的选项,如下图所示:
(四)、uboot中选中boot_tftp命令,禁止boot_android和bootrk命令,如下图所示:
配置到此,uboot启动后,就可以自动从tftp服务器启动了。