README
^^^^^^

This port conributed by jeditekunum.

This is the README file for the port of NuttX to the MoteinoMEGA from
LowPowerLab (http://www.lowpowerlab.com).  The MoteinoMEGA is based
on an Atmel ATMega1284P.  As of this writing, documentation for the
MoteinoMEGA board is available here:

https://lowpowerlab.com/shop/index.php?_route_=Moteino/moteinomega

Contents
^^^^^^^^

  o MoteinoMEGA Features
  o Pin Connections
  o DualOptiboot Bootloader
  o Toolchains
  o MoteinoMEGA Configuration Options
  o Configurations

MoteinoMEGA Features
^^^^^^^^^^^^^^^^^^^^

   o  16MHz ATmega1284P Atmel 8bit AVR RISC Processor
   o  128Kbyte Flash
   o  16Kbyte RAM
   o  4Kbyte EEPROM
   o  2 High Speed Serial Ports
   o  8Ch 10bit Analog Input port

Pin Connections
^^^^^^^^^^^^^^^

  -------------------- -----------------------------
  ATMega1284P Pinout   MoteinoMEGA board connection
  -------------------- -----------------------------
  (left)
   1 AREF              AR
   2 PA7               A7
   3 PA6               A6
   4 PA5               A5
   5 PA4               A4
   6 PA3               A3
   7 PA2               A2
   8 PA1               A1
   9 PA0               A0
  10 PB0               0
  11 PB1               1
  12 PB2 (INT2)        2/i2  (used by optional radio)
  13 PB3 (PWM0)        3
  14 PB4 (PWM1/SS)     4/SS  (used by optional radio)
  15 PB5 (MOSI)        5/MO  (used by optional radio/flash)
  16 PB6 (MISO/PWM2)   6/MI  (used by optional radio/flash)
  17 PB7 (SCK/PWM3)    7/SCK (used by optional radio/flash)
  18 VOUT              3v3
  19 VIN               VIN
  20 GND               GND
  (bottom)
  21 DTR/RTS           DTR
  22 TX0               v
  23 RX0               ^
  24 VIN
  25
  26 GND               GND
  (right)
  27 GND               GND
  28 VIN               VIN
  29 VOUT              3v3
  30 RESET             RST
  31 PD0 (RX0)         8/Serial 0 ^
  32 PD1 (TX0)         9/Serial 0 v
  33 PD2 (RX1/INT0)    10/Serial 0 ^/i0
  34 PD3 (TX1/INT1)    11/Serial 1 v/i1
  35 PD4 (PWM4)        12
  36 PD5 (PWM5)        13
  37 PD6 (PWM6)        14
  38 PD7 (PWM7)        15/LED
  39 PC0 (SCL)         16/SCL
  40 PC1 (SDA)         17/SDA
  41 PC2 (TCK)         18
  42 PC3 (TMS)         19
  43 PC4 (TDO)         20
  44 PC5 (TDI)         21
  45 PC6               22
  46 PC7               23 (used by optional flash)


DualOptiboot Bootloader
^^^^^^^^^^^^^^^^^^^^^^^

o FTDI (or similar) USB-To-Serial converter with compatible connector
  configured for DTR (AdaFruit, SparkFun, etc)
o Obtain ard-reset-arduino Python script
  (one source: https://github.com/mikaelpatel/Cosa/blob/master/build/Arduino-Makefile/bin/ard-reset-arduino)
  This script triggers the DTR pin to enter bootloader mode.
o Obtain avrdude for your platform.

Bootloader operates at 115200 baud.  It would be useful to create a short script
that invokes ard-reset-arduino and then avrdude to load program.  This script
could then also, optionally, invoke miniterm.py or some other serial interface
program for console.

Example:

APP=nuttx
CPU=atmega1284p
BAUD=115200
PORT=/dev/tty.usbserial-A703X8PQ
avr-size --mcu=$CPU -C --format=avr $APP
ard-reset-arduino --verbose $PORT
avrdude -q -V -p $CPU -C {location-of-avrdude.conf} -D -c arduino -b $BAUD \
  -P $PORT -U flash:w:${APP}.hex:i
miniterm.py --port=$PORT --baud=$BAUD -q --lf

Toolchains
^^^^^^^^^^

The toolchain may be selected using the kconfig-mconf tool (via 'make menuconfig'),
by editing the existing configuration file (defconfig), or by overriding
the toolchain on the make commandline with CONFIG_AVR_TOOLCHAIN=<toolchain>.

The valid values for <toolchain> are BUILDROOT, CROSSPACK, LINUXGCC and WINAVR.

This port was tested using the OS X / CROSSPACK tool chain, GCC version 4.8.1.
Please see other NuttX documentation for toolchain details.

MoteinoMEGA Configuration Options
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    CONFIG_ARCH - Identifies the arch/ subdirectory.  This should
       be set to:

       CONFIG_ARCH=avr

    CONFIG_ARCH_FAMILY - For use in C code:

       CONFIG_ARCH_FAMILY=avr

    CONFIG_ARCH_FAMILY_family - For use in C code:

       CONFIG_ARCH_FAMILY_AVR=y

    CONFIG_ARCH_CHIP - Identifies the arch/*/chip subdirectory

       CONFIG_ARCH_CHIP=atmega

    CONFIG_ARCH_CHIP_name - For use in C code to identify the exact
       chip:

       CONFIG_ARCH_CHIP_ATMEGA1284P=y

    CONFIG_ARCH_BOARD - Identifies the configs subdirectory and
       hence, the board that supports the particular chip or SoC.

       CONFIG_ARCH_BOARD=moteino-mega

    CONFIG_ARCH_BOARD_name - For use in C code

       CONFIG_ARCH_BOARD_MOTEINO_MEGA=y

    CONFIG_ARCH_LOOPSPERMSEC - Must be calibrated for correct operation
       of delay loops

    CONFIG_RAM_SIZE - Describes the installed DRAM.  One of:

       CONFIG_RAM_SIZE=(16*1024) - (16Kb)

    CONFIG_RAM_START - The start address of installed SRAM

       CONFIG_RAM_START=0x800100

    CONFIG_ARCH_LEDS - Use LEDs to show state. Unique to boards that
       have LEDs

    CONFIG_ARCH_INTERRUPTSTACK - This architecture supports an interrupt
       stack. If defined, this symbol is the size of the interrupt
        stack in bytes.  If not defined, the user task stacks will be
      used during interrupt handling.

    CONFIG_ARCH_STACKDUMP - Do stack dumps after assertions

    CONFIG_ARCH_LEDS -  Use LEDs to show state. Unique to board architecture.

    CONFIG_ARCH_CALIBRATION - Enables some build in instrumentation that
       cause a 100 second delay during boot-up.  This 100 second delay
       serves no purpose other than it allows you to calibratre
       CONFIG_ARCH_LOOPSPERMSEC.  You simply use a stop watch to measure
       the 100 second delay then adjust CONFIG_ARCH_LOOPSPERMSEC until
       the delay actually is 100 seconds.

    Individual subsystems can be enabled:

       CONFIG_AVR_INT0=n
       CONFIG_AVR_INT1=n
       CONFIG_AVR_INT2=n
       CONFIG_AVR_INT3=n
       CONFIG_AVR_INT4=n
       CONFIG_AVR_INT5=n
       CONFIG_AVR_INT6=n
       CONFIG_AVR_INT7=n
       CONFIG_AVR_WDT=n
       CONFIG_AVR_TIMER0=n
       CONFIG_AVR_TIMER1=n
       CONFIG_AVR_TIMER2=n
       CONFIG_AVR_TIMER3=n
       CONFIG_AVR_SPI=n
       CONFIG_AVR_USART0=y
       CONFIG_AVR_USART1=n
       CONFIG_AVR_ADC=n
       CONFIG_AVR_ANACOMP=n
       CONFIG_AVR_TWI=n

   If the watchdog is enabled, this specifies the initial timeout.  Default
  is maximum supported value.

      CONFIG_WDTO_15MS
      CONFIG_WDTO_30MS
      CONFIG_WDTO_60MS
      CONFIG_WDTO_120MS
      CONFIG_WDTO_1250MS
      CONFIG_WDTO_500MS
      CONFIG_WDTO_1S
      CONFIG_WDTO_2S
      CONFIG_WDTO_4S
      CONFIG_WDTO_8S

 ATMEGA specific device driver settings

    CONFIG_USARTn_SERIAL_CONSOLE - selects the USARTn for the
       console and ttys0 (default is the USART0).
    CONFIG_USARTn_RXBUFSIZE - Characters are buffered as received.
       This specific the size of the receive buffer
    CONFIG_USARTn_TXBUFSIZE - Characters are buffered before
       being sent.  This specific the size of the transmit buffer
    CONFIG_USARTn_BAUD - The configure BAUD of the USART.  Must be
    CONFIG_USARTn_BITS - The number of bits.  Must be either 7 or 8.
    CONFIG_USARTn_PARTIY - 0=no parity, 1=odd parity, 2=even parity
    CONFIG_USARTn_2STOP - Two stop bits

Configurations
^^^^^^^^^^^^^^

Common Configuration Notes
--------------------------

  1. Each MoteinoMEGA configuration is maintained in a sub-directory and
     can be selected as follow:

       tools/configure.sh moteino-mega/<subdir>

     Where <subdir> is one of the configuration sub-directories described in
     the following paragraph.

  2. These configurations use the mconf-based configuration tool.  To
     change a configurations 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.

Configuration Sub-Directories
-----------------------------

  hello:
    The simple apps/examples/hello "Hello, World!" example.

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