K510 U-boot Developer's Guide
文档版本:V1.0.0
发布日期:2022-03-09
免责声明 您购买的产品、服务或特性等应受北京嘉楠捷思信息技术有限公司(“本公司”,下同)商业合同和条款的约束,本文档中描述的全部或部分产品、服务或特性可能不在您的购买或使用范围之内。除非合同另有约定,本公司不对本文档的任何陈述、信息、内容的准确性、可靠性、完整性、营销型、特定目的性和非侵略性提供任何明示或默示的声明或保证。除非另有约定,本文档仅作为使用指导的参考。 由于产品版本升级或其他原因,本文档内容将可能在未经任何通知的情况下,不定期进行更新或修改。
商标声明
“”、“Canaan”图标、嘉楠和嘉楠其他商标均为北京嘉楠捷思信息技术有限公司的商标。本文档可能提及的其他所有商标或注册商标,由各自的所有人拥有。
版权所有©2022北京嘉楠捷思信息技术有限公司 本文档仅适用K510平台开发设计,非经本公司书面许可,任何单位和个人不得以任何形式对本文档的部分或全部内容传播。
北京嘉楠捷思信息技术有限公司 网址:canaan-creative.com 商务垂询:[email protected]
# 前言 **文档目的** 本文档为K510 demo板sdk配套文档,主要介绍uboot相关内容,比如uboot下k510 demo板配置文件、设备树、驱动位置等信息。读者对象
本文档(本指南)主要适用的人员:
- 软件开发人员
- 技术支持人员
修订记录 修订记录累积了每次文档更新的说明。最新版本的文档包含以前所有版本的更新内容。
版本号 | 修改者 | 修订日期 | 修订说明 |
---|---|---|---|
V1.0.0 | 系统软件组 | 2022-03-09 | |
[TOC]
u-boot是sdk的一部分,sdk目前使用的u-boot版本是2020.01。Uboot是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序, UBoot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。UBoot除了支持PowerPC系列的处理器外,还能支持MIPS、 x86、ARM、NIOS、RISICV等,主要功能有初始化内存,引导linux系统,更多u-boot介绍请参考https://www.denx.de/wiki/U-Boot
- 操作系统
编号 | 软件资源 | 说明 |
---|---|---|
1 | Ubuntu | 18.04/20.04 |
- 软件环境
软件环境要求如下表所示:
编号 | 软件资源 | 说明 |
---|---|---|
1 | K510 SDK |
下载并编译sdk,sdk编译的时候会下载uboot代码,并编译uboot代码。sdk的下载编译方法请参考K510_SDK_Build_and_Burn_Guide.md
本章以编译k510_evb_lp3_v1_1_defconfig为例。对应的sdk编译方法是make CONF=k510_evb_lp3_v1_1_defconfig,其编译完后目录如下:
k510_evb_lp3_v1_1_defconfig/build/uboot-custom ---uboot的代码和编译目录;
board/canaan/k510/uboot-sdcard.env---uboot默认环境变量配置文件
k510_evb_lp3_v1_1_defconfig/build/uboot-custom/configs/k510_evb_lp3_v1_1_defconfig --uboot配置文件;
k510_evb_lp3_v1_1_defconfig/build/uboot-custom/arch/riscv/dts/k510_evb_lp3_v1_1.dts----设备树文件;
k510_evb_lp3_v1_1_defconfig/build/uboot-custom/include/configs/k510_evb_lp3_v1_1.h---头文件;
k510_evb_lp3_v1_1_defconfig/images/u-boot_burn.bin ---uboot烧写固件
buildroot-2020.02.11/boot/uboot ----buildroot里面关于uboot的编译脚本,一般不需修改;
configs/k510_evb_lp3_v1_1_defconfig---sdk的配置文件,BR2_TARGET_UBOOT_BOARD_DEFCONFIG指定uboot的配置文件;
_start(arch/riscv/cpu/start.S, line 43)
board_init_f(common/board_f.c, line 1013)
board_init_r(common/board_r.c, line 845)
run_main_loop(common/board_r.c, line 637)
board/Canaan/k510_evb_lp3/ddr_init.c
drivers/net/macb.c
设备树:
ethernet@93030000 {
compatible = "cdns,macb";
reg = <0x0 0x93030000 0x0 0x10000>;
phy-mode = "rmii";
interrupts = <0x36 0x4>;
interrupt-parent = <0x4>;
clocks = <0x5 0x5>;
clock-names = "hclk", "pclk";
};
drivers/serial/ns16550.c
设备树:
serial@96000000 {
compatible = "andestech,uart16550", "ns16550a";
reg = <0x0 0x96000000 0x0 0x1000>;
interrupts = <0x19 0x4>;
clock-frequency = <0x17d7840>;
reg-shift = <0x2>;
reg-io-width = <0x4>;
no-loopback-test = <0x1>;
interrupt-parent = <0x4>;
};
drivers/pinctrl/pinctrl-single.c
设备树:
iomux@97040000 {
compatible = "pinctrl-single";
reg = <0x0 0x97040000 0x0 0x10000>;
#address-cells = <0x1>;
#size-cells = <0x0>;
#pinctrl-cells = <0x1>;
pinctrl-single,register-width = <0x20>;
pinctrl-single,function-mask = <0xffffffff>;
pinctrl-names = "default";
pinctrl-0 = <0x6 0x7 0x8 0x9 0xa>;
iomux_uart0_pins {
pinctrl-single,pins = <0x1c0 0x540ca8 0x1c4 0x5a0c69>;
phandle = <0x6>;
};
iomux_emac_pins {
pinctrl-single,pins = <0x8c 0x4e 0x90 0xce 0x88 0x8e 0x98 0x4e 0x80 0x8e 0xb8 0x4e 0xb4 0x4e 0xa8 0x8e 0xa4 0x8e 0x74 0x8e>;
phandle = <0x7>;
};
iomux_spi0_pins {
pinctrl-single,pins = <0x158 0x4e 0x15c 0x4e 0x160 0xce 0x164 0xce 0x168 0xce 0x16c 0xce 0x170 0xce 0x174 0xce 0x178 0xce 0x17c 0xce 0x180 0x8e>;
phandle = <0x8>;
};
iomux_mmc0_pins {
pinctrl-single,pins = <0x1c 0x4e 0x20 0xce 0x24 0xce 0x28 0xce 0x2c 0xce 0x30 0xce 0x34 0xce 0x38 0xce 0x3c 0xce 0x40 0xce>;
phandle = <0x9>;
};
iomux_mmc2_pins {
pinctrl-single,pins = <0x5c 0x4e 0x60 0xce 0x64 0xce 0x68 0xce 0x6c 0xce 0x70 0xce>;
phandle = <0xa>;
};
};
drivers/mmc/sdhci-cadence.c
设备树
mmc0@93000000 {
compatible = "socionext,uniphier-sd4hc", "cdns,sd4hc";
reg = <0x0 0x93000000 0x0 0x400>;
interrupts = <0x30 0x4>;
interrupt-parent = <0x4>;
clocks = <0xb 0x4>;
max-frequency = <0xbebc200>;
cap-mmc-highspeed;
bus-width = <0x8>;
};
mmc2@93020000 {
compatible = "socionext,uniphier-sd4hc", "cdns,sd4hc";
reg = <0x0 0x93020000 0x0 0x400>;
interrupts = <0x32 0x4>;
interrupt-parent = <0x4>;
clocks = <0xb 0x4>;
max-frequency = <0xbebc200>;
cap-sd-highspeed;
bus-width = <0x1>;
};
uboot的默认环境变量在SDK的board/canaan/k510目录下,用文本文件预定义:
uboot-emmc.env
uboot-nfs.env
uboot-sdcard.env
SDK的post脚本会在编译的时候调用mkenvimage将文本的环境变量定义编译为uboot可以加载的二进制镜像,放在启动分区中。
举例如下:
uboot-sdcard.env
bootm_size=0x2000000
bootdelay=3
stderr=serial@96000000
stdin=serial@96000000
stdout=serial@96000000
arch=riscv
baudrate=115200
ipaddr=10.100.226.221
netmask=255.255.255.0
gatewayip=10.100.226.254
serverip=10.100.226.63
bootargs=root=/dev/mmcblk1p2 rw console=ttyS0,115200n8 debug loglevel=7
bootcmd=fatload mmc 1:1 0x600000 bootm-bbl.img;fatload mmc 1:1 0x2000000 k510.dtb;bootm 0x600000 - 0x2000000
bootcmd_nfs=tftp 0x600000 bootm-bbl.img;tftp 0x2000000 k510_nfsroot.dtb;bootm 0x600000 - 0x2000000
注:内核启动参数bootargs由uboot的默认环境变量设置,dts中的bootargs将会被覆盖。详见 常见问题-bootargs 哪里获取并传给内核的?
sdk镜像里面已经包含uboot程序,直接烧写sdk镜像,比如:k510_evb_lp3_v1_1_defconfig/images/sysimage-sdcard.img文件
把u-boot_burn.bin文件放到tftp目录,配置设备网口ip地址,进入/root/sd/p1目录;执行tftp -gr u-boot_burn.bin xxx.xxx.xxx.xx 命令;
把u-boot_burn.bin文件放到tftp目录,配置设备网口ip地址;通过tftp -gr u-boot_burn.bin xxx.xxx.xxx.xx下载文件到设备;
执行dd if=u-boot_burn.bin of=/dev/mmcblk0p1 命令把文件写到mmc卡。
答:目前evb只能跑800,CRB可以设置800或1600。CRB板子ddr频率设置方法见uboot的board\Canaan\k510_crb_lp3\ddr_param.h文件,800M对应#define DDR_800 1,1600M对应#define DDR_1600 1宏。
答:从uboot环境变量bootargs 获取,uboot引导内核时会根据bootargs 环境变量值,修改内存设备树里面的bootargs参数。相关代码如下:
int fdt_chosen(void *fdt)
{
int nodeoffset;
int err;
char *str; /* used to set string properties */
err = fdt_check_header(fdt);
if (err < 0) {
printf("fdt_chosen: %s\n", fdt_strerror(err));
return err;
}
/* find or create "/chosen" node. */
nodeoffset = fdt_find_or_add_subnode(fdt, 0, "chosen");
if (nodeoffset < 0)
return nodeoffset;
str = env_get("bootargs");
if (str) {
err = fdt_setprop(fdt, nodeoffset, "bootargs", str,
strlen(str) + 1);
if (err < 0) {
printf("WARNING: could not set bootargs %s.\n",
fdt_strerror(err));
return err;
}
}
return fdt_fixup_stdout(fdt, nodeoffset);
}
答:uboot根据启动方式动态获取环境变量,引导内核时根据bootargs环境变量,更新内存里面的设备树。修改完后的启动参数见/sys/firmware/devicetree/base/chosen节点。
答:
启动方式 | uboot读取和保存位置 | 编译时对应文件 |
---|---|---|
emmc启动 | emmc第二个分区的uboot-emmc.env文件 | board\canaan\k510\uboot-emmc.env |
sd卡启动 | sd卡第一个分区的uboot-sd.env文件 | board\canaan\k510\uboot-sd.env |
答:qos相关寄存器是QOS_CTRL0 QOS_CTRL1 QOS_CTRL2 QOS_CTRL3 QOS_CTRL4 。例子:
//设置qos后,nncase demo性能有所提高
*(uint32_t *)0x970E00FC = (0x2 << 8) | (0x2 << 12) | (0x2 << 16) | (0x2 << 20) | (0x2 << 24); *(uint32_t *)0x970E0100 = (0x3 << 4) | 0x3; *(uint32_t *)0x970E00F4 = (0x5 << 16) | (0x5 << 20);