复位配置字 RCW ( Reset Configuration Word ) 存储在非易失性存储器中 ( 如:NOR、QSPI、SDHC )。它提供了灵活性来适应大量的配置参数来支持 SoC 的高度可配置性。配置参数一般包括:
① 各个模块的频率,包括磁芯、DDR 等
② I/O 引脚 pin-muxing 配置
③ 其他 SoC 配置
RCW 提供以下功能:
① 引导位置为 NOR flash
② 使能 4 个 UART,无需流控制
③ 使能 I2C1, I2C2, I2C3, I2C4, SDHC, IFC, PCIe, SATA
在一些实验中我们需要通过修改 RCW 配置来达到目的,这里就说明一下怎样来修改 RCW 配置并使其编译成功生效
1.给虚拟机分配 IP 地址
先对虚拟机网络进行设置选择桥接有线网卡方式,设置完后分配并查看 Ubuntu 的 IP 地址。
sudo ifconfig enp0s3 192.168.1.1
ifconfig
2.设置开发板 tftp 网络环境
① 设置开发板硬件开关从 SD 卡启动
从启动的 log 中可以看到
Board: LS1043ARDB, boot from SD
② 设置服务器 IP 地址
=> setenv serverip <ipaddress1>
For example:
=> setenv serverip 192.168.1.1
③ 将 ethact 和 ethprime 设置为连接到 TFTP 服务器的以太网接口
=> setenv ethprime <name of interface connected to TFTP server>
For example:
=> setenv ethprime FM1@DTSEC1
=> setenv ethact <name of interface connected to TFTP server>
For example:
=> setenv ethact FM1@DTSEC1
=> setenv ipaddr 192.168.1.2
=> setenv netmask 255.255.255.0
⑤ 保存设置
=> saveenv
⑥ ping 服务器
=> ping $serverip
For example:
=> ping 192.168.1.1
可以看到
Using FM1@DTSEC1 device
host 192.168.1.1 is alive
则 tftp 网络环境搭建完成,可以使用 tftp 传输文件
1.RCW 源文件位置: /dana/flexbuild_lsdk1906_update_290719/packages/firmware/rcw/ls1043ardb/RR_FQPP_1455
2.文件命名约定
rcw_x.rcw
rcw_x_bootmode.rcw
rcw_x_specialsetting.rcw
x = Core frequency
bootmode = bootmode:SD/NAND/NOR and so on.
specialsetting = special setting:
lpuart:used for lpuart
sben:Secure boot
For example,
rcw_1600.rcw means rcw for core frequency of 1600MHz with nor boot.
rcw_1600_sd.rcw means rcw for core frequency of 1600MHz with sd boot.
rcw_1600_lpuart.rcw means rcw for core frequency of 1600MHz with nor boot special for lpuart.
For more information please refer to the comments in rcw file.
3.修改 RCW 文件
vim rcw_1600_sdboot.rcw
可以看到相关 RCW 配置
#include <../ls1043aqds/ls1043a.rcwi> //定义了 512 位的字段和字段名
SYS_PLL_RAT=4
MEM_PLL_RAT=16
CGA_PLL1_RAT=16
CGA_PLL2_RAT=10
SRDS_PRTCL_S1=5205
FM1_MAC_RAT=1
SRDS_PLL_REF_CLK_SEL_S1=2
SRDS_DIV_PEX=1
DDR_FDBK_MULT=2
DDR_REFCLK_SEL=1
PBI_SRC=6
IFC_MODE=64
HWA_CGA_M1_CLK_SEL=6
DRAM_LAT=1
SYS_PLL_SPD=1
UART_BASE=7
IRQ_OUT=1
TVDD_VSEL=0
DVDD_VSEL=2
EVDD_VSEL=2
IIC2_EXT=0
SYSCLK_FREQ=600
HWA_CGA_M2_CLK_SEL=1
#include <../ls1043aqds/atf_address.rcw>
#include <../ls1043aqds/cci_barrier_disable.rcw>
#include <../ls1043aqds/usb_phy_freq.rcw>
在 QorIQ LS1043A Reference Manual 第四章中有关于 RCW 字段的描述
例如:
可以发现,我们需要修改 RCW 的第 439-440 位,字段名称为 EVDD_VSEL,作用为配 置 EVDD IO 域的电压。
在源文件中:EVDD_VSEL=2
可知,我们源码中的 RCW 字段为 EVDD_VSEL 设置的参数为二进制的 10 ,即 EVDD IO 域的电压为 3.3 V
可以通过 u-boot 启动 log 读出 EVDD_VSEL 是否配置为 10
U-Boot 2019.04-dirty (Jan 13 2020 - 16:10:10 +0800)
SoC: LS1043AE Rev1.1 (0x87920011)
Clock Configuration:
CPU0(A53):1600 MHz CPU1(A53):1600 MHz CPU2(A53):1600 MHz
CPU3(A53):1600 MHz
Bus: 400 MHz DDR: 1600 MT/s FMAN: 500 MHz
Reset Configuration Word (RCW):
00000000: 08100010 0a000000 00000000 00000000
00000010: 14550002 80004012 60040000 c1002000
00000020: 00000000 00000000 00000000 00038800
00000030: 00000000 00001100 00000096 00000001
Model: LS1043A RDB Board
Board: LS1043ARDB, boot from SD
首先通过上文我们知道, EVDD_VSEL 字段处于 RCW 的第 439-440 位。而上图中 RCW 每一行前面显示的就是 RCW 的内存地址,每一个内存地址中存储着 8 位数据。所以我们首先计算第 439-440 位处于 RCW 内存地址中的位置:439/8=54
那么好了,我们取出地址 54,55 的数据:
00000030: 20044500 00001100 00000096 00000001
因为 RCW 是 16 进制显示,则将 1100 化成二进制为:
0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0
接下来我们就需要知道 439-440 处于上面的哪两位。首先确认上面数据的第一位处于
RCW 的第几位:54*8=432
则我们可以知道上面数据的对应关系为:可见,439-440 的值为 10,与代码中设置相符。接下来我们在源码中修改 LS1043A 的 RCW 文件并修改 EVDD_VSEL=0
4.编译 RCW 文件
flex-builder -c rcw -m ls1043ardb //编译 RCW 文件生成 rcw_*_sdboot.bin 固件
flex-builder -i mkfw -m ls1043ardb -b sd //打包固件
编译后可以使用十六进制文本打开编译生成的二进制文件包对比,看是否修改编译成功
我们需要把修改编译好的固件更新到 SD 卡中,使用 tftp 方式更新
1.下载固件并写入到 SD 卡中
=> tftp a0000000 firmware_ls1043ardb_uboot_sdboot.img
=> mmc write a0000000 8 1fff8
过程 log
=> tftp a0000000 firmware_ls1043ardb_uboot_sdboot.img
Using FM1@DTSEC1 device
TFTP from server 192.168.1.2; our IP address is 192.168.1.3
Filename 'firmware_ls1043ardb_uboot_sdboot.img'.
Load address: 0xa0000000
Loading:
################################################################# #################################################################
/* 省略 …… */
###############################################
3.4 MiB/s
done
Bytes transferred = 45532708 (2b6c624 hex)
=> mmc write a0000000 8 1fff8
MMC write: dev # 0, block # 8, count 131064 ... 131064 blocks written: OK
2.重启从 SD 卡引导启动
=> cpld reset sd
3.对比 log 是否修改编译引导生效
U-Boot2019.04-dirty (Jan 14 2020 - 09:30:07 +0800)
SoC: LS1043AE Rev1.1 (0x87920011)
Clock Configuration:
CPU0(A53):1600 MHz CPU1(A53):1600 MHz CPU2(A53):1600 MHz
CPU3(A53):1600 MHz
Bus: 400 MHz DDR: 1600 MT/s FMAN: 500 MHz
Reset Configuration Word (RCW):
00000000: 08100010 0a000000 00000000 00000000
00000010: 14550002 80004012 60040000 c1002000
00000020: 00000000 00000000 00000000 00038800
00000030: 00000000 00001000 00000096 00000001
Model: LS1043A RDB Board
Board: LS1043ARDB, boot from SD
使用之前的方法计算可以得出 EVDD_VSEL 字段配置为 00 也就是 1.8v
在 RCW 源文件中虽然有定义 512 位的字段和字段名但是并没有将所有的字段定义列举 出来,有些字段是保留项省略了,如果需要更改这些字段可以根据 QorIQ LS1043A Reference Manual 中第四章节中的 RCW 字段表格中描述的进行修改,按照前面的格式添加到源文件中。
QorIQ LS1043A Reference Manual 下载地址:
QorIQ LS1043A Reference Manual
未经本人允许,不得转载!谢谢!