FreeCalypso > hg > freecalypso-tools
comparison doc/Binary-file-formats @ 676:b6b8307d195b
doc: new articles Binary-file-formats and Flash-programming
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 08 Mar 2020 22:15:57 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
675:8b1e86dcc3ac | 676:b6b8307d195b |
---|---|
1 In FreeCalypso we use 3 different file formats for Calypso binary images, i.e., | |
2 code images to be loaded into either flash or RAM or retrieved flash dumps. | |
3 These 3 different file formats are straight binary (*.bin), moko-style m0 (*.m0) | |
4 and little-endian S-records (*.srec). | |
5 | |
6 Straight binary (*.bin) | |
7 ======================= | |
8 | |
9 Straight binary is our preferred format for flash dumps. It is written in the | |
10 native little-endian byte order of the Calypso ARM7 processor, i.e., the order | |
11 of bytes in the raw binary file directly corresponds to incrementing byte | |
12 addresses as visible to the ARM7 - any ASCII strings in the image thus appear | |
13 naturally. We also use the same straight binary format in native LE byte order | |
14 for flashable code images generated with the gcc+binutils toolchain (as opposed | |
15 to TI's TMS470), generated with arm-elf-objcopy -O binary - although we don't | |
16 have too many such code images currently given that neither FC Citrine nor FC | |
17 Selenite ever achieved production quality. | |
18 | |
19 Another unrelated use of this straight binary format is for RAM-loadable code | |
20 images that are fed to Compal's bootloader (Motorola C1xx and Sony Ericsson | |
21 J100) as opposed to Calypso boot ROM. Our generally preferred image format for | |
22 RAM-loadable code pieces is little-endian S-records (*.srec, see below), but | |
23 for Compal's bootloader we use straight binary instead because of the way this | |
24 bootloader protocol works. | |
25 | |
26 moko-style m0 | |
27 ============= | |
28 | |
29 This format is a variant of Motorola hex (S-records), a variant invented by TI | |
30 rather than by us. This format is produced by TI's hex470 tool when run with | |
31 -m -memwidth 16 -romwidth 16 options, which is the configuration used by TI in | |
32 the Calypso program, and is read by TI's flash programming tool called FLUID. | |
33 TI used this format not only for flashable firmware images, but also for various | |
34 RAM-loadable code pieces, particularly those that comprise the target-side | |
35 component of FLUID. | |
36 | |
37 The special quirk of this S-record variant format is its peculiar byte order. | |
38 TI viewed it as "16-bit hex", meaning that the image is logically viewed as | |
39 consisting of 16-bit words rather than 8-bit bytes, each S3 record carries an | |
40 even number of bytes to be loaded at an even address, and each 16-bit word | |
41 (4 hex digits) appears in these S3 records with its most-significant hex nibble | |
42 toward the left, just like the address field of each S-record. But if this | |
43 image gets interpreted by some more naive tool (for example, objcopy from GNU | |
44 binutils) as bytes rather than 16-bit words, the result will be a reversed byte | |
45 order, with all strings etc messed up. | |
46 | |
47 In FreeCalypso we use this moko-style m0 format (our new name for what TI called | |
48 16-bit hex) only for flashable firmware images built with TI's TMS470 toolchain | |
49 (can be our own FC Magnetite or historical ones built by Openmoko or other | |
50 similar historical vendors), but never for any RAM-loadable code pieces - we use | |
51 little-endian SREC for the latter as explained below. | |
52 | |
53 And what about the name? Why do we call it moko-style m0 rather than just m0? | |
54 The reason is because Compal muddied our waters by introducing their own *.m0 | |
55 files that were generated with -memwidth 8 -romwidth 8 instead of -memwidth 16 | |
56 -romwidth 16, producing 8-bit hex instead of 16-bit hex. We do not support | |
57 Compal's different *.m0 files at all, and we needed some name to specifically | |
58 identify TI-style m0 files rather than Compal-style. We ended up with the name | |
59 moko-style rather than TI-style because we already had our mokosrec2bin program | |
60 going back to 2013-04-15, one of the very first programs written in the | |
61 FreeCalypso family of projects: our very first encounter with this file format | |
62 were mokoN firmware images put out in this *.m0 format by That Company. | |
63 | |
64 Little-endian S-records (*.srec) | |
65 ================================ | |
66 | |
67 Back at the beginning of FreeCalypso in the spring/summer of 2013 I (Mother | |
68 Mychaela) decided to use S-records instead of straight binary for our | |
69 RAM-loadable code pieces, i.e., code that is loaded into RAM either through the | |
70 Calypso boot ROM (fc-iram) or by chain-loading via loadagent (fc-xram). I made | |
71 this decision based on two factors: | |
72 | |
73 1) ARM code generated by common toolchains (both TI's TMS470 and gcc+binutils) | |
74 without special contortions is not position-independent: a code image that | |
75 was linked for a given address needs to be loaded at that specific address, | |
76 not some other. | |
77 | |
78 2) An S-record image has its load address embedded in the image itself, whereas | |
79 a raw binary naturally does not carry any such extra metadata. | |
80 | |
81 With SREC as the standardized hand-off format from code generation tools to | |
82 loadtools, the choice of load address is made entirely on the code generation | |
83 side; loadtools do not impose a fixed load address, nor do they require it to | |
84 be communicated via extra command line arguments or options. | |
85 | |
86 However, the variant of SREC we use for RAM-loadable code pieces is not the same | |
87 as moko-style m0 - the byte order is the opposite, with our RAM-loadable code | |
88 pieces using the native little-endian byte order of the ARM7 processor as the | |
89 byte order within S3 records. Prior to the introduction of RAM-loadable FC | |
90 Magnetite fw images for Pirelli DP-L10 in late 2016 (and then likewise for our | |
91 own FCDEV3B), the only RAM-loadable code pieces we have had were built with | |
92 gcc+binutils, not with TMS470, and GNU binutils got a different take on the | |
93 S-record format than TI did: they generate byte-oriented SREC files, with the | |
94 byte order being the same as it would be in a straight binary file, matching | |
95 the target processor's memory byte addressing order. Thus GNU-style SREC has | |
96 been adopted as the format for our RAM-loadable code images for both fc-iram | |
97 and fc-xram, as opposed to TI-style SREC aka moko-style m0. The convention we | |
98 have adopted is that *.m0 filename suffix means TI-style aka moko-style, | |
99 whereas *.srec means GNU-style. | |
100 | |
101 Besides the S3 record byte order, there is one other difference between TI-built | |
102 *.m0 code images and GNU-built *.srec ones: the final S7 record carries the | |
103 entry point address in GNU-built *.srec images, whereas TI's *.m0 images always | |
104 have a zero dummy address in there. Our fc-iram and fc-xram tools require the | |
105 real entry point address in the S7 record. | |
106 | |
107 How do we generate ramimage.srec RAM-loadable images for fc-xram in FC | |
108 Magnetite? Answer: FC Magnetite build system includes a special ad hoc | |
109 converter program that reads ramimage.m0 produced by TI's hex470 tool and | |
110 produces ramimage.srec: it reverses the order of bytes, adds another S3 record | |
111 that writes the boot-ROM-redirected interrupt and exception vectors and | |
112 generates an S7 record with the right entry point address. | |
113 | |
114 This little-endian *.srec format is actively used only for RAM-loadable code | |
115 pieces in FreeCalypso, not for anything that goes into or gets read from flash. | |
116 We do have flash dump2srec and flash program-srec commands in fc-loadtool, they | |
117 were implemented back in the founding stage of FreeCalypso in 2013 for the sake | |
118 of completeness and symmetry (it seemed right to support both binary and | |
119 S-record formats), but they never got any practical use: if you are making a | |
120 flash dump, you would normally want to examine it afterward, and any such | |
121 examination almost always needs a straight binary image, not S-records. |