blob: 94e7555e2bbcb7917ceb2bd6b005edfe09e646e8 [file] [log] [blame]
Christina Quastc0aa7692015-02-25 14:02:01 +01001/* ----------------------------------------------------------------------------
2 * ATMEL Microcontroller Software Support
3 * ----------------------------------------------------------------------------
4 * Copyright (c) 2009, Atmel Corporation
5 *
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are met:
10 *
11 * - Redistributions of source code must retain the above copyright notice,
12 * this list of conditions and the disclaimer below.
13 *
14 * Atmel's name may not be used to endorse or promote products derived from
15 * this software without specific prior written permission.
16 *
17 * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
20 * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
23 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
26 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 * ----------------------------------------------------------------------------
28 */
29
30/*------------------------------------------------------------------------------
31 * Headers
32 *------------------------------------------------------------------------------*/
33
34#include "board.h"
35
36#include <string.h>
37
38extern uint8_t rcvdChar;
39extern uint32_t char_stat;
40
Christina Quast4ba4d222015-03-02 16:14:09 +010041//#define BUFLEN 14
42// FIXME: Remove:
Christina Quasta1dd0ef2015-03-22 19:06:12 +010043#define PR TRACE_INFO
Christina Quast4ba4d222015-03-02 16:14:09 +010044//#define PR printf
45
46/*typedef struct ring_buffer
47{
48 uint8_t buf[BUFLEN*2]; // data buffer
49 uint8_t idx; // number of items in the buffer
50} ring_buffer;
51*/
52ring_buffer buf = { {0}, 0 };
53
54void buf_push(uint8_t item)
55{
Christina Quasta1dd0ef2015-03-22 19:06:12 +010056 buf.buf[buf.idx % (BUFLEN*2)] = item;
57 PR("Psh: %x %x\n\r", buf.idx, buf.buf[buf.idx]);
58 buf.idx = (buf.idx+1) % (BUFLEN*2);
Christina Quast4ba4d222015-03-02 16:14:09 +010059}
60
Christina Quastc0aa7692015-02-25 14:02:01 +010061/** Initializes a ISO driver
62 */
63// FIXME: This function is implemented in iso7816_4.c !! Only MCK instead of SCK is always taken. Change that!
64void _ISO7816_Init( void )
65{
Christina Quast4ba4d222015-03-02 16:14:09 +010066 printf("ISO_Init\n\r");
Christina Quastc0aa7692015-02-25 14:02:01 +010067 TRACE_DEBUG("ISO_Init\n\r");
68
69 USART_Configure( USART_PHONE,
70 US_MR_USART_MODE_IS07816_T_0
71// Nope, we aren't master:
72 // | US_MR_USCLKS_MCK
73 | US_MR_USCLKS_SCK
74 | US_MR_NBSTOP_1_BIT
75 | US_MR_PAR_EVEN
76 | US_MR_CHRL_8_BIT
77 | US_MR_CLKO /** TODO: This field was set in the original simtrace firmware..why? */
78 | (3<<24), /* MAX_ITERATION */
79 1,
80 0);
81 /*
82 SYNC = 0 (async mode)
83 OVER = 0 (oversampling by 8?)
84 FIDI = 372 (default val on startup before other value is negotiated)
85 USCLKS = 3 (Select SCK as input clock) --> US_MR_USCLKS_SCK
86 CD = 1 ? --> US_BRGR_CD(1)
87 */
88 USART_PHONE->US_FIDI = 372;
89// USART_PHONE->US_IDR = (uint32_t) -1;
90 USART_PHONE->US_BRGR = US_BRGR_CD(1);
91// USART_PHONE->US_BRGR = BOARD_MCK / (372*9600);
92 USART_PHONE->US_TTGR = 5;
93
94 /* Configure USART */
95 PMC_EnablePeripheral(ID_USART_PHONE);
96
97 USART1->US_IDR = 0xffffffff;
98 USART_EnableIt( USART1, US_IER_RXRDY) ;
99 /* enable USART1 interrupt */
100 NVIC_EnableIRQ( USART1_IRQn ) ;
101
102// USART_PHONE->US_IER = US_IER_RXRDY | US_IER_OVRE | US_IER_FRAME | US_IER_PARE | US_IER_NACK | US_IER_ITER;
103}
104
105/*
106 * Initializes rcvdChar with the char received on USART interface
107 * char_stat is zero if no error occured.
108 * Otherwise it is filled with the content of the status register.
109 */
110void USART1_IrqHandler( void )
111{
112 uint32_t stat;
113 char_stat = 0;
114 // Rcv buf full
115/* if((stat & US_CSR_RXBUFF) == US_CSR_RXBUFF) {
116 TRACE_DEBUG("Rcv buf full");
117 USART_DisableIt(USART1, US_IDR_RXBUFF);
118 }
119*/
120 uint32_t csr = USART_PHONE->US_CSR;
121
Christina Quasta1dd0ef2015-03-22 19:06:12 +0100122// PR("---- stat: %x\n\r", csr);
Christina Quast4ba4d222015-03-02 16:14:09 +0100123
Christina Quastc0aa7692015-02-25 14:02:01 +0100124 if (csr & US_CSR_TXRDY) {
125 /* transmit buffer empty, nothing to transmit */
126 }
127 if (csr & US_CSR_RXRDY) {
128 stat = (csr&(US_CSR_OVRE|US_CSR_FRAME|
Christina Quast4ba4d222015-03-02 16:14:09 +0100129 US_CSR_PARE|US_CSR_TIMEOUT|US_CSR_NACK|
130 (1<<10)));
Christina Quasta1dd0ef2015-03-22 19:06:12 +0100131 int c = (USART_PHONE->US_RHR) & 0xFF;
132// printf(" %x", c);
Christina Quast4ba4d222015-03-02 16:14:09 +0100133
Christina Quastc0aa7692015-02-25 14:02:01 +0100134 if (stat == 0 ) {
Christina Quast4ba4d222015-03-02 16:14:09 +0100135 /* Fill char into buffer */
Christina Quast4ba4d222015-03-02 16:14:09 +0100136 buf_push((USART_PHONE->US_RHR) & 0xFF);
137 } else {
Christina Quasta1dd0ef2015-03-22 19:06:12 +0100138// buf_push((USART_PHONE->US_RHR) & 0xFF);
139 PR("e");
Christina Quast4ba4d222015-03-02 16:14:09 +0100140 PR("%x\n\r", (USART_PHONE->US_RHR) & 0xFF);
Christina Quast4bcc0232015-03-24 21:59:32 +0100141 PR("st: %x ", stat);
Christina Quast4ba4d222015-03-02 16:14:09 +0100142 } /* else: error occured */
Christina Quastc0aa7692015-02-25 14:02:01 +0100143
Christina Quastce296b92015-03-18 18:41:19 +0100144 if ((buf.idx % BUFLEN) == BUFLEN-1) {
Christina Quast4ba4d222015-03-02 16:14:09 +0100145 rcvdChar = 1;
Christina Quasta1dd0ef2015-03-22 19:06:12 +0100146 printf("r. ");
Christina Quast4ba4d222015-03-02 16:14:09 +0100147 }
Christina Quastc0aa7692015-02-25 14:02:01 +0100148
Christina Quast4ba4d222015-03-02 16:14:09 +0100149 char_stat = stat;
150 }
151}