Fix AVR clock setup; add SPI driver

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3721 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo
2011-06-17 22:03:20 +00:00
parent 5ead03feb7
commit a542f92647
18 changed files with 709 additions and 34 deletions
+1 -14
View File
@@ -29,7 +29,7 @@ nuttx/
(3) ARM/STR71x (arch/arm/src/str71x/) (3) ARM/STR71x (arch/arm/src/str71x/)
(4) ARM/LM3S6918 (arch/arm/src/lm3s/) (4) ARM/LM3S6918 (arch/arm/src/lm3s/)
(4) ARM/STM32 (arch/arm/src/stm32/) (4) ARM/STM32 (arch/arm/src/stm32/)
(3) AVR (arch/avr) (2) AVR (arch/avr)
(0) Intel x86 (arch/x86) (0) Intel x86 (arch/x86)
(4) 8051 / MCS51 (arch/8051/) (4) 8051 / MCS51 (arch/8051/)
(2) Hitachi/Renesas SH-1 (arch/sh/src/sh1) (2) Hitachi/Renesas SH-1 (arch/sh/src/sh1)
@@ -882,19 +882,6 @@ o ARM/STM32 (arch/arm/src/stm32/)
o AVR (arch/avr) o AVR (arch/avr)
^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^
Description: The serial console for the Micropendous3 AT90USB is configured for
38400 BAUD. However, I get serial output at more or less exactly 4800
BAUD (/8 less). From what I can see the setup looks correct but I don't
have a compatible AVR emulator to check things out in detail. I am
thinking that there is some fuse setting that divides the input clock
by 8??? but that is just a fantasy.
Update: No, something else is wrong; the Teensy AT90USB behaves in
exactly the same way.
Status: Open
Priority: Low. Setting the terminal BAUD to 4800 solves the issues. However,
I suspect that this means that there are other lurking timing issues
as well.
Description: There is a port for the Amber Web Server ATMega128, however this is Description: There is a port for the Amber Web Server ATMega128, however this is
completely untested due to the lack to compatible, functional test completely untested due to the lack to compatible, functional test
equipment. equipment.
+4
View File
@@ -54,6 +54,10 @@ ifeq ($(CONFIG_ARCH_STACKDUMP),y)
CMN_CSRCS += up_dumpstate.c CMN_CSRCS += up_dumpstate.c
endif endif
ifeq ($(CONFIG_AVR_SPI),y)
CMN_CSRCS += up_spi.c
endif
# Required AT90USB files # Required AT90USB files
CHIP_ASRCS = at90usb_exceptions.S CHIP_ASRCS = at90usb_exceptions.S
+5
View File
@@ -39,6 +39,7 @@
#include <nuttx/config.h> #include <nuttx/config.h>
#include <avr/wdt.h> #include <avr/wdt.h>
#include <avr/power.h>
#include "at90usb_config.h" #include "at90usb_config.h"
#include "up_internal.h" #include "up_internal.h"
@@ -127,6 +128,10 @@ void up_lowinit(void)
up_wdtinit(); up_wdtinit();
/* Set the system clock divider to 1 */
clock_prescale_set(clock_div_1);
/* Initialize a console (probably a serial console) */ /* Initialize a console (probably a serial console) */
up_consoleinit(); up_consoleinit();
-6
View File
@@ -46,12 +46,6 @@
* Pre-processor Definitions * Pre-processor Definitions
************************************************************************************/ ************************************************************************************/
/* Physical memory map */
# warning "Missing Definitions"
/* Peripheral Address Map */
# warning "Missing Definitions"
/************************************************************************************ /************************************************************************************
* Public Types * Public Types
************************************************************************************/ ************************************************************************************/
+1 -1
View File
@@ -48,7 +48,7 @@
/* Define features for supported chip in the ATMEGA family */ /* Define features for supported chip in the ATMEGA family */
#if 0 #if 1
#else #else
# error "Unsupported AVR chip" # error "Unsupported AVR chip"
#endif #endif
+4
View File
@@ -54,6 +54,10 @@ ifeq ($(CONFIG_ARCH_STACKDUMP),y)
CMN_CSRCS += up_dumpstate.c CMN_CSRCS += up_dumpstate.c
endif endif
ifeq ($(CONFIG_AVR_SPI),y)
CMN_CSRCS += up_spi.c
endif
# Required ATMEGA files # Required ATMEGA files
CHIP_ASRCS = atmega_exceptions.S CHIP_ASRCS = atmega_exceptions.S
+5
View File
@@ -39,6 +39,7 @@
#include <nuttx/config.h> #include <nuttx/config.h>
#include <avr/wdt.h> #include <avr/wdt.h>
#include <avr/power.h>
#include "atmega_config.h" #include "atmega_config.h"
#include "up_internal.h" #include "up_internal.h"
@@ -127,6 +128,10 @@ void up_lowinit(void)
up_wdtinit(); up_wdtinit();
/* Set the system clock divider to 1 */
clock_prescale_set(clock_div_1);
/* Initialize a console (probably a serial console) */ /* Initialize a console (probably a serial console) */
up_consoleinit(); up_consoleinit();
-6
View File
@@ -46,12 +46,6 @@
* Pre-processor Definitions * Pre-processor Definitions
************************************************************************************/ ************************************************************************************/
/* Physical memory map */
# warning "Missing Definitions"
/* Peripheral Address Map */
# warning "Missing Definitions"
/************************************************************************************ /************************************************************************************
* Public Types * Public Types
************************************************************************************/ ************************************************************************************/
+1 -1
View File
@@ -48,7 +48,7 @@
/* Define features for supported chip in the ATMEGA family */ /* Define features for supported chip in the ATMEGA family */
#if 0 #if 1
#else #else
# error "Unsupported AVR chip" # error "Unsupported AVR chip"
#endif #endif
+85
View File
@@ -42,6 +42,7 @@
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
# include <stdint.h> # include <stdint.h>
# include <stdbool.h>
#endif #endif
/**************************************************************************** /****************************************************************************
@@ -90,12 +91,96 @@ extern uint16_t g_heapbase;
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
/************************************************************************************
* Name: up_copystate
*
* Description:
* Copy the contents of a register state save structure from one location to
* another.
*
************************************************************************************/
extern void up_copystate(uint8_t *dest, uint8_t *src); extern void up_copystate(uint8_t *dest, uint8_t *src);
/************************************************************************************
* Name: up_saveusercontext
*
* Description:
* Save the register context of the currently executing (user) thread.
*
************************************************************************************/
extern int up_saveusercontext(uint8_t *saveregs); extern int up_saveusercontext(uint8_t *saveregs);
/************************************************************************************
* Name: up_fullcontextrestore
*
* Description:
* Restore the full context of a saved thread/task.
*
************************************************************************************/
extern void up_fullcontextrestore(uint8_t *restoreregs) __attribute__ ((noreturn)); extern void up_fullcontextrestore(uint8_t *restoreregs) __attribute__ ((noreturn));
/************************************************************************************
* Name: up_switchcontext
*
* Description:
* Switch from one thread/task context to another.
*
************************************************************************************/
extern void up_switchcontext(uint8_t *saveregs, uint8_t *restoreregs); extern void up_switchcontext(uint8_t *saveregs, uint8_t *restoreregs);
/************************************************************************************
* Name: up_doirq
*
* Description:
* Dispatch an interrupt.
*
************************************************************************************/
extern uint8_t *up_doirq(uint8_t irq, uint8_t *regs); extern uint8_t *up_doirq(uint8_t irq, uint8_t *regs);
/************************************************************************************
* Name: avr_spiselect, avr_spitatus, and avr_spicmddata
*
* Description:
* These external functions must be provided by board-specific logic. They are
* implementations of the select, status, and cmddata methods of the SPI interface
* defined by struct spi_ops_s (see include/nuttx/spi.h). All other methods
* including up_spiinitialize()) are provided by common LPC17xx logic. To use
* this common SPI logic on your board:
*
* 1. Provide logic in up_boardinitialize() to configure SPI chip select
* pins.
* 2. Provide avr_spiselect() and avr_spistatus() functions in your board-specific
* logic. These functions will perform chip selection and status operations
* using GPIOs in the way your board is configured.
* 2. If CONFIG_SPI_CMDDATA is defined in the NuttX configuration, provide the
* avr_spicmddata() function in your board-specific logic. This functions will
* perform cmd/data selection operations using GPIOs in the way your board is
* configured.
* 3. Add a call to up_spiinitialize() in your low level application
* initialization logic
* 4. The handle returned by up_spiinitialize() may then be used to bind the
* SPI driver to higher level logic (e.g., calling
* mmcsd_spislotinitialize(), for example, will bind the SPI driver to
* the SPI MMC/SD driver).
*
************************************************************************************/
struct spi_dev_s;
enum spi_dev_e;
#ifdef CONFIG_AVR_SPI
extern void avr_spiselect(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool selected);
extern uint8_t avr_spistatus(FAR struct spi_dev_s *dev, enum spi_dev_e devid);
#ifdef CONFIG_SPI_CMDDATA
extern int avr_spicmddata(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool cmd);
#endif
#endif
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif /* __ARCH_AVR_SRC_AVR_AVR_INTERNAL_H */ #endif /* __ARCH_AVR_SRC_AVR_AVR_INTERNAL_H */
File diff suppressed because it is too large Load Diff
+45
View File
@@ -90,10 +90,55 @@ extern uint32_t g_heapbase;
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
/************************************************************************************
* Name: up_copystate
*
* Description:
* Copy the contents of a register state save structure from one location to
* another.
*
************************************************************************************/
extern void up_copystate(uint32_t *dest, uint32_t *src); extern void up_copystate(uint32_t *dest, uint32_t *src);
/************************************************************************************
* Name: up_saveusercontext
*
* Description:
* Save the register context of the currently executing (user) thread.
*
************************************************************************************/
extern int up_saveusercontext(uint32_t *saveregs); extern int up_saveusercontext(uint32_t *saveregs);
/************************************************************************************
* Name: up_fullcontextrestore
*
* Description:
* Restore the full context of a saved thread/task.
*
************************************************************************************/
extern void up_fullcontextrestore(uint32_t *restoreregs) __attribute__ ((noreturn)); extern void up_fullcontextrestore(uint32_t *restoreregs) __attribute__ ((noreturn));
/************************************************************************************
* Name: up_switchcontext
*
* Description:
* Switch from one thread/task context to another.
*
************************************************************************************/
extern void up_switchcontext(uint32_t *saveregs, uint32_t *restoreregs); extern void up_switchcontext(uint32_t *saveregs, uint32_t *restoreregs);
/************************************************************************************
* Name: up_doirq
*
* Description:
* Dispatch an interrupt.
*
************************************************************************************/
extern uint32_t *up_doirq(int irq, uint32_t *regs); extern uint32_t *up_doirq(int irq, uint32_t *regs);
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
+9
View File
@@ -69,6 +69,15 @@
# define CONFIG_PRINT_TASKNAME 1 # define CONFIG_PRINT_TASKNAME 1
#endif #endif
/* If there is going to be stackdump output, then we should turn on output
* here unconditionally as well.
*/
#ifdef CONFIG_ARCH_STACKDUMP
# undef lldbg
# define lldbg lib_lowprintf
#endif
/**************************************************************************** /****************************************************************************
* Private Data * Private Data
****************************************************************************/ ****************************************************************************/
+4 -2
View File
@@ -49,9 +49,11 @@
/* Configuration ************************************************************/ /* Configuration ************************************************************/
/* Clocking *****************************************************************/ /* Clocking *****************************************************************/
/* Assume default CLKDIV8 fuse setting is overridden to CLKDIV1 */
#define BOARD_CPU_CLOCK 14745600 /* F_CPU = 14.7456MHz */ #define BOARD_XTAL_FREQ 14745600 /* 14.7456MHz crystal */
#define BOARD_TOSCK_CLOCK 32768 /* TOSC = 32.768KHz */ #define BOARD_CPU_CLOCK BOARD_XTAL_FREQ /* F_CPU = 14.7456MHz */
#define BOARD_TOSCK_CLOCK 32768 /* TOSC = 32.768KHz */
/* LED definitions **********************************************************/ /* LED definitions **********************************************************/
/* The Amber Web Server has a reset switch and four LEDs. The LEDs indicate /* The Amber Web Server has a reset switch and four LEDs. The LEDs indicate
+3 -1
View File
@@ -49,8 +49,10 @@
/* Configuration ************************************************************/ /* Configuration ************************************************************/
/* Clocking *****************************************************************/ /* Clocking *****************************************************************/
/* Assume default CLKDIV8 fuse setting is overridden to CLKDIV1 */
#define BOARD_CPU_CLOCK 16000000 /* F_CPU = 16MHz */ #define BOARD_XTAL_FREQ 16000000 /* 16MHz crystal */
#define BOARD_CPU_CLOCK BOARD_XTAL_FREQ /* F_CPU = 16MHz */
/* LED definitions **********************************************************/ /* LED definitions **********************************************************/
/* The Micropendous 3 has no on-board LEDs */ /* The Micropendous 3 has no on-board LEDs */
+3 -1
View File
@@ -49,8 +49,10 @@
/* Configuration ************************************************************/ /* Configuration ************************************************************/
/* Clocking *****************************************************************/ /* Clocking *****************************************************************/
/* Assume default CLKDIV8 fuse setting is overridden to CLKDIV1 */
#define BOARD_CPU_CLOCK 16000000 /* F_CPU = 16MHz */ #define BOARD_XTAL_FREQ 16000000 /* 16MHz crystal */
#define BOARD_CPU_CLOCK BOARD_XTAL_FREQ /* F_CPU = 16MHz */
/* LED definitions **********************************************************/ /* LED definitions **********************************************************/
/* The Teensy++ 2.0 has a single on-board LEDs connected to PortD, Pin 6 */ /* The Teensy++ 2.0 has a single on-board LEDs connected to PortD, Pin 6 */
+1 -1
View File
@@ -792,7 +792,7 @@ CONFIG_BOOT_COPYTORAM=n
CONFIG_CUSTOM_STACK=n CONFIG_CUSTOM_STACK=n
CONFIG_STACK_POINTER= CONFIG_STACK_POINTER=
CONFIG_IDLETHREAD_STACKSIZE=512 CONFIG_IDLETHREAD_STACKSIZE=512
CONFIG_USERMAIN_STACKSIZE=512 CONFIG_USERMAIN_STACKSIZE=1024
CONFIG_PTHREAD_STACK_MIN=256 CONFIG_PTHREAD_STACK_MIN=256
CONFIG_PTHREAD_STACK_DEFAULT=512 CONFIG_PTHREAD_STACK_DEFAULT=512
CONFIG_HEAP_BASE= CONFIG_HEAP_BASE=
+1 -1
View File
@@ -204,7 +204,7 @@ void mm_givesemaphore(void)
/* I better be holding at least one reference to the semaphore */ /* I better be holding at least one reference to the semaphore */
ASSERT(g_holder == my_pid); DEBUGASSERT(g_holder == my_pid);
/* Do I hold multiple references to the semphore */ /* Do I hold multiple references to the semphore */