README.txt 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. README
  2. ^^^^^^
  3. This README file discusses the port of NuttX to the Embedded Artists
  4. EA3152 board.
  5. Contents
  6. ^^^^^^^^
  7. o Development Environment
  8. o GNU Toolchain Options
  9. o IDEs
  10. o NuttX buildroot Toolchain
  11. o Boot Sequence
  12. o Image Format
  13. o Image Download to ISRAM
  14. o Using OpenOCD and GDB
  15. o ARM/EA3152-specific Configuration Options
  16. o Configurations
  17. Development Environment
  18. ^^^^^^^^^^^^^^^^^^^^^^^
  19. Either Linux or Cygwin on Windows can be used for the development environment.
  20. The source has been built only using the GNU toolchain (see below). Other
  21. toolchains will likely cause problems.
  22. GNU Toolchain Options
  23. ^^^^^^^^^^^^^^^^^^^^^
  24. The NuttX make system has been modified to support the following different
  25. toolchain options.
  26. 1. The CodeSourcery GNU toolchain,
  27. 2. The devkitARM GNU toolchain,
  28. 3. Raisonance GNU toolchain,
  29. 4. The NuttX buildroot Toolchain (see below), or
  30. 5. Any generic arm-none-eabi GNU toolchain.
  31. All testing has been conducted using the NuttX buildroot toolchain. However,
  32. the make system is setup to default to use the devkitARM toolchain. To use
  33. the CodeSourcery, devkitARM or Raisonance GNU toolchain, you simply need to
  34. add one of the following configuration options to your .config (or defconfig)
  35. file:
  36. CONFIG_ARM_TOOLCHAIN_CODESOURCERYW=y : CodeSourcery under Windows
  37. CONFIG_ARM_TOOLCHAIN_CODESOURCERYL=y : CodeSourcery under Linux
  38. CONFIG_ARM_TOOLCHAIN_DEVKITARM=y : devkitARM under Windows
  39. CONFIG_ARM_TOOLCHAIN_BUILDROOT=y : NuttX buildroot under Linux or Cygwin (default)
  40. CONFIG_ARM_TOOLCHAIN_GNU_EABIL : Generic arm-none-eabi toolchain
  41. You may also have to modify the PATH environment variable if your make cannot
  42. find the tools.
  43. The toolchain may also be set using the kconfig-mconf utility (make menuconfig)
  44. or by passing CONFIG_ARM_TOOLCHAIN=<toolchain> to make, where <toolchain> is one
  45. of CODESOURCERYW, CODESOURCERYL, DEVKITARM, BUILDROOT or GNU_EABI as described
  46. above.
  47. NOTE: the CodeSourcery (for Windows), devkitARM, and Raisonance toolchains are
  48. Windows native toolchains. The CodeSourcey (for Linux) and NuttX buildroot
  49. toolchains are Cygwin and/or Linux native toolchains. There are several limitations
  50. to using a Windows based toolchain in a Cygwin environment. The three biggest are:
  51. 1. The Windows toolchain cannot follow Cygwin paths. Path conversions are
  52. performed automatically in the Cygwin makefiles using the 'cygpath' utility
  53. but you might easily find some new path problems. If so, check out 'cygpath -w'
  54. 2. Windows toolchains cannot follow Cygwin symbolic links. Many symbolic links
  55. are used in Nuttx (e.g., include/arch). The make system works around these
  56. problems for the Windows tools by copying directories instead of linking them.
  57. But this can also cause some confusion for you: For example, you may edit
  58. a file in a "linked" directory and find that your changes had no effect.
  59. That is because you are building the copy of the file in the "fake" symbolic
  60. directory. If you use a Windows toolchain, you should get in the habit of
  61. making like this:
  62. make clean_context all
  63. An alias in your .bashrc file might make that less painful.
  64. NOTE 1: The CodeSourcery toolchain (2009q1) does not work with default optimization
  65. level of -Os (See Make.defs). It will work with -O0, -O1, or -O2, but not with
  66. -Os.
  67. NOTE 2: The devkitARM toolchain includes a version of MSYS make. Make sure that
  68. the paths to Cygwin's /bin and /usr/bin directories appear BEFORE the devkitARM
  69. path or will get the wrong version of make.
  70. Generic arm-none-eabi GNU Toolchain
  71. -----------------------------------
  72. There are a number of toolchain projects providing support for ARMv4/v5
  73. class processors, including:
  74. GCC ARM Embedded
  75. https://developer.arm.com/open-source/gnu-toolchain/gnu-rm
  76. Summon ARM Toolchain
  77. https://github.com/esden/summon-arm-toolchain
  78. Yagarto
  79. http://www.yagarto.de
  80. Others exist for various Linux distributions, MacPorts, etc. Any version
  81. based on GCC 4.6.3 or later should work.
  82. IDEs
  83. ^^^^
  84. NuttX is built using command-line make. It can be used with an IDE, but some
  85. effort will be required to create the project
  86. Makefile Build
  87. --------------
  88. Under Eclipse, it is pretty easy to set up an "empty makefile project" and
  89. simply use the NuttX makefile to build the system. That is almost for free
  90. under Linux. Under Windows, you will need to set up the "Cygwin GCC" empty
  91. makefile project in order to work with Windows (Google for "Eclipse Cygwin" -
  92. there is a lot of help on the internet).
  93. Native Build
  94. ------------
  95. Here are a few tips before you start that effort:
  96. 1) Select the toolchain that you will be using in your .config file
  97. 2) Start the NuttX build at least one time from the Cygwin command line
  98. before trying to create your project. This is necessary to create
  99. certain auto-generated files and directories that will be needed.
  100. 3) Set up include pathes: You will need include/, arch/arm/src/lpc31xx,
  101. arch/arm/src/common, arch/arm/src/arm, and sched/.
  102. 4) All assembly files need to have the definition option -D __ASSEMBLY__
  103. on the command line.
  104. Startup files will probably cause you some headaches. The NuttX startup file
  105. is arch/arm/src/lpc31xx/lpc31_vectors.S. You may have to build NuttX
  106. one time from the Cygwin command line in order to obtain the pre-built
  107. startup object needed by an IDE.
  108. NuttX buildroot Toolchain
  109. ^^^^^^^^^^^^^^^^^^^^^^^^^
  110. A GNU GCC-based toolchain is assumed. The PATH environment variable should
  111. be modified to point to the correct path to the Cortex-M3 GCC toolchain (if
  112. different from the default in your PATH variable).
  113. If you have no Cortex-M3 toolchain, one can be downloaded from the NuttX
  114. Bitbucket download site (https://bitbucket.org/nuttx/buildroot/downloads/).
  115. This GNU toolchain builds and executes in the Linux or Cygwin environment.
  116. 1. You must have already configured Nuttx in <some-dir>/nuttx.
  117. cd tools
  118. ./configure.sh ea3152/<sub-dir>
  119. 2. Download the latest buildroot package into <some-dir>
  120. 3. unpack the buildroot tarball. The resulting directory may
  121. have versioning information on it like buildroot-x.y.z. If so,
  122. rename <some-dir>/buildroot-x.y.z to <some-dir>/buildroot.
  123. 4. cd <some-dir>/buildroot
  124. 5. cp configs/arm926t-defconfig-4.2.4 .config
  125. 6. make oldconfig
  126. 7. make
  127. 8. Make sure that the PATH variable includes the path to the newly built
  128. binaries.
  129. See the file configs/README.txt in the buildroot source tree. That has more
  130. detailed PLUS some special instructions that you will need to follow if you are
  131. building a Cortex-M3 toolchain for Cygwin under Windows.
  132. Boot Sequence
  133. ^^^^^^^^^^^^^
  134. LPC315x has on chip bootrom which loads properly formatted images from multiple
  135. sources into SRAM. These sources include including SPI Flash, NOR Flash, UART,
  136. USB, SD Card, and NAND Flash.
  137. In all configurations, NuttX is loaded directly into ISRAM. NuttX is linked
  138. to execute from ISRAM, regardless of the boot source.
  139. Image Format
  140. ^^^^^^^^^^^^
  141. In order to use the bootrom bootloader, a special header must be added to the
  142. beginning of the binary image that includes information about the binary (things
  143. like the entry point, the size, and CRC's to verify the image.
  144. NXP provides a Windows program to append such a header to the binary image.
  145. However, (1) that program won't run under Linux, and (2) when I try it under
  146. WinXP, Symantec immediately claims that the program is misbehaving and deletes
  147. it!
  148. To work around both of these issues, I have created a small program under
  149. configs/ea3152/tools to add the header. This program can be built under
  150. either Linux or Cygwin (and probably other tool environments as well). That
  151. tool can be built as follows:
  152. - cd configs/ea3152/tools
  153. - make
  154. Then, to build the NuttX binary ready to load with the bootloader, just
  155. following these steps:
  156. - cd tools/ # Configure Nuttx
  157. - ./configure.sh ea3152/ostest # (using the ostest configuration for this example)
  158. - cd .. # Set up environment
  159. - make # Make NuttX. This will produce nuttx.bin
  160. - mklpc.sh # Make the bootloader binary (nuttx.lpc)
  161. NOTES:
  162. 1. You will need to set your PATH variable appropriately or use the full path
  163. to mklpc.sh in the final step.
  164. 2. You can instruct Symantec to ignore the errors and it will stop quarantining
  165. the NXP program.
  166. 3. The CRC32 logic in configs/ea3152/tools doesn't seem to work. As a result,
  167. the CRC is currently disabled in the header:
  168. RCS file: /cvsroot/nuttx/nuttx/configs/ea3152/tools/lpchdr.c,v
  169. retrieving revision 1.2
  170. diff -r1.2 lpchdr.c
  171. 264c264
  172. < g_hdr.imageType = 0x0000000b;
  173. ---
  174. > g_hdr.imageType = 0x0000000a;
  175. Image Download to ISRAM
  176. ^^^^^^^^^^^^^^^^^^^^^^^
  177. Assuming that you already have the FTDI driver installed*, then here is the
  178. are the steps that I use for loading new code into the EA3152:
  179. - Create the bootloader binary, nuttx.lpc, as described above.
  180. - Connected the EA3152 using the FTDI USB port (not the lpc3152 USB port)
  181. This will power up the EA3152 and start the bootloader.
  182. - Start a terminal emulator (such as TeraTerm) at 115200 8NI.
  183. - Reset the EA3152 and you should see:
  184. LPC31xx READY FOR PLAIN IMAGE>
  185. - Send the nuttx.lpc file and you should see:
  186. Download finished
  187. That will load the NuttX binary into ISRAM and attempt to execute it.
  188. *See the LPC315x documentation if you do not have the FTDI driver installed.
  189. Using OpenOCD and GDB
  190. ^^^^^^^^^^^^^^^^^^^^^
  191. I have been using the Olimex ARM-USB-OCD JTAG debugger with the EA3152
  192. (http://www.olimex.com). The OpenOCD configuration file is here:
  193. tools/armusbocb.cfg. There is also a script on the tools directory that
  194. I used to start the OpenOCD daemon on my system called oocd.sh. That
  195. script would probably require some modifications to work in another
  196. environment:
  197. - possibly the value of OPENOCD_PATH
  198. - If you are working under Linux you will need to change any
  199. occurances of `cygpath -w blablabla` to just blablabla
  200. Then you should be able to start the OpenOCD daemon like:
  201. configs/ea3152/tools/oocd.sh $PWD
  202. Where it is assumed that you are executing oocd.sh from the top level
  203. directory where NuttX is installed.
  204. Once the OpenOCD daemon has been started, you can connect to it via
  205. GDB using the following GDB command:
  206. arm-nuttx-elf-gdb
  207. (gdb) target remote localhost:3333
  208. And you can load the NuttX ELF file:
  209. (gdb) symbol-file nuttx
  210. (gdb) load nuttx
  211. ARM/EA3152-specific Configuration Options
  212. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  213. CONFIG_ARCH - Identifies the arch/ subdirectory. This should
  214. be set to:
  215. CONFIG_ARCH=arm
  216. CONFIG_ARCH_family - For use in C code:
  217. CONFIG_ARCH_ARM=y
  218. CONFIG_ARCH_architecture - For use in C code:
  219. CONFIG_ARCH_ARM926EJS=y
  220. CONFIG_ARCH_CHIP - Identifies the arch/*/chip subdirectory
  221. CONFIG_ARCH_CHIP=lpc31xx
  222. CONFIG_ARCH_CHIP_name - For use in C code
  223. CONFIG_ARCH_CHIP_LPC3152
  224. CONFIG_ARCH_BOARD - Identifies the configs subdirectory and
  225. hence, the board that supports the particular chip or SoC.
  226. CONFIG_ARCH_BOARD=ea3152
  227. CONFIG_ARCH_BOARD_name - For use in C code
  228. CONFIG_ARCH_BOARD_EA3152
  229. CONFIG_ARCH_LOOPSPERMSEC - Must be calibrated for correct operation
  230. of delay loops
  231. CONFIG_ENDIAN_BIG - define if big endian (default is little
  232. endian)
  233. CONFIG_RAM_SIZE - For most ARM9 architectures, this describes the
  234. size of installed DRAM. For the LPC315X, it is used only to
  235. deterimine how to map the executable regions. It is SDRAM size
  236. only if you are executing out of the external SDRAM; or it could
  237. be NOR FLASH size, external SRAM size, or internal SRAM size.
  238. CONFIG_RAM_START - The start address of installed DRAM (physical)
  239. CONFIG_RAM_VSTART - The startaddress of DRAM (virtual)
  240. CONFIG_ARCH_LEDS - Use LEDs to show state. Unique to boards that
  241. have LEDs
  242. CONFIG_ARCH_INTERRUPTSTACK - This architecture supports an interrupt
  243. stack. If defined, this symbol is the size of the interrupt
  244. stack in bytes. If not defined, the user task stacks will be
  245. used during interrupt handling.
  246. CONFIG_ARCH_STACKDUMP - Do stack dumps after assertions
  247. CONFIG_ARCH_LEDS - Use LEDs to show state. Unique to board architecture.
  248. CONFIG_ARCH_BUTTONS - Enable support for buttons. Unique to board architecture.
  249. CONFIG_ARCH_CALIBRATION - Enables some build in instrumentation that
  250. cause a 100 second delay during boot-up. This 100 second delay
  251. serves no purpose other than it allows you to calibratre
  252. CONFIG_ARCH_LOOPSPERMSEC. You simply use a stop watch to measure
  253. the 100 second delay then adjust CONFIG_ARCH_LOOPSPERMSEC until
  254. the delay actually is 100 seconds.
  255. CONFIG_ARCH_DMA - Support DMA initialization
  256. CONFIG_ARCH_LOWVECTORS - define if vectors reside at address 0x0000:00000
  257. Undefine if vectors reside at address 0xffff:0000
  258. CONFIG_ARCH_ROMPGTABLE - A pre-initialized, read-only page table is available.
  259. If defined, then board-specific logic must also define PGTABLE_BASE_PADDR,
  260. PGTABLE_BASE_VADDR, and all memory section mapping in a file named
  261. board_memorymap.h.
  262. Individual subsystems can be enabled:
  263. CONFIG_LPC31_MCI, CONFIG_LPC31_SPI, CONFIG_LPC31_UART
  264. External memory available on the board (see also CONFIG_MM_REGIONS)
  265. CONFIG_LPC31_EXTSRAM0 - Select if external SRAM0 is present
  266. CONFIG_LPC31_EXTSRAM0HEAP - Select if external SRAM0 should be
  267. configured as part of the NuttX heap.
  268. CONFIG_LPC31_EXTSRAM0SIZE - Size (in bytes) of the installed
  269. external SRAM0 memory
  270. CONFIG_LPC31_EXTSRAM1 - Select if external SRAM1 is present
  271. CONFIG_LPC31_EXTSRAM1HEAP - Select if external SRAM1 should be
  272. configured as part of the NuttX heap.
  273. CONFIG_LPC31_EXTSRAM1SIZE - Size (in bytes) of the installed
  274. external SRAM1 memory
  275. CONFIG_LPC31_EXTDRAM - Select if external SDRAM is present
  276. CONFIG_LPC31_EXTDRAMHEAP - Select if external SDRAM should be
  277. configured as part of the NuttX heap.
  278. CONFIG_LPC31_EXTDRAMSIZE - Size (in bytes) of the installed
  279. external SDRAM memory
  280. CONFIG_LPC31_EXTNAND - Select if external NAND is present
  281. CONFIG_LPC31_EXTNANDSIZE - Size (in bytes) of the installed
  282. external NAND memory
  283. LPC315X specific device driver settings
  284. CONFIG_UART_SERIAL_CONSOLE - selects the UART for the
  285. console and ttys0
  286. CONFIG_UART_RXBUFSIZE - Characters are buffered as received.
  287. This specific the size of the receive buffer
  288. CONFIG_UART_TXBUFSIZE - Characters are buffered before
  289. being sent. This specific the size of the transmit buffer
  290. CONFIG_UART_BAUD - The configure BAUD of the UART. Must be
  291. CONFIG_UART_BITS - The number of bits. Must be either 7 or 8.
  292. CONFIG_UART_PARTIY - 0=no parity, 1=odd parity, 2=even parity
  293. CONFIG_UART_2STOP - Two stop bits
  294. Configurations
  295. ^^^^^^^^^^^^^^
  296. Each EA3152 configuration is maintained in a sub-directory and can be
  297. selected as follow:
  298. cd tools
  299. ./configure.sh ea3152/<subdir>
  300. cd -
  301. Where <subdir> is one of the following:
  302. ostest:
  303. This configuration directory, performs a simple OS test using
  304. examples/ostest. By default, this project assumes that you are
  305. using the DFU bootloader.