硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3076|回复: 1
收起左侧

[i.MX-X1] x1 flash 加载启动学习笔记

[复制链接]

4

主题

141

回帖

153

积分

初级会员

积分
153
QQ
发表于 2018-5-6 18:09:32 | 显示全部楼层 |阅读模式
本帖最后由 qgyhd1234 于 2018-5-6 19:32 编辑

       之前在x1上跑RT_Thread时,因为官方未做适配,所以学习了下1052的启动加载。           
       x1板子上拨码开关SW7可以选择1052的启动模式,主要有Hyper Flash启动,QPSI Flash启动,SD卡启动,usb或串口下载,更具体的介绍可以去看https://forum.anfulai.cn/forum.ph ... 0888&extra=page%3D1

        rt1052内部的rom不给用户使用,所以需要外接flash来保存代码,x1接的是Hyper Flash。

       为适应不同的flash,当RT1052的片上ROM在检测到启动模式为FlexSPI接口后,会根据BootPin的配置信息配置该模式下需要使用的FlexSPI接口管脚的复用模式并将FlexSPI的时钟配置成默认的30MHz,然后会以0x6000_0000为首地址读取前512Byte作为外部Flash的配置信息(几线制的SPI Flash,SPI的时钟频率,LUT查找表,DDR/SDR模式以及片选CS管脚的hold/setup time等信息)并以此来配置FlexSPI模块以满足外部flash的特性。

      然后1052会读取接下来的跟用户Image相关的几个关键信息,即IVT(Image Vector Table),Boot Data和DCD(Device configuration data)。其中IVT需要放在外部Flash的固定偏移地址(对于NorfFlash来说其需要存储在基地址+4KB的偏移地址)供ROM读取以便让系统知道用户Image的第一条执行指令放在哪里以及BootData和DCD的存放地址,BootData则保存了完整Image的首地址和整个image所占的空间大小,而DCD则包含了一些配置命令以便在跳到用户程序入口之前供ROM调用配置内部外设以更好的匹配外部IC,一般如果系统外挂了SDRAM的情况则需要配置好DCD(因为有时需要主程序在跑起来之前,外部SDRAM就得处于ready状态,以供CPU把data或者code copy到SDRAM里时不会出错)。


       x1自带的工程里xip文件夹下的三个文件包含了我们需要的flexspi配置信息,dcd_data,image_vector_table和boot_data,直接将这三个文件添加到工程就好了,然后要做的就是修改分散加载文件了,直接打开RT-Thread的分散加载文件,根据上面的描述,先定义放flash配置文件和vector_table的地址和大小
#define m_flash_config_start           0x60000000
#define m_flash_config_size            0x00001000

#define m_ivt_start                    0x60001000
#define m_ivt_size                     0x00001000


       然后加入两个加载时域,第一个加载时域地址是0x60000000,放flash配置文件,第二个加载时域地址是  0x60001000,放IVT,Boot Data和DCD,记得要把IVT输入段放在第一个,确保IVT在0x60001000。


LR_m_rom_config m_flash_config_start m_flash_config_size {   ; load region size_region
        RW_m_config_text m_flash_config_start m_flash_config_size { ; load address = execution address
        * (.boot_hdr.conf, +FIRST)
        }
}


LR_m_rom_ivt m_ivt_start m_ivt_size {   ; load region size_region
        RW_m_ivt_text m_ivt_start m_ivt_size { ; load address = execution address
        * (.boot_hdr.ivt, +FIRST)
        * (.boot_hdr.boot_data)
        * (.boot_hdr.dcd_data)
        }
}

      由于 xip三个文件中的四个变量——Flash配置参数,IVT表,Boot data及DCD没有被程序中的其他函数调用,为了防止被编译器自动优化掉,需要在linker窗口中添加4条keep变量,
--keep=*(.boot_hdr.ivt)
--keep=*(.boot_hdr.boot_data)
--keep=*(.boot_hdr.dcd_data)
--keep=*(.boot_hdr.conf)

       将这些改完后生成的固件里就自带了Flash配置参数,IVT表,Boot data,DCD和用户image了,可以像stm32一样直接用mdk下载程序到1052里了




评分

参与人数 1金币 +50 收起 理由
eric2013 + 50 赞一个!

查看全部评分

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2018-5-7 01:32:42 | 显示全部楼层
谢谢楼主分享。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 00:45 , Processed in 0.037211 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表