【NXP DN 系列】修改并编译生效 RCW 配置 For ND LS1043ARDB LSDK1906

本文介绍了如何修改LS1043A SoC的复位配置字(RCW)以适应不同配置,包括核心频率、I/O引脚和SoC设置。同时,详细阐述了组建局域网的步骤,涉及虚拟机IP分配、开发板TFTP网络环境设置。此外,还展示了如何修改并编译RCW文件,以及如何通过TFTP更新SD卡固件以实现新配置的引导生效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载地址:https://blog.youkuaiyun.com/dana_xiong/article/details/113592121

一、 RCW

复位配置字 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
 
  • 1

在这里插入图片描述
2.设置开发板 tftp 网络环境
① 设置开发板硬件开关从 SD 卡启动
从启动的 log 中可以看到

Board: LS1043ARDB, boot from SD
 

    ② 设置服务器 IP 地址

    => setenv serverip <ipaddress1>
    For example:
    => setenv serverip 192.168.1.1
     
    • 1
    • 2

    ③ 将 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
     
    • 1
    • 2
    • 3
    • 4
    • 5

    端口名地址映射
    在这里插入图片描述
    ④ 给开发板分配 IP 地址

    => setenv ipaddr 192.168.1.2
    => setenv netmask 255.255.255.0
     
    • 1

    ⑤ 保存设置

    => saveenv
     

      ⑥ ping 服务器

      => ping $serverip
      For example:
      => ping 192.168.1.1
       
      • 1
      • 2

      可以看到

      Using FM1@DTSEC1 device
      host 192.168.1.1 is alive
       
      • 1

      则 tftp 网络环境搭建完成,可以使用 tftp 传输文件

      三、修改并编译 RCW 文件

      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  //打包固件
         
        • 1

        编译后可以使用十六进制文本打开编译生成的二进制文件包对比,看是否修改编译成功
        在这里插入图片描述

        四、 更新 SD 卡固件

        我们需要把修改编译好的固件更新到 SD 卡中,使用 tftp 方式更新
        1.下载固件并写入到 SD 卡中

        => tftp a0000000 firmware_ls1043ardb_uboot_sdboot.img
        => mmc write a0000000 8 1fff8
         
        • 1

        过程 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

          注:

          未经本人允许,不得转载!谢谢!

          ### NXP LS1043 调试教程及相关进展 #### 一、NXP LS1043 的调试概述 NXP LS1043 是一款基于 ARM Cortex-A72 架构的高性能处理器,广泛应用于网络通信领域。其调试过程涉及硬件初始化、驱动开发以及性能优化等多个方面[^1]。 #### 二、调试方法与工具 1. **硬件初始化** - 使用 U-Boot 或其他引导加载程序完成初始设置。U-Boot 支持对 NAND Flash 和 SPI NOR Flash 进行烧录操作,可通过设备树文件 (Device Tree) 定义硬件资源分配。 - 设备树中需明确指定存储介质参数,例如 IFC NAND 的位宽和地址映射关系,QSPI NOR 的分区布局等[^1]。 2. **驱动开发** - 开发过程中需要关注的关键驱动包括但不限于: - **IFC NAND 驱动**:负责管理 NAND Flash 存储器的操作,确保数据可靠性和一致性。 - **QSPI NOR 驱动**:实现快速启动功能,通常用于存放 bootloader 和关键配置数据。 - **SATA 驱动**:支持外部固态硬盘的数据访问,适用于大容量存储需求场景。 - **SGMII 网络接口驱动**:通过 SERDES 接口连接 PHY 芯片,提供千兆级网络传输能力。 - 对于 SGMII 网口驱动,需特别注意 SERDES 寄存器配置。例如,SERDES 选项应设为 `0x3358` 启用 PLL 映射模式 `2221` 来满足时钟同步要求[^1]。 3. **调试工具** - 常见工具有 JTAG 调试器(如 Lauterbach)、串口终端软件(如 minicom)以及逻辑分析仪等辅助设备。 - 利用 GDB 工具可以远程调试应用程序代码,定位潜在问题所在位置。 #### 三、常见问题及其解决方案 1. **链接失败问题** - 如果发现物理层无法成功建立链路,则可能是由于 SERDES 参数错误引起。建议重新核查 RCW 文件中的配置项是否正确无误[^1]。 2. **存储性能低下** - 当遇到 NAND Flash 或 QSPI NOR 性能瓶颈时,可尝试调整 ECC 校验级别或者修改页大小来提升吞吐量表现。 3. **网口转发效率低** - 若观察到以太网帧处理速度较慢,可能是因为中断响应时间过长所致。可以通过优化 DMA 缓冲区设计减少上下文中断次数从而提高整体效能[^1]。 ```c // 示例代码展示如何利用信号量机制协调两个进程间的工作流程 #include <stdio.h> #include <stdlib.h> #include <semaphore.h> sem_t semaphore; void processA() { printf("Process A is running.\n"); sem_post(&semaphore); } void processB() { sem_wait(&semaphore); printf("Process B is running.\n"); } int main() { sem_init(&semaphore, 0, 0); processA(); processB(); sem_destroy(&semaphore); return 0; } ``` 以上示例展示了简单的线程同步技术,在实际项目实施阶段可能会更加复杂但原理相同适用范围广。 ---
          评论 2
          添加红包

          请填写红包祝福语或标题

          红包个数最小为10个

          红包金额最低5元

          当前余额3.43前往充值 >
          需支付:10.00
          成就一亿技术人!
          领取后你会自动成为博主和红包主的粉丝 规则
          hope_wisdom
          发出的红包
          实付
          使用余额支付
          点击重新获取
          扫码支付
          钱包余额 0

          抵扣说明:

          1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
          2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

          余额充值