mirror of
https://github.com/apache/nuttx.git
synced 2026-06-02 01:21:26 +08:00
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:
@@ -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.
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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
|
||||||
************************************************************************************/
|
************************************************************************************/
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
@@ -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__ */
|
||||||
|
|||||||
@@ -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
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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
@@ -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 */
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user