QSPI flash xip模式运行
背景:
在做一个项目,调研p-sram当ram用在cadence qspi接口下是否正常,首先用qspi-flash xip模式验证控制器是否支持flash的xip模式。
一、更改步骤:
1.1首先配置链接脚本
默认链接脚本
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{. = 0xf4000000;. = ALIGN(4);.text : {_stext = .;*(.vectors)*(.text*)*(.rodata .rodata*) /* read-only data (constants) */. = ALIGN(4);*(.glue*)_etext = . ;}__exidx_start = .;.ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) }__exidx_end = .;. = ALIGN(8);_edummy = .;/* data sections */.data : {_sdata = .;__ld_real_data_start = .;*(.data*)_edata = .;}. = ALIGN(8);/* bss sections */_sbss = .;.bss (NOLOAD) : {*(.bss .bss.*). = ALIGN(4);}_ebss = .;/*stack sections 4K*/.stack (NOLOAD):{. = ALIGN(64);. = . + 0x400;__stack = .;}_end = .;.pagetable (NOLOAD):{. = ALIGN(16*1024);__pagetable_start = .;. = . + 0x00004000;}.dynsym : { *(.dynsym) }.dynbss : { *(.dynbss) }.dynstr : { *(.dynstr*) }.dynamic : { *(.dynamic*) }.hash : { *(.hash*) }.plt : { *(.plt*) }.interp : { *(.interp*) }.gnu : { *(.gnu*) }
}
_romsize = _edata - _stext;
_ramsize = _end - _stext;
xip链接脚本
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{. = 0xe0000000;. = ALIGN(4);.text 0xe000000c : {_stext = .;*(.vectors)*(.text*)*(.rodata .rodata*) /* read-only data (constants) */. = ALIGN(4);*(.glue*)_etext = . ;}__exidx_start = .;.ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) }__exidx_end = .;. = ALIGN(8);_edummy = .;/* data sections */.data 0xf4000000 : AT ( _edummy ) {_sdata = .;__ld_real_data_start = .;*(.data*)_edata = .;}. = ALIGN(8);/* bss sections */_sbss = .;.bss (NOLOAD) : {*(.bss .bss.*). = ALIGN(4);}_ebss = .;/*stack sections 4K*/.stack (NOLOAD):{. = ALIGN(64);. = . + 0x1000;__stack = .;}_end = .;.pagetable (NOLOAD):{. = ALIGN(16*1024);__pagetable_start = .;. = . + 0x00004000;}.dynsym : { *(.dynsym) }.dynbss : { *(.dynbss) }.dynstr : { *(.dynstr*) }.dynamic : { *(.dynamic*) }.hash : { *(.hash*) }.plt : { *(.plt*) }.interp : { *(.interp*) }.gnu : { *(.gnu*) }
}
_romsize = _edata - _stext;
_ramsize = _end - _stext;
1.2更改控制器代码:
#define QSPI_ENTER_XIP_MODE ((1 << 7) + (1 << 11) + (0x3 << 12))void qspi_enter_xip_mode(uint32_t base)
{uint32_t value;volatile pstruct_qspi_reg_t addr = (pstruct_qspi_reg_t)base;value = addr->QSPI_CONFIGURATION;value |= QSPI_ENTER_XIP_MODE;addr->QSPI_CONFIGURATION = value;
}
二、使用:
直接跳过image的包头后,PC直接在text段上运行。运行正常。