nuttx/boards/arm/lpc214x/zp214xpa
cuiziwei 4ec7af779d nuttx/boards:init_array.* needs to be executed in order
When I try to set priorities in certain programs, such as init_priority(HIGH_PRIORITY), I've noticed that during linking, there's no guarantee that the programs will be compiled in the sequence I've specified based on priority. This has led to some runtime errors in my program.

I realized that in the ld file, when initializing dynamic arrays, there's no assurance of initializing init_array.* before init_array. This has resulted in runtime errors in the program. Consequently, I've rearranged the init_array.* in the ld file of NuttX to be placed before init_array and added a SORT operation to init_array.* to ensure accurate initialization based on priorities during linking.
2023-08-29 22:54:37 +08:00
..
configs
include
scripts
src
tools
Kconfig
README.txt

zp214xpa README FILE
====================

The ZP213X/4XPA board from the0.net with LPC2148 installed.
Includes support for the UG-2864AMBAG01 OLED from The0.net.

Contents
========

  o MCU Connections
  o Serial Console
  o Using OpenOCD and GDB with an FT2232 JTAG emulator
  o Configurations

MCU Connections:
================

The ZP213X/4XPA board is no more than an LPC2148, crystals,
USB device and several connectors.

  Module Socket:
  --------------
  PIN NAME  PIN NAME
   1  VBAT  56  VCC
   2  3V3   55  Vusb
   3  VREF  54  3V3
   4  P0.0  53  RESET
   5  P0.1  52  P1.31
   6  P0.2  51  P1.30
   7  P0.3  50  P1.29
   8  P0.4  49  P1.28
   9  P0.5  48  P1.27
  10  P0.6  47  P1.26
  11  P0.7  46  P1.25
  12  P0.8  45  P1.24
  13  P0.9  44  P1.23
  14  P0.10 43  P1.22
  15  P0.11 42  P1.21
  16  P0.12 41  P1.20
  17  P0.13 40  P1.19
  18  P0.14 39  P1.18
  19  P0.15 38  P1.17
  20  P0.16 37  P1.16
  21  P0.17 36  P0.31
  22  P0.18 35  P0.30
  23  P0.19 34  P0.29
  24  P0.20 33  P0.28
  25  P0.21 32  P0.27
  26  P0.22 31  P0.26
  27  P0.23 30  P0.25
  28  GND   29  GND

  JTAG Debug:
  -----------
  PIN NAME       PIN NAME
   1  VCC1        2  3V3
   3  P1.31 NTRST 4  GND
   5  P1.28 TDI   6  GND
   7  P1.30 TMS   8  GND
   9  P1.29 TCK  10  GND
  11  P1.26 RTCK 12  GND
  13  P1.27 TDO  14  GND
  15  RESET NRTS 16  GND
  17  N/C   NC0  18  GND
  19  N/C   NC1  20  GND

  Z28160 Net Module:
  ------------------
  PIN NAME      PIN NAME
   1  P0.7  /CS 10  3V3   VCC
   2  P0.4  SCK  9  P1.24 RST
   3  P0.6  SI   8  N/C   CLKOUT
   4  P0.5  SO   7  INT   P1.25
   5  GND        6  N/C   WOL

  SPI LCD:
  --------
  PIN NAME
   1  3V3   3V3
   2  VCC   5V
   3  P0.18 RESET(DO)
   4  P0.19 DI
   5  P0.20 CS
   6  P0.17 SCK
   7  P0.23 A0(RESET)
   8  N/C   LED-
   9  N/C   LED+(BL)
  10  GND   GND

  USB Interface:
  --------------
  Vusb, P0.26, P0.27

Serial Console:
===============

  Both UART0 and UART1 are always enabled.  UART0 is configured to be the
  serial console in these configurations.

  P0.0/TXD0/PWM1        Module Socket, Pin 4
  P0.1/RxD0/PWM3/EINT0  Module Socket, Pin 5

  P0.8/TXD1/PWM4/AD1.1  Module Socket, Pin 12
  P0.9/RxD1/PWM6/EINT3  Module Socket, Pin 13

LCD Interface
=============

  PIN NAME  PIN CONFIGURATION
   3  RESET P0.18/CAP1.3/MISO1/MAT1.3P0.18 RESET - General purpose output
   4  DI    P0.19/MAT1.2/MOSI1/CAP1.2P0.19 DI    - Alternate function 2
   5  CS    P0.20/MAT1.3/SSEL1/EINT3             - General purpose output
   6  SCK   P0.17/CAP1.2/SCK1/MAT1.2             - Alternate function 2
   7  A0    P0.23/VBUS                           - General purpose output

ENC29J60 Interface
==================

  PIN NAME  PIN CONFIGURATION
   1  /CS   P0.7/SSEL0/PWM2/EINT2                - General purpose output
   2  SCK   P0.4/SCK0/CAP0.1/AD0.6               - Alternate function 1
   3  SI    P0.6/MOSI0/CAP0.2/AD1.0              - Alternate function 1
   4  SO    P0.5/MISO0/MAT0.1/AD0.7              - Alternate function 1
   7  INT   P1.25/EXTIN0                         - Alternal function 1
   9  RST   P1.24/TRACECLK                       - General purpose output

Using OpenOCD and GDB with an FT2232 JTAG emulator
==================================================

  Downloading OpenOCD

    You can get information about OpenOCD here: http://openocd.berlios.de/web/
    and you can download it from here. http://sourceforge.net/projects/openocd/files/.
    To get the latest OpenOCD with more mature lpc214x, you have to download
    from the GIT archive.

      git clone git://openocd.git.sourceforge.net/gitroot/openocd/openocd

    At present, there is only the older, frozen 0.4.0 version.  These, of course,
    may have changed since I wrote this.

  Building OpenOCD under Cygwin:

    You can build OpenOCD for Windows using the Cygwin tools.  Below are a
    few notes that worked as of November 7, 2010.  Things may have changed
    by the time you read this, but perhaps the following will be helpful to
    you:

    1. Install Cygwin (http://www.cygwin.com/).  My recommendation is to install
       everything.  There are many tools you will need and it is best just to
       waste a little disk space and have everything you need.  Everything will
       require a couple of gigbytes of disk space.

    2. Create a directory /home/OpenOCD.

    3. Get the FT2232 driver from http://www.ftdichip.com/Drivers/D2XX.htm and
       extract it into /home/OpenOCD/ftd2xx

       $ pwd
       /home/OpenOCD
       $ ls
       CDM20802 WHQL Certified.zip
       $ mkdir ftd2xx
       $ cd ftd2xx
       $ unzip ..CDM20802\ WHQL\ Certified.zip
       Archive:  CDM20802 WHQL Certified.zip
       ...

    3. Get the latest OpenOCD source

       $ pwd
       /home/OpenOCD
       $ git clone git://openocd.git.sourceforge.net/gitroot/openocd/openocd

       You will then have the source code in /home/OpenOCD/openocd

    4. Build OpenOCD for the FT22322 interface

       $ pwd
       /home/OpenOCD/openocd
       $ ./bootstrap

       Jim is a tiny version of the Tcl scripting language.  It is needed
       by more recent versions of OpenOCD.  Build libjim.a using the following
       instructions:

       $ git submodule init
       $ git submodule update
       $ cd jimtcl
       $ ./configure --with-jim-ext=nvp
       $ make
       $ make install

       Configure OpenOCD:

       $ ./configure --enable-maintainer-mode --disable-werror --disable-shared \
                    --enable-ft2232_ftd2xx --with-ftd2xx-win32-zipdir=/home/OpenOCD/ftd2xx \
                    LDFLAGS="-L/home/OpenOCD/openocd/jimtcl"

        Then build OpenOCD and its HTML documentation:

        $ make
        $ make html

        The result of the first make will be the "openocd.exe" will be
        created in the folder /home/openocd/src.  The following command
        will install OpenOCD to a standard location (/usr/local/bin)
        using using this command:

        $ make install

  Helper Scripts.

    I have been using the Olimex ARM-USB-OCD JTAG debugger with the
    ZP213X/4XPA.  OpenOCD requires a configuration file.  I keep the
    one I used last here:

      boards/zpa214xpa/tools/olimex.cfg

    However, the "correct" configuration script to use with OpenOCD may
    change as the features of OpenOCD evolve.  So you should at least
    compare that olimex.cfg file with configuration files in
    /usr/local/share/openocd/scripts/target (or /home/OpenOCD/openocd/tcl/target).

    There is also a script on the tools/ directory that I use to start
    the OpenOCD daemon on my system called oocd.sh.  That script will
    probably require some modifications to work in another environment:

    - Possibly the value of OPENOCD_PATH and TARGET_PATH
    - It assumes that the correct script to use is the one at
      boards/arm/lpc214x/zp214xpa/tools/olimex.cfg

  Starting OpenOCD

    Then you should be able to start the OpenOCD daemon like:

      boards/arm/lpc214x/zp214xpa/tools/oocd.sh $PWD

    If you add that path to your PATH environment variable, the command
    simplifies to just:

      oocd.sh $PWD

    Where it is assumed that you are executing oocd.sh from the top-level
    directory where NuttX is installed.  $PWD will be the path to the
    top-level NuttX directory.

  Connecting GDB

    Once the OpenOCD daemon has been started, you can connect to it via
    GDB using the following GDB command:

      arm-nuttx-elf-gdb
      (gdb) target remote localhost:3333

    NOTE:  The name of your GDB program may differ.  For example, with the
    CodeSourcery toolchain, the ARM GDB would be called arm-none-eabi-gdb.

    After starting GDB, you can load the NuttX ELF file:

      (gdb) symbol-file nuttx
      (gdb) load nuttx

    NOTES:
    1. Loading the symbol-file is only useful if you have built NuttX to
       include debug symbols (by setting CONFIG_DEBUG_SYMBOLS=y in the
       .config file).

    OpenOCD will support several special 'monitor' commands.  These
    GDB commands will send comments to the OpenOCD monitor.  Here
    are a couple that you will need to use:

     (gdb) monitor reset
     (gdb) monitor halt

    NOTES:
    1. The MCU must be halted using 'mon halt' prior to loading code.
    2. Reset will restart the processor after loading code.
    3. The 'monitor' command can be abbreviated as just 'mon'.

Configurations:
===============

  Each NXP LPC214x configuration is maintained in a sub-directory and
  can be selected as follow:

    tools/configure.sh zp214xpa:<subdir>

  Where <subdir> is one of the following:

  nsh:
  ----

    Configures the NuttShell (nsh) located at examples/nsh.  The
    Configuration enables only the serial NSH interfaces.

    NOTES:

    1. This configuration uses the mconf-based configuration tool.  To
       change this configuration using that tool, you should:

       a. Build and install the kconfig-mconf tool.  See nuttx/README.txt
          see additional README.txt files in the NuttX tools repository.

       b. Execute 'make menuconfig' in nuttx/ in order to start the
          reconfiguration process.

    2. Default platform/toolchain:

       CONFIG_HOST_LINUX=y              : Linux (Cygwin under Windows okay too).
       CONFIG_ARM_TOOLCHAIN_GNU_EABI=y  : Buildroot (arm-nuttx-elf-gcc)
       CONFIG_RAW_BINARY=y              : Output formats: ELF and raw binary

  nxlines:
  --------

    This is the apps/examples/nxlines test using the UG_2864AMBAG01 board
    from The0.net that plugs into the "SPI LCD" connector on the ZP3X4XPA
    board.

    NOTES:

    1. This configuration uses the mconf-based configuration tool.  To
       change this configuration using that tool, you should:

       a. Build and install the kconfig-mconf tool.  See nuttx/README.txt
          see additional README.txt files in the NuttX tools repository.

       b. Execute 'make menuconfig' in nuttx/ in order to start the
          reconfiguration process.

    2. Default platform/toolchain:

       CONFIG_HOST_LINUX=y              : Linux (Cygwin under Windows okay too).
       CONFIG_ARM_TOOLCHAIN_GNU_EABI=y  : Buildroot (arm-nuttx-elf-gcc)
       CONFIG_RAW_BINARY=y              : Output formats: ELF and raw binary

    STATUS:
    2012-12-30:  Configuration verified.

    2017-11-25:  Grrr... This configuration no longer works.  Some serious bit
      rot has set in.  Now only random garbage appears on the OLED.  Certainly
      a lot has changed since 2012, but I cannot see any change to either this
      configuration, to the LCD driver, or to the LPC2148 support that would
      affect the operation of the LCD.  The nsh configuration is still functional.