9
0
Fork 0

LPC17xx USBDEV driver now compiles (still untested)

git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@2805 7fd9a85b-ad96-42d3-883c-3090e2eb8679
This commit is contained in:
patacongo 2010-07-16 03:01:05 +00:00
parent 3c0fd9fbd7
commit 90a0035325
9 changed files with 203 additions and 45 deletions

View File

@ -1176,3 +1176,8 @@
* net/uip/uip_igmp*.c - Add IGMP support (untested on initial
checkin).
* examples/igmp - Add a trivial test for IGMP (much more is needed)
* configs/nucleus2g/usbserial and usbstorage - Add USB configurations
for testing purposes.
* arch/arm/src/common/up_internal.h, cortexm3/up_assert.c,
*/*_vectors.S - Correct compilations errors when CONFIG_ARCH_INTERRUPTSTACK
is enabled (feature still not tested)

View File

@ -8,7 +8,7 @@
<tr align="center" bgcolor="#e4e4e4">
<td>
<h1><big><font color="#3c34ec"><i>NuttX RTOS</i></font></big></h1>
<p>Last Updated: July 11, 2010</p>
<p>Last Updated: July 15, 2010</p>
</td>
</tr>
</table>
@ -1851,6 +1851,11 @@ nuttx-5.8 2010-xx-xx Gregory Nutt &lt;spudmonkey@racsa.co.cr&gt;
* net/uip/uip_igmp*.c - Add IGMP support (untested on initial
checkin).
* examples/igmp - Add a trivial test for IGMP (much more is needed)
* configs/nucleus2g/usbserial and usbstorage - Add USB configurations
for testing purposes.
* arch/arm/src/common/up_internal.h, cortexm3/up_assert.c,
*/*_vectors.S - Correct compilations errors when CONFIG_ARCH_INTERRUPTSTACK
is enabled (feature still not tested)
pascal-2.1 2010-xx-xx Gregory Nutt &lt;spudmonkey@racsa.co.cr&gt;

View File

@ -208,33 +208,28 @@ static void up_dumpstate(void)
up_stackdump(sp, istackbase);
}
/* Extract the user stack pointer. */
/* Extract the user stack pointer if we are in an interrupt handler.
* If we are not in an interrupt handler. Then sp is the user stack
* pointer (and the above range check should have failed).
*/
if (current_regs)
{
sp = current_regs[REG_R13];
lldbg("sp: %08x\n", sp);
}
/* Show user stack info */
lldbg("User stack:\n");
lldbg(" base: %08x\n", ustackbase);
lldbg(" size: %08x\n", ustacksize);
lldbg("User stack:\n");
lldbg(" base: %08x\n", ustackbase);
lldbg(" size: %08x\n", ustacksize);
/* Dump the user stack if the stack pointer lies within the allocated user
* stack memory.
*/
/* Dump the user stack if the stack pointer lies within the allocated user
* stack memory.
*/
if (sp > ustackbase || sp <= ustackbase - ustacksize)
{
#if !defined(CONFIG_ARCH_INTERRUPTSTACK) || CONFIG_ARCH_INTERRUPTSTACK < 4
lldbg("ERROR: Stack pointer is not within allocated stack\n");
#endif
}
else
{
up_stackdump(sp, ustackbase);
}
if (sp <= ustackbase && sp > ustackbase - ustacksize)
{
up_stackdump(sp, ustackbase);
}
#else
lldbg("sp: %08x\n", sp);
@ -247,9 +242,7 @@ static void up_dumpstate(void)
if (sp > ustackbase || sp <= ustackbase - ustacksize)
{
#if !defined(CONFIG_ARCH_INTERRUPTSTACK) || CONFIG_ARCH_INTERRUPTSTACK < 4
lldbg("ERROR: Stack pointer is not within allocated stack\n");
#endif
}
else
{

View File

@ -59,6 +59,7 @@
#include "up_arch.h"
#include "up_internal.h"
#include "lpc17_internal.h"
#include "lpc17_usb.h"
#include "lpc17_syscon.h"
@ -103,7 +104,7 @@
#endif
#ifdef CONFIG_DEBUG
# define USB_ERROR_INT USBDEV_INT_EPRINT
# define USB_ERROR_INT USBDEV_INT_ERRINT
#else
# define USB_ERROR_INT 0
#endif
@ -178,7 +179,7 @@
#define LPC17_TRACEINTID_EPOUT 0x0013
#define LPC17_TRACEINTID_EPOUTQEMPTY 0x0014
#define LPC17_TRACEINTID_EP0SETUPSETADDRESS 0x0015
#define LPC17_TRACEINTID_EPRINT 0x0016
#define LPC17_TRACEINTID_ERRINT 0x0016
#define LPC17_TRACEINTID_EPSLOW 0x0017
#define LPC17_TRACEINTID_FRAME 0x0018
#define LPC17_TRACEINTID_GETCONFIG 0x0019
@ -2021,18 +2022,18 @@ static int lpc17_usbinterrupt(int irq, FAR void *context)
#if CONFIG_DEBUG
/* USB engine error interrupt */
if ((devintstatus & USBDEV_INT_EPRINT))
if ((devintstatus & USBDEV_INT_ERRINT))
{
uint8_t errcode;
/* Clear the error interrupt */
lpc17_putreg(USBDEV_INT_EPRINT, LPC17_USBDEV_INTCLR);
lpc17_putreg(USBDEV_INT_ERRINT, LPC17_USBDEV_INTCLR);
/* And show what error occurred */
errcode = (uint8_t)lpc17_usbcmd(CMD_USBDEV_READERRORSTATUS, 0) & 0x0f;
usbtrace(TRACE_INTDECODE(LPC17_TRACEINTID_EPRINT), (uint16_t)errcode);
usbtrace(TRACE_INTDECODE(LPC17_TRACEINTID_ERRINT), (uint16_t)errcode);
}
#endif
@ -3106,7 +3107,9 @@ void up_usbinitialize(void)
/* Disable USB interrupts */
lpc17_putreg(0, LPC17_USBDEV_INTST);
regval = lpc17_getreg(LPC17_SYSCON_USBINTST);
regval &= ~SYSCON_USBINTST_ENINTS;
lpc17_putreg(regval, LPC17_SYSCON_USBINTST);
irqrestore(flags);
/* Initialize the device state structure */
@ -3166,9 +3169,11 @@ void up_usbinitialize(void)
/* Turn on USB power and clocking */
reg = lpc17_getreg(LPC17_PCON_PCONP);
reg |= LPC17_PCONP_PCUSB;
lpc17_putreg(reg, LPC17_PCON_PCONP);
flags = irqsave();
reg = lpc17_getreg(LPC17_SYSCON_PCONP);
reg |= SYSCON_PCONP_PCUSB;
lpc17_putreg(reg, LPC17_SYSCON_PCONP);
irqrestore(flags);
/* Attach USB controller interrupt handler */
@ -3184,7 +3189,11 @@ void up_usbinitialize(void)
* driver
*/
lpc17_putreg(USBDEV_INTST_ENUSBINTS, LPC17_USBDEV_INTST);
flags = irqsave();
reg = lpc17_getreg(LPC17_SYSCON_USBINTST);
reg |= SYSCON_USBINTST_ENINTS;
lpc17_putreg(regval, LPC17_SYSCON_USBINTST);
irqrestore(flags);
/* Disconnect device */
@ -3240,9 +3249,9 @@ void up_usbuninitialize(void)
/* Turn off USB power and clocking */
reg = lpc17_getreg(LPC17_PCON_PCONP);
reg &= ~LPC17_PCONP_PCUSB;
lpc17_putreg(reg, LPC17_PCON_PCONP);
reg = lpc17_getreg(LPC17_SYSCON_PCONP);
reg &= ~SYSCON_PCONP_PCUSB;
lpc17_putreg(reg, LPC17_SYSCON_PCONP);
irqrestore(flags);
}

View File

@ -42,6 +42,9 @@ CSRCS = up_boot.c up_leds.c up_ssp.c
ifeq ($(CONFIG_EXAMPLES_NSH_ARCHINIT),y)
CSRCS += up_nsh.c
endif
ifeq ($(CONFIG_EXAMPLE),usbstorage)
CSRCS += up_usbstrg.c
endif
AOBJS = $(ASRCS:.S=$(OBJEXT))
COBJS = $(CSRCS:.c=$(OBJEXT))

View File

@ -0,0 +1,143 @@
/****************************************************************************
* configs/nucleus2g/src/up_usbstrg.c
*
* Copyright (C) 2010 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Configure and register the LPC17xx MMC/SD SPI block driver.
*
* 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 <stdio.h>
#include <debug.h>
#include <errno.h>
#include <nuttx/spi.h>
#include <nuttx/mmcsd.h>
/****************************************************************************
* Pre-Processor Definitions
****************************************************************************/
/* Configuration ************************************************************/
#ifndef CONFIG_EXAMPLES_USBSTRG_DEVMINOR1
# define CONFIG_EXAMPLES_USBSTRG_DEVMINOR1 0
#endif
/* PORT and SLOT number probably depend on the board configuration */
#ifdef CONFIG_ARCH_BOARD_NUCLEUS2G
# undef LPC17XX_MMCSDSPIPORTNO
# define LPC17XX_MMCSDSPIPORTNO 1
# undef LPC17XX_MMCSDSLOTNO
# define LPC17XX_MMCSDSLOTNO 0
#else
/* Add configuration for new LPC17xx boards here */
# error "Unrecognized LPC17xx board"
#endif
/* Debug ********************************************************************/
#ifdef CONFIG_CPP_HAVE_VARARGS
# ifdef CONFIG_DEBUG
# define message(...) lib_lowprintf(__VA_ARGS__)
# define msgflush()
# else
# define message(...) printf(__VA_ARGS__)
# define msgflush() fflush(stdout)
# endif
#else
# ifdef CONFIG_DEBUG
# define message lib_lowprintf
# define msgflush()
# else
# define message printf
# define msgflush() fflush(stdout)
# endif
#endif
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: usbstrg_archinitialize
*
* Description:
* Perform architecture specific initialization
*
****************************************************************************/
int usbstrg_archinitialize(void)
{
FAR struct spi_dev_s *spi;
int ret;
/* Get the SPI port */
message("usbstrg_archinitialize: Initializing SPI port %d\n",
LPC17XX_MMCSDSPIPORTNO);
spi = up_spiinitialize(1);
if (!spi)
{
message("usbstrg_archinitialize: Failed to initialize SPI port %d\n",
LPC17XX_MMCSDSPIPORTNO);
return -ENODEV;
}
message("usbstrg_archinitialize: Successfully initialized SPI port %d\n",
LPC17XX_MMCSDSPIPORTNO);
/* Bind the SPI port to the slot */
message("usbstrg_archinitialize: Binding SPI port %d to MMC/SD slot %d\n",
LPC17XX_MMCSDSPIPORTNO, LPC17XX_MMCSDSLOTNO);
ret = mmcsd_spislotinitialize(CONFIG_EXAMPLES_USBSTRG_DEVMINOR1, LPC17XX_MMCSDSLOTNO, spi);
if (ret < 0)
{
message("usbstrg_archinitialize: Failed to bind SPI port %d to MMC/SD slot %d: %d\n",
LPC17XX_MMCSDSPIPORTNO, LPC17XX_MMCSDSLOTNO, ret);
return ret;
}
message("usbstrg_archinitialize: Successfuly bound SPI port %d to MMC/SD slot %d\n",
LPC17XX_MMCSDSPIPORTNO, LPC17XX_MMCSDSLOTNO);
return OK;
}

View File

@ -81,7 +81,7 @@ CONFIG_DRAM_SIZE=(32*1024)
CONFIG_DRAM_START=0x10000000
CONFIG_DRAM_END=(CONFIG_DRAM_START+CONFIG_DRAM_SIZE)
CONFIG_ARCH_IRQPRIO=y
CONFIG_ARCH_INTERRUPTSTACK=1024
CONFIG_ARCH_INTERRUPTSTACK=n
CONFIG_ARCH_STACKDUMP=y
CONFIG_ARCH_BOOTLOADER=n
CONFIG_ARCH_LEDS=y

View File

@ -81,7 +81,7 @@ CONFIG_DRAM_SIZE=(32*1024)
CONFIG_DRAM_START=0x10000000
CONFIG_DRAM_END=(CONFIG_DRAM_START+CONFIG_DRAM_SIZE)
CONFIG_ARCH_IRQPRIO=y
CONFIG_ARCH_INTERRUPTSTACK=1024
CONFIG_ARCH_INTERRUPTSTACK=n
CONFIG_ARCH_STACKDUMP=y
CONFIG_ARCH_BOOTLOADER=n
CONFIG_ARCH_LEDS=y
@ -113,7 +113,7 @@ CONFIG_LPC17_UART3=n
CONFIG_LPC17_CAN1=n
CONFIG_LPC17_CAN2=n
CONFIG_LPC17_SPI=n
CONFIG_LPC17_SSP0=n
CONFIG_LPC17_SSP0=y
CONFIG_LPC17_SSP1=n
CONFIG_LPC17_I2C0=n
CONFIG_LPC17_I2C1=n

View File

@ -1,7 +1,7 @@
/****************************************************************************
* drivers/mmcsd/mmcsd_spi.c
*
* Copyright (C) 2008-2009 Gregory Nutt. All rights reserved.
* Copyright (C) 2008-2010 Gregory Nutt. All rights reserved.
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
*
* Redistribution and use in source and binary forms, with or without
@ -114,12 +114,12 @@
* ticks per second.
*/
#define MMCSD_DELAY_10MS (CLK_TCK/100 + 1)
#define MMCSD_DELAY_50MS (CLK_TCK/20 + 1)
#define MMCSD_DELAY_100MS (CLK_TCK/10 + 1)
#define MMCSD_DELAY_250MS (CLK_TCK/4 + 1)
#define MMCSD_DELAY_500MS (CLK_TCK/2 + 1)
#define MMCSD_DELAY_1SEC (CLK_TCK + 1)
#define MMCSD_DELAY_10MS (CLK_TCK/100 + 1)
#define MMCSD_DELAY_50MS (CLK_TCK/20 + 1)
#define MMCSD_DELAY_100MS (CLK_TCK/10 + 1)
#define MMCSD_DELAY_250MS (CLK_TCK/4 + 1)
#define MMCSD_DELAY_500MS (CLK_TCK/2 + 1)
#define MMCSD_DELAY_1SEC (CLK_TCK + 1)
#define MMCSD_DELAY_10SEC (10 * CLK_TCK + 1)
#define ELAPSED_TIME(t) (g_system_timer-(t))