From 531d10b403ad7bed5a9df989da913e8a991ac80b Mon Sep 17 00:00:00 2001 From: Christina Quast Date: Thu, 19 Mar 2015 19:27:04 +0100 Subject: [PATCH] Timer counter functions, Makefile adjusted --- sam3s_example/Makefile | 4 +- sam3s_example/simtrace/simtrace.h | 4 ++ sam3s_example/simtrace/tc_etu.c | 115 ++++++++++++++++++++++++++++++ 3 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 sam3s_example/simtrace/tc_etu.c diff --git a/sam3s_example/Makefile b/sam3s_example/Makefile index c37852da..932dc87a 100644 --- a/sam3s_example/Makefile +++ b/sam3s_example/Makefile @@ -142,9 +142,9 @@ VPATH += src_board src_sam3s cmsis $(USB_PATHS) simtrace # Objects built from C source files C_CMSIS = core_cm3.o C_LOWLEVEL = board_cstartup_gnu.o board_lowlevel.o syscalls.o exceptions.o -C_LIBLEVEL = spi.o pio.o pmc.o usart.o pio_it.o pio_capture.o uart_console.o iso7816_4.o wdt.o led.o +C_LIBLEVEL = spi.o pio.o pmc.o usart.o pio_it.o pio_capture.o uart_console.o iso7816_4.o wdt.o led.o tc.o C_CCID = cciddriver.o USBD.o USBDDriver.o USBD_HAL.o USBRequests.o USBDCallbacks.o USBDescriptors.o USBDDriverCallbacks.o -C_SIMTRACE = simtrace_iso7816.o usb.o ccid.o sniffer.o phone.o +C_SIMTRACE = simtrace_iso7816.o usb.o ccid.o sniffer.o phone.o tc_etu.o C_APPLEVEL = main.o C_OBJECTS = $(C_CMSIS) $(C_LOWLEVEL) $(C_LIBLEVEL) $(C_APPLEVEL) $(C_CCID) $(C_SIMTRACE) diff --git a/sam3s_example/simtrace/simtrace.h b/sam3s_example/simtrace/simtrace.h index 6ed6fa8d..39a85ebf 100644 --- a/sam3s_example/simtrace/simtrace.h +++ b/sam3s_example/simtrace/simtrace.h @@ -59,4 +59,8 @@ extern void CCID_run( void ); extern void Phone_run( void ); extern void MITM_run( void ); +/* Timer helper function */ +void Timer_Init( void ); +void TC0_Counter_Reset( void ); + #endif /* SIMTRACE_H */ diff --git a/sam3s_example/simtrace/tc_etu.c b/sam3s_example/simtrace/tc_etu.c new file mode 100644 index 00000000..39741ac6 --- /dev/null +++ b/sam3s_example/simtrace/tc_etu.c @@ -0,0 +1,115 @@ +/* SimTrace TC (Timer / Clock) support code + * (C) 2006 by Harald Welte + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/*------------------------------------------------------------------------------ + * Headers + *------------------------------------------------------------------------------*/ +#include "board.h" + +#include + +//FIXME: +static const Pin pTC[] = {PIO_PA4B_TCLK0, PIO_PA0B_TIOA0, PIO_PA1B_TIOB0}; + +/** Global timestamp in milliseconds since start of application */ +volatile uint32_t dwTimeStamp = 0; +uint8_t timeout_occured = 0; + +// FIXME: Do I need the function?: +/** + * \brief Handler for Sytem Tick interrupt. + * + * Process System Tick Event + * Increments the timestamp counter. + */ +void SysTick_Handler( void ) +{ + dwTimeStamp ++; + +} + + + +void TC0_IrqHandler( void ) +{ + volatile uint32_t dummy; + /* Clear status bit to acknowledge interrupt */ + dummy = TC0->TC_CHANNEL[ 0 ].TC_SR; + + TRACE_DEBUG("++++ TC0_IrqHandler"); + timeout_occured++; +} + + +void TC0_Counter_Reset( void ) +{ + TC0->TC_CHANNEL[ 0 ].TC_CCR = TC_CCR_SWTRG ; +} + +/* == Timeouts == + * One symbol is about 2ms --> Timeout = BUFLEN * 2ms ? + * For BUFLEN = 64 that is 7.8 Hz + */ +void Timer_Init() +{ + uint32_t div; + uint32_t tcclks; + + /** Enable peripheral clock. */ + PMC_EnablePeripheral(ID_TC0); + + /** Configure TC for a 8Hz frequency and trigger on RC compare. */ + TC_FindMckDivisor( 1, BOARD_MCK, &div, &tcclks, BOARD_MCK ); + TRACE_INFO("Chosen div, tcclk: %d, %d", div, tcclks); + /* TC_CMR: TC Channel Mode Register: Capture Mode */ + /* CPCTRG: RC Compare resets the counter and starts the counter clock. */ + TC_Configure( TC0, 0, tcclks | TC_CMR_CPCTRG ); + /* TC_RC: TC Register C: contains the Register C value in real time. */ + TC0->TC_CHANNEL[ 0 ].TC_RC = ( BOARD_MCK / div ) / 4; + + /* Configure and enable interrupt on RC compare */ + NVIC_EnableIRQ( (IRQn_Type)ID_TC0 ); + + TC0->TC_CHANNEL[ 0 ].TC_IER = TC_IER_CPCS; /* CPCS: RC Compare */ + TC_Start( TC0, 0 ); + + return; + + /*** From here on we have code based on old simtrace code */ + + /* Cfg PA4(TCLK0), PA0(TIOA0), PA1(TIOB0) */ + + PIO_Configure( pTC, PIO_LISTSIZE( pTC ) ); + + + +// FIXME: +// PIO_ConfigureIt( &pinPhoneRST, ISR_PhoneRST ) ; +// PIO_EnableIt( &pinPhoneRST ) ; + + /* enable interrupts for Compare-C and External Trigger */ + TC0->TC_CHANNEL[0].TC_IER = TC_IER_CPCS | TC_IER_ETRGS; + + //... + /* Enable master clock for TC0 */ +// TC0->TC_CHANNEL[0].TC_CCR + + /* Reset to start timers */ + //... +}