| /* SimTrace TC (Timer / Clock) support code |
| * (C) 2006 by Harald Welte <hwelte@hmw-consulting.de> |
| * |
| * 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 <string.h> |
| |
| static const Pin pTC[] = {PINS_TC}; |
| |
| /** Global timestamp in milliseconds since start of application */ |
| volatile uint32_t dwTimeStamp = 0; |
| volatile 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; |
| |
| timeout_occured++; |
| // printf("++++ TC0_Irq %d\n\r", timeout_occured); |
| } |
| |
| |
| void TC0_Counter_Reset( void ) |
| { |
| TC0->TC_CHANNEL[ 0 ].TC_CCR = TC_CCR_SWTRG ; |
| timeout_occured = 0; |
| } |
| |
| /* == 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 $ARG1 Hz frequency and trigger on RC compare. */ |
| TC_FindMckDivisor( 8, BOARD_MCK, &div, &tcclks, BOARD_MCK ); |
| TRACE_INFO("Chosen div, tcclk: %d, %d\r\n", 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 */ |
| //... |
| } |