FreeCalypso > hg > fc-selenite
comparison doc/Developer-notes @ 129:3055bcff8050
doc/Developer-notes written
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Fri, 09 Nov 2018 03:04:02 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 128:24a161f415f5 | 129:3055bcff8050 |
|---|---|
| 1 The present article is a Selenite-specific addendum to the TCS211-fw-arch | |
| 2 document in the freecalypso-docs repository; the latter document needs to be | |
| 3 read first before this one. Also because FC Selenite is derived from FC | |
| 4 Magnetite, you should also read the Developer-notes document in the fc-magnetite | |
| 5 source repository before the present one. | |
| 6 | |
| 7 Source tree layout | |
| 8 ================== | |
| 9 | |
| 10 The principal difference between Magnetite and Selenite in terms of the source | |
| 11 tree layout is that Magnetite supports building two different code base variants | |
| 12 (either pure TCS211 with G23M PS blobs or our FreeCalypso signature TCS2/TCS3 | |
| 13 hybrid), whereas Selenite only supports the hybrid code base. Dropping support | |
| 14 for the non-hybrid version is necessary in order to have a saner code base for | |
| 15 new forward developments such as the compiler migration to gcc (the objective | |
| 16 of FC Selenite) or the future planned UI development work which will be done in | |
| 17 yet another to-be-created source tree after we build the necessary hardware. | |
| 18 | |
| 19 The source tree change is the elimination of parallel versions: in Magnetite we | |
| 20 have to maintain two parallel versions for many firmware components, whereas in | |
| 21 Selenite there is only one version, the one corresponding to our FreeCalypso | |
| 22 signature TCS2/TCS3 hybrid explained in the TCS211-fw-arch document. | |
| 23 | |
| 24 The directories under src/ are now as follows: | |
| 25 | |
| 26 condat | |
| 27 | |
| 28 This subtree is the amalgamation of condat2 and condat3 from Magnetite, | |
| 29 hybridized as detailed in the TCS211-fw-arch document. | |
| 30 | |
| 31 cs | |
| 32 | |
| 33 This subtree is an import of chipsetsw from TCS211, plus our own | |
| 34 reconstruction of those parts of TCS211 chipsetsw which were censored | |
| 35 out in our starting copy: src/cs/layer1, src/cs/system/main and the | |
| 36 src/cs/system/bootloader/src stub. | |
| 37 | |
| 38 This subtree is kept in sync with Magnetite as much as possible; the | |
| 39 diffs from Magnetite are to support gcc and the new version of Nucleus. | |
| 40 | |
| 41 g23m-aci | |
| 42 g23m-fad | |
| 43 g23m-gprs | |
| 44 g23m-gsm | |
| 45 | |
| 46 These directories contain the new TCS3 version of the G23M PS+ACI code | |
| 47 realm for our blob-free hybrid. The directory layout comes directly | |
| 48 from our TCS3.2 source from Peek/FGW: TI previously kept all G23M code | |
| 49 under g23m/condat/ms/src, but then they moved to these new g23m-* | |
| 50 directories which I (Mother Mychaela) like for their shortness, so we | |
| 51 enthusiastically kept the new directory layout. Only two pieces still | |
| 52 resided under g23m/condat/ms/src in our TCS3.2 source: ati_ext and upm, | |
| 53 which we moved into g23m-aci and g23m-gprs, respectively, where they | |
| 54 properly belong. Just like in Magnetite, our TCS2/TCS3 hybrid uses the | |
| 55 TCS2 version of ALR; in Selenite it has been moved to g23m-gsm/alr2. | |
| 56 | |
| 57 These directories are kept in sync with Magnetite as much as possible; | |
| 58 the diffs from Magnetite are fixes (band-aids in some cases) to pass | |
| 59 compilation with gcc. | |
| 60 | |
| 61 gpf | |
| 62 | |
| 63 This subtree is the amalgamation of gpf2 and gpf3 from Magnetite; see | |
| 64 TCS211-fw-arch for the explanation of how our version of GPF has been | |
| 65 reconstructed from the surviving bits and pieces. One additional change | |
| 66 is that the old Nucleus header files have been moved out of the way so | |
| 67 that we always use the new Nucleus headers without ambiguity or | |
| 68 conflict. | |
| 69 | |
| 70 libsys | |
| 71 | |
| 72 This library is specific to the gcc-built configuration. We use newlib | |
| 73 that is built as part of our gcc toolchain (see Toolchain-setup-gcc) as | |
| 74 our libc implementation for the most part, but for a few functions we | |
| 75 are not able to use newlib's implementation because it uses malloc or | |
| 76 depends on a Unix syscall environment which we don't have; libsys | |
| 77 provides our own replacements for these few libc functions. | |
| 78 | |
| 79 nucleus | |
| 80 | |
| 81 We use a non-TI-sourced version of Nucleus from Comrade XVilka; because | |
| 82 it does not come from any of our TI-sourced components, it gets its own | |
| 83 top-level source directory. | |
| 84 | |
| 85 Assembly code pieces | |
| 86 ==================== | |
| 87 | |
| 88 Like any other software that runs on the bare metal as opposed to an application | |
| 89 under some high-level OS like Linux, our FreeCalypso GSM fw necessarily includes | |
| 90 some assembly code pieces in addition to the main body of C code. The | |
| 91 differences between TI's TMS470 and GNU ARM environments and ABIs are great, | |
| 92 hence entirely different versions of all assembly code pieces and linker script | |
| 93 magic are needed between the two. For the TMS470 compiler environment all | |
| 94 assembly code pieces and linker scripts are essentially unchanged from TI's | |
| 95 TCS211, whereas for the gcc version all assembly code is entirely new. This | |
| 96 assembly code and other support pieces that are specific to the gcc environment | |
| 97 (see libsys above) originate from our first attempts at gcc-built GSM fw from | |
| 98 the 2013-2015 timeframe. | |
| 99 | |
| 100 The use of two entirely independent assembly code implementations between the | |
| 101 two compiler environments gives rise to some minor architectural differences: | |
| 102 the new gcc version takes the approach of routing interrupts and exceptions | |
| 103 through the Calypso internal ROM (on all targets in both flashed and RAM-loaded | |
| 104 builds) and uses flash boot mode 0 instead of flash boot mode 1 on the sensible | |
| 105 non-Compal targets. Both of these design decisions require that the Calypso | |
| 106 chip version be one of the new ones with boot ROM version 0300 (the one with | |
| 107 all of the earlier bugs fixed); this requirement poses no problem for our own | |
| 108 FreeCalypso hw and for the use case of running FreeCalypso fw on the historical | |
| 109 hw from Motorola, Openmoko and Pirelli, but if anyone besides the Mother has an | |
| 110 ancient D-Sample or Leonardo board with a Calypso C05 chip on it, those boards | |
| 111 cannot run Selenite-gcc. | |
| 112 | |
| 113 Configuration and build system | |
| 114 ============================== | |
| 115 | |
| 116 The configuration and build system of FC Selenite is based on that of Magnetite; | |
| 117 please read the Developer-notes document in the fc-magnetite source repository. | |
| 118 | |
| 119 The first difference from Magnetite is that Selenite does not have overall fw | |
| 120 configuration recipes like Magnetite has in configs/* - instead the recipe for | |
| 121 the hybrid modem configuration (the only config in the Magnetite sense that is | |
| 122 supported in Selenite) has been incorporated into the new configure-gcc.sh | |
| 123 and configure-tms470.sh scripts. The selection of which components will be | |
| 124 included or excluded is driven by GPRS, SRVC and FCHG_STATE config variables - | |
| 125 these config vars exist in Magnetite too, but in Selenite they can be set by | |
| 126 the user on the configure command line. | |
| 127 | |
| 128 The individual component build recipes in components/* are similar between | |
| 129 Magnetite and Selenite, but the following aspects are different: | |
| 130 | |
| 131 * There are no component variants: for each given foo.lib (TMS470) or foo.a | |
| 132 (gcc) firmware component, there is only one components/foo recipe. | |
| 133 | |
| 134 * Except for a few gcc-specific components and one TMS470-specific component | |
| 135 (the empty bootloader stub, see TCS211-fw-arch), every components/foo recipe | |
| 136 has to work for both TMS470 and gcc environments. The CFLAGS Bourne shell | |
| 137 variable is for TI's cl470 compiler, CFLAGS_gcc is for gcc, and CPPFLAGS are | |
| 138 common for both. | |
| 139 | |
| 140 * The shell function call for compiling C source files is c_file, replacing | |
| 141 Magnetite's cfile_plain and cfile_str2ind - there is no support for str2ind | |
| 142 in Selenite. | |
| 143 | |
| 144 Because there is no hybrid vs. classic TCS211 dichotomy in Selenite, there are | |
| 145 no more header file selection shell variables - see the ex script in | |
| 146 scripts/convert-from-magnetite.ex for the idea. |
