Hi Petro, I checked the Errata: https://ww1.microchip.com/downloads/en/DeviceDoc/SAM-E70-S70-V70-V71-Family-Errata-DS80000767J.pdf
There is the ARM note: 3. Arm® Cortex®-M73.1 Arm Cortex-M7All issues related to the Arm r0p1 (for MRLA) and r1p1 (and MRLB) cores are described on the Arm website. WorkaroundRefer to the following Arm documentation: • For Arm Cortex-M7 r0p1 core (MRLA device): https://silver.arm.com/download/download.tm?pv=2004343 • For Arm Cortex-M7 r1p1 core (MRLB device): https://silver.arm.com/download/download.tm?pv=3257391&p=1929427 • Arm Embedded Trace Macrocell CoreSight ETM–M7 (TM975) Software Developers Errata Notice: https://silver.arm.com/download/download.tm?pv=1998309 Do you know about these or what they cover? I couldn't find the link but didn't really search after that. 5. Device 5.1 AHB Peripheral (AHBP) Port Frequency Ratio Peripheral accesses done through the AHBP with a Core/Bus ratio of 1/3 and 1/4 may lead to unpredictable results. WorkaroundThe user must use a Core/Bus frequency ratio of 1 or 1/2. So I am running 300Mhz core and 150Mhz core, but I ready this in reverse - the core should be 150 and the backplane 75 or 150/150? The backplane doesn't run at 300, or am I missing something? Do you run 300/150? I am using SAME70N21B-ANT, what about you? Thank you and best regards -James On Fri, Dec 9, 2022 at 8:02 PM James Dougherty <jafr...@gmail.com> wrote: > Thanks Petro, > > You are right, or so it seems, but from what I can tell most of this is > working already > and since the armv7-m code is common across STM32 as well that should be > ok. > > But I did tst and try what you said, it is an easy change because we are > in thumb mode and > the SAMBA bootloader initializes internal SRAM on SAME70. So we make a > small trampoline > by simply renaming __start() in sam_start.c to arm_boot, and add sam_head.S > to implement __start which sets up the initial stack, calls > arm_data_initialize and then jumps to arm_boot() > > In arm_data_initialize we zero bss, copy from flash to ram and we don't > need to call arch_clean_dcache because > the cache is in write-through mode (write-through simplifies the cache > coherency protocol because it doesn't need the > modified state - the main memory is always up to date). > > I use ISB to throw away any pre-fetched instructions and squash the > pipeline .. > DIffs: > In samv7/Makedefs > > -HEAD_ASRC = > +HEAD_ASRC = sam_head.S > > > In samv7/sam_start.c > > -const uintptr_t g_idle_topstack = HEAP_BASE; > +//const uintptr_t g_idle_topstack = HEAP_BASE; > > -void __start(void) > +void arm_boot(void) > > Copy attached asm file into samv7 directory and rebuild. > > > Anyhow, it boots, but no difference - still get that exception_common with > a FLASH address... I will have to dig deeper but > do please try the attached and see if it works for you or I missed > something... changes are trivial, it is > a basic m7 copy flash to ram like the armv7-r > > Oh yes, related, I was also able to catch an interrupt with symbols: > > Program received signal SIGINT, Interrupt. > up_doirq (irq=3, regs=0x20402534 <g_intstackalloc+1844>) at > armv7-m/up_doirq.c:58 > 58 { > (gdb) up > #1 0x00400a00 in exception_common () at armv7-m/gnu/up_lazyexception.S:237 > 237 bl up_doirq /* R0=IRQ, R1=register save (msp) */ > (gdb) up > Initial frame selected; you cannot go up. > (gdb) down > #0 up_doirq (irq=3, regs=0x20402534 <g_intstackalloc+1844>) at > armv7-m/up_doirq.c:58 > 58 { > (gdb) > > up_irq in ram but exception_common still in flash, I wonder why we hit > that IRQ (Hardfault). > > Thanks and let me know what you think. > > Best regards > -James > > > > On Fri, Dec 9, 2022 at 2:24 AM Petro Karashchenko < > petro.karashche...@gmail.com> wrote: > >> In order to have the possibility to reprogram the whole internal flash you >> will need to implement CONFIG_BOOT_COPYTORAM option in sam_start.c and >> create a proper linker script. >> Maybe even you will need to move the __start routine to the assembly file >> because after copying code to RAM you will need to drain the instruction >> pipeline before jumping to relocated code and that will require making >> sure >> that start-up is done in position independent code and just to the >> relocated code will not use relative offset jumps. >> >> Best regards, >> Petro >> >> пт, 9 груд. 2022 р. о 12:18 Petro Karashchenko < >> petro.karashche...@gmail.com> >> пише: >> >> > Hi, >> > >> > Finally I was able to take a look here. The case is that armv7-m (and >> some >> > other ARM versions) do not use arm_head.S and __start entry points are >> > implemented in C code and CONFIG_BOOT_COPYTORAM option is not >> implemented, >> > so code is always executed from internal flash. So when you are trying >> to >> > erase all internal flash you are getting an exception and that is >> expected. >> > Currently the CONFIG_ARCH_RAMFUNCS only copies functions marked with >> > __ramfunc__ attribute. The internal flash access APIs should be in SRAM >> > because that is a requirement of flash access, uness IAP is used to >> access >> > flash. I will try to push the IAP version and remove many of EEFC APIs. >> > >> > The MCUboot variant works because MCUboot is located at the separate >> flash >> > partition and erase/reprogram only application slots. I mean that >> MCUboot >> > can't update itself. >> > >> > Even having CONFIG_ARCH_RAMVECTORS enabled you will not be able to >> > reprogram the whole internal flash because of the above. >> > >> > Best regards, >> > Petro >> > >> > пт, 9 груд. 2022 р. о 07:56 David Sidrane <david.sidr...@nscdg.com> >> пише: >> > >> >> Have you ensured that all the code (and support code, systic etc) is in >> >> RAM? >> >> >> >> Also, Is this an ECCed FLASH? Is the write size correct? We must line >> >> cache >> >> the writes on some parts in the PX4 bootloader. >> >> >> >> >> >> >> https://github.com/PX4/PX4-Autopilot/blob/main/platforms/nuttx/src/bootloader/common/lib/flash_cache.c >> >> >> >> >> >> David >> >> -----Original Message----- >> >> From: James Dougherty <jafr...@gmail.com> >> >> Sent: Friday, December 9, 2022 12:46 AM >> >> To: dev@nuttx.apache.org >> >> Subject: Re: SAM-E70 progmem - in system programming and RAMFUNCS >> >> >> >> Thank you Greg, Thank you David! >> >> >> >> I did check that is correct: >> >> >> >> arch/arm/src/samv7/sam_start.c - 344:356 >> >> >> >> /* Copy any necessary code sections from FLASH to RAM. The correct >> >> * destination in SRAM is geive by _sramfuncs and _eramfuncs. The >> >> * temporary location is in flash after the data initialization code >> >> * at _framfuncs. This should be done before sam_clockconfig() is >> >> * called (in case it has some dependency on initialized C >> variables). >> >> */ >> >> >> >> #ifdef CONFIG_ARCH_RAMFUNCS >> >> for (src = &_framfuncs, dest = &_sramfuncs; dest < &_eramfuncs; ) >> >> { >> >> *dest++ = *src++; >> >> } >> >> #endif >> >> >> >> Also looks correct - in: same70-xplained/samv7-scripts/flash-sram.ld - >> >> 36:113 >> >> >> >> /* The SAME70Q21 has 2048Kb of FLASH beginning at address 0x0040:0000 >> and >> >> * 384Kb of SRAM beginining at 0x2040:0000 >> >> * >> >> * When booting from FLASH, FLASH memory is aliased to address >> 0x0000:0000 >> >> * where the code expects to begin execution by jumping to the entry >> point >> >> in >> >> * the 0x0400:0000 address range (Assuming that ITCM is not enable). >> >> */ >> >> >> >> MEMORY >> >> { >> >> flash (rx) : ORIGIN = 0x00400000, LENGTH = 2048K sram (rwx) : ORIGIN = >> >> 0x20400000, LENGTH = 384K } >> >> >> >> OUTPUT_ARCH(arm) >> >> EXTERN(_vectors) >> >> ENTRY(_stext) >> >> >> >> SECTIONS >> >> { >> >> .text : { >> >> _stext = ABSOLUTE(.); >> >> *(.vectors) >> >> *(.text .text.*) >> >> *(.fixup) >> >> *(.gnu.warning) >> >> *(.rodata .rodata.*) >> >> *(.gnu.linkonce.t.*) >> >> *(.glue_7) >> >> *(.glue_7t) >> >> *(.got) >> >> *(.gcc_except_table) >> >> *(.gnu.linkonce.r.*) >> >> _etext = ABSOLUTE(.); >> >> } > flash >> >> >> >> .init_section : { >> >> _sinit = ABSOLUTE(.); >> >> *(.init_array .init_array.*) >> >> _einit = ABSOLUTE(.); >> >> } > flash >> >> >> >> .ARM.extab : { >> >> *(.ARM.extab*) >> >> } > flash >> >> >> >> __exidx_start = ABSOLUTE(.); >> >> .ARM.exidx : { >> >> *(.ARM.exidx*) >> >> } > flash >> >> __exidx_end = ABSOLUTE(.); >> >> >> >> _eronly = ABSOLUTE(.); >> >> >> >> .data : { >> >> _sdata = ABSOLUTE(.); >> >> *(.data .data.*) >> >> *(.gnu.linkonce.d.*) >> >> CONSTRUCTORS >> >> _edata = ABSOLUTE(.); >> >> } > sram AT > flash >> >> >> >> .ramfunc ALIGN(4): { >> >> _sramfuncs = ABSOLUTE(.); >> >> *(.ramfunc .ramfunc.*) >> >> _eramfuncs = ABSOLUTE(.); >> >> } > sram AT > flash >> >> >> >> _framfuncs = LOADADDR(.ramfunc); >> >> >> >> .bss : { >> >> _sbss = ABSOLUTE(.); >> >> *(.bss .bss.*) >> >> *(.gnu.linkonce.b.*) >> >> *(COMMON) >> >> _ebss = ABSOLUTE(.); >> >> } > sram >> >> >> >> To David's point, I looked at NVIC since I have CONFIG_ARCH_RAMVECTORS. >> >> arm/src/samv7/samv7_irq.c >> >> >> >> #ifdef CONFIG_ARCH_RAMVECTORS >> >> /* If CONFIG_ARCH_RAMVECTORS is defined, then we are using a >> RAM-based >> >> * vector table that requires special initialization. >> >> */ >> >> >> >> up_ramvec_initialize(); >> >> #endif >> >> >> >> arm/src/armv7-m/up_ramvec_initialize.c >> >> after we copy the ram vectors: >> >> >> >> /* Now configure the NVIC to use the new vector table. */ >> >> putreg32((uint32_t)g_ram_vectors, NVIC_VECTAB); >> >> >> >> and after sam_bringup.c >> >> >> >> printf("NVIC: 0x%08x\n", getreg32(NVIC_VECTAB)); >> >> >> >> NVIC: 0x20401180 >> >> >> >> Looks good. >> >> >> >> And yes, still hitting flash on exception: >> >> >> >> flash_erasell /dev/mtd0 >> >> >> >> Whammo - hardfault in openocd monitor: >> >> >> >> target halted due to debug-request, current mode: Handler HardFault >> >> xPSR: 0x81000003 pc: 0x00401114 msp: 0x204025e8 >> >> >> >> Try to flash the lower 256KB of flash, works like a champ: >> >> >> >> nsh> sdflash 0x440000 /mnt/sdcard/nuttx.bin / >> >> >> >> >> .............................................................................. >> >> >> >> >> .............................................................................. >> >> >> .......................................................................... >> >> Installed application of size 233692 bytes to program memory [440000h - >> >> 4790dch]. >> >> nsh> reboot >> >> >> >> So tomorrow, I will maybe move the image to another location in flash >> and >> >> hack up the linker script. >> >> Also do a detailed read on the errata, Petro mentioned there is some >> >> possible chip bug, maybe that is it .. >> >> There is some nasty Komodo dragon lurking in there, hissing and >> snapping >> >> at >> >> ankles ... SAMV7 doesn't work like an STM32F1/F4/F7 which all work >> >> perfectly >> >> on this codebase.. could also be a timing issue - 300Mhz core clock and >> >> 150Mhz AHB clock, I will try to slow it down and change the flash wait >> >> states also ... maybe a bus error is occuring. >> >> >> >> I will pick this up again tomorrow, any ideas, please share! >> >> >> >> Thank you for your time and attention to this issue... >> >> -James >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> On Thu, Dec 8, 2022 at 7:57 AM Gregory Nutt <spudan...@gmail.com> >> wrote: >> >> >> >> > On 12/8/2022 5:55 AM, David Sidrane wrote: >> >> > > Is the NVIC_VTABLE repointed to the RAM vectors? >> >> > >> >> > The RAM functions are like .bss: There is a storage area of code >> that >> >> > that is copied into RAM only power up. But the symbols associated >> >> > with the RAMFUNCs are defined by the linker script to be the address >> >> > of the RAM destination, not the address of the FLASH copy-source >> storage >> >> > area: >> >> > >> >> > 186 /* Copy any necessary code sections from FLASH to RAM. The >> >> correct >> >> > 187 * destination in SRAM is geive by _sramfuncs and _eramfuncs. >> The >> >> > 188 * temporary location is in flash after the data initialization >> >> code >> >> > 189 * at _framfuncs. This should be done before >> sam_clockconfig() is >> >> > 190 * called (in case it has some dependency on initialized C >> >> > variables). >> >> > 191 */ >> >> > 192 >> >> > 193 #ifdef CONFIG_ARCH_RAMFUNCS >> >> > 194 for (src = (const uint32_t *)_framfuncs, >> >> > 195 dest = (uint32_t *)_sramfuncs; dest < (uint32_t >> *)_eramfuncs; >> >> > 196 ) >> >> > 197 { >> >> > 198 *dest++ = *src++; >> >> > 199 } >> >> > 200 #endif >> >> > >> >> > >> >> >> > >> >