[ECOS] redboot on STM3240G-EVAL board

Oleg Uzenkov o.uzenkov@unicore.co.ua
Fri Oct 10 08:52:00 GMT 2014


Thanks Sergei,

>>> ELF files are quite large, what is the preferred format for an image
>>> to be passed to redboot?  what "load" and "fis create" command look
>>> like?
>>> **Roughly** speaking, you save .text segment in FLASH (adjusted to
>>> flash block erase size), you save not ELF image! So, do not mess
>>> with binaries. Also `load' command does not carry whole ELF image
>>> into RAM, but .text segment with a few other segments.
>> The thing is:
>> I will need to work with files (new firmware should arrive to sdcard
>> on the board through ftp in a main app). I want redboot to pick a new
>                 ^^^^^^^^^^^
>> image up from sdcard at reset.
> If your board has Ethernet, then you can build RedBoot with networking
> support and use TFTP or HTTP protocols to load firmware blobs from the
> NET. Why not? Or you talk about "main app" on a host side?

No there is no Ethernet chip. I have GPRS modem on the board and I use 
LWIP 1.3.2 stack from eCos. FTP is to be custom made using RAW sockets.

>> Extracting sections from received ELF file and transferring them to
>> redboot is more of a manual work.
>> So, I think I am kind of stuck with ELF files.
>>
>> So I am thinking:
>>
>> * Should I load compressed ELF file (gzip) with -d switch?
>>
>> * Should I load SREC file (they are usually smaller than ELF)?
> If you talk about eCos executables (to load) then regardless of the
> source format you have to keep in a place only sections with LOAD
> attribute. Look
>
>    stat -c %s install/tests/kernel/current/tests/tm_basic
>    608261
>
> Thus, ELF size is 608K. Let's get a binary to load (in RAM for my case)
>
>    arm-eabi-objcopy -O binary install/tests/kernel/current/tests/tm_basic{,.bin}
>    stat -c %s install/tests/kernel/current/tests/tm_basic.bin
>    47248
>
> Binary image size is 47K or exactly 47248 bytes. What that 47K is? Let's
> print all section's headers of ELF
>
>    arm-eabi-objdump -h install/tests/kernel/current/tests/tm_basic
>
> You will see all sections its sizes, locations and even more. But we
> need to load only the sections which have attribute *LOAD* (not bad
> name for 'load' command). Filter those sections
>
>    arm-eabi-objdump -h install/tests/kernel/current/tests/tm_basic | grep LOAD -B1
>      8 .rom_vectors  00000040  81008000  81008000  00008000  2**2
>                      CONTENTS, ALLOC, LOAD, READONLY, CODE
>      9 .text         0000a704  81008040  81008040  00008040  2**2
>                      CONTENTS, ALLOC, LOAD, READONLY, CODE
>     10 .rodata       00000e60  81012744  81012744  00012744  2**2
>                      CONTENTS, ALLOC, LOAD, READONLY, DATA
>     11 .data         000002ec  810135a4  810135a4  000135a4  2**2
>                      CONTENTS, ALLOC, LOAD, DATA
>
> Let's calculate sum of all sizes
>
>    echo "ibase=16; 40+A704+E60+2EC" | bc
>    47248
>
> We got exactly 47248 bytes. Again, regardless source file format (srec,
> elf, bin) you have to save on a media *at least* those *LOAD* bytes and
> you (or loader) have to know all LMA (Load Memory Address) addresses to
> relocate the sections (if that is needed) in the right places.
>
>> * Should I save executable sections and store them in a file. Transfer
>> that file to sdcard for redboot to pick it up at reset.  (nor sure how
>> to do it actually)
>   
> What do you want to save? SD card space? Internal FLASH space? Loading
> time?
>

I meant saving *LOAD* bytes in a file and sending that file to the board 
via ftp.
Not sure how to specify that info, i.e. what to get from a file (section 
addresses and sizes) and where to relocate them in memory (LMA).
ELF contains this info.

>> * Can I actually load a .bin (image in binary format)?
> Yes, you can. You would even manage the loading of compressed binary images
> (.bin.gz).
Oh, that sounds promising.

But I am unable to load .bin with "load -m x" and create fis with "fis 
create <name>"

RedBoot> load -m x
CUnrecognized image type: 0x64200000
xyzModem - CRC mode, 32(SOH)/0(STX)/0(CAN) packets, 4 retries
RedBoot> fis create appbin
*** invalid 'fis' command: required parameter missing
...

What is the correct usage of "load" and "fis create" when you deal with 
.bin file?
(Perhaps I need to specify switches, not sure which ones. Sorry for 
being dumb )) )

info about my app.bin:

Entry point address:               0x64008111 (from elf file)

mlt_*.ldi file used:
SECTIONS
{
     SECTIONS_BEGIN
     SECTION_sram (sram, hal_virtual_vector_table_end, LMA_EQ_VMA)
     SECTION_rom_vectors (ram, 0x64008000, LMA_EQ_VMA)
     SECTION_RELOCS (ram, ALIGN (0x8), LMA_EQ_VMA)
     SECTION_text (ram, ALIGN (0x8), LMA_EQ_VMA)
     SECTION_fini (ram, ALIGN (0x8), LMA_EQ_VMA)
     SECTION_rodata (ram, ALIGN(0x8), LMA_EQ_VMA)
     SECTION_rodata1 (ram, ALIGN (0x8), LMA_EQ_VMA)
     SECTION_fixup (ram, ALIGN (0x8), LMA_EQ_VMA)
     SECTION_gcc_except_table (ram, ALIGN (0x8), LMA_EQ_VMA)
     SECTION_eh_frame (ram, ALIGN (0x8), LMA_EQ_VMA)
     SECTION_got (ram, ALIGN (0x8), LMA_EQ_VMA)
     SECTION_data (ram, ALIGN (0x8), LMA_EQ_VMA)
     SECTION_bss (ram, ALIGN (0x8), LMA_EQ_VMA)
     CYG_LABEL_DEFN(__heap1) = ALIGN (0x8);
     SECTIONS_END
}

> HTH
>
> Sergei


-- 
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss



More information about the Ecos-discuss mailing list