Edit online

参数配置

Luban-Lite 中含有 BootLoader 和 RTOS 两个固件的编译配置,以 D12x 产品线为例,如下所示:
  • d12x_demo68-nor-xip_rt-thread_helloworld_defconfig

  • d12x_demo68-nor-xip_baremetal_bootloader_defconfig

本节以 D12x 编译配置为例演示了 NOR 方案切换 XIP 方案的配置步骤,演示过程中使用了下列环境以供参考:
  • SDK版本:Luban-lite V1.2.1

  • 开发板:D12x demo68 nor

  • 方案配置:d12x_demo68-nor_rt-thread_helloworld_defconfig

执行如下配置流程:

  1. 在工程根目录选中d12x_demo68-nor_rt-thread_helloworld_defconfig 方案。
  2. 执行 scons --menuconfig命令进入 menuconfig 的功能配置界面。
  3. 在 BootLoader 配置选项中,使能 xip_boot 命令。
    注:

    由于 XIP 启动依赖 NOR Flash,[*] XIP Boot[ ] NOR Boot 只能二选一。

    BootLoader options  --->
       Commands  --->
           [ ] NOR Boot
           [*] XIP Boot
    
  4. 进入 RTOS 配置选项,关闭 SPI NOR 驱动:
    Board options  --->
    [ ] SPI0 Devices: SPINOR  ----
    
    Rt-Thread options  --->
    RT-Thread Components  --->
        [ ] FAL: flash abstraction layer  ----
        Device Drivers  --->
            [ ]   Using SFUD(Serial Flash Universal Driver)
    Drivers options  --->
    Peripheral  --->
            [ ] SPINOR Driver SFUD: Serial Flash Universal Driver  ----
    
  5. 在 RTOS 配置选项中,关闭 Littlefs 文件系统:
    注: XIP 模式下,Flash 无法写入,可以关闭 Littlefs。
    Local packages options  --->
    Third-party packages options  --->
        [ ] Littlefs: A high-integrity embedded file system  ----
    
    Application options  --->
        [ ] Using File System Image 1  ----
    
  6. 配置 RAMDISK,将 rodata 目录映射到 ramdisk中,使 LVGL 能访问图片素材等资源文件。
    Local packages options  --->
    Third-party packages options  --->
        [*] ramdisk: A RAM memory block device.  --->
            RAMDISK type (Create RAMDISK from initial data)  --->
            (rodata) RAMDISK initial device name
    
    Application options  --->
        (/ram/lvgl_data) LVGL Resource Directory
    
  7. 配置 XIP 相关参数:
    Board options  --->
    Mem Options  --->
    [*] Enable XIP
            XIP parameter  --->
                (0x100800) XIP fw start addr
    
    XIP 起始地址的计算公式为:os 分区在 Flash 的偏移地址 + I TB 头部大小 0x800:
    警告: XIP 模式下,XIP 地址段为只读属性,不可以写 XIP 地址。关于详细说明,可查看注意事项


    根据分区表得知,os 分区在 Flash 上的偏移地址是 1 MB(512K+128K+128K+256K),则此处 XIP 起始地址应填写0x100800, 可以删除 data 分区。

  8. 查看测试 LOG,示例如下:

注意事项

在 XIP 模式下, XIP 地址段为只读属性,不可写入,若因为编码问题对 XIP 地址进行写入操作,可能造成不可预知异常,需要严格规范代码。需要检查以下修改是否合入,未合入需要手动修改:
bsp/artinchip/hal/cmu/aic_hal_clk.c         | 8 +-------                                            
 bsp/artinchip/include/hal/aic_hal_clk_cmu.h | 2 --                                                  
 2 files changed, 1 insertion(+), 9 deletions(-)                                                     
                                                                                                     
diff --git a/bsp/artinchip/hal/cmu/aic_hal_clk.c b/bsp/artinchip/hal/cmu/aic_hal_clk.c               
index 1362682cc..a0c912769 100644                                                                    
--- a/bsp/artinchip/hal/cmu/aic_hal_clk.c                                                            
+++ b/bsp/artinchip/hal/cmu/aic_hal_clk.c                                                            
@@ -22,7 +22,6 @@ int hal_clk_enable_deassertrst(uint32_t clk_id)                                    
                         cfg->ops->enable_clk_deassert_rst != NULL,                                  
                 -EINVAL);                                                                           
                                                                                                     
-    cfg->enable = 1;                                                                                
     return (cfg->ops->enable_clk_deassert_rst(cfg));                                                
 }                                                                                                   
                                                                                                     
@@ -37,7 +36,6 @@ int hal_clk_disable_assertrst(uint32_t clk_id)                                     
                         cfg->ops->disable_clk_assert_rst != NULL,                                   
                 -EINVAL);                                                                           
                                                                                                     
-    cfg->enable = 0;                                                                                
     cfg->ops->disable_clk_assert_rst(cfg);                                                          
     return 0;                                                                                          
 }                                                                                                      
@@ -52,7 +50,6 @@ int hal_clk_enable(uint32_t clk_id)                                                   
     CHECK_PARAM(cfg != NULL && cfg->ops != NULL && cfg->ops->enable != NULL,                           
                 -EINVAL);                                                                              
                                                                                                        
-    cfg->enable = 1;                                                                                   
     return (cfg->ops->enable(cfg));                                                                    
 }                                                                                                      
                                                                                                        
@@ -66,8 +63,6 @@ int hal_clk_disable(uint32_t clk_id)                                                  
     CHECK_PARAM(cfg != NULL && cfg->ops != NULL && cfg->ops->disable != NULL,                          
                 -EINVAL);                                                                              
                                                                                                        
-    cfg->enable = 0;                                                                                   
-                                                                                                       
     cfg->ops->disable(cfg);                                                                            
     return 0;                                                                                          
 }                                                                                                      
@@ -84,8 +79,7 @@ int hal_clk_is_enabled(uint32_t clk_id)                                               
                                                                                                        
     if (cfg->ops->is_enabled == NULL) {                                                                
         parent_clk_id = hal_clk_get_parent(clk_id);
-        cfg->enable = hal_clk_is_enabled(parent_clk_id);                                            
-        return cfg->enable;                                                                         
+        return hal_clk_is_enabled(parent_clk_id);                                                   
     }                                                                                               
     return (cfg->ops->is_enabled(cfg));                                                             
 }                                                                                                   
diff --git a/bsp/artinchip/include/hal/aic_hal_clk_cmu.h b/bsp/artinchip/include/hal/aic_hal_clk_cmu.h
index 8c99a33fb..34ae8d1fb 100644                                                                    
--- a/bsp/artinchip/include/hal/aic_hal_clk_cmu.h                                                    
+++ b/bsp/artinchip/include/hal/aic_hal_clk_cmu.h                                                    
@@ -14,7 +14,6 @@ extern "C" {                                                                       
 struct aic_clk_comm_cfg {                                                                           
     struct aic_clk_ops *ops;                                                                        
     const char *name;                                                                               
-    bool enable;                                                                                    
 };                                                                                                  
                                                                                                     
 struct aic_clk_fixed_rate_cfg {                                                                     
@@ -154,7 +153,6 @@ struct aic_clk_ops {                                                             
         .id        = _id, \                                                                         
         .parent_id = 0, \                                                                           
         .rate      = _rate, \                                                                       
-        .comm.enable = 1, \                                                                         
         .comm.ops  = &aic_clk_fixed_rate_ops, \                                                     
         .comm.name = _name,  \                                                                      
     }                                                                                               
--                                                                                                   
2.25.1
Edit online

支持 XIP 的 Flash 型号

1. 支持 XIP 的 Flash 型号
器件型号 品牌 容量 (B) JEDEC ID

D13x/D12x XIP启动支持

GD25Q128EWIG GigaDevice(兆易) 16M 0xC84018
GD25Q128ESIGR GigaDevice(兆易) 16M 0xC84018
GD25Q64ESIGR GigaDevice(兆易) 8M 0xC84017
ZB25VQ128ASIG Zbit(恒烁) 16M 0x5e4018
ZB25VQ64ASIG Zbit(恒烁) 8M 0x5e4017
ZB25VQ32DSJG Zbit(恒烁) 4M 0x5e4016
XT25F128BSSIGT XTX(芯天下) 16M 0x0B4018
XT25F64BSOIGT-S XTX(芯天下) 8M 0x0B4017
BY25Q128ASSIG BOYAMICRO(博雅) 16M 0x684018
BY25Q64ASSIG BOYAMICRO(博雅) 8M 0x684017
W25Q128JVSIQ WINBOND(华邦) 16M 0xef4018
W25Q64JVSSIQ WINBOND(华邦) 8M 0xef4017
FM25Q64-DNA-T-G FM(复旦微) 8M 0xA14017
ZD25Q64BSIGT Zetta(澜智) 8M 0xBA16