TM4C123G LaunchPad: Add initialization logic for an external AT24 EEPROM. This is intended only to suppport testing of the Tiva I2C driver

This commit is contained in:
Gregory Nutt 2014-12-10 15:56:49 -06:00
parent 98d9ceb582
commit 47c4ce5761
8 changed files with 549 additions and 27 deletions

View file

@ -4,4 +4,43 @@
#
if ARCH_BOARD_TM4C123G_LAUNCHPAD
config TM4C123G_LAUNCHPAD_AT24_BLOCKMOUNT
bool "AT24 Serial EEPROM auto-mount"
default n
depends on NSH_ARCHINIT && TIVA_I2C0 && MTD_AT24XX
---help---
Automatically initialize the AT24 SPI EEPROM driver when NSH starts.
The Serial EEPROM was mounted on an external adaptor board and
connected to the LaunchPad thusly:
- VCC -- VCC
- GND -- GND
- PB2 -- SCL
- PB3 -- SDA
choice
prompt "AT24 serial EPPROM configuration"
default TM4C123G_LAUNCHPAD_AT24_FTL
depends on TM4C123G_LAUNCHPAD_AT24_BLOCKMOUNT
config TM4C123G_LAUNCHPAD_AT24_FTL
bool "Create AT24 block driver"
---help---
Create the MTD driver for the AT24 and "wrap" the AT24 as a standard
block driver that could then, for example, be mounted using FAT or
any other file system. Any file system may be used, but there will
be no wear-leveling.
config TM4C123G_LAUNCHPAD_AT24_NXFFS
bool "Create AT24 NXFFS file system"
depends on FS_NXFFS
---help---
Create the MTD driver for the AT24 and mount the AT24 device as
a wear-leveling, NuttX FLASH file system (NXFFS). The downside of
NXFFS is that it can be very slow.
endchoice # AT24 serial EPPROM configuration
endif

View file

@ -18,6 +18,8 @@ Contents
LEDs
Serial Console
USB Device Controller Functions
AT24 Serial EEPROM
I2C Tool
Using OpenOCD and GDB with an FT2232 JTAG emulator
TM4C123G LaunchPad Configuration Options
Configurations
@ -79,6 +81,152 @@ PIN SIGNAL(S) LanchPad Function
31 PF3/CAN0TX/SSI1FSS/T1CCP1/TRCLK LED_G, GPIO, J4 pin 2
05 PF4/T2CCP0 USR_SW1 (Low when pressed), GPIO, J4 pin 10
AT24 Serial EEPROM
^^^^^^^^^^^^^^^^^^
AT24 Connections
----------------
A AT24C512 Serial EEPPROM was used for tested I2C. There are no I2C
devices on-board the Launchpad, but an external serial EEPROM module
module was used.
The Serial EEPROM was mounted on an external adaptor board and connected
to the LaunchPad thusly:
- VCC -- VCC
- GND -- GND
- PB2 -- SCL
- PB3 -- SDA
Configuration Settings
----------------------
The following configuration settings were used:
System Type -> Tiva/Stellaris Peripheral Support
CONFIG_TIVA_I2C0=y : Enable I2C
System Type -> I2C device driver options
TIVA_I2C_FREQUENCY=100000 : Select an I2C frequency
Device Drivers -> I2C Driver Support
CONFIG_I2C=y : Enable I2C support
CONFIG_I2C_TRANSFER=y : Driver supports the transfer() method
CONFIG_I2C_WRITEREAD=y : Driver supports the writeread() method
Device Drivers -> Memory Technology Device (MTD) Support
CONFIG_MTD=y : Enable MTD support
CONFIG_MTD_AT24XX=y : Enable the AT24 driver
CONFIG_AT24XX_SIZE=512 : Specifies the AT 24C512 part
CONFIG_AT24XX_ADDR=0x53 : AT24 I2C address
Application Configuration -> NSH Library
CONFIG_NSH_ARCHINIT=y : NSH board-initialization
File systems
CONFIG_NXFFS=y : Enables the NXFFS file system
CONFIG_NXFFS_PREALLOCATED=y : Required
: Other defaults are probably OK
Board Selection
CONFIG_TM4C123G_LAUNCHPAD_AT24_BLOCKMOUNT=y : Mounts AT24 for NSH
CONFIG_TM4C123G_LAUNCHPAD_AT24_NXFFS=y : Mount the AT24 using NXFFS
You can then format the AT24 EEPROM for a FAT file system and mount the
file system at /mnt/at24 using these NSH commands:
nsh> mkfatfs /dev/mtdblock0
nsh> mount -t vfat /dev/mtdblock0 /mnt/at24
Then you an use the FLASH as a normal FAT file system:
nsh> echo "This is a test" >/mnt/at24/atest.txt
nsh> ls -l /mnt/at24
/mnt/at24:
-rw-rw-rw- 16 atest.txt
nsh> cat /mnt/at24/atest.txt
This is a test
I2C Tool
========
I2C Tool. NuttX supports an I2C tool at apps/system/i2c that can be used
to peek and poke I2C devices. That tool can be enabled by setting the
following:
System Type -> TIVA Peripheral Support
CONFIG_TIVA_I2C0=y : Enable I2C0
CONFIG_TIVA_I2C1=y : Enable I2C1
CONFIG_TIVA_I2C2=y : Enable I2C2
...
System Type -> I2C device driver options
CONFIG_TIVA_I2C0_FREQUENCY=100000 : Select an I2C0 frequency
CONFIG_TIVA_I2C1_FREQUENCY=100000 : Select an I2C1 frequency
CONFIG_TIVA_I2C2_FREQUENCY=100000 : Select an I2C2 frequency
...
Device Drivers -> I2C Driver Support
CONFIG_I2C=y : Enable I2C support
CONFIG_I2C_TRANSFER=y : Driver supports the transfer() method
CONFIG_I2C_WRITEREAD=y : Driver supports the writeread() method
Application Configuration -> NSH Library
CONFIG_SYSTEM_I2CTOOL=y : Enable the I2C tool
CONFIG_I2CTOOL_MINBUS=0 : I2C0 has the minimum bus number 0
CONFIG_I2CTOOL_MAXBUS=2 : I2C2 has the maximum bus number 2
CONFIG_I2CTOOL_DEFFREQ=100000 : Pick a consistent frequency
The I2C tool has extensive help that can be accessed as follows:
nsh> i2c help
Usage: i2c <cmd> [arguments]
Where <cmd> is one of:
Show help : ?
List busses : bus
List devices : dev [OPTIONS] <first> <last>
Read register : get [OPTIONS] [<repititions>]
Show help : help
Write register: set [OPTIONS] <value> [<repititions>]
Verify access : verf [OPTIONS] [<value>] [<repititions>]
Where common "sticky" OPTIONS include:
[-a addr] is the I2C device address (hex). Default: 03 Current: 03
[-b bus] is the I2C bus number (decimal). Default: 0 Current: 0
[-r regaddr] is the I2C device register address (hex). Default: 00 Current: 00
[-w width] is the data width (8 or 16 decimal). Default: 8 Current: 8
[-s|n], send/don't send start between command and data. Default: -n Current: -n
[-i|j], Auto increment|don't increment regaddr on repititions. Default: NO Current: NO
[-f freq] I2C frequency. Default: 100000 Current: 100000
NOTES:
o Arguments are "sticky". For example, once the I2C address is
specified, that address will be re-used until it is changed.
WARNING:
o The I2C dev command may have bad side effects on your I2C devices.
Use only at your own risk.
As an example, the I2C dev command can be used to list all devices
responding on I2C0 (the default) like this:
nsh> i2c dev 0x03 0x77
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- 1a -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- 39 -- -- -- 3d -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: 60 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
nsh>
NOTE: This is output from a different board and shows I2C
devices responding at addresses 0x1a, 0x39, 0x3d, and 0x60.
Using OpenOCD and GDB with an FT2232 JTAG emulator
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View file

@ -35,32 +35,38 @@
-include $(TOPDIR)/Make.defs
CFLAGS += -I$(TOPDIR)/sched
CFLAGS += -I$(TOPDIR)/sched
ASRCS =
AOBJS = $(ASRCS:.S=$(OBJEXT))
CSRCS = tm4c_boot.c tm4c_ssi.c
ASRCS =
AOBJS = $(ASRCS:.S=$(OBJEXT))
CSRCS = tm4c_boot.c tm4c_bringup.c tm4c_ssi.c
ifeq ($(CONFIG_ARCH_LEDS),y)
CSRCS += tm4c_autoleds.c
CSRCS += tm4c_autoleds.c
endif
ifeq ($(CONFIG_NSH_ARCHINIT),y)
CSRCS += tm4c_nsh.c
CSRCS += tm4c_nsh.c
endif
COBJS = $(CSRCS:.c=$(OBJEXT))
ifeq ($(CONFIG_MTD_AT24XX),y)
ifeq ($(CONFIG_TIVA_I2C0),y)
CSRCS += tm4c_at24.c
endif
endif
SRCS = $(ASRCS) $(CSRCS)
OBJS = $(AOBJS) $(COBJS)
COBJS = $(CSRCS:.c=$(OBJEXT))
SRCS = $(ASRCS) $(CSRCS)
OBJS = $(AOBJS) $(COBJS)
ARCH_SRCDIR = $(TOPDIR)/arch/$(CONFIG_ARCH)/src
ifeq ($(WINTOOL),y)
CFLAGS += -I "${shell cygpath -w $(ARCH_SRCDIR)/chip}" \
-I "${shell cygpath -w $(ARCH_SRCDIR)/common}" \
-I "${shell cygpath -w $(ARCH_SRCDIR)/armv7-m}"
CFLAGS += -I "${shell cygpath -w $(ARCH_SRCDIR)/chip}" \
-I "${shell cygpath -w $(ARCH_SRCDIR)/common}" \
-I "${shell cygpath -w $(ARCH_SRCDIR)/armv7-m}"
else
CFLAGS += -I$(ARCH_SRCDIR)/chip -I$(ARCH_SRCDIR)/common -I$(ARCH_SRCDIR)/armv7-m
CFLAGS += -I$(ARCH_SRCDIR)/chip -I$(ARCH_SRCDIR)/common -I$(ARCH_SRCDIR)/armv7-m
endif
all: libboard$(LIBEXT)

View file

@ -49,6 +49,9 @@
/************************************************************************************
* Definitions
************************************************************************************/
/* Configuration ********************************************************************/
#define HAVE_AT24 1
/* How many SSI modules does this chip support? */
@ -62,6 +65,57 @@
# define CONFIG_SSI1_DISABLE 1
#endif
/* AT24 Serial EEPROM
*
* A AT24C512 Serial EEPPROM was used for tested I2C. There are no I2C
* devices on-board the Launchpad, but an external serial EEPROM module
* module was used.
*
* The Serial EEPROM was mounted on an external adaptor board and connected
* to the LaunchPad thusly:
*
* - VCC -- VCC
* - GND -- GND
* - PB2 -- SCL
* - PB3 -- SDA
*/
#define AT24_BUS 0
#define AT24_MINOR 0
#if !defined(CONFIG_MTD_AT24XX) || !defined(CONFIG_TIVA_I2C0)
# undef HAVE_AT24
#endif
/* Can't support AT25 features if mountpoints are disabled or if we were not
* asked to mount the AT25 part
*/
#if defined(CONFIG_DISABLE_MOUNTPOINT) || \
!defined(CONFIG_TM4C123G_LAUNCHPAD_AT24_BLOCKMOUNT)
# undef HAVE_AT24
#endif
/* If we are going to mount the AT25, then they user must also have told
* us what to do with it by setting one of these.
*/
#ifndef CONFIG_FS_NXFFS
# undef CONFIG_TM4C123G_LAUNCHPAD_AT24_NXFFS
#endif
#if !defined(CONFIG_TM4C123G_LAUNCHPAD_AT24_FTL) && \
!defined(CONFIG_TM4C123G_LAUNCHPAD_AT24_NXFFS)
# undef HAVE_AT24
#endif
#if defined(CONFIG_TM4C123G_LAUNCHPAD_AT24_FTL) && \
defined(CONFIG_TM4C123G_LAUNCHPAD_AT24_NXFFS)
# warning Both CONFIG_TM4C123G_LAUNCHPAD_AT24_FTL and CONFIG_TM4C123G_LAUNCHPAD_AT24_NXFFS are set
# warning Ignoring CONFIG_TM4C123G_LAUNCHPAD_AT24_NXFFS
# undef CONFIG_TM4C123G_LAUNCHPAD_AT24_NXFFS
#endif
/* TM4C123G LaunchPad ***************************************************************/
/* The TM4C123G LaunchPad has a single RGB LED. There is only one visible LED which
* will vary in color. But, from the standpoint of the firmware, this appears as
@ -147,6 +201,27 @@ void weak_function tm4c_ssiinitialize(void);
void tm4c_ledinit(void);
#endif
/****************************************************************************
* Name: tm4c_bringup
*
* Description:
* Bring up board features
*
****************************************************************************/
int tm4c_bringup(void);
/****************************************************************************
* Name: tm4c_at24_automount
*
* Description:
* Initialize and configure the AT24 serial EEPROM
*
****************************************************************************/
#ifdef HAVE_AT24
int tm4c_at24_automount(int minor);
#endif
#endif /* __ASSEMBLY__ */
#endif /* __CONFIGS_TM4C123G_LAUNCHPAD_TM4C123G_LAUNCHPAD_H */

View file

@ -0,0 +1,156 @@
/****************************************************************************
* config/sama5d3x-ek/src/tm4c_at24.c
*
* Copyright (C) 2014 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/* AT24 Serial EEPROM
*
* A AT24C512 Serial EEPPROM was used for tested I2C. There are no I2C
* devices on-board the Launchpad, but an external serial EEPROM module
* module was used.
*
* The Serial EEPROM was mounted on an external adaptor board and connected
* to the LaunchPad thusly:
*
* - VCC -- VCC
* - GND -- GND
* - PB2 -- SCL
* - PB3 -- SDA
*/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <sys/mount.h>
#include <stdbool.h>
#include <stdio.h>
#include <errno.h>
#include <debug.h>
#include <nuttx/i2c.h>
#include <nuttx/mtd/mtd.h>
#include <nuttx/fs/nxffs.h>
#include "tm4c123g-launchpad.h"
#ifdef HAVE_AT24
/****************************************************************************
* Pre-Processor Definitions
****************************************************************************/
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: tm4c_at24_automount
*
* Description:
* Initialize and configure the AT24 serial EEPROM
*
****************************************************************************/
int tm4c_at24_automount(int minor)
{
FAR struct i2c_dev_s *i2c;
FAR struct mtd_dev_s *mtd;
static bool initialized = false;
int ret;
/* Have we already initialized? */
if (!initialized)
{
/* No.. Get the I2C bus driver */
i2c = up_i2cinitialize(AT24_BUS);
if (!i2c)
{
syslog(LOG_ERR, "ERROR: Failed to initialize SPI%d\n", AT24_BUS);
return -ENODEV;
}
/* Now bind the I2C interface to the AT24 I2C EEPROM driver */
mtd = at24c_initialize(i2c);
if (!mtd)
{
syslog(LOG_ERR,
"ERROR: Failed to bind SPI%d to the AT24 EEPROM driver\n",
AT24_BUS);
return -ENODEV;
}
#if defined(CONFIG_TM4C123G_LAUNCHPAD_AT24_FTL)
/* And finally, use the FTL layer to wrap the MTD driver as a block driver */
ret = ftl_initialize(AT24_MINOR, mtd);
if (ret < 0)
{
syslog(LOG_ERR, "ERROR: Failed to initialize the FTL layer: %d\n", ret);
return ret;
}
#elif defined(CONFIG_TM4C123G_LAUNCHPAD_AT24_NXFFS)
/* Initialize to provide NXFFS on the MTD interface */
ret = nxffs_initialize(mtd);
if (ret < 0)
{
syslog(LOG_ERR, "ERROR: NXFFS initialization failed: %d\n", ret);
return ret;
}
/* Mount the file system at /mnt/at24 */
ret = mount(NULL, "/mnt/at24", "nxffs", 0, NULL);
if (ret < 0)
{
syslog(LOG_ERR, "ERROR: Failed to mount the NXFFS volume: %d\n", errno);
return ret;
}
#endif
/* Now we are initialized */
initialized = true;
}
return OK;
}
#endif /* HAVE_AT24 */

View file

@ -64,7 +64,7 @@
*
* Description:
* All Tiva architectures must provide the following entry point. This entry
* point is called early in the intitialization -- after all memory has been
* point is called early in the initialization -- after all memory has been
* configured and mapped but before any devices have been initialized.
*
************************************************************************************/
@ -90,3 +90,25 @@ void tiva_boardinitialize(void)
tm4c_ledinit();
#endif
}
/****************************************************************************
* Name: board_initialize
*
* Description:
* If CONFIG_BOARD_INITIALIZE is selected, then an additional
* initialization call will be performed in the boot-up sequence to a
* function called board_initialize(). board_initialize() will be
* called immediately after up_intiialize() is called and just before the
* initial application is started. This additional initialization phase
* may be used, for example, to initialize board-specific device drivers.
*
****************************************************************************/
#ifdef CONFIG_BOARD_INITIALIZE
void board_initialize(void)
{
/* Perform board initialization */
(void)tm4c_bringup();
}
#endif /* CONFIG_BOARD_INITIALIZE */

View file

@ -0,0 +1,80 @@
/****************************************************************************
* config/tm4c123g-launchpad/src/tm4c_bringup.c
*
* Copyright (C) 2014 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <syslog.h>
#include "tm4c123g-launchpad.h"
/****************************************************************************
* Pre-Processor Definitions
****************************************************************************/
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: tm4c_bringup
*
* Description:
* Bring up board features
*
****************************************************************************/
int tm4c_bringup(void)
{
#ifdef HAVE_AT24
int ret;
/* Initialize the AT24 driver */
ret = tm4c_at24_automount(AT24_MINOR);
if (ret < 0)
{
syslog(LOG_ERR, "ERROR: tm4c_at24_automount failed: %d\n", ret);
}
return ret;
#else
return OK;
#endif /* HAVE_AT24 */
}

View file

@ -39,24 +39,12 @@
#include <nuttx/config.h>
#include <stdio.h>
#include <syslog.h>
#include <errno.h>
#include <nuttx/spi/spi.h>
#include <nuttx/mmcsd.h>
#include "tm4c123g-launchpad.h"
/****************************************************************************
* Pre-Processor Definitions
****************************************************************************/
/* Configuration ************************************************************/
/* Can't support USB features if USB is not enabled */
#ifndef CONFIG_USBDEV
# undef NSH_HAVEUSBDEV
#endif
/****************************************************************************
* Public Functions
@ -72,5 +60,13 @@
int nsh_archinitialize(void)
{
/* If CONFIG_BOARD_INITIALIZE is selected then board initialization was
* already performed in board_initialize.
*/
#ifndef CONFIG_BOARD_INITIALIZE
return tm4c_bringup();
#else
return OK;
#endif
}