mirror of
https://gitea.osmocom.org/sim-card/simtrace2.git
synced 2026-03-17 13:48:32 +03:00
initial
This commit is contained in:
172
sam3s_example/src/board_cstartup_gnu.c
Normal file
172
sam3s_example/src/board_cstartup_gnu.c
Normal file
@@ -0,0 +1,172 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* ATMEL Microcontroller Software Support
|
||||
* ----------------------------------------------------------------------------
|
||||
* Copyright (c) 2010, Atmel Corporation
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the disclaimer below.
|
||||
*
|
||||
* Atmel's name may not be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
||||
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Headers
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
#include "board.h"
|
||||
#include "board_lowlevel.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Exported variables
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/* Stack Configuration */
|
||||
#define STACK_SIZE 0x900 /** Stack size (in DWords) */
|
||||
__attribute__ ((aligned(8),section(".stack")))
|
||||
uint32_t pdwStack[STACK_SIZE] ;
|
||||
|
||||
/* Initialize segments */
|
||||
extern uint32_t _sfixed;
|
||||
extern uint32_t _efixed;
|
||||
extern uint32_t _etext;
|
||||
extern uint32_t _srelocate;
|
||||
extern uint32_t _erelocate;
|
||||
extern uint32_t _szero;
|
||||
extern uint32_t _ezero;
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* ProtoTypes
|
||||
*----------------------------------------------------------------------------*/
|
||||
extern int main( void ) ;
|
||||
extern void __libc_init_array( void ) ;
|
||||
void ResetException( void ) ;
|
||||
|
||||
/*------------------------------------------------------------------------------
|
||||
* Exception Table
|
||||
*------------------------------------------------------------------------------*/
|
||||
|
||||
__attribute__((section(".vectors")))
|
||||
IntFunc exception_table[] = {
|
||||
|
||||
/* Configure Initial Stack Pointer, using linker-generated symbols */
|
||||
(IntFunc)(&pdwStack[STACK_SIZE-1]),
|
||||
ResetException,
|
||||
|
||||
NMI_Handler,
|
||||
HardFault_Handler,
|
||||
MemManage_Handler,
|
||||
BusFault_Handler,
|
||||
UsageFault_Handler,
|
||||
0, 0, 0, 0, /* Reserved */
|
||||
SVC_Handler,
|
||||
DebugMon_Handler,
|
||||
0, /* Reserved */
|
||||
PendSV_Handler,
|
||||
SysTick_Handler,
|
||||
|
||||
/* Configurable interrupts */
|
||||
SUPC_IrqHandler, /* 0 Supply Controller */
|
||||
RSTC_IrqHandler, /* 1 Reset Controller */
|
||||
RTC_IrqHandler, /* 2 Real Time Clock */
|
||||
RTT_IrqHandler, /* 3 Real Time Timer */
|
||||
WDT_IrqHandler, /* 4 Watchdog Timer */
|
||||
PMC_IrqHandler, /* 5 PMC */
|
||||
EEFC_IrqHandler, /* 6 EEFC */
|
||||
IrqHandlerNotUsed, /* 7 Reserved */
|
||||
UART0_IrqHandler, /* 8 UART0 */
|
||||
UART1_IrqHandler, /* 9 UART1 */
|
||||
SMC_IrqHandler, /* 10 SMC */
|
||||
PIOA_IrqHandler, /* 11 Parallel IO Controller A */
|
||||
PIOB_IrqHandler, /* 12 Parallel IO Controller B */
|
||||
PIOC_IrqHandler, /* 13 Parallel IO Controller C */
|
||||
USART0_IrqHandler, /* 14 USART 0 */
|
||||
USART1_IrqHandler, /* 15 USART 1 */
|
||||
IrqHandlerNotUsed, /* 16 Reserved */
|
||||
IrqHandlerNotUsed, /* 17 Reserved */
|
||||
MCI_IrqHandler, /* 18 MCI */
|
||||
TWI0_IrqHandler, /* 19 TWI 0 */
|
||||
TWI1_IrqHandler, /* 20 TWI 1 */
|
||||
SPI_IrqHandler, /* 21 SPI */
|
||||
SSC_IrqHandler, /* 22 SSC */
|
||||
TC0_IrqHandler, /* 23 Timer Counter 0 */
|
||||
TC1_IrqHandler, /* 24 Timer Counter 1 */
|
||||
TC2_IrqHandler, /* 25 Timer Counter 2 */
|
||||
TC3_IrqHandler, /* 26 Timer Counter 3 */
|
||||
TC4_IrqHandler, /* 27 Timer Counter 4 */
|
||||
TC5_IrqHandler, /* 28 Timer Counter 5 */
|
||||
ADC_IrqHandler, /* 29 ADC controller */
|
||||
DAC_IrqHandler, /* 30 DAC controller */
|
||||
PWM_IrqHandler, /* 31 PWM */
|
||||
CRCCU_IrqHandler, /* 32 CRC Calculation Unit */
|
||||
ACC_IrqHandler, /* 33 Analog Comparator */
|
||||
USBD_IrqHandler, /* 34 USB Device Port */
|
||||
IrqHandlerNotUsed /* 35 not used */
|
||||
};
|
||||
|
||||
/**
|
||||
* \brief This is the code that gets called on processor reset.
|
||||
* To initialize the device, and call the main() routine.
|
||||
*/
|
||||
void ResetException( void )
|
||||
{
|
||||
uint32_t *pSrc, *pDest ;
|
||||
|
||||
/* Low level Initialize */
|
||||
LowLevelInit() ;
|
||||
|
||||
/* Initialize the relocate segment */
|
||||
pSrc = &_etext ;
|
||||
pDest = &_srelocate ;
|
||||
|
||||
if ( pSrc != pDest )
|
||||
{
|
||||
for ( ; pDest < &_erelocate ; )
|
||||
{
|
||||
*pDest++ = *pSrc++ ;
|
||||
}
|
||||
}
|
||||
|
||||
/* Clear the zero segment */
|
||||
for ( pDest = &_szero ; pDest < &_ezero ; )
|
||||
{
|
||||
*pDest++ = 0;
|
||||
}
|
||||
|
||||
/* Set the vector table base address */
|
||||
pSrc = (uint32_t *)&_sfixed;
|
||||
SCB->VTOR = ( (uint32_t)pSrc & SCB_VTOR_TBLOFF_Msk ) ;
|
||||
|
||||
if ( ((uint32_t)pSrc >= IRAM_ADDR) && ((uint32_t)pSrc < IRAM_ADDR+IRAM_SIZE) )
|
||||
{
|
||||
SCB->VTOR |= 1 << SCB_VTOR_TBLBASE_Pos ;
|
||||
}
|
||||
|
||||
/* Initialize the C library */
|
||||
__libc_init_array() ;
|
||||
|
||||
/* Branch to main function */
|
||||
main() ;
|
||||
|
||||
/* Infinite loop */
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
124
sam3s_example/src/board_lowlevel.c
Normal file
124
sam3s_example/src/board_lowlevel.c
Normal file
@@ -0,0 +1,124 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* ATMEL Microcontroller Software Support
|
||||
* ----------------------------------------------------------------------------
|
||||
* Copyright (c) 2009, Atmel Corporation
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the disclaimer below.
|
||||
*
|
||||
* Atmel's name may not be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
||||
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
*
|
||||
* Provides the low-level initialization function that called on chip startup.
|
||||
*/
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Headers
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
#include "board.h"
|
||||
#include "board_lowlevel.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Local definitions
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/* Clock settings at 48MHz */
|
||||
#if (BOARD_MCK == 48000000)
|
||||
#define BOARD_OSCOUNT (CKGR_MOR_MOSCXTST(0x8))
|
||||
#define BOARD_PLLAR (CKGR_PLLAR_STUCKTO1 \
|
||||
| CKGR_PLLAR_MULA(0x7) \
|
||||
| CKGR_PLLAR_PLLACOUNT(0x1) \
|
||||
| CKGR_PLLAR_DIVA(0x1))
|
||||
#define BOARD_MCKR (PMC_MCKR_PRES_CLK_2 | PMC_MCKR_CSS_PLLA_CLK)
|
||||
|
||||
/* Clock settings at 64MHz */
|
||||
#elif (BOARD_MCK == 64000000)
|
||||
#define BOARD_OSCOUNT (CKGR_MOR_MOSCXTST(0x8))
|
||||
#define BOARD_PLLAR (CKGR_PLLAR_STUCKTO1 \
|
||||
| CKGR_PLLAR_MULA(0x0f) \
|
||||
| CKGR_PLLAR_PLLACOUNT(0x1) \
|
||||
| CKGR_PLLAR_DIVA(0x3))
|
||||
#define BOARD_MCKR (PMC_MCKR_PRES_CLK | PMC_MCKR_CSS_PLLA_CLK)
|
||||
|
||||
#else
|
||||
#error "No settings for current BOARD_MCK."
|
||||
#endif
|
||||
|
||||
/* Define clock timeout */
|
||||
#define CLOCK_TIMEOUT 0xFFFFFFFF
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* \brief Performs the low-level initialization of the chip.
|
||||
* This includes EFC and master clock configuration.
|
||||
* It also enable a low level on the pin NRST triggers a user reset.
|
||||
*/
|
||||
WEAK void LowLevelInit( void )
|
||||
{
|
||||
uint32_t timeout = 0;
|
||||
|
||||
/* Set 3 FWS for Embedded Flash Access */
|
||||
EFC->EEFC_FMR = EEFC_FMR_FWS(3);
|
||||
|
||||
/* Select external slow clock */
|
||||
#if 0
|
||||
if ((SUPC->SUPC_SR & SUPC_SR_OSCSEL) != SUPC_SR_OSCSEL_CRYST)
|
||||
{
|
||||
SUPC->SUPC_CR = (uint32_t)(SUPC_CR_XTALSEL_CRYSTAL_SEL | SUPC_CR_KEY(0xA5));
|
||||
timeout = 0;
|
||||
while (!(SUPC->SUPC_SR & SUPC_SR_OSCSEL_CRYST) );
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Initialize main oscillator */
|
||||
if ( !(PMC->CKGR_MOR & CKGR_MOR_MOSCSEL) )
|
||||
{
|
||||
PMC->CKGR_MOR = CKGR_MOR_KEY(0x37) | BOARD_OSCOUNT | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTEN;
|
||||
timeout = 0;
|
||||
while (!(PMC->PMC_SR & PMC_SR_MOSCXTS) && (timeout++ < CLOCK_TIMEOUT));
|
||||
}
|
||||
|
||||
/* Switch to 3-20MHz Xtal oscillator */
|
||||
PMC->CKGR_MOR = CKGR_MOR_KEY(0x37) | BOARD_OSCOUNT | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTEN | CKGR_MOR_MOSCSEL;
|
||||
timeout = 0;
|
||||
while (!(PMC->PMC_SR & PMC_SR_MOSCSELS) && (timeout++ < CLOCK_TIMEOUT));
|
||||
PMC->PMC_MCKR = (PMC->PMC_MCKR & ~(uint32_t)PMC_MCKR_CSS_Msk) | PMC_MCKR_CSS_MAIN_CLK;
|
||||
for ( timeout = 0; !(PMC->PMC_SR & PMC_SR_MCKRDY) && (timeout++ < CLOCK_TIMEOUT) ; );
|
||||
|
||||
/* Initialize PLLA */
|
||||
PMC->CKGR_PLLAR = BOARD_PLLAR;
|
||||
timeout = 0;
|
||||
while (!(PMC->PMC_SR & PMC_SR_LOCKA) && (timeout++ < CLOCK_TIMEOUT));
|
||||
|
||||
/* Switch to main clock */
|
||||
PMC->PMC_MCKR = (BOARD_MCKR & ~PMC_MCKR_CSS_Msk) | PMC_MCKR_CSS_MAIN_CLK;
|
||||
for ( timeout = 0; !(PMC->PMC_SR & PMC_SR_MCKRDY) && (timeout++ < CLOCK_TIMEOUT) ; );
|
||||
|
||||
PMC->PMC_MCKR = BOARD_MCKR ;
|
||||
for ( timeout = 0; !(PMC->PMC_SR & PMC_SR_MCKRDY) && (timeout++ < CLOCK_TIMEOUT) ; );
|
||||
}
|
||||
384
sam3s_example/src/exceptions.c
Normal file
384
sam3s_example/src/exceptions.c
Normal file
@@ -0,0 +1,384 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* ATMEL Microcontroller Software Support
|
||||
* ----------------------------------------------------------------------------
|
||||
* Copyright (c) 2009, Atmel Corporation
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the disclaimer below.
|
||||
*
|
||||
* Atmel's name may not be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
||||
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
* This file contains the default exception handlers.
|
||||
*
|
||||
* \note
|
||||
* The exception handler has weak aliases.
|
||||
* As they are weak aliases, any function with the same name will override
|
||||
* this definition.
|
||||
*/
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Headers
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
#include "chip.h"
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* \brief Default interrupt handler for not used irq.
|
||||
*/
|
||||
void IrqHandlerNotUsed( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default NMI interrupt handler.
|
||||
*/
|
||||
WEAK void NMI_Handler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default HardFault interrupt handler.
|
||||
*/
|
||||
WEAK void HardFault_Handler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default MemManage interrupt handler.
|
||||
*/
|
||||
WEAK void MemManage_Handler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default BusFault interrupt handler.
|
||||
*/
|
||||
WEAK void BusFault_Handler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default UsageFault interrupt handler.
|
||||
*/
|
||||
WEAK void UsageFault_Handler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default SVC interrupt handler.
|
||||
*/
|
||||
WEAK void SVC_Handler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default DebugMon interrupt handler.
|
||||
*/
|
||||
WEAK void DebugMon_Handler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default PendSV interrupt handler.
|
||||
*/
|
||||
WEAK void PendSV_Handler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default SysTick interrupt handler.
|
||||
*/
|
||||
WEAK void SysTick_Handler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default interrupt handler for Supply Controller.
|
||||
*/
|
||||
WEAK void SUPC_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default interrupt handler for Reset Controller.
|
||||
*/
|
||||
WEAK void RSTC_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default interrupt handler for Real Time Clock.
|
||||
*/
|
||||
WEAK void RTC_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default interrupt handler for Real Time Timer.
|
||||
*/
|
||||
WEAK void RTT_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default interrupt handler for Watchdog Timer.
|
||||
*/
|
||||
WEAK void WDT_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default interrupt handler for PMC.
|
||||
*/
|
||||
WEAK void PMC_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default interrupt handler for EEFC.
|
||||
*/
|
||||
WEAK void EEFC_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default interrupt handler for UART0.
|
||||
*/
|
||||
WEAK void UART0_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default interrupt handler for UART1.
|
||||
*/
|
||||
WEAK void UART1_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default interrupt handler for SMC.
|
||||
*/
|
||||
WEAK void SMC_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default interrupt handler for PIOA Controller.
|
||||
*/
|
||||
WEAK void PIOA_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default interrupt handler for PIOB Controller.
|
||||
*/
|
||||
WEAK void PIOB_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default interrupt handler for PIOC Controller.
|
||||
*/
|
||||
WEAK void PIOC_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default interrupt handler for USART0.
|
||||
*/
|
||||
WEAK void USART0_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default interrupt handler for USART1.
|
||||
*/
|
||||
WEAK void USART1_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default interrupt handler for MCI.
|
||||
*/
|
||||
WEAK void MCI_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default interrupt handler for TWI0.
|
||||
*/
|
||||
WEAK void TWI0_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default interrupt handler for TWI1.
|
||||
*/
|
||||
WEAK void TWI1_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default interrupt handler for SPI.
|
||||
*/
|
||||
WEAK void SPI_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default interrupt handler for SSC.
|
||||
*/
|
||||
WEAK void SSC_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default interrupt handler for TC0.
|
||||
*/
|
||||
WEAK void TC0_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default interrupt handler for TC1.
|
||||
*/
|
||||
WEAK void TC1_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default interrupt handler for TC2.
|
||||
*/
|
||||
WEAK void TC2_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default SUPC interrupt handler for TC3.
|
||||
*/
|
||||
WEAK void TC3_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default SUPC interrupt handler for TC4.
|
||||
*/
|
||||
WEAK void TC4_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default SUPC interrupt handler for TC5.
|
||||
*/
|
||||
WEAK void TC5_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default SUPC interrupt handler for ADC.
|
||||
*/
|
||||
WEAK void ADC_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default SUPC interrupt handler for DAC.
|
||||
*/
|
||||
WEAK void DAC_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default SUPC interrupt handler for PWM.
|
||||
*/
|
||||
WEAK void PWM_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default SUPC interrupt handler for CRCCU.
|
||||
*/
|
||||
WEAK void CRCCU_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default SUPC interrupt handler for ACC.
|
||||
*/
|
||||
WEAK void ACC_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Default SUPC interrupt handler for USBD.
|
||||
*/
|
||||
WEAK void USBD_IrqHandler( void )
|
||||
{
|
||||
while ( 1 ) ;
|
||||
}
|
||||
454
sam3s_example/src/pio.c
Normal file
454
sam3s_example/src/pio.c
Normal file
@@ -0,0 +1,454 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* ATMEL Microcontroller Software Support
|
||||
* ----------------------------------------------------------------------------
|
||||
* Copyright (c) 2010, Atmel Corporation
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the disclaimer below.
|
||||
*
|
||||
* Atmel's name may not be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
||||
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/** \file */
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Headers
|
||||
*----------------------------------------------------------------------------*/
|
||||
#include "chip.h"
|
||||
#include "pio.h"
|
||||
#include "pmc.h"
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Local functions
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* \brief Configures one or more pin(s) of a PIO controller as being controlled by
|
||||
* peripheral A. Optionally, the corresponding internal pull-up(s) can be enabled.
|
||||
*
|
||||
* \param pio Pointer to a PIO controller.
|
||||
* \param mask Bitmask of one or more pin(s) to configure.
|
||||
* \param enablePullUp Indicates if the pin(s) internal pull-up shall be
|
||||
* configured.
|
||||
*/
|
||||
static void PIO_SetPeripheralA(
|
||||
Pio *pio,
|
||||
unsigned int mask,
|
||||
unsigned char enablePullUp)
|
||||
{
|
||||
unsigned int abcdsr;
|
||||
/* Disable interrupts on the pin(s) */
|
||||
pio->PIO_IDR = mask;
|
||||
|
||||
/* Enable the pull-up(s) if necessary */
|
||||
if (enablePullUp) {
|
||||
pio->PIO_PUER = mask;
|
||||
}
|
||||
else {
|
||||
|
||||
pio->PIO_PUDR = mask;
|
||||
}
|
||||
|
||||
abcdsr = pio->PIO_ABCDSR[0];
|
||||
pio->PIO_ABCDSR[0] &= (~mask & abcdsr);
|
||||
abcdsr = pio->PIO_ABCDSR[1];
|
||||
pio->PIO_ABCDSR[1] &= (~mask & abcdsr);
|
||||
pio->PIO_PDR = mask;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Configures one or more pin(s) of a PIO controller as being controlled by
|
||||
* peripheral B. Optionally, the corresponding internal pull-up(s) can be enabled.
|
||||
*
|
||||
* \param pio Pointer to a PIO controller.
|
||||
* \param mask Bitmask of one or more pin(s) to configure.
|
||||
* \param enablePullUp Indicates if the pin(s) internal pull-up shall be
|
||||
* configured.
|
||||
*/
|
||||
static void PIO_SetPeripheralB(
|
||||
Pio *pio,
|
||||
unsigned int mask,
|
||||
unsigned char enablePullUp)
|
||||
{
|
||||
unsigned int abcdsr;
|
||||
/* Disable interrupts on the pin(s) */
|
||||
pio->PIO_IDR = mask;
|
||||
|
||||
/* Enable the pull-up(s) if necessary */
|
||||
if (enablePullUp) {
|
||||
|
||||
pio->PIO_PUER = mask;
|
||||
}
|
||||
else {
|
||||
|
||||
pio->PIO_PUDR = mask;
|
||||
}
|
||||
|
||||
abcdsr = pio->PIO_ABCDSR[0];
|
||||
pio->PIO_ABCDSR[0] = (mask | abcdsr);
|
||||
abcdsr = pio->PIO_ABCDSR[1];
|
||||
pio->PIO_ABCDSR[1] &= (~mask & abcdsr);
|
||||
|
||||
pio->PIO_PDR = mask;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Configures one or more pin(s) of a PIO controller as being controlled by
|
||||
* peripheral C. Optionally, the corresponding internal pull-up(s) can be enabled.
|
||||
*
|
||||
* \param pio Pointer to a PIO controller.
|
||||
* \param mask Bitmask of one or more pin(s) to configure.
|
||||
* \param enablePullUp Indicates if the pin(s) internal pull-up shall be
|
||||
* configured.
|
||||
*/
|
||||
static void PIO_SetPeripheralC(
|
||||
Pio *pio,
|
||||
unsigned int mask,
|
||||
unsigned char enablePullUp)
|
||||
{
|
||||
unsigned int abcdsr;
|
||||
/* Disable interrupts on the pin(s) */
|
||||
pio->PIO_IDR = mask;
|
||||
|
||||
/* Enable the pull-up(s) if necessary */
|
||||
if (enablePullUp) {
|
||||
|
||||
pio->PIO_PUER = mask;
|
||||
}
|
||||
else {
|
||||
|
||||
pio->PIO_PUDR = mask;
|
||||
}
|
||||
|
||||
abcdsr = pio->PIO_ABCDSR[0];
|
||||
pio->PIO_ABCDSR[0] &= (~mask & abcdsr);
|
||||
abcdsr = pio->PIO_ABCDSR[1];
|
||||
pio->PIO_ABCDSR[1] = (mask | abcdsr);
|
||||
|
||||
pio->PIO_PDR = mask;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Configures one or more pin(s) of a PIO controller as being controlled by
|
||||
* peripheral D. Optionally, the corresponding internal pull-up(s) can be enabled.
|
||||
*
|
||||
* \param pio Pointer to a PIO controller.
|
||||
* \param mask Bitmask of one or more pin(s) to configure.
|
||||
* \param enablePullUp Indicates if the pin(s) internal pull-up shall be
|
||||
* configured.
|
||||
*/
|
||||
static void PIO_SetPeripheralD(
|
||||
Pio *pio,
|
||||
unsigned int mask,
|
||||
unsigned char enablePullUp)
|
||||
{
|
||||
unsigned int abcdsr;
|
||||
/* Disable interrupts on the pin(s) */
|
||||
pio->PIO_IDR = mask;
|
||||
|
||||
/* Enable the pull-up(s) if necessary */
|
||||
if (enablePullUp) {
|
||||
|
||||
pio->PIO_PUER = mask;
|
||||
}
|
||||
else {
|
||||
|
||||
pio->PIO_PUDR = mask;
|
||||
}
|
||||
|
||||
abcdsr = pio->PIO_ABCDSR[0];
|
||||
pio->PIO_ABCDSR[0] = (mask | abcdsr);
|
||||
abcdsr = pio->PIO_ABCDSR[1];
|
||||
pio->PIO_ABCDSR[1] = (mask | abcdsr);
|
||||
|
||||
pio->PIO_PDR = mask;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Configures one or more pin(s) or a PIO controller as inputs. Optionally,
|
||||
* the corresponding internal pull-up(s) and glitch filter(s) can be enabled.
|
||||
*
|
||||
* \param pio Pointer to a PIO controller.
|
||||
* \param mask Bitmask indicating which pin(s) to configure as input(s).
|
||||
* \param enablePullUp Indicates if the internal pull-up(s) must be enabled.
|
||||
* \param enableFilter Indicates if the glitch filter(s) must be enabled.
|
||||
*/
|
||||
static void PIO_SetInput(
|
||||
Pio *pio,
|
||||
unsigned int mask,
|
||||
unsigned char attribute)
|
||||
{
|
||||
/* Disable interrupts */
|
||||
pio->PIO_IDR = mask;
|
||||
|
||||
/* Enable pull-up(s) if necessary */
|
||||
if (attribute & PIO_PULLUP)
|
||||
pio->PIO_PUER = mask;
|
||||
else
|
||||
pio->PIO_PUDR = mask;
|
||||
|
||||
/* Enable Input Filter if necessary */
|
||||
if (attribute & (PIO_DEGLITCH | PIO_DEBOUNCE))
|
||||
pio->PIO_IFER = mask;
|
||||
else
|
||||
pio->PIO_IFDR = mask;
|
||||
|
||||
/* Enable de-glitch or de-bounce if necessary */
|
||||
if (attribute & PIO_DEGLITCH)
|
||||
{
|
||||
pio->PIO_IFSCDR = mask;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (attribute & PIO_DEBOUNCE)
|
||||
{
|
||||
pio->PIO_IFSCER = mask;
|
||||
}
|
||||
}
|
||||
|
||||
/* Configure pin as input */
|
||||
pio->PIO_ODR = mask;
|
||||
pio->PIO_PER = mask;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Configures one or more pin(s) of a PIO controller as outputs, with the
|
||||
* given default value. Optionally, the multi-drive feature can be enabled
|
||||
* on the pin(s).
|
||||
*
|
||||
* \param pio Pointer to a PIO controller.
|
||||
* \param mask Bitmask indicating which pin(s) to configure.
|
||||
* \param defaultValue Default level on the pin(s).
|
||||
* \param enableMultiDrive Indicates if the pin(s) shall be configured as
|
||||
* open-drain.
|
||||
* \param enablePullUp Indicates if the pin shall have its pull-up activated.
|
||||
*/
|
||||
static void PIO_SetOutput(
|
||||
Pio *pio,
|
||||
unsigned int mask,
|
||||
unsigned char defaultValue,
|
||||
unsigned char enableMultiDrive,
|
||||
unsigned char enablePullUp)
|
||||
{
|
||||
/* Disable interrupts */
|
||||
pio->PIO_IDR = mask;
|
||||
|
||||
/* Enable pull-up(s) if necessary */
|
||||
if (enablePullUp) {
|
||||
|
||||
pio->PIO_PUER = mask;
|
||||
}
|
||||
else {
|
||||
|
||||
pio->PIO_PUDR = mask;
|
||||
}
|
||||
|
||||
/* Enable multi-drive if necessary */
|
||||
if (enableMultiDrive) {
|
||||
|
||||
pio->PIO_MDER = mask;
|
||||
}
|
||||
else {
|
||||
|
||||
pio->PIO_MDDR = mask;
|
||||
}
|
||||
|
||||
/* Set default value */
|
||||
if (defaultValue) {
|
||||
|
||||
pio->PIO_SODR = mask;
|
||||
}
|
||||
else {
|
||||
|
||||
pio->PIO_CODR = mask;
|
||||
}
|
||||
|
||||
/* Configure pin(s) as output(s) */
|
||||
pio->PIO_OER = mask;
|
||||
pio->PIO_PER = mask;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Global functions
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* \brief Configures a list of Pin instances, each of which can either hold a single
|
||||
* pin or a group of pins, depending on the mask value; all pins are configured
|
||||
* by this function. The size of the array must also be provided and is easily
|
||||
* computed using PIO_LISTSIZE whenever its length is not known in advance.
|
||||
*
|
||||
* \param list Pointer to a list of Pin instances.
|
||||
* \param size Size of the Pin list (calculated using PIO_LISTSIZE).
|
||||
*
|
||||
* \return 1 if the pins have been configured properly; otherwise 0.
|
||||
*/
|
||||
uint8_t PIO_Configure( const Pin *list, uint32_t size )
|
||||
{
|
||||
/* Configure pins */
|
||||
while ( size > 0 )
|
||||
{
|
||||
switch ( list->type )
|
||||
{
|
||||
|
||||
case PIO_PERIPH_A:
|
||||
PIO_SetPeripheralA(list->pio,
|
||||
list->mask,
|
||||
(list->attribute & PIO_PULLUP) ? 1 : 0);
|
||||
break;
|
||||
|
||||
case PIO_PERIPH_B:
|
||||
PIO_SetPeripheralB(list->pio,
|
||||
list->mask,
|
||||
(list->attribute & PIO_PULLUP) ? 1 : 0);
|
||||
break;
|
||||
|
||||
case PIO_PERIPH_C:
|
||||
PIO_SetPeripheralC(list->pio,
|
||||
list->mask,
|
||||
(list->attribute & PIO_PULLUP) ? 1 : 0);
|
||||
break;
|
||||
|
||||
case PIO_PERIPH_D:
|
||||
PIO_SetPeripheralD(list->pio,
|
||||
list->mask,
|
||||
(list->attribute & PIO_PULLUP) ? 1 : 0);
|
||||
break;
|
||||
case PIO_INPUT:
|
||||
PMC_EnablePeripheral(list->id);
|
||||
PIO_SetInput(list->pio,
|
||||
list->mask,
|
||||
list->attribute);
|
||||
break;
|
||||
|
||||
case PIO_OUTPUT_0:
|
||||
case PIO_OUTPUT_1:
|
||||
PIO_SetOutput(list->pio,
|
||||
list->mask,
|
||||
(list->type == PIO_OUTPUT_1),
|
||||
(list->attribute & PIO_OPENDRAIN) ? 1 : 0,
|
||||
(list->attribute & PIO_PULLUP) ? 1 : 0);
|
||||
break;
|
||||
|
||||
default: return 0;
|
||||
}
|
||||
|
||||
list++;
|
||||
size--;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Sets a high output level on all the PIOs defined in the given Pin instance.
|
||||
* This has no immediate effects on PIOs that are not output, but the PIO
|
||||
* controller will memorize the value they are changed to outputs.
|
||||
*
|
||||
* \param pin Pointer to a Pin instance describing one or more pins.
|
||||
*/
|
||||
void PIO_Set(const Pin *pin)
|
||||
{
|
||||
pin->pio->PIO_SODR = pin->mask;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Sets a low output level on all the PIOs defined in the given Pin instance.
|
||||
* This has no immediate effects on PIOs that are not output, but the PIO
|
||||
* controller will memorize the value they are changed to outputs.
|
||||
*
|
||||
* \param pin Pointer to a Pin instance describing one or more pins.
|
||||
*/
|
||||
void PIO_Clear(const Pin *pin)
|
||||
{
|
||||
pin->pio->PIO_CODR = pin->mask;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Returns 1 if one or more PIO of the given Pin instance currently have
|
||||
* a high level; otherwise returns 0. This method returns the actual value that
|
||||
* is being read on the pin. To return the supposed output value of a pin, use
|
||||
* PIO_GetOutputDataStatus() instead.
|
||||
*
|
||||
* \param pin Pointer to a Pin instance describing one or more pins.
|
||||
*
|
||||
* \return 1 if the Pin instance contains at least one PIO that currently has
|
||||
* a high level; otherwise 0.
|
||||
*/
|
||||
unsigned char PIO_Get( const Pin *pin )
|
||||
{
|
||||
unsigned int reg ;
|
||||
|
||||
if ( (pin->type == PIO_OUTPUT_0) || (pin->type == PIO_OUTPUT_1) )
|
||||
{
|
||||
reg = pin->pio->PIO_ODSR ;
|
||||
}
|
||||
else
|
||||
{
|
||||
reg = pin->pio->PIO_PDSR ;
|
||||
}
|
||||
|
||||
if ( (reg & pin->mask) == 0 )
|
||||
{
|
||||
return 0 ;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 1 ;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Returns 1 if one or more PIO of the given Pin are configured to output a
|
||||
* high level (even if they are not output).
|
||||
* To get the actual value of the pin, use PIO_Get() instead.
|
||||
*
|
||||
* \param pin Pointer to a Pin instance describing one or more pins.
|
||||
*
|
||||
* \return 1 if the Pin instance contains at least one PIO that is configured
|
||||
* to output a high level; otherwise 0.
|
||||
*/
|
||||
unsigned char PIO_GetOutputDataStatus(const Pin *pin)
|
||||
{
|
||||
if ((pin->pio->PIO_ODSR & pin->mask) == 0) {
|
||||
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* \brief Configures Glitch or Debouncing filter for input.
|
||||
*
|
||||
* \param pin Pointer to a Pin instance describing one or more pins.
|
||||
* \param cuttoff Cutt off frequency for debounce filter.
|
||||
*/
|
||||
void PIO_SetDebounceFilter( const Pin *pin, uint32_t cuttoff )
|
||||
{
|
||||
Pio *pio = pin->pio;
|
||||
|
||||
pio->PIO_IFSCER = pin->mask; /* set Debouncing, 0 bit field no effect */
|
||||
pio->PIO_SCDR = ((32678/(2*(cuttoff))) - 1) & 0x3FFF; /* the lowest 14 bits work */
|
||||
}
|
||||
161
sam3s_example/src/pmc.c
Normal file
161
sam3s_example/src/pmc.c
Normal file
@@ -0,0 +1,161 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* ATMEL Microcontroller Software Support
|
||||
* ----------------------------------------------------------------------------
|
||||
* Copyright (c) 2009, Atmel Corporation
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the disclaimer below.
|
||||
*
|
||||
* Atmel's name may not be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
||||
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Headers
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
#include "chip.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Local definitions
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
#define MASK_STATUS0 0xFFFFFFFC
|
||||
#define MASK_STATUS1 0xFFFFFFFF
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* \brief Enables the clock of a peripheral. The peripheral ID is used
|
||||
* to identify which peripheral is targetted.
|
||||
*
|
||||
* \note The ID must NOT be shifted (i.e. 1 << ID_xxx).
|
||||
*
|
||||
* \param id Peripheral ID (ID_xxx).
|
||||
*/
|
||||
extern void PMC_EnablePeripheral( uint32_t dwId )
|
||||
{
|
||||
assert( dwId < 35 ) ;
|
||||
|
||||
if ( dwId < 32 )
|
||||
{
|
||||
if ( (PMC->PMC_PCSR0 & ((uint32_t)1 << dwId)) == ((uint32_t)1 << dwId) )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
PMC->PMC_PCER0 = 1 << dwId ;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
dwId -= 32;
|
||||
if ((PMC->PMC_PCSR1 & ((uint32_t)1 << dwId)) == ((uint32_t)1 << dwId))
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
PMC->PMC_PCER1 = 1 << dwId ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Disables the clock of a peripheral. The peripheral ID is used
|
||||
* to identify which peripheral is targetted.
|
||||
*
|
||||
* \note The ID must NOT be shifted (i.e. 1 << ID_xxx).
|
||||
*
|
||||
* \param id Peripheral ID (ID_xxx).
|
||||
*/
|
||||
extern void PMC_DisablePeripheral( uint32_t dwId )
|
||||
{
|
||||
assert( dwId < 35 ) ;
|
||||
|
||||
if ( dwId < 32 )
|
||||
{
|
||||
if ( (PMC->PMC_PCSR0 & ((uint32_t)1 << dwId)) != ((uint32_t)1 << dwId) )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
PMC->PMC_PCDR0 = 1 << dwId ;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
dwId -= 32 ;
|
||||
if ( (PMC->PMC_PCSR1 & ((uint32_t)1 << dwId)) != ((uint32_t)1 << dwId) )
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
PMC->PMC_PCDR1 = 1 << dwId ;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Enable all the periph clock via PMC.
|
||||
*/
|
||||
extern void PMC_EnableAllPeripherals( void )
|
||||
{
|
||||
PMC->PMC_PCER0 = MASK_STATUS0 ;
|
||||
while ( (PMC->PMC_PCSR0 & MASK_STATUS0) != MASK_STATUS0 ) ;
|
||||
|
||||
PMC->PMC_PCER1 = MASK_STATUS1 ;
|
||||
while ( (PMC->PMC_PCSR1 & MASK_STATUS1) != MASK_STATUS1 ) ;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Disable all the periph clock via PMC.
|
||||
*/
|
||||
extern void PMC_DisableAllPeripherals( void )
|
||||
{
|
||||
PMC->PMC_PCDR0 = MASK_STATUS0 ;
|
||||
while ( (PMC->PMC_PCSR0 & MASK_STATUS0) != 0 ) ;
|
||||
|
||||
PMC->PMC_PCDR1 = MASK_STATUS1 ;
|
||||
while ( (PMC->PMC_PCSR1 & MASK_STATUS1) != 0 ) ;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Get Periph Status for the given peripheral ID.
|
||||
*
|
||||
* \param id Peripheral ID (ID_xxx).
|
||||
*/
|
||||
extern uint32_t PMC_IsPeriphEnabled( uint32_t dwId )
|
||||
{
|
||||
assert( dwId < 35 ) ;
|
||||
|
||||
if ( dwId < 32 )
|
||||
{
|
||||
return ( PMC->PMC_PCSR0 & (1 << dwId) ) ;
|
||||
}
|
||||
else {
|
||||
return ( PMC->PMC_PCSR1 & (1 << (dwId - 32)) ) ;
|
||||
}
|
||||
}
|
||||
352
sam3s_example/src/spi.c
Normal file
352
sam3s_example/src/spi.c
Normal file
@@ -0,0 +1,352 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* ATMEL Microcontroller Software Support
|
||||
* ----------------------------------------------------------------------------
|
||||
* Copyright (c) 2009, Atmel Corporation
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the disclaimer below.
|
||||
*
|
||||
* Atmel's name may not be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
||||
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/** \addtogroup spi_module Working with SPI
|
||||
* The SPI driver provides the interface to configure and use the SPI
|
||||
* peripheral.
|
||||
*
|
||||
* The Serial Peripheral Interface (SPI) circuit is a synchronous serial
|
||||
* data link that provides communication with external devices in Master
|
||||
* or Slave Mode.
|
||||
*
|
||||
* To use the SPI, the user has to follow these few steps:
|
||||
* -# Enable the SPI pins required by the application (see pio.h).
|
||||
* -# Configure the SPI using the \ref SPI_Configure(). This enables the
|
||||
* peripheral clock. The mode register is loaded with the given value.
|
||||
* -# Configure all the necessary chip selects with \ref SPI_ConfigureNPCS().
|
||||
* -# Enable the SPI by calling \ref SPI_Enable().
|
||||
* -# Send/receive data using \ref SPI_Write() and \ref SPI_Read(). Note that \ref SPI_Read()
|
||||
* must be called after \ref SPI_Write() to retrieve the last value read.
|
||||
* -# Send/receive data using the PDC with the \ref SPI_WriteBuffer() and
|
||||
* \ref SPI_ReadBuffer() functions.
|
||||
* -# Disable the SPI by calling \ref SPI_Disable().
|
||||
*
|
||||
* For more accurate information, please look at the SPI section of the
|
||||
* Datasheet.
|
||||
*
|
||||
* Related files :\n
|
||||
* \ref spi.c\n
|
||||
* \ref spi.h.\n
|
||||
*/
|
||||
/*@{*/
|
||||
/*@}*/
|
||||
|
||||
/**
|
||||
* \file
|
||||
*
|
||||
* Implementation of Serial Peripheral Interface (SPI) controller.
|
||||
*
|
||||
*/
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Headers
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
#include "chip.h"
|
||||
#include "pmc.h"
|
||||
#include "spi.h"
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
/**
|
||||
* \brief Enables a SPI peripheral.
|
||||
*
|
||||
* \param spi Pointer to an Spi instance.
|
||||
*/
|
||||
extern void SPI_Enable( Spi* spi )
|
||||
{
|
||||
spi->SPI_CR = SPI_CR_SPIEN ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Disables a SPI peripheral.
|
||||
*
|
||||
* \param spi Pointer to an Spi instance.
|
||||
*/
|
||||
extern void SPI_Disable( Spi* spi )
|
||||
{
|
||||
spi->SPI_CR = SPI_CR_SPIDIS ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Enables one or more interrupt sources of a SPI peripheral.
|
||||
*
|
||||
* \param spi Pointer to an Spi instance.
|
||||
* \param sources Bitwise OR of selected interrupt sources.
|
||||
*/
|
||||
extern void SPI_EnableIt( Spi* spi, uint32_t dwSources )
|
||||
{
|
||||
spi->SPI_IER = dwSources ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Disables one or more interrupt sources of a SPI peripheral.
|
||||
*
|
||||
* \param spi Pointer to an Spi instance.
|
||||
* \param sources Bitwise OR of selected interrupt sources.
|
||||
*/
|
||||
extern void SPI_DisableIt( Spi* spi, uint32_t dwSources )
|
||||
{
|
||||
spi->SPI_IDR = dwSources ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Configures a SPI peripheral as specified. The configuration can be computed
|
||||
* using several macros (see \ref spi_configuration_macros).
|
||||
*
|
||||
* \param spi Pointer to an Spi instance.
|
||||
* \param id Peripheral ID of the SPI.
|
||||
* \param configuration Value of the SPI configuration register.
|
||||
*/
|
||||
extern void SPI_Configure( Spi* spi, uint32_t dwId, uint32_t dwConfiguration )
|
||||
{
|
||||
PMC_EnablePeripheral( dwId ) ;
|
||||
spi->SPI_CR = SPI_CR_SPIDIS ;
|
||||
|
||||
/* Execute a software reset of the SPI twice */
|
||||
spi->SPI_CR = SPI_CR_SWRST ;
|
||||
spi->SPI_CR = SPI_CR_SWRST ;
|
||||
spi->SPI_MR = dwConfiguration ;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* \brief Configures a chip select of a SPI peripheral. The chip select configuration
|
||||
* is computed using several macros (see \ref spi_configuration_macros).
|
||||
*
|
||||
* \param spi Pointer to an Spi instance.
|
||||
* \param npcs Chip select to configure (0, 1, 2 or 3).
|
||||
* \param configuration Desired chip select configuration.
|
||||
*/
|
||||
void SPI_ConfigureNPCS( Spi* spi, uint32_t dwNpcs, uint32_t dwConfiguration )
|
||||
{
|
||||
spi->SPI_CSR[dwNpcs] = dwConfiguration ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Get the current status register of the given SPI peripheral.
|
||||
* \note This resets the internal value of the status register, so further
|
||||
* read may yield different values.
|
||||
* \param spi Pointer to a Spi instance.
|
||||
* \return SPI status register.
|
||||
*/
|
||||
extern uint32_t SPI_GetStatus( Spi* spi )
|
||||
{
|
||||
return spi->SPI_SR ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Reads and returns the last word of data received by a SPI peripheral. This
|
||||
* method must be called after a successful SPI_Write call.
|
||||
*
|
||||
* \param spi Pointer to an Spi instance.
|
||||
*
|
||||
* \return readed data.
|
||||
*/
|
||||
extern uint32_t SPI_Read( Spi* spi )
|
||||
{
|
||||
while ( (spi->SPI_SR & SPI_SR_RDRF) == 0 ) ;
|
||||
|
||||
return spi->SPI_RDR & 0xFFFF ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Sends data through a SPI peripheral. If the SPI is configured to use a fixed
|
||||
* peripheral select, the npcs value is meaningless. Otherwise, it identifies
|
||||
* the component which shall be addressed.
|
||||
*
|
||||
* \param spi Pointer to an Spi instance.
|
||||
* \param npcs Chip select of the component to address (0, 1, 2 or 3).
|
||||
* \param data Word of data to send.
|
||||
*/
|
||||
extern void SPI_Write( Spi* spi, uint32_t dwNpcs, uint16_t wData )
|
||||
{
|
||||
/* Send data */
|
||||
while ( (spi->SPI_SR & SPI_SR_TXEMPTY) == 0 ) ;
|
||||
spi->SPI_TDR = wData | SPI_PCS( dwNpcs ) ;
|
||||
while ( (spi->SPI_SR & SPI_SR_TDRE) == 0 ) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Check if SPI transfer finish.
|
||||
*
|
||||
* \param spi Pointer to an Spi instance.
|
||||
*
|
||||
* \return Returns 1 if there is no pending write operation on the SPI; otherwise
|
||||
* returns 0.
|
||||
*/
|
||||
extern uint32_t SPI_IsFinished( Spi* spi )
|
||||
{
|
||||
return ((spi->SPI_SR & SPI_SR_TXEMPTY) != 0) ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Enable Spi PDC transmit
|
||||
* \param spi Pointer to an Spi instance.
|
||||
*/
|
||||
extern void SPI_PdcEnableTx( Spi* spi )
|
||||
{
|
||||
spi->SPI_PTCR = SPI_PTCR_TXTEN ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Disable Spi PDC transmit
|
||||
* \param spi Pointer to an Spi instance.
|
||||
*/
|
||||
extern void SPI_PdcDisableTx( Spi* spi )
|
||||
{
|
||||
spi->SPI_PTCR = SPI_PTCR_TXTDIS ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Enable Spi PDC receive
|
||||
* \param spi Pointer to an Spi instance.
|
||||
*/
|
||||
extern void SPI_PdcEnableRx( Spi* spi )
|
||||
{
|
||||
spi->SPI_PTCR = SPI_PTCR_RXTEN ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Disable Spi PDC receive
|
||||
* \param spi Pointer to an Spi instance.
|
||||
*/
|
||||
extern void SPI_PdcDisableRx( Spi* spi )
|
||||
{
|
||||
spi->SPI_PTCR = SPI_PTCR_RXTDIS ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Set PDC transmit and next transmit buffer address and size.
|
||||
*
|
||||
* \param spi Pointer to an Spi instance.
|
||||
* \param txBuf PDC transmit buffer address.
|
||||
* \param txCount Length in bytes of the transmit buffer.
|
||||
* \param txNextBuf PDC next transmit buffer address.
|
||||
* \param txNextCount Length in bytes of the next transmit buffer.
|
||||
*/
|
||||
extern void SPI_PdcSetTx( Spi* spi, void* pvTxBuf, uint32_t dwTxCount, void* pvTxNextBuf, uint32_t dwTxNextCount )
|
||||
{
|
||||
spi->SPI_TPR = (uint32_t)pvTxBuf ;
|
||||
spi->SPI_TCR = dwTxCount ;
|
||||
spi->SPI_TNPR = (uint32_t)pvTxNextBuf ;
|
||||
spi->SPI_TNCR = dwTxNextCount ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Set PDC receive and next receive buffer address and size.
|
||||
*
|
||||
* \param spi Pointer to an Spi instance.
|
||||
* \param rxBuf PDC receive buffer address.
|
||||
* \param rxCount Length in bytes of the receive buffer.
|
||||
* \param rxNextBuf PDC next receive buffer address.
|
||||
* \param rxNextCount Length in bytes of the next receive buffer.
|
||||
*/
|
||||
extern void SPI_PdcSetRx( Spi* spi, void* pvRxBuf, uint32_t dwRxCount, void* pvRxNextBuf, uint32_t dwRxNextCount )
|
||||
{
|
||||
spi->SPI_RPR = (uint32_t)pvRxBuf ;
|
||||
spi->SPI_RCR = dwRxCount ;
|
||||
spi->SPI_RNPR = (uint32_t)pvRxNextBuf ;
|
||||
spi->SPI_RNCR = dwRxNextCount ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Sends the contents of buffer through a SPI peripheral, using the PDC to
|
||||
* take care of the transfer.
|
||||
*
|
||||
* \param spi Pointer to an Spi instance.
|
||||
* \param buffer Data buffer to send.
|
||||
* \param length Length of the data buffer.
|
||||
*/
|
||||
extern uint32_t SPI_WriteBuffer( Spi* spi, void* pvBuffer, uint32_t dwLength )
|
||||
{
|
||||
/* Check if first bank is free */
|
||||
if ( spi->SPI_TCR == 0 )
|
||||
{
|
||||
spi->SPI_TPR = (uint32_t)pvBuffer ;
|
||||
spi->SPI_TCR = dwLength ;
|
||||
spi->SPI_PTCR = PERIPH_PTCR_TXTEN ;
|
||||
|
||||
return 1 ;
|
||||
}
|
||||
/* Check if second bank is free */
|
||||
else
|
||||
{
|
||||
if ( spi->SPI_TNCR == 0 )
|
||||
{
|
||||
spi->SPI_TNPR = (uint32_t)pvBuffer ;
|
||||
spi->SPI_TNCR = dwLength ;
|
||||
|
||||
return 1 ;
|
||||
}
|
||||
}
|
||||
|
||||
/* No free banks */
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Reads data from a SPI peripheral until the provided buffer is filled. This
|
||||
* method does NOT need to be called after SPI_Write or SPI_WriteBuffer.
|
||||
*
|
||||
* \param spi Pointer to an Spi instance.
|
||||
* \param buffer Data buffer to store incoming bytes.
|
||||
* \param length Length in bytes of the data buffer.
|
||||
*/
|
||||
extern uint32_t SPI_ReadBuffer( Spi* spi, void *pvBuffer, uint32_t dwLength )
|
||||
{
|
||||
/* Check if the first bank is free */
|
||||
if ( spi->SPI_RCR == 0 )
|
||||
{
|
||||
spi->SPI_RPR = (uint32_t)pvBuffer ;
|
||||
spi->SPI_RCR = dwLength ;
|
||||
spi->SPI_PTCR = PERIPH_PTCR_RXTEN ;
|
||||
|
||||
return 1 ;
|
||||
}
|
||||
/* Check if second bank is free */
|
||||
else
|
||||
{
|
||||
if ( spi->SPI_RNCR == 0 )
|
||||
{
|
||||
spi->SPI_RNPR = (uint32_t)pvBuffer ;
|
||||
spi->SPI_RNCR = dwLength ;
|
||||
return 1 ;
|
||||
}
|
||||
}
|
||||
|
||||
/* No free bank */
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
|
||||
143
sam3s_example/src/syscalls.c
Normal file
143
sam3s_example/src/syscalls.c
Normal file
@@ -0,0 +1,143 @@
|
||||
/* ----------------------------------------------------------------------------
|
||||
* ATMEL Microcontroller Software Support
|
||||
* ----------------------------------------------------------------------------
|
||||
* Copyright (c) 2009, Atmel Corporation
|
||||
*
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* - Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the disclaimer below.
|
||||
*
|
||||
* Atmel's name may not be used to endorse or promote products derived from
|
||||
* this software without specific prior written permission.
|
||||
*
|
||||
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
||||
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* \file syscalls.c
|
||||
*
|
||||
* Implementation of newlib syscall.
|
||||
*
|
||||
*/
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Headers
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
|
||||
#include "board.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Exported variables
|
||||
*----------------------------------------------------------------------------*/
|
||||
|
||||
#undef errno
|
||||
extern int errno ;
|
||||
extern int _end ;
|
||||
|
||||
/*----------------------------------------------------------------------------
|
||||
* Exported functions
|
||||
*----------------------------------------------------------------------------*/
|
||||
extern void _exit( int status ) ;
|
||||
extern void _kill( int pid, int sig ) ;
|
||||
extern int _getpid ( void ) ;
|
||||
|
||||
extern caddr_t _sbrk ( int incr )
|
||||
{
|
||||
static unsigned char *heap = NULL ;
|
||||
unsigned char *prev_heap ;
|
||||
|
||||
if ( heap == NULL )
|
||||
{
|
||||
heap = (unsigned char *)&_end ;
|
||||
}
|
||||
prev_heap = heap;
|
||||
|
||||
heap += incr ;
|
||||
|
||||
return (caddr_t) prev_heap ;
|
||||
}
|
||||
|
||||
extern int link( char *old, char *new )
|
||||
{
|
||||
return -1 ;
|
||||
}
|
||||
|
||||
extern int _close( int file )
|
||||
{
|
||||
return -1 ;
|
||||
}
|
||||
|
||||
extern int _fstat( int file, struct stat *st )
|
||||
{
|
||||
st->st_mode = S_IFCHR ;
|
||||
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
extern int _isatty( int file )
|
||||
{
|
||||
return 1 ;
|
||||
}
|
||||
|
||||
extern int _lseek( int file, int ptr, int dir )
|
||||
{
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
extern int _read(int file, char *ptr, int len)
|
||||
{
|
||||
return 0 ;
|
||||
}
|
||||
|
||||
extern int _write( int file, char *ptr, int len )
|
||||
{
|
||||
//int iIndex ;
|
||||
|
||||
|
||||
// for ( ; *ptr != 0 ; ptr++ )
|
||||
/* for ( iIndex=0 ; iIndex < len ; iIndex++, ptr++ )
|
||||
{
|
||||
UART_PutChar( *ptr ) ;
|
||||
}
|
||||
|
||||
return iIndex ;
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern void _exit( int status )
|
||||
{
|
||||
printf( "Exiting with status %d.\n", status ) ;
|
||||
|
||||
for ( ; ; ) ;
|
||||
}
|
||||
|
||||
extern void _kill( int pid, int sig )
|
||||
{
|
||||
return ;
|
||||
}
|
||||
|
||||
extern int _getpid ( void )
|
||||
{
|
||||
return -1 ;
|
||||
}
|
||||
Reference in New Issue
Block a user