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/)
(4) ARM/LM3S6918 (arch/arm/src/lm3s/)
(4) ARM/STM32 (arch/arm/src/stm32/)
(3) AVR (arch/avr)
(2) AVR (arch/avr)
(0) Intel x86 (arch/x86)
(4) 8051 / MCS51 (arch/8051/)
(2) Hitachi/Renesas SH-1 (arch/sh/src/sh1)
@@ -882,19 +882,6 @@ o ARM/STM32 (arch/arm/src/stm32/)
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
completely untested due to the lack to compatible, functional test
equipment.
+4
View File
@@ -54,6 +54,10 @@ ifeq ($(CONFIG_ARCH_STACKDUMP),y)
CMN_CSRCS += up_dumpstate.c
endif
ifeq ($(CONFIG_AVR_SPI),y)
CMN_CSRCS += up_spi.c
endif
# Required AT90USB files
CHIP_ASRCS = at90usb_exceptions.S
+5
View File
@@ -39,6 +39,7 @@
#include <nuttx/config.h>
#include <avr/wdt.h>
#include <avr/power.h>
#include "at90usb_config.h"
#include "up_internal.h"
@@ -127,6 +128,10 @@ void up_lowinit(void)
up_wdtinit();
/* Set the system clock divider to 1 */
clock_prescale_set(clock_div_1);
/* Initialize a console (probably a serial console) */
up_consoleinit();
-6
View File
@@ -46,12 +46,6 @@
* Pre-processor Definitions
************************************************************************************/
/* Physical memory map */
# warning "Missing Definitions"
/* Peripheral Address Map */
# warning "Missing Definitions"
/************************************************************************************
* Public Types
************************************************************************************/
+1 -1
View File
@@ -48,7 +48,7 @@
/* Define features for supported chip in the ATMEGA family */
#if 0
#if 1
#else
# error "Unsupported AVR chip"
#endif
+4
View File
@@ -54,6 +54,10 @@ ifeq ($(CONFIG_ARCH_STACKDUMP),y)
CMN_CSRCS += up_dumpstate.c
endif
ifeq ($(CONFIG_AVR_SPI),y)
CMN_CSRCS += up_spi.c
endif
# Required ATMEGA files
CHIP_ASRCS = atmega_exceptions.S
+5
View File
@@ -39,6 +39,7 @@
#include <nuttx/config.h>
#include <avr/wdt.h>
#include <avr/power.h>
#include "atmega_config.h"
#include "up_internal.h"
@@ -127,6 +128,10 @@ void up_lowinit(void)
up_wdtinit();
/* Set the system clock divider to 1 */
clock_prescale_set(clock_div_1);
/* Initialize a console (probably a serial console) */
up_consoleinit();
-6
View File
@@ -46,12 +46,6 @@
* Pre-processor Definitions
************************************************************************************/
/* Physical memory map */
# warning "Missing Definitions"
/* Peripheral Address Map */
# warning "Missing Definitions"
/************************************************************************************
* Public Types
************************************************************************************/
+1 -1
View File
@@ -48,7 +48,7 @@
/* Define features for supported chip in the ATMEGA family */
#if 0
#if 1
#else
# error "Unsupported AVR chip"
#endif
+85
View File
@@ -42,6 +42,7 @@
#ifndef __ASSEMBLY__
# include <stdint.h>
# include <stdbool.h>
#endif
/****************************************************************************
@@ -90,12 +91,96 @@ extern uint16_t g_heapbase;
#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);
/************************************************************************************
* Name: up_saveusercontext
*
* Description:
* Save the register context of the currently executing (user) thread.
*
************************************************************************************/
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));
/************************************************************************************
* Name: up_switchcontext
*
* Description:
* Switch from one thread/task context to another.
*
************************************************************************************/
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);
/************************************************************************************
* 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 /* __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__
/************************************************************************************
* 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);
/************************************************************************************
* Name: up_saveusercontext
*
* Description:
* Save the register context of the currently executing (user) thread.
*
************************************************************************************/
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));
/************************************************************************************
* Name: up_switchcontext
*
* Description:
* Switch from one thread/task context to another.
*
************************************************************************************/
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);
#endif /* __ASSEMBLY__ */
+9
View File
@@ -69,6 +69,15 @@
# define CONFIG_PRINT_TASKNAME 1
#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
****************************************************************************/
+4 -2
View File
@@ -49,9 +49,11 @@
/* Configuration ************************************************************/
/* Clocking *****************************************************************/
/* Assume default CLKDIV8 fuse setting is overridden to CLKDIV1 */
#define BOARD_CPU_CLOCK 14745600 /* F_CPU = 14.7456MHz */
#define BOARD_TOSCK_CLOCK 32768 /* TOSC = 32.768KHz */
#define BOARD_XTAL_FREQ 14745600 /* 14.7456MHz crystal */
#define BOARD_CPU_CLOCK BOARD_XTAL_FREQ /* F_CPU = 14.7456MHz */
#define BOARD_TOSCK_CLOCK 32768 /* TOSC = 32.768KHz */
/* LED definitions **********************************************************/
/* The Amber Web Server has a reset switch and four LEDs. The LEDs indicate
+3 -1
View File
@@ -49,8 +49,10 @@
/* Configuration ************************************************************/
/* 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 **********************************************************/
/* The Micropendous 3 has no on-board LEDs */
+3 -1
View File
@@ -49,8 +49,10 @@
/* Configuration ************************************************************/
/* 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 **********************************************************/
/* 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_STACK_POINTER=
CONFIG_IDLETHREAD_STACKSIZE=512
CONFIG_USERMAIN_STACKSIZE=512
CONFIG_USERMAIN_STACKSIZE=1024
CONFIG_PTHREAD_STACK_MIN=256
CONFIG_PTHREAD_STACK_DEFAULT=512
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 */
ASSERT(g_holder == my_pid);
DEBUGASSERT(g_holder == my_pid);
/* Do I hold multiple references to the semphore */