README.txt
==========

This is the README file for the port of NuttX to the Freescale Freedom-K64F
development board.

Contents
========

  o Freedom K64F Features
  o Serial Console
  o LEDs and Buttons
  o Networking Support
  o SD Card Support
  o USB Device Controller Support
  o Development Environment
  o GNU Toolchain Options
  o Freedom K64F Configuration Options
  o Configurations
  o Status

Kinetis Freedom K64F Features:
=============================

  The features of the FRDM-K64F hardware are as follows:

  - MK64FN1M0VLL12 MCU (120 MHz, 1 MB flash memory, 256 KB RAM, low-power,
    crystal-less USB, and 100 LQFP)
  - Dual role USB interface with micro-B USB connector
  - RGB LED
  - FXOS8700CQ - accelerometer and magnetometer
  - Two user push buttons
  - Flexible power supply option - OpenSDAv2 USB, K64 USB, and external
    source
  - Easy access to MCU input/output through Arduino R3TM compatible I/O
    connectors
  - Programmable OpenSDAv2 debug circuit supporting the CMSIS-DAP Interface
    software that provides:
    o Mass storage device (MSD) flash programming interface
    o CMSIS-DAP debug interface over a driver-less USB HID connection
       providing run-control debugging and compatibility with IDE tools
    o Virtual serial port interface
    o Open-source CMSIS-DAP software project: github.com/mbedmicro/CMSIS-DAP.
  - Ethernet
  - SDHC
  - Add-on RF module: nRF24L01+ Nordic 2.4GHz Radio
  - Add-on Bluetooth module: JY-MCU BT board V1.05 BT

OpenSDAv2
=========

  The FRDM-K64F platform features OpenSDAv2, the Freescale open-source
  hardware embedded serial and debug adapter running an open-source
  bootloader. This circuit offers several options for serial communication,
  flash programming, and run-control debugging. OpenSDAv2 is an mbed
  HDK-compatible debug interface preloaded with the open-source CMSIS-DAP
  Interface firmware (mbed interface) for rapid prototyping and product
  development.

  To use set raw binary output for nuttx.bin

Serial Console
==============

  USB VCOM Console
  ----------------
  The primary serial port interface signals are PTB16 UART0_RX and PTB17
  UART0_TX. These signals are connected to the OpenSDAv2 VCOM circuit.

  Serial Shield Console
  ---------------------
  An alternative serial port might use a standard serial shield mounted
  on the Freedom Board.  In this case, Arduino pin D1 provides UART TX and
  pin D0 provides UART RX.

  The I/O headers on the FRDM-K64F board are arranged to enable
  compatibility with Arduino shield. The outer rows of pins (even numbered
  pins) on the headers, share the same mechanical spacing and placement with
  the I/O headers on the Arduino Revision 3 (R3) standard.

  The Arduino D0 and D1 pins then correspond to pins 2 and 4 on the J1 I/O
  connector:

    Arduino Pin              FRDM-K64F J1 Connector
    ------------------------ -----------------------
    UART TX, Arduino D1 pin  Pin 4, PTC17, UART3_TX
    UART RX, Arduino D0 pin  Pin 2, PTC16, UART3_RX

  Default Serial Console
  ----------------------
  By default, these configuration are setup to use the Serial Console on
  UART3.  That, however, is easily reconfigured.

LEDs and Buttons
================

  RGB LED
  -------
  An RGB LED is connected through GPIO as shown below:

    LED    K64
    ------ -------------------------------------------------------
    RED    PTB22/SPI2_SOUT/FB_AD29/CMP2_OUT
    BLUE   PTB21/SPI2_SCK/FB_AD30/CMP1_OUT
    GREEN  PTE26/ENET_1588_CLKIN/UART4_CTS_b/RTC_CLKOUT/USB0_CLKIN

  If CONFIG_ARCH_LEDs is defined, then NuttX will control the LED on board the
  Freedom KL25Z.  Usage of these LEDs is defined in include/board.h and
  src/k64_leds.c.  The following definitions describe how NuttX controls the LEDs:

    SYMBOL                Meaning                 LED state
                                                  RED   GREEN  BLUE
    -------------------  -----------------------  -----------------
    LED_STARTED          NuttX has been started    OFF  OFF  OFF
    LED_HEAPALLOCATE     Heap has been allocated   OFF  OFF  ON
    LED_IRQSENABLED      Interrupts enabled        OFF  OFF  ON
    LED_STACKCREATED     Idle stack created        OFF  ON   OFF
    LED_INIRQ            In an interrupt          (no change)
    LED_SIGNAL           In a signal handler      (no change)
    LED_ASSERTION        An assertion failed      (no change)
    LED_PANIC            The system has crashed    FLASH OFF OFF
    LED_IDLE             K64 is in sleep mode     (Optional, not used)

  Buttons
  -------
  Two push buttons, SW2 and SW3, are available on FRDM-K64F board, where
  SW2 is connected to PTC6 and SW3 is connected to PTA4. Besides the
  general purpose input/output functions, SW2 and SW3 can be low-power
  wake up signal. Also, only SW3 can be a non-maskable interrupt.

  Switch    GPIO Function
  --------- ---------------------------------------------------------------
  SW2       PTC6/SPI0_SOUT/PD0_EXTRG/I2S0_RX_BCLK/FB_AD9/I2S0_MCLK/LLWU_P10
  SW3       PTA4/FTM0_CH1/NMI_b/LLWU_P3

Networking Support
==================

  Ethernet MAC/KSZ8081 PHY
  ------------------------
  ------------ ----------------- --------------------------------------------
  KSZ8081      Board Signal(s)   K64F Pin
  Pin Signal                     Function                       pinmux Name
  --- -------- ----------------- --------------------------------------------
   1  VDD_1V2  VDDPLL_1.2V       ---                            ---
   2  VDDA_3V3 VDDA_ENET         ---                            ---
   3  RXM      ENET1_RX-         ---                            ---
   4  RXP      ENET1_RX+         ---                            ---
   5  TXM      ENET1_TX-         ---                            ---
   6  TXP      ENET1_TX+         ---                            ---
   7  X0       RMII_XTAL0        ---                            ---
   8  XI       RMII_XTAL1        ---                            ---
   9  REXT     ---               ---, Apparently not connected  ---
  10  MDIO     RMII0_MDIO        PTB0/RMII0_MDIO                PIN_RMII0_MDIO
  11  MDC      RMII0_MDC         PTB1/RMII0_MDC                 PIN_RMII0_MDC
  12  RXD1     RMII0_RXD_1       PTA12/RMII0_RXD1               PIN_RMII0_RXD1
  13  RXD0     RMII0_RXD_0       PTA13/RMII0_RXD0               PIN_RMII0_RXD0
  14  VDDIO    VDDIO_ENET        ---                            ---
  15  CRS_DIV                    PTA14/RMII0_CRS_DV             PIN_RMII0_CRS_DV
  16  REF_CLK  RMII_RXCLK        PTA18/EXTAL0, PHY clock input  ---
  17  RXER     RMII0_RXER        PTA5/RMII0_RXER                PIN_RMII0_RXER
  18  INTRP    RMII0_INT_B,      J14 Pin 2, Apparently not      ---
               PHY_INT_1         available unless jumpered
  19  TXEN     RMII0_TXEN        PTA15/RMII0_TXEN               PIN_RMII0_TXEN
  20  TXD0     RMII0_TXD_0       PTA16/RMII0_TXD0               PIN_RMII0_TXD0
  21  TXD1     RMII0_TXD_1       PTA17/RMII0_TXD1               PIN_RMII0_TXD1
  22  GND1     ---               ---                            ---
  24  nRST     PHY_RST_B         ---                            ---
  25  GND2     ---               ---                            ---
  --- -------- ----------------- --------------------------------------------

  No external pullup is available on MDIO signal when MK64FN1M0VLL12 MCU is
  requests status of the Ethernet link connection. Internal pullup is required
  when port configuration for MDIO signal is enabled:

    CONFIG_KINETIS_ENET_MDIOPULLUP=y

  Networking support via the can be added to NSH by selecting the following
  configuration options.

  Selecting the EMAC peripheral
  -----------------------------

  System Type -> Kinetis Peripheral Support
    CONFIG_KINETIS_ENET=y               : Enable the EThernet MAC peripheral

  System Type -> Ethernet Configuration
    CONFIG_KINETIS_ENETNETHIFS=1
    CONFIG_KINETIS_ENETNRXBUFFERS=6
    CONFIG_KINETIS_ENETNTXBUFFERS=2
    CONFIG_KINETIS_ENET_MDIOPULLUP=y

  Networking Support
    CONFIG_NET=y                        : Enable Neworking
    CONFIG_NET_ETHERNET=y               : Support Ethernet data link
    CONFIG_NET_SOCKOPTS=y               : Enable socket operations
    CONFIG_NET_ETH_PKTSIZE=590          : Maximum packet size 1518 is more standard
    CONFIG_NET_ARP=y                    : Enable ARP
    CONFIG_NET_ARPTAB_SIZE=16           : ARP table size
    CONFIG_NET_ARP_IPIN=y               : Enable ARP address harvesting
    CONFIG_NET_ARP_SEND=y               : Send ARP request before sending data
    CONFIG_NET_TCP=y                    : Enable TCP/IP networking
    CONFIG_NET_TCP_WRITE_BUFFERS=y      : Support TCP write-buffering
    CONFIG_NET_TCPBACKLOG=y             : Support TCP/IP backlog
    CONFIG_NET_MAX_LISTENPORTS=20       :
    CONFIG_NET_UDP=y                    : Enable UDP networking
    CONFIG_NET_BROADCAST=y              : Needed for DNS name resolution
    CONFIG_NET_ICMP=y                   : Enable ICMP networking
    CONFIG_NET_ICMP_SOCKET=y            : Needed for NSH ping command
                                        : Defaults should be okay for other options
f Application Configuration -> Network Utilities
    CONFIG_NETDB_DNSCLIENT=y               : Enable host address resolution
    CONFIG_NETUTILS_TELNETD=y           : Enable the Telnet daemon
    CONFIG_NETUTILS_TFTPC=y             : Enable TFTP data file transfers for get and put commands
    CONFIG_NETUTILS_NETLIB=y            : Network library support is needed
    CONFIG_NETUTILS_WEBCLIENT=y         : Needed for wget support
                                        : Defaults should be okay for other options
  Application Configuration -> NSH Library
    CONFIG_NSH_TELNET=y                 : Enable NSH session via Telnet
    CONFIG_NSH_IPADDR=0x0a000002        : Select a fixed IP address
    CONFIG_NSH_DRIPADDR=0x0a000001      : IP address of gateway/host PC
    CONFIG_NSH_NETMASK=0xffffff00       : Netmask
    CONFIG_NSH_NOMAC=y                  : Need to make up a bogus MAC address
                                        : Defaults should be okay for other options

  You can also enable enable the DHCPC client for networks that use
  dynamically assigned address:

  Application Configuration -> Network Utilities
    CONFIG_NETUTILS_DHCPC=y             : Enables the DHCP client

  Networking Support
    CONFIG_NET_UDP=y                    : Depends on broadcast UDP

  Application Configuration -> NSH Library
    CONFIG_NET_BROADCAST=y
    CONFIG_NSH_DHCPC=y                  : Tells NSH to use DHCPC, not
                                        : the fixed addresses

  Using the network with NSH
  --------------------------

  So what can you do with this networking support?  First you see that
  NSH has several new network related commands:

    ifconfig, ifdown, ifup:  Commands to help manage your network
    get and put:             TFTP file transfers
    wget:                    HTML file transfers
    ping:                    Check for access to peers on the network
    Telnet console:          You can access the NSH remotely via telnet.

  You can also enable other add on features like full FTP or a Web
  Server or XML RPC and others.  There are also other features that
  you can enable like DHCP client (or server) or network name
  resolution.

  By default, the IP address of the FRDM-K64F will be 10.0.0.2 and
  it will assume that your host is the gateway and has the IP address
  10.0.0.1.

    nsh> ifconfig
    eth0    HWaddr 00:e0:de:ad:be:ef at UP
            IPaddr:10.0.0.2 DRaddr:10.0.0.1 Mask:255.255.255.0

  You can use ping to test for connectivity to the host (Careful,
  Window firewalls usually block ping-related ICMP traffic).  On the
  target side, you can:

    nsh> ping 10.0.0.1
    PING 10.0.0.1 56 bytes of data
    56 bytes from 10.0.0.1: icmp_seq=1 time=0 ms
    56 bytes from 10.0.0.1: icmp_seq=2 time=0 ms
    56 bytes from 10.0.0.1: icmp_seq=3 time=0 ms
    56 bytes from 10.0.0.1: icmp_seq=4 time=0 ms
    56 bytes from 10.0.0.1: icmp_seq=5 time=0 ms
    56 bytes from 10.0.0.1: icmp_seq=6 time=0 ms
    56 bytes from 10.0.0.1: icmp_seq=7 time=0 ms
    56 bytes from 10.0.0.1: icmp_seq=8 time=0 ms
    56 bytes from 10.0.0.1: icmp_seq=9 time=0 ms
    56 bytes from 10.0.0.1: icmp_seq=10 time=0 ms
    10 packets transmitted, 10 received, 0% packet loss, time 10100 ms

  NOTE: In this configuration is is normal to have packet loss > 0%
  the first time you ping due to the default handling of the ARP
  table.

  On the host side, you should also be able to ping the FRDM-K64F:

    $ ping 10.0.0.2

  You can also log into the NSH from the host PC like this:

    $ telnet 10.0.0.2
    Trying 10.0.0.2...
    Connected to 10.0.0.2.
    Escape character is '^]'.
    sh_telnetmain: Session [3] Started

    NuttShell (NSH) NuttX-6.31
    nsh> help
    help usage:  help [-v] [<cmd>]

      [           echo        ifconfig    mkdir       mw          sleep
      ?           exec        ifdown      mkfatfs     ping        test
      cat         exit        ifup        mkfifo      ps          umount
      cp          free        kill        mkrd        put         usleep
      cmp         get         losetup     mh          rm          wget
      dd          help        ls          mount       rmdir       xd
      df          hexdump     mb          mv          source

    Builtin Apps:
    nsh>

  NOTE:  If you enable this networking as described above, you will
  experience a delay on booting NSH.  That is because the start-up logic
  waits for the network connection to be established before starting
  NuttX.  In a real application, you would probably want to do the
  network bringup on a separate thread so that access to the NSH prompt
  is not delayed.

  This delay will be especially long if the board is not connected to
  a network.  On the order of minutes!  You will probably think that
  NuttX has crashed!  And then, when it finally does come up after
  numerous timeouts and retries, the network will not be available --
  even if the network cable is plugged in later.

  The long delays can be eliminated by using a separate the network
  initialization thread discussed below.  Recovering after the network
  becomes available requires the network monitor feature, also discussed
  below.

  Network Initialization Thread
  -----------------------------
  There is a configuration option enabled by CONFIG_NSH_NETINIT_THREAD
  that will do the NSH network bring-up asynchronously in parallel on
  a separate thread.  This eliminates the (visible) networking delay
  altogether.  This current implementation, however, has some limitations:

    - If no network is connected, the network bring-up will fail and
      the network initialization thread will simply exit.  There are no
      retries and no mechanism to know if the network initialization was
      successful (it could perform a network Ioctl to see if the link is
      up and it now, keep trying, but it does not do that now).

    - Furthermore, there is currently no support for detecting loss of
      network connection and recovery of the connection (similarly, this
      thread could poll periodically for network status, but does not).

  Both of these shortcomings could be eliminated by enabling the network
  monitor:

  Network Monitor
  ---------------
  By default the network initialization thread will bring-up the network
  then exit, freeing all of the resources that it required.  This is a
  good behavior for systems with limited memory.

  If the CONFIG_NSH_NETINIT_MONITOR option is selected, however, then the
  network initialization thread will persist forever; it will monitor the
  network status.  In the event that the network goes down (for example, if
  a cable is removed), then the thread will monitor the link status and
  attempt to bring the network back up.  In this case the resources
  required for network initialization are never released.

  Pre-requisites:

    - CONFIG_NSH_NETINIT_THREAD as described above.

    - The K64F EMAC block does not support PHY interrupts.  The KSZ8081
      PHY interrupt line is brought to a jumper block and it should be
      possible to connect that some some interrupt port pin.  You would
      need to provide some custom logic in the Freedcom K64F
      configuration to set up that PHY interrupt.

    - In addition to the PHY interrupt, the Network Monitor also requires the
      following setting:

        CONFIG_NETDEV_PHY_IOCTL. Enable PHY IOCTL commands in the Ethernet
        device driver. Special IOCTL commands must be provided by the Ethernet
        driver to support certain PHY operations that will be needed for link
        management. There operations are not complex and are implemented for
        the Atmel SAMA5 family.

        CONFIG_ARCH_PHY_INTERRUPT. This is not a user selectable option.
        Rather, it is set when you select a board that supports PHY
        interrupts.  For the K64F, like most other architectures, the PHY
        interrupt must be provided via some board-specific GPIO.  In any
        event, the board-specific logic must provide support for the PHY
        interrupt. To do this, the board logic must do two things: (1) It
        must provide the function arch_phy_irq() as described and prototyped
        in the nuttx/include/nuttx/arch.h, and (2) it must select
        CONFIG_ARCH_PHY_INTERRUPT in the board configuration file to
        advertise that it supports arch_phy_irq().

        One other thing: UDP support is required (CONFIG_NET_UDP).

  Given those prerequisites, the network monitor can be selected with these
  additional settings.

    System Type -> Kinetis Ethernet Configuration
      CONFIG_ARCH_PHY_INTERRUPT=y           : (auto-selected)
      CONFIG_NETDEV_PHY_IOCTL=y             : (auto-selected)

    Application Configuration -> NSH Library -> Networking Configuration
      CONFIG_NSH_NETINIT_THREAD             : Enable the network initialization thread
      CONFIG_NSH_NETINIT_MONITOR=y          : Enable the network monitor
      CONFIG_NSH_NETINIT_RETRYMSEC=2000     : Configure the network monitor as you like
      CONFIG_NSH_NETINIT_SIGNO=18

SD Card Support
===============

  Card Slot
  ---------
  A micro Secure Digital (SD) card slot is available on the FRDM-K64F connected to
  the SD Host Controller (SDHC) signals of the MCU. This slot will accept micro
  format SD memory cards. The SD card detect pin (PTE6) is an open switch that
  shorts with VDD when card is inserted.

    ------------ ------------- --------
    SD Card Slot Board Signal  K64F Pin
    ------------ ------------- --------
    DAT0         SDHC0_D0      PTE1
    DAT1         SDHC0_D1      PTE0
    DAT2         SDHC0_D2      PTE5
    CD/DAT3      SDHC0_D3      PTE4
    CMD          SDHC0_CMD     PTE3
    CLK          SDHC0_DCLK    PTE2
    SWITCH       D_CARD_DETECT PTE6
    ------------ ------------- --------

  There is no Write Protect pin available to the K64F.

  Configuration Settings
  ----------------------
  Enabling SDHC support. The Freedom K64F provides one microSD memory card
  slot.  Support for the SD slots can be enabled with the following
  settings:

    System Type->Kinetic Peripheral Selection
      CONFIG_KINETIS_SDHC=y                 : To enable SDHC0 support
      CONFIG_KINETIS_SDHC_DMA=y             : Use SDIO DMA

    System Type
      CONFIG_KINETIS_GPIOIRQ=y              : GPIO interrupts needed
      CONFIG_KINETIS_PORTEINTS=y            : Card detect pin is on PTE6

    Device Drivers -> MMC/SD Driver Support
      CONFIG_MMCSD=y                        : Enable MMC/SD support
      CONFIG_MMSCD_NSLOTS=1                 : One slot per driver instance
      CONFIG_MMCSD_MULTIBLOCK_LIMIT=1       : (REVISIT)
      CONFIG_MMCSD_HAVE_CARDDETECT=y        : Supports card-detect PIOs
      CONFIG_MMCSD_MMCSUPPORT=n             : Interferes with some SD cards
      CONFIG_MMCSD_SPI=n                    : No SPI-based MMC/SD support
      CONFIG_MMCSD_SDIO=y                   : SDIO-based MMC/SD support
      CONFIG_SDIO_BLOCKSETUP=y              : Needs to know block sizes

    RTOS Features -> Work Queue Support
      CONFIG_SCHED_WORKQUEUE=y              : Driver needs work queue support
      CONFIG_SCHED_HPWORK=y

    Application Configuration -> NSH Library
      CONFIG_NSH_ARCHINIT=y                 : NSH board-initialization, and
      CONFIG_BOARDCTL=y                 : Or
      CONFIG_BOARD_LATE_INITIALIZE=y

  Using the SD card
  -----------------

  1. After booting, the SDHC device will appear as /dev/mmcsd0.
  2. If you try mounting an SD card with nothing in the slot, the mount will
     fail:

       nsh> mount -t vfat /dev/mmcsd0 /mnt/sd0
       nsh: mount: mount failed: 19

     NSH can be configured to provide errors as strings instead of
     numbers.  But in this case, only the error number is reported.  The
     error numbers can be found in nuttx/include/errno.h:

       #define ENODEV              19
       #define ENODEV_STR          "No such device"

     So the mount command is saying that there is no device or, more
     correctly, that there is no card in the SD card slot.

  3. Insert the SD card.  Then the mount should succeed.

      nsh> mount -t vfat /dev/mmcsd0 /mnt/sd0
      nsh> ls /mnt/sd1
      /mnt/sd1:
       atest.txt
      nsh> cat /mnt/sd1/atest.txt
      This is a test

     NOTE:  See the next section entitled "Auto-Mounter" for another way
     to mount your SD card.

  4. Before removing the card, you must umount the file system.  This is
     equivalent to "ejecting" or "safely removing" the card on Windows:  It
     flushes any cached data to an SD card and makes the SD card unavailable
     to the applications.

       nsh> umount -t /mnt/sd0

     It is now safe to remove the card.  NuttX provides into callbacks
     that can be used by an application to automatically unmount the
     volume when it is removed.  But those callbacks are not used in
     these configurations.

  Auto-Mounter
  ------------
  NuttX implements an auto-mounter than can make working with SD cards
  easier.  With the auto-mounter, the file system will be automatically
  mounted when the SD card is inserted into the SDHC slot and automatically
  unmounted when the SD card is removed.

  Here is a sample configuration for the auto-mounter:

    File System Configuration
      CONFIG_FS_AUTOMOUNTER=y

    Board-Specific Options
      CONFIG_FRDMK64F_SDHC_AUTOMOUNT=y
      CONFIG_FRDMK64F_SDHC_AUTOMOUNT_FSTYPE="vfat"
      CONFIG_FRDMK64F_SDHC_AUTOMOUNT_BLKDEV="/dev/mmcsd0"
      CONFIG_FRDMK64F_SDHC_AUTOMOUNT_MOUNTPOINT="/mnt/sdcard"
      CONFIG_FRDMK64F_SDHC_AUTOMOUNT_DDELAY=1000
      CONFIG_FRDMK64F_SDHC_AUTOMOUNT_UDELAY=2000

  WARNING:  SD cards should never be removed without first unmounting
  them.  This is to avoid data and possible corruption of the file
  system.  Certainly this is the case if you are writing to the SD card
  at the time of the removal.  If you use the SD card for read-only access,
  however, then I cannot think of any reason why removing the card without
  mounting would be harmful.

USB Device Controller Support
==============================

  USB Device Controller Support
  -----------------------------
  The USBHS device controller driver is enabled with he following
  configurationsettings:

    Device Drivers -> USB Device Driver Support
      CONFIG_USBDEV=y                           : Enable USB device support
    For full-speed/low-power mode:
      CONFIG_USBDEV_DUALSPEED=n                 : Disable High speed support
    For high-speed/normal mode:
      CONFIG_USBDEV_DUALSPEED=y                 : Enable High speed support
      CONFIG_USBDEV_DMA=y                       : Enable DMA methods
      CONFIG_USBDEV_MAXPOWER=100                : Maximum power consumption
      CONFIG_USBDEV_SELFPOWERED=y               : Self-powered device

    System Type -> Kinetis Peripheral Selection
      CONFIG_KINETIS_USBOTG=y

  CDC/ACM Device Class
  --------------------
  In order to be usable, you must all enabled some class driver(s) for the
  USBHS device controller.  Here, for example, is how to configure the CDC/ACM
  serial device class:

    Device Drivers -> USB Device Driver Support
      CONFIG_CDCACM=y                           : USB Modem (CDC ACM) support
      CONFIG_CDCACM_EP0MAXPACKET=64             : Endpoint 0 packet size
      CONFIG_CDCACM_EPINTIN=1                   : Interrupt IN endpoint number
      CONFIG_CDCACM_EPINTIN_FSSIZE=64           : Full speed packet size
      CONFIG_CDCACM_EPINTIN_HSSIZE=64           : High speed packet size
      CONFIG_CDCACM_EPBULKOUT=3                 : Bulk OUT endpoint number
      CONFIG_CDCACM_EPBULKOUT_FSSIZE=64         : Full speed packet size
      CONFIG_CDCACM_EPBULKOUT_HSSIZE=512        : High speed packet size
      CONFIG_CDCACM_EPBULKIN=2                  : Bulk IN endpoint number
      CONFIG_CDCACM_EPBULKIN_FSSIZE=64          : Full speed packet size
      CONFIG_CDCACM_EPBULKIN_HSSIZE=512         : High speed packet size
      CONFIG_CDCACM_NWRREQS=4                   : Number of write requests
      CONFIG_CDCACM_NRDREQS=8                   : Number of read requests
      CONFIG_CDCACM_BULKIN_REQLEN=96            : Size of write request buffer (for full speed)
      CONFIG_CDCACM_BULKIN_REQLEN=768           : Size of write request buffer (for high speed)
      CONFIG_CDCACM_RXBUFSIZE=257               : Serial read buffer size
      CONFIG_CDCACM_TXBUFSIZE=193               : Serial transmit buffer size (for full speed)
      CONFIG_CDCACM_TXBUFSIZE=769               : Serial transmit buffer size (for high speed)
      CONFIG_CDCACM_VENDORID=0x0525             : Vendor ID
      CONFIG_CDCACM_PRODUCTID=0xa4a7            : Product ID
      CONFIG_CDCACM_VENDORSTR="NuttX"           : Vendor string
      CONFIG_CDCACM_PRODUCTSTR="CDC/ACM Serial" : Product string

    Device Drivers -> Serial Driver Support
      CONFIG_SERIAL_REMOVABLE=y                 : Support for removable serial device

  The CDC/ACM application provides commands to connect and disconnect the
  CDC/ACM serial device:

    CONFIG_SYSTEM_CDCACM=y                     : Enable connect/disconnect support
    CONFIG_SYSTEM_CDCACM_DEVMINOR=0            : Use device /dev/ttyACM0
    CONFIG_CDCACM_RXBUFSIZE=???                : A large RX may be needed

  If you include this CDC/ACM application, then you can connect the CDC/ACM
  serial device to the host by entering the command 'sercon' and you detach
  the serial device with the command 'serdis'.  If you do no use this
  application, they you will have to write logic in your board initialization
  code to initialize and attach the USB device.

Development Environment
=======================

  Either Linux or Cygwin on Windows can be used for the development environment.
  The source has been built only using the GNU toolchain (see below).  Other
  toolchains will likely cause problems. Testing was performed using the Cygwin
  environment.

GNU Toolchain Options
=====================

  The NuttX make system supports several GNU-based toolchains under Linux,
  Cygwin under Windows, and Windows native.  To select a toolchain:

  1. Use 'make menuconfig' and select the toolchain that you are using
     under the System Type menu.
  2. The default toolchain is the NuttX buildroot under Linux or Cygwin:

    CONFIG_ARM_TOOLCHAIN_BUILDROOT=y

  You may also have to modify the PATH environment variable if your make cannot
  find the tools.

Freedom K64F Configuration Options
==================================

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

       CONFIG_ARCH=arm

    CONFIG_ARCH_family - For use in C code:

       CONFIG_ARCH_ARM=y

    CONFIG_ARCH_architecture - For use in C code:

       CONFIG_ARCH_CORTEXM4=y

    CONFIG_ARCH_CHIP - Identifies the arch/*/chip subdirectory

       CONFIG_ARCH_CHIP=kinetis

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

       CONFIG_ARCH_CHIP_MK64FN1M0VLL12

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

       CONFIG_ARCH_BOARD="freedom-k64f" (for the Freedom K64F development board)

    CONFIG_ARCH_BOARD_name - For use in C code

       CONFIG_ARCH_BOARD_FREEDOM_K64F=y

    CONFIG_ARCH_LOOPSPERMSEC - Must be calibrated for correct operation
       of delay loops

    CONFIG_ENDIAN_BIG - define if big endian (default is little
       endian)

    CONFIG_RAM_SIZE - Describes the installed DRAM (SRAM in this case):

       CONFIG_RAM_SIZE=0x00010000 (64Kb)

    CONFIG_RAM_START - The start address of installed DRAM

       CONFIG_RAM_START=0x20000000

    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.

  Individual subsystems can be enabled:

    CONFIG_KINETIS_TRACE    -- Enable trace clocking on power up.
    CONFIG_KINETIS_FLEXBUS  -- Enable flexbus clocking on power up.
    CONFIG_KINETIS_UART0    -- Support UART0
    CONFIG_KINETIS_UART1    -- Support UART1
    CONFIG_KINETIS_UART2    -- Support UART2
    CONFIG_KINETIS_UART3    -- Support UART3
    CONFIG_KINETIS_UART4    -- Support UART4
    CONFIG_KINETIS_UART5    -- Support UART5
    CONFIG_KINETIS_ENET     -- Support Ethernet (K5x, K6x, and K7x only)
    CONFIG_KINETIS_RNGB     -- Support the random number generator(K6x only)
    CONFIG_KINETIS_FLEXCAN0 -- Support FlexCAN0
    CONFIG_KINETIS_FLEXCAN1 -- Support FlexCAN1
    CONFIG_KINETIS_SPI0     -- Support SPI0
    CONFIG_KINETIS_SPI1     -- Support SPI1
    CONFIG_KINETIS_SPI2     -- Support SPI2
    CONFIG_KINETIS_I2C0     -- Support I2C0
    CONFIG_KINETIS_I2C1     -- Support I2C1
    CONFIG_KINETIS_I2S      -- Support I2S
    CONFIG_KINETIS_DAC0     -- Support DAC0
    CONFIG_KINETIS_DAC1     -- Support DAC1
    CONFIG_KINETIS_ADC0     -- Support ADC0
    CONFIG_KINETIS_ADC1     -- Support ADC1
    CONFIG_KINETIS_CMP      -- Support CMP
    CONFIG_KINETIS_VREF     -- Support VREF
    CONFIG_KINETIS_SDHC     -- Support SD host controller
    CONFIG_KINETIS_FTM0     -- Support FlexTimer 0
    CONFIG_KINETIS_FTM1     -- Support FlexTimer 1
    CONFIG_KINETIS_FTM2     -- Support FlexTimer 2
    CONFIG_KINETIS_LPTMR0   -- Support the low power timer 0
    CONFIG_KINETIS_RTC      -- Support RTC
    CONFIG_KINETIS_SLCD     -- Support the segment LCD (K3x, K4x, and K5x only)
    CONFIG_KINETIS_EWM      -- Support the external watchdog
    CONFIG_KINETIS_CMT      -- Support Carrier Modulator Transmitter
    CONFIG_KINETIS_USBOTG   -- Support USB OTG (see also CONFIG_USBHOST and CONFIG_USBDEV)
    CONFIG_KINETIS_USBDCD   -- Support the USB Device Charger Detection module
    CONFIG_KINETIS_LLWU     -- Support the Low Leakage Wake-Up Unit
    CONFIG_KINETIS_TSI      -- Support the touch screeen interface
    CONFIG_KINETIS_FTFL     -- Support FLASH
    CONFIG_KINETIS_DMA      -- Support DMA
    CONFIG_KINETIS_CRC      -- Support CRC
    CONFIG_KINETIS_PDB      -- Support the Programmable Delay Block
    CONFIG_KINETIS_PIT      -- Support Programmable Interval Timers
    CONFIG_ARM_MPU          -- Support the MPU

  Kinetis interrupt priorities (Default is the mid priority).  These should
  not be set because they can cause unhandled, nested interrupts.  All
  interrupts need to be at the default priority in the current design.

    CONFIG_KINETIS_UART0PRIO
    CONFIG_KINETIS_UART1PRIO
    CONFIG_KINETIS_UART2PRIO
    CONFIG_KINETIS_UART3PRIO
    CONFIG_KINETIS_UART4PRIO
    CONFIG_KINETIS_UART5PRIO

    CONFIG_KINETIS_EMACTMR_PRIO
    CONFIG_KINETIS_EMACTX_PRIO
    CONFIG_KINETIS_EMACRX_PRIO
    CONFIG_KINETIS_EMACMISC_PRIO

    CONFIG_KINETIS_SDHC_PRIO

  PIN Interrupt Support

    CONFIG_KINETIS_GPIOIRQ   -- Enable pin interrupt support.  Also needs
      one or more of the following:
    CONFIG_KINETIS_PORTAINTS -- Support 32 Port A interrupts
    CONFIG_KINETIS_PORTBINTS -- Support 32 Port B interrupts
    CONFIG_KINETIS_PORTCINTS -- Support 32 Port C interrupts
    CONFIG_KINETIS_PORTDINTS -- Support 32 Port D interrupts
    CONFIG_KINETIS_PORTEINTS -- Support 32 Port E interrupts

  Kinetis K64 specific device driver settings

    CONFIG_UARTn_SERIAL_CONSOLE - selects the UARTn (n=0..5) for the
      console and ttys0 (default is the UART0).
    CONFIG_UARTn_RXBUFSIZE - Characters are buffered as received.
       This specific the size of the receive buffer
    CONFIG_UARTn_TXBUFSIZE - Characters are buffered before
       being sent.  This specific the size of the transmit buffer
    CONFIG_UARTn_BAUD - The configure BAUD of the UART.
    CONFIG_UARTn_BITS - The number of bits.  Must be either 8 or 8.
    CONFIG_UARTn_PARTIY - 0=no parity, 1=odd parity, 2=even parity

  Kenetis ethernet controller settings

    CONFIG_ENET_NRXBUFFERS - Number of RX buffers.  The size of one
        buffer is determined by CONFIG_NET_ETH_PKTSIZE.  Default: 6
    CONFIG_ENET_NTXBUFFERS - Number of TX buffers.  The size of one
        buffer is determined by CONFIG_NET_ETH_PKTSIZE.  Default: 2
    CONFIG_ENET_USEMII - Use MII mode.  Default: RMII mode.
    CONFIG_ENET_PHYADDR - PHY address

Configurations
==============

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

    tools/configure.sh freedom-k64f:<subdir>

Where <subdir> is one of the following:

  netnsh:
  ------
    This configuration is identical to the nsh configuration described
    below except that networking support is enabled.

    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_WINDOWS=y               : Cygwin under Windows
       CONFIG_WINDOWS_CYGWIN=y
       CONFIG_ARM_TOOLCHAIN_GNU_EABI=y  : ARM/mbed toolcahin (arm-none-elf-gcc)
       CONFIG_INTELHEX_BINARY=y            : Output formats: Intel hex binary

    3. The Serial Console is provided on UART3 with the correct pin
       configuration for use with an Arduino Serial Shield.

    4. SDHC support is not enabled in this configuration.  Refer to the
       configuration settings listed above under "SD Card Support".

    5. Support for NSH built-in applications is enabled, but no built-in
       applications have been configured in.

    6. No external pullup is available on MDIO signal when MK64FN1M0VLL12 MCU
       is requests status of the Ethernet link connection. Internal pullup is
       required when port configuration for MDIO signal is enabled:

       CONFIG_KINETIS_ENET_MDIOPULLUP=y

    7. Configured to use a fixed IPv4 address:

       CONFIG_NSH_IPADDR=0x0a000002
       CONFIG_NSH_DRIPADDR=0x0a000001
       CONFIG_NSH_NETMASK=0xffffff00

       And a bogus MAC address:

       CONFIG_NSH_NOMAC=y
       CONFIG_NSH_SWMAC=y
       CONFIG_NETINIT_MACADDR=0x00e0deadbeef

  nsh:
  ---
    Configures the NuttShell (nsh) located at apps/examples/nsh using a
    serial console on UART3.

    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_WINDOWS=y               : Cygwin under Windows
         CONFIG_WINDOWS_CYGWIN=y
         CONFIG_ARM_TOOLCHAIN_GNU_EABI=y  : ARM/mbed toolcahin (arm-none-elf-gcc)
         CONFIG_INTELHEX_BINARY=y            : Output formats: Intel hex binary

    3. The Serial Console is provided on UART0 with the correct pin
       configuration for use with the OpenSDAv2 VCOM.  This can be switched
       to use a RS-232 shield on UART3 by reconfiguring the serial console.

         -CONFIG_KINETIS_UART0=y
         +CONFIG_KINETIS_UART3=y
         -CONFIG_UART0_SERIALDRIVER=y
         +CONFIG_UART3_SERIALDRIVER=y
         -CONFIG_UART0_SERIAL_CONSOLE=y
         +CONFIG_UART3_SERIAL_CONSOLE=y
         -CONFIG_UART0_RXBUFSIZE=256
         +CONFIG_UART3_RXBUFSIZE=256
         -CONFIG_UART0_TXBUFSIZE=256
         +CONFIG_UART3_TXBUFSIZE=256
         -CONFIG_UART0_BAUD=115200
         +CONFIG_UART3_BAUD=115200
         -CONFIG_UART0_BITS=8
         +CONFIG_UART3_BITS=8
         -CONFIG_UART0_PARITY=0
         +CONFIG_UART3_PARITY=0
         -CONFIG_UART0_2STOP=0
         +CONFIG_UART3_2STOP=0

       NOTE: On my Windows 10 / Cygwin64 system, the OpenSDAv2 VCOM is not
       recognized.  I probably need to install a driver?

       There is a serial USB driver on the mbed web site.  However, this
       driver would not install on Windows 10 for me.  I understand that
       it installs OK on Windows 7.

    4. Support for NSH built-in applications is enabled, but no built-in
       applications have been configured in.

    5. An SDHC driver is enabled in this configuration but does not yet work.
       The basic problem seems to be that it does not sense the presence of
       the SD card on PTE6.  No interrupts are generated when the SD card is
       inserted or removed.  You might want to disable SDHC and MMC/SD if
       you are using this configuration.  Refer to the configuration
       settings listed above under "SD Card Support".

Status
======

  2016-07-11:  Received hardware today and the board came up on the very
    first try.  That does not happen often.  At this point, the very basic
    NSH configuration is working and LEDs are working.

    The only odd behavior that I see is that pressing SW3 causes an NMI
    interrupt (followed by a crash):

      kinetis_nmi: PANIC!!! NMI received

    I don't yet understand why this is.

  2016-07-12:  Added support for the KSZ8081 PHY and added the netnsh
    configuration.  The network is basically functional.  More testing is
    needed, but I have not seen any obvious network failures.

    In testing, I notice a strange thing.  If I run at full optimization the
    code runs (albeit with bugs-to-be-solved).  But with no optimization or
    even at -O1, the system fails to boot.  This seems to be related to the
    watchdog timer.

  2016-07-13:  Add SD automounter logic; broke out SDHC logic into a separate
    file.  The nsh configuration now has SDHC enabled be default.  Does not
    yet work.  The basic problem seems to be that it does not sense the
    presence of the SD card on PTE6.  No interrupts are generated when the
    SD card is inserted or removed.  You might want to disable SDHC and
    MMC/SD if you are using this configuration.

    The nsh configuration now builds successfully with USB device enabled.
    USB device, however, has not yet been tested.  I have not yet looked
    into 48MHz clocking requirements.

  2017-02-10:  These have been numerous SDHC fixes submitted by Marc Rechte'.
    These may or may not have fixed the SDHC issues mentioned about.  You
    would have to retest to verify the SDHC functionality.
