This is the mail archive of the ecos-discuss@sourceware.org mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: redboot on STM3240G-EVAL board


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]