mirror of
https://github.com/apache/nuttx.git
synced 2026-05-20 04:16:35 +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/)
|
||||
(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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -46,12 +46,6 @@
|
||||
* Pre-processor Definitions
|
||||
************************************************************************************/
|
||||
|
||||
/* Physical memory map */
|
||||
# warning "Missing Definitions"
|
||||
|
||||
/* Peripheral Address Map */
|
||||
# warning "Missing Definitions"
|
||||
|
||||
/************************************************************************************
|
||||
* Public Types
|
||||
************************************************************************************/
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
|
||||
/* Define features for supported chip in the ATMEGA family */
|
||||
|
||||
#if 0
|
||||
#if 1
|
||||
#else
|
||||
# error "Unsupported AVR chip"
|
||||
#endif
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -46,12 +46,6 @@
|
||||
* Pre-processor Definitions
|
||||
************************************************************************************/
|
||||
|
||||
/* Physical memory map */
|
||||
# warning "Missing Definitions"
|
||||
|
||||
/* Peripheral Address Map */
|
||||
# warning "Missing Definitions"
|
||||
|
||||
/************************************************************************************
|
||||
* Public Types
|
||||
************************************************************************************/
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
|
||||
/* Define features for supported chip in the ATMEGA family */
|
||||
|
||||
#if 0
|
||||
#if 1
|
||||
#else
|
||||
# error "Unsupported AVR chip"
|
||||
#endif
|
||||
|
||||
@@ -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
@@ -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__ */
|
||||
|
||||
@@ -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
|
||||
****************************************************************************/
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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
@@ -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 */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user