aboutsummaryrefslogtreecommitdiffstats
path: root/os/hal/platforms/AT91SAM7
diff options
context:
space:
mode:
authorbarthess <barthess@35acf78f-673a-0410-8e92-d51de3d6d3f4>2012-11-08 07:29:55 +0000
committerbarthess <barthess@35acf78f-673a-0410-8e92-d51de3d6d3f4>2012-11-08 07:29:55 +0000
commit25acf389b0475d90c8d3fcb2ed0eb24bc15b1287 (patch)
treec66ccfbaff9bdc0609810869edde69fe3598d19b /os/hal/platforms/AT91SAM7
parent07f4e8ed945b736dccdf1f20a37551f5cd7b6775 (diff)
downloadChibiOS-25acf389b0475d90c8d3fcb2ed0eb24bc15b1287.tar.gz
ChibiOS-25acf389b0475d90c8d3fcb2ed0eb24bc15b1287.tar.bz2
ChibiOS-25acf389b0475d90c8d3fcb2ed0eb24bc15b1287.zip
AT91SAM7A3. Initial commit.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@4799 35acf78f-673a-0410-8e92-d51de3d6d3f4
Diffstat (limited to 'os/hal/platforms/AT91SAM7')
-rw-r--r--os/hal/platforms/AT91SAM7/at91sam7.h3
-rw-r--r--os/hal/platforms/AT91SAM7/pal_lld.c4
-rw-r--r--os/hal/platforms/AT91SAM7/pal_lld.h6
-rw-r--r--os/hal/platforms/AT91SAM7/serial_lld.c79
-rw-r--r--os/hal/platforms/AT91SAM7/serial_lld.h27
5 files changed, 108 insertions, 11 deletions
diff --git a/os/hal/platforms/AT91SAM7/at91sam7.h b/os/hal/platforms/AT91SAM7/at91sam7.h
index c567c5e4f..bb1e8e1b3 100644
--- a/os/hal/platforms/AT91SAM7/at91sam7.h
+++ b/os/hal/platforms/AT91SAM7/at91sam7.h
@@ -31,6 +31,7 @@
#define SAM7X128 4
#define SAM7X256 5
#define SAM7X512 6
+#define SAM7A3 7
#ifndef SAM7_PLATFORM
#error "SAM7 platform not defined"
@@ -50,6 +51,8 @@
#include "at91lib/AT91SAM7X256.h"
#elif SAM7_PLATFORM == SAM7X512
#include "at91lib/AT91SAM7X512.h"
+#elif SAM7_PLATFORM == SAM7A3
+#include "at91lib/AT91SAM7A3.h"
#else
#error "SAM7 platform not supported"
#endif
diff --git a/os/hal/platforms/AT91SAM7/pal_lld.c b/os/hal/platforms/AT91SAM7/pal_lld.c
index 733345c95..e4914261e 100644
--- a/os/hal/platforms/AT91SAM7/pal_lld.c
+++ b/os/hal/platforms/AT91SAM7/pal_lld.c
@@ -63,7 +63,7 @@ void _pal_lld_init(const PALConfig *config) {
uint32_t ports = (1 << AT91C_ID_PIOA);
#if (SAM7_PLATFORM == SAM7X128) || (SAM7_PLATFORM == SAM7X256) || \
- (SAM7_PLATFORM == SAM7X512)
+ (SAM7_PLATFORM == SAM7X512) || (SAM7_PLATFORM == SAM7A3)
ports |= (1 << AT91C_ID_PIOB);
#endif
AT91C_BASE_PMC->PMC_PCER = ports;
@@ -87,7 +87,7 @@ void _pal_lld_init(const PALConfig *config) {
* PIOB setup.
*/
#if (SAM7_PLATFORM == SAM7X128) || (SAM7_PLATFORM == SAM7X256) || \
- (SAM7_PLATFORM == SAM7X512)
+ (SAM7_PLATFORM == SAM7X512) || (SAM7_PLATFORM == SAM7A3)
AT91C_BASE_PIOB->PIO_PPUER = config->P1Data.pusr; /* Pull-up as spec.*/
AT91C_BASE_PIOB->PIO_PPUDR = ~config->P1Data.pusr;
AT91C_BASE_PIOB->PIO_PER = 0xFFFFFFFF; /* PIO enabled.*/
diff --git a/os/hal/platforms/AT91SAM7/pal_lld.h b/os/hal/platforms/AT91SAM7/pal_lld.h
index fa0ad22d4..8d69059c4 100644
--- a/os/hal/platforms/AT91SAM7/pal_lld.h
+++ b/os/hal/platforms/AT91SAM7/pal_lld.h
@@ -64,7 +64,8 @@ typedef struct {
/** @brief Port 0 setup data.*/
at91sam7_pio_setup_t P0Data;
#if (SAM7_PLATFORM == SAM7X128) || (SAM7_PLATFORM == SAM7X256) || \
- (SAM7_PLATFORM == SAM7X512) || defined(__DOXYGEN__)
+ (SAM7_PLATFORM == SAM7X512) || (SAM7_PLATFORM == SAM7A3) || \
+ defined(__DOXYGEN__)
/** @brief Port 1 setup data.*/
at91sam7_pio_setup_t P1Data;
#endif
@@ -112,7 +113,8 @@ typedef AT91PS_PIO ioportid_t;
* @brief PIO port B identifier.
*/
#if (SAM7_PLATFORM == SAM7X128) || (SAM7_PLATFORM == SAM7X256) || \
- (SAM7_PLATFORM == SAM7X512) || defined(__DOXYGEN__)
+ (SAM7_PLATFORM == SAM7X512) || (SAM7_PLATFORM == SAM7A3) || \
+ defined(__DOXYGEN__)
#define IOPORT2 AT91C_BASE_PIOB
#endif
diff --git a/os/hal/platforms/AT91SAM7/serial_lld.c b/os/hal/platforms/AT91SAM7/serial_lld.c
index 33917b38f..d156a6553 100644
--- a/os/hal/platforms/AT91SAM7/serial_lld.c
+++ b/os/hal/platforms/AT91SAM7/serial_lld.c
@@ -51,9 +51,19 @@
#define SAM7_DBGU_RX AT91C_PA27_DRXD
#define SAM7_DBGU_TX AT91C_PA28_DTXD
+#elif (SAM7_PLATFORM == SAM7A3)
+#define SAM7_USART0_RX AT91C_PA2_RXD0
+#define SAM7_USART0_TX AT91C_PA3_TXD0
+#define SAM7_USART1_RX AT91C_PA7_RXD1
+#define SAM7_USART1_TX AT91C_PA8_TXD1
+#define SAM7_USART2_RX AT91C_PA9_RXD2
+#define SAM7_USART2_TX AT91C_PA10_TXD2
+#define SAM7_DBGU_RX AT91C_PA30_DRXD
+#define SAM7_DBGU_TX AT91C_PA31_DTXD
+
#else
#error "serial lines not defined for this SAM7 version"
-#endif
+#endif /* HAL_USE_SERIAL */
/*===========================================================================*/
/* Driver exported variables. */
@@ -68,10 +78,17 @@ SerialDriver SD1;
/** @brief USART1 serial driver identifier.*/
SerialDriver SD2;
#endif
+
+#if (SAM7_PLATFORM == SAM7A3)
+#if USE_SAM7_USART2 || defined(__DOXYGEN__)
+/** @brief USART2 serial driver identifier.*/
+SerialDriver SD3;
+#endif
+#endif
#if USE_SAM7_DBGU_UART || defined(__DOXYGEN__)
/** @brief DBGU_UART serial driver identifier.*/
-SerialDriver SD3;
+SerialDriver SDDBG;
#endif
/*===========================================================================*/
@@ -212,10 +229,20 @@ static void notify2(GenericQueue *qp) {
}
#endif
-#if USE_SAM7_DBGU_UART || defined(__DOXYGEN__)
+#if (SAM7_PLATFORM == SAM7A3)
+#if USE_SAM7_USART2 || defined(__DOXYGEN__)
static void notify3(GenericQueue *qp) {
(void)qp;
+ AT91C_BASE_US2->US_IER = AT91C_US_TXRDY;
+}
+#endif
+#endif /* (SAM7_PLATFORM == SAM7A3) */
+
+#if USE_SAM7_DBGU_UART || defined(__DOXYGEN__)
+static void notify_dbg(GenericQueue *qp) {
+
+ (void)qp;
AT91C_BASE_DBGU->DBGU_IER = AT91C_US_TXRDY;
}
#endif
@@ -254,6 +281,23 @@ CH_IRQ_HANDLER(USART1IrqHandler) {
}
#endif
+#if (SAM7_PLATFORM == SAM7A3)
+#if USE_SAM7_USART2 || defined(__DOXYGEN__)
+/**
+ * @brief USART2 interrupt handler.
+ *
+ * @isr
+ */
+CH_IRQ_HANDLER(USART2IrqHandler) {
+
+ CH_IRQ_PROLOGUE();
+ sd_lld_serve_interrupt(&SD3);
+ AT91C_BASE_AIC->AIC_EOICR = 0;
+ CH_IRQ_EPILOGUE();
+}
+#endif
+#endif /* (SAM7_PLATFORM == SAM7A3) */
+
/* note - DBGU_UART IRQ is the SysIrq in board.c
since it's not vectored separately by the AIC.*/
@@ -290,12 +334,25 @@ void sd_lld_init(void) {
USART1IrqHandler);
#endif
-#if USE_SAM7_DBGU_UART
+#if (SAM7_PLATFORM == SAM7A3)
+#if USE_SAM7_USART2
sdObjectInit(&SD3, NULL, notify3);
+ SD3.usart = AT91C_BASE_US2;
+ AT91C_BASE_PIOA->PIO_PDR = SAM7_USART2_RX | SAM7_USART2_TX;
+ AT91C_BASE_PIOA->PIO_ASR = SAM7_USART2_RX | SAM7_USART2_TX;
+ AT91C_BASE_PIOA->PIO_PPUDR = SAM7_USART2_RX | SAM7_USART2_TX;
+ AIC_ConfigureIT(AT91C_ID_US2,
+ AT91C_AIC_SRCTYPE_HIGH_LEVEL | SAM7_USART2_PRIORITY,
+ USART2IrqHandler);
+#endif
+#endif /* (SAM7_PLATFORM == SAM7A3) */
+
+#if USE_SAM7_DBGU_UART
+ sdObjectInit(&SDDBG, NULL, notify_dbg);
/* this is a little cheap, but OK for now since there's enough overlap
between dbgu and usart register maps. it means we can reuse all the
same usart interrupt handling and config that already exists.*/
- SD3.usart = (AT91PS_USART)AT91C_BASE_DBGU;
+ SDDBG.usart = (AT91PS_USART)AT91C_BASE_DBGU;
AT91C_BASE_PIOA->PIO_PDR = SAM7_DBGU_RX | SAM7_DBGU_TX;
AT91C_BASE_PIOA->PIO_ASR = SAM7_DBGU_RX | SAM7_DBGU_TX;
AT91C_BASE_PIOA->PIO_PPUDR = SAM7_DBGU_RX | SAM7_DBGU_TX;
@@ -334,6 +391,16 @@ void sd_lld_start(SerialDriver *sdp, const SerialConfig *config) {
AIC_EnableIT(AT91C_ID_US1);
}
#endif
+#if (SAM7_PLATFORM == SAM7A3)
+#if USE_SAM7_USART2
+ if (&SD3 == sdp) {
+ /* Starts the clock and clears possible sources of immediate interrupts.*/
+ AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_US2);
+ /* Enables associated interrupt vector.*/
+ AIC_EnableIT(AT91C_ID_US2);
+ }
+#endif
+#endif /* (SAM7_PLATFORM == SAM7A3) */
/* Note - no explicit start for SD3 (DBGU_UART) since it's not included
in the AIC or PMC.*/
}
@@ -368,7 +435,7 @@ void sd_lld_stop(SerialDriver *sdp) {
}
#endif
#if USE_SAM7_DBGU_UART
- if (&SD3 == sdp) {
+ if (&SDDBG == sdp) {
AT91C_BASE_DBGU->DBGU_IDR = 0xFFFFFFFF;
return;
}
diff --git a/os/hal/platforms/AT91SAM7/serial_lld.h b/os/hal/platforms/AT91SAM7/serial_lld.h
index 283a05149..5c2a74bf3 100644
--- a/os/hal/platforms/AT91SAM7/serial_lld.h
+++ b/os/hal/platforms/AT91SAM7/serial_lld.h
@@ -57,6 +57,17 @@
#define USE_SAM7_USART1 TRUE
#endif
+#if (SAM7_PLATFORM == SAM7A3)
+/**
+ * @brief UART2 driver enable switch.
+ * @details If set to @p TRUE the support for USART3 is included.
+ * @note The default is @p TRUE.
+ */
+#if !defined(USE_SAM7_USART2) || defined(__DOXYGEN__)
+#define USE_SAM7_USART2 TRUE
+#endif
+#endif /* (SAM7_PLATFORM == SAM7A3) */
+
/**
* @brief DBGU UART driver enable switch.
* @details If set to @p TRUE the support for the DBGU UART is included.
@@ -80,6 +91,15 @@
#define SAM7_USART1_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 2)
#endif
+#if (SAM7_PLATFORM == SAM7A3)
+/**
+ * @brief UART2 interrupt priority level setting.
+ */
+#if !defined(SAM7_USART2_PRIORITY) || defined(__DOXYGEN__)
+#define SAM7_USART2_PRIORITY (AT91C_AIC_PRIOR_HIGHEST - 2)
+#endif
+#endif /* (SAM7_PLATFORM == SAM7A3) */
+
/**
* @brief DBGU_UART interrupt priority level setting.
*/
@@ -146,9 +166,14 @@ extern SerialDriver SD1;
#if USE_SAM7_USART1 && !defined(__DOXYGEN__)
extern SerialDriver SD2;
#endif
-#if USE_SAM7_DBGU_UART
+#if (SAM7_PLATFORM == SAM7A3)
+#if USE_SAM7_USART2 && !defined(__DOXYGEN__)
extern SerialDriver SD3;
#endif
+#endif
+#if USE_SAM7_DBGU_UART
+extern SerialDriver SDDBG;
+#endif
#ifdef __cplusplus
extern "C" {