Fix error in AT91SAM SPI driver introduced in recent comment. Varioius improvements to README files and debug output

This commit is contained in:
Gregory Nutt 2013-06-13 13:38:31 -06:00
parent b40def3027
commit 516c3bb7c2
3 changed files with 101 additions and 129 deletions

View File

@ -13,6 +13,7 @@ Contents
- NuttX EABI "buildroot" Toolchain - NuttX EABI "buildroot" Toolchain
- NuttX OABI "buildroot" Toolchain - NuttX OABI "buildroot" Toolchain
- NXFLAT Toolchain - NXFLAT Toolchain
- AtmelStudio6.1
- LEDs - LEDs
- SAM3U-EK-specific Configuration Options - SAM3U-EK-specific Configuration Options
- Configurations - Configurations
@ -213,12 +214,32 @@ NXFLAT Toolchain
8. Edit setenv.h, if necessary, so that the PATH variable includes 8. Edit setenv.h, if necessary, so that the PATH variable includes
the path to the newly builtNXFLAT binaries. the path to the newly builtNXFLAT binaries.
AtmelStudio6.1
^^^^^^^^^^^^^^
You can use AtmelStudio6.1 to load and debug code.
- To load code:
Tools -> Device Programming
Configure the debugger and chip and you are in business.
- To Debug Code:
File -> Open -> Open Object File for Debugging
Select the project name, the full path to the NuttX object (called
just nuttx with no extension), and chip. Take the time to resolve
all of the source file linkages or else you will not have source
level debug!
LEDs LEDs
^^^^ ^^^^
The SAM3U-EK board has four LEDs labeled LD1, LD2, LD3 and LD4 on the The SAM3U-EK board has four LEDs labeled LD1, LD2, LD3 and LD4 on the
the board. Usage of these LEDs is defined in include/board.h and src/up_leds.c. the board. Usage of these LEDs is defined in include/board.h and src/up_leds.c.
They are encoded as follows: They are encoded as follows:
SYMBOL Meaning LED0* LED1 LED2 SYMBOL Meaning LED0* LED1 LED2
------------------- ----------------------- ------- ------- ------- ------------------- ----------------------- ------- ------- -------
@ -405,6 +426,42 @@ Configurations
2. Unless stated otherwise, all configurations generate console 2. Unless stated otherwise, all configurations generate console
output of UART0 (J3). output of UART0 (J3).
3. Unless otherwise stated, the configurations are setup for
Linux (or any other POSIX environment like Cygwin under Windows):
Build Setup:
CONFIG_HOST_LINUX=y : Linux or other POSIX environment
4. These configurations use the older, OABI, buildroot toolchain. But
that is easily reconfigured:
System Type -> Toolchain:
CONFIG_ARMV7M_TOOLCHAIN_BUILDROOT=y : Buildroot toolchain
CONFIG_ARMV7M_OABI_TOOLCHAIN=y : Older, OABI toolchain
If you want to use the Atmel GCC toolchain, here are the steps to
do so:
Build Setup:
CONFIG_HOST_WINDOWS=y : Windows
CONFIG_HOST_CYGWIN=y : Using Cygwin or other POSIX environment
System Type -> Toolchain:
CONFIG_ARMV7M_TOOLCHAIN_GNU_EABIW=y : General GCC EABI toolchain under windows
This re-configuration should be done before making NuttX or else the
subsequent 'make' will fail. If you have already attempted building
NuttX then you will have to 1) 'make distclean' to remove the old
configuration, 2) 'cd tools; ./configure.sh sam3u-ek/ksnh' to start
with a fresh configuration, and 3) perform the configuration changes
above.
Also, make sure that your PATH variable has the new path to your
Atmel tools. Try 'which arm-none-eabi-gcc' to make sure that you
are selecting the right tool. setenv.sh is available for you to
use to set or PATH variable. The path in the that file may not,
however, be correct for your installation.
Configuration sub-directories Configuration sub-directories
----------------------------- -----------------------------
@ -424,30 +481,7 @@ Configuration sub-directories
NOTES: NOTES:
1. This configuration is setup for Linux (or any other POSIX environment 1. At the end of the build, there will be several files in the top-level
like Cygwin under Windows):
Build Setup:
CONFIG_HOST_LINUX=y : Linux or other POSIX environment
2. This configuration uses the older, OABI, buildroot toolchain. But
that is easily reconfigured:
System Type -> Toolchain:
CONFIG_ARMV7M_TOOLCHAIN_BUILDROOT=y : Buildroot toolchain
CONFIG_ARMV7M_OABI_TOOLCHAIN=y : Older, OABI toolchain
If you want to use the Atmel GCC toolchain, here are the steps to
do so:
Build Setup:
CONFIG_HOST_WINDOWS=y : Windows
CONFIG_HOST_CYGWIN=y : Using Cygwin or other POSIX environment
System Type -> Toolchain:
CONFIG_ARMV7M_TOOLCHAIN_GNU_EABIW=y : General GCC EABI toolchain under windows
3. At the end of the build, there will be several files in the top-level
NuttX build directory: NuttX build directory:
PASS1: PASS1:
@ -463,7 +497,7 @@ Configuration sub-directories
The J-Link programmer will except files in .hex, .mot, .srec, and .bin The J-Link programmer will except files in .hex, .mot, .srec, and .bin
formats. formats.
4. Combining .hex files. If you plan to use the .hex files with your 2. Combining .hex files. If you plan to use the .hex files with your
debugger or FLASH utility, then you may need to combine the two hex debugger or FLASH utility, then you may need to combine the two hex
files into a single .hex file. Here is how you can do that. files into a single .hex file. Here is how you can do that.
@ -513,30 +547,7 @@ Configuration sub-directories
NOTES: NOTES:
1. This configuration is setup for Linux (or any other POSIX environment 1. NSH built-in applications are supported. However, there are
like Cygwin under Windows):
Build Setup:
CONFIG_HOST_LINUX=y : Linux or other POSIX environment
2. This configuration uses the older, OABI, buildroot toolchain. But
that is easily reconfigured:
System Type -> Toolchain:
CONFIG_ARMV7M_TOOLCHAIN_BUILDROOT=y : Buildroot toolchain
CONFIG_ARMV7M_OABI_TOOLCHAIN=y : Older, OABI toolchain
If you want to use the Atmel GCC toolchain, here are the steps to
do so:
Build Setup:
CONFIG_HOST_WINDOWS=y : Windows
CONFIG_HOST_CYGWIN=y : Using Cygwin or other POSIX environment
System Type -> Toolchain:
CONFIG_ARMV7M_TOOLCHAIN_GNU_EABIW=y : General GCC EABI toolchain under windows
3. NSH built-in applications are supported. However, there are
no built-in applications built with the default configuration. no built-in applications built with the default configuration.
Binary Formats: Binary Formats:
@ -545,7 +556,7 @@ Configuration sub-directories
Applicaton Configuration: Applicaton Configuration:
CONFIG_NSH_BUILTIN_APPS=y : Enable starting apps from NSH command line CONFIG_NSH_BUILTIN_APPS=y : Enable starting apps from NSH command line
4. This configuration has been used for verifying the touchscreen on 2. This configuration has been used for verifying the touchscreen on
on the SAM3U-EK LCD. With these modifications, you can include the on the SAM3U-EK LCD. With these modifications, you can include the
touchscreen test program at apps/examples/touchscreen as an NSH built-in touchscreen test program at apps/examples/touchscreen as an NSH built-in
application. You can enable the touchscreen and test by modifying the application. You can enable the touchscreen and test by modifying the
@ -591,58 +602,7 @@ Configuration sub-directories
Configures to use examples/nx using the HX834x LCD hardware on Configures to use examples/nx using the HX834x LCD hardware on
the SAM3U-EK development board. the SAM3U-EK development board.
NOTES:
1. This configuration is setup for Linux (or any other POSIX environment
like Cygwin under Windows):
Build Setup:
CONFIG_HOST_LINUX=y : Linux or other POSIX environment
2. This configuration uses the older, OABI, buildroot toolchain. But
that is easily reconfigured:
System Type -> Toolchain:
CONFIG_ARMV7M_TOOLCHAIN_BUILDROOT=y : Buildroot toolchain
CONFIG_ARMV7M_OABI_TOOLCHAIN=y : Older, OABI toolchain
If you want to use the Atmel GCC toolchain, here are the steps to
do so:
Build Setup:
CONFIG_HOST_WINDOWS=y : Windows
CONFIG_HOST_CYGWIN=y : Using Cygwin or other POSIX environment
System Type -> Toolchain:
CONFIG_ARMV7M_TOOLCHAIN_GNU_EABIW=y : General GCC EABI toolchain under windows
ostest: ostest:
This configuration directory, performs a simple OS test using This configuration directory, performs a simple OS test using
examples/ostest. By default, this project assumes that you are examples/ostest. By default, this project assumes that you are
using the DFU bootloader. using the DFU bootloader.
NOTES:
1. This configuration is setup for Linux (or any other POSIX environment
like Cygwin under Windows):
Build Setup:
CONFIG_HOST_LINUX=y : Linux or other POSIX environment
2. This configuration uses the older, OABI, buildroot toolchain. But
that is easily reconfigured:
System Type -> Toolchain:
CONFIG_ARMV7M_TOOLCHAIN_BUILDROOT=y : Buildroot toolchain
CONFIG_ARMV7M_OABI_TOOLCHAIN=y : Older, OABI toolchain
If you want to use the Atmel GCC toolchain, here are the steps to
do so:
Build Setup:
CONFIG_HOST_WINDOWS=y : Windows
CONFIG_HOST_CYGWIN=y : Using Cygwin or other POSIX environment
System Type -> Toolchain:
CONFIG_ARMV7M_TOOLCHAIN_GNU_EABIW=y : General GCC EABI toolchain under windows

View File

@ -59,8 +59,10 @@
* Private Data * Private Data
****************************************************************************/ ****************************************************************************/
#if defined(CONFIG_GPIOA_IRQ) && defined(CONFIG_ARCH_IRQBUTTONS)
static xcpt_t g_irqbutton1; static xcpt_t g_irqbutton1;
static xcpt_t g_irqbutton2; static xcpt_t g_irqbutton2;
#endif
/**************************************************************************** /****************************************************************************
* Private Functions * Private Functions

View File

@ -143,7 +143,7 @@
#ifndef CONFIG_DEBUG #ifndef CONFIG_DEBUG
# undef CONFIG_DEBUG_VERBOSE # undef CONFIG_DEBUG_VERBOSE
# undef CONFIG_DEBUG_GRAPHICS # undef CONFIG_DEBUG_LED
#endif #endif
#ifndef CONFIG_DEBUG_VERBOSE #ifndef CONFIG_DEBUG_VERBOSE
@ -159,9 +159,17 @@
/* Debug ******************************************************************************/ /* Debug ******************************************************************************/
#ifdef CONFIG_LCD_REGDEBUG #ifdef CONFIG_LCD_REGDEBUG
# define regdbg(format, arg...) vdbg(format, ##arg) # define regdbg(format, arg...) vdbg(format, ##arg)
#else #else
# define regdbg(x...) # define regdbg(x...)
#endif
#ifdef CONFIG_DEBUG_LCD
# define lcddbg(format, arg...) dbg(format, ##arg)
# define lcdvdbg(format, arg...) vdbg(format, ##arg)
#else
# define lcddbg(x...)
# define lcdvdbg(x...)
#endif #endif
/* Graphics Capbilities ***************************************************************/ /* Graphics Capbilities ***************************************************************/
@ -305,7 +313,9 @@ struct sam_dev_s
/* Low-level HX834x Register access */ /* Low-level HX834x Register access */
static void sam_putreg(uint16_t reg, uint16_t data); static void sam_putreg(uint16_t reg, uint16_t data);
#ifdef CONFIG_DEBUG_LCD
static uint16_t sam_getreg(uint16_t reg); static uint16_t sam_getreg(uint16_t reg);
#endif
/* Misc. LCD Helper Functions */ /* Misc. LCD Helper Functions */
@ -316,10 +326,8 @@ static inline uint16_t sam_rdram(void);
static void sam_lcdon(void); static void sam_lcdon(void);
static void sam_lcdoff(void); static void sam_lcdoff(void);
#ifdef CONFIG_DEBUG_GRAPHICS #if 0 /* CONFIG_DEBUG_LCD */
static void sam_dumpreg(uint8_t startreg, uint8_t endreg); static void sam_dumpreg(uint8_t startreg, uint8_t endreg);
#else
# define sam_dumpreg(startreg,endreg)
#endif #endif
/* LCD Data Transfer Methods */ /* LCD Data Transfer Methods */
@ -442,6 +450,7 @@ static void sam_putreg(uint16_t reg, uint16_t data)
* *
**************************************************************************************/ **************************************************************************************/
#ifdef CONFIG_DEBUG_LCD
static uint16_t sam_getreg(uint16_t reg) static uint16_t sam_getreg(uint16_t reg)
{ {
uint16_t data; uint16_t data;
@ -450,6 +459,7 @@ static uint16_t sam_getreg(uint16_t reg)
regdbg("base: %08x RS: %04x data: %04x\n", LCD_BASE, LCD_BASE + HX843X_LCD_RS, data); regdbg("base: %08x RS: %04x data: %04x\n", LCD_BASE, LCD_BASE + HX843X_LCD_RS, data);
return data; return data;
} }
#endif
/************************************************************************************** /**************************************************************************************
* Name: sam_setcursor * Name: sam_setcursor
@ -533,7 +543,7 @@ static void sam_lcdon(void)
{ {
/* Display ON Setting */ /* Display ON Setting */
gvdbg("ON\n"); lcdvdbg("ON\n");
sam_putreg(HX8347_R90H, 0x7f); /* SAP=0111 1111 */ sam_putreg(HX8347_R90H, 0x7f); /* SAP=0111 1111 */
sam_putreg(HX8347_R26H, 0x04); /* GON=0 DTE=0 D=01 */ sam_putreg(HX8347_R26H, 0x04); /* GON=0 DTE=0 D=01 */
up_mdelay(100); up_mdelay(100);
@ -553,7 +563,7 @@ static void sam_lcdon(void)
static void sam_lcdoff(void) static void sam_lcdoff(void)
{ {
gvdbg("OFF\n"); lcdvdbg("OFF\n");
sam_putreg(HX8347_R90H, 0x00); /* SAP=0000 0000 */ sam_putreg(HX8347_R90H, 0x00); /* SAP=0000 0000 */
sam_putreg(HX8347_R26H, 0x00); /* GON=0 DTE=0 D=00 */ sam_putreg(HX8347_R26H, 0x00); /* GON=0 DTE=0 D=00 */
} }
@ -566,7 +576,7 @@ static void sam_lcdoff(void)
* *
**************************************************************************************/ **************************************************************************************/
#ifdef CONFIG_DEBUG_GRAPHICS #if 0 /* CONFIG_DEBUG_LCD */
static void sam_dumpreg(uint8_t startreg, uint8_t endreg) static void sam_dumpreg(uint8_t startreg, uint8_t endreg)
{ {
uint16_t value; uint16_t value;
@ -575,7 +585,7 @@ static void sam_dumpreg(uint8_t startreg, uint8_t endreg)
for (addr = startreg; addr <= endreg; addr++) for (addr = startreg; addr <= endreg; addr++)
{ {
value = sam_getreg(addr); value = sam_getreg(addr);
gdbg(" %02x: %04x\n", addr, value); lcddbg(" %02x: %04x\n", addr, value);
} }
} }
#endif #endif
@ -602,7 +612,7 @@ static int sam_putrun(fb_coord_t row, fb_coord_t col, FAR const uint8_t *buffer,
/* Buffer must be provided and aligned to a 16-bit address boundary */ /* Buffer must be provided and aligned to a 16-bit address boundary */
gvdbg("row: %d col: %d npixels: %d\n", row, col, npixels); lcdvdbg("row: %d col: %d npixels: %d\n", row, col, npixels);
DEBUGASSERT(buffer && ((uintptr_t)buffer & 1) == 0); DEBUGASSERT(buffer && ((uintptr_t)buffer & 1) == 0);
#ifdef CONFIG_LCD_PORTRAIT #ifdef CONFIG_LCD_PORTRAIT
@ -668,7 +678,7 @@ static int sam_getrun(fb_coord_t row, fb_coord_t col, FAR uint8_t *buffer,
/* Buffer must be provided and aligned to a 16-bit address boundary */ /* Buffer must be provided and aligned to a 16-bit address boundary */
gvdbg("row: %d col: %d npixels: %d\n", row, col, npixels); lcdvdbg("row: %d col: %d npixels: %d\n", row, col, npixels);
DEBUGASSERT(buffer && ((uintptr_t)buffer & 1) == 0); DEBUGASSERT(buffer && ((uintptr_t)buffer & 1) == 0);
#ifdef CONFIG_LCD_PORTRAIT #ifdef CONFIG_LCD_PORTRAIT
@ -719,8 +729,8 @@ static int sam_getvideoinfo(FAR struct lcd_dev_s *dev,
FAR struct fb_videoinfo_s *vinfo) FAR struct fb_videoinfo_s *vinfo)
{ {
DEBUGASSERT(dev && vinfo); DEBUGASSERT(dev && vinfo);
gvdbg("fmt: %d xres: %d yres: %d nplanes: %d\n", lcdvdbg("fmt: %d xres: %d yres: %d nplanes: %d\n",
g_videoinfo.fmt, g_videoinfo.xres, g_videoinfo.yres, g_videoinfo.nplanes); g_videoinfo.fmt, g_videoinfo.xres, g_videoinfo.yres, g_videoinfo.nplanes);
memcpy(vinfo, &g_videoinfo, sizeof(struct fb_videoinfo_s)); memcpy(vinfo, &g_videoinfo, sizeof(struct fb_videoinfo_s));
return OK; return OK;
} }
@ -737,7 +747,7 @@ static int sam_getplaneinfo(FAR struct lcd_dev_s *dev, unsigned int planeno,
FAR struct lcd_planeinfo_s *pinfo) FAR struct lcd_planeinfo_s *pinfo)
{ {
DEBUGASSERT(dev && pinfo && planeno == 0); DEBUGASSERT(dev && pinfo && planeno == 0);
gvdbg("planeno: %d bpp: %d\n", planeno, g_planeinfo.bpp); lcdvdbg("planeno: %d bpp: %d\n", planeno, g_planeinfo.bpp);
memcpy(pinfo, &g_planeinfo, sizeof(struct lcd_planeinfo_s)); memcpy(pinfo, &g_planeinfo, sizeof(struct lcd_planeinfo_s));
return OK; return OK;
} }
@ -755,7 +765,7 @@ static int sam_getpower(struct lcd_dev_s *dev)
{ {
struct sam_dev_s *priv = (struct sam_dev_s *)dev; struct sam_dev_s *priv = (struct sam_dev_s *)dev;
DEBUGASSERT(dev); DEBUGASSERT(dev);
gvdbg("power: %d\n", priv->power); lcdvdbg("power: %d\n", priv->power);
return priv->power; return priv->power;
} }
@ -779,7 +789,7 @@ static int sam_setpower(struct lcd_dev_s *dev, int power)
struct sam_dev_s *priv = (struct sam_dev_s *)dev; struct sam_dev_s *priv = (struct sam_dev_s *)dev;
unsigned int i; unsigned int i;
gvdbg("power: %d\n", power); lcdvdbg("power: %d\n", power);
DEBUGASSERT(power <= CONFIG_LCD_MAXPOWER); DEBUGASSERT(power <= CONFIG_LCD_MAXPOWER);
/* Switch off backlight */ /* Switch off backlight */
@ -823,7 +833,7 @@ static int sam_setpower(struct lcd_dev_s *dev, int power)
static int sam_getcontrast(struct lcd_dev_s *dev) static int sam_getcontrast(struct lcd_dev_s *dev)
{ {
gvdbg("Not implemented\n"); lcdvdbg("Not implemented\n");
return -ENOSYS; return -ENOSYS;
} }
@ -837,7 +847,7 @@ static int sam_getcontrast(struct lcd_dev_s *dev)
static int sam_setcontrast(struct lcd_dev_s *dev, unsigned int contrast) static int sam_setcontrast(struct lcd_dev_s *dev, unsigned int contrast)
{ {
gvdbg("contrast: %d\n", contrast); lcdvdbg("contrast: %d\n", contrast);
return -ENOSYS; return -ENOSYS;
} }
@ -857,13 +867,13 @@ static int sam_setcontrast(struct lcd_dev_s *dev, unsigned int contrast)
int up_lcdinitialize(void) int up_lcdinitialize(void)
{ {
#ifdef CONFIG_DEBUG_GRAPHICS #ifdef CONFIG_DEBUG_LCD
uint16_t hxregval; uint16_t hxregval;
#endif #endif
uint32_t regval; uint32_t regval;
unsigned int i; unsigned int i;
gvdbg("Initializing\n"); lcdvdbg("Initializing\n");
/* Enable LCD EXTCS2 pins */ /* Enable LCD EXTCS2 pins */
@ -930,12 +940,12 @@ int up_lcdinitialize(void)
/* Check HX8347 Chip ID */ /* Check HX8347 Chip ID */
#ifdef CONFIG_DEBUG_GRAPHICS #ifdef CONFIG_DEBUG_LCD
hxregval = sam_getreg(HX8347_R67H); hxregval = sam_getreg(HX8347_R67H);
gvdbg("Chip ID: %04x\n", hxregval); lcdvdbg("Chip ID: %04x\n", hxregval);
if (hxregval != HX8347_CHIPID) if (hxregval != HX8347_CHIPID)
{ {
gdbg("Bad chip ID: %04x Expected: %04x\n", hxregval, HX8347_CHIPID); lcddbg("Bad chip ID: %04x Expected: %04x\n", hxregval, HX8347_CHIPID);
return -ENODEV; return -ENODEV;
} }
#endif #endif
@ -1038,7 +1048,7 @@ int up_lcdinitialize(void)
FAR struct lcd_dev_s *up_lcdgetdev(int lcddev) FAR struct lcd_dev_s *up_lcdgetdev(int lcddev)
{ {
gvdbg("lcddev: %d\n", lcddev); lcdvdbg("lcddev: %d\n", lcddev);
return lcddev == 0 ? &g_lcddev_s.dev : NULL; return lcddev == 0 ? &g_lcddev_s.dev : NULL;
} }