summaryrefslogtreecommitdiff
path: root/openpicc/application/ssc_picc.c
diff options
context:
space:
mode:
authorhenryk <henryk@6dc7ffe9-61d6-0310-9af1-9938baff3ed1>2007-12-03 04:55:57 +0000
committerhenryk <henryk@6dc7ffe9-61d6-0310-9af1-9938baff3ed1>2007-12-03 04:55:57 +0000
commite22f23efcbe54ab8aabfd54f8b55a5d01a15a487 (patch)
tree015aa7b5dcf063d4fc594eb4fade40cd086ae924 /openpicc/application/ssc_picc.c
parent67d9be99569c49671b4cc2217824307202b92439 (diff)
* Reduce leaking of TX buffers
* Found the problem that when switching between receiving and sending tc_cdiv would most of the time not generate an SSC_CLOCK for approx. 5ms: The issue is that after setting the divisor (which stored in RC) CV might be greater than RC. Thus no compare will happen until CV overflows (at 0xffff carrier cycles) and therefore the clock will appear to be stopped for that time. A good fix would have been TC_CV = TC_CV % TC_RC but unfortunately TC_CV is read-only. Instead use SWTRG to reset TC_CV to zero and then try to use the phase-shift code to have the phase stay correct. * Measured the transmit start delay that is introduced by the SSC TF emulation through FIQ and adjusted ISO14443A_FDT accordingly git-svn-id: https://svn.openpcd.org:2342/trunk@366 6dc7ffe9-61d6-0310-9af1-9938baff3ed1
Diffstat (limited to 'openpicc/application/ssc_picc.c')
-rw-r--r--openpicc/application/ssc_picc.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/openpicc/application/ssc_picc.c b/openpicc/application/ssc_picc.c
index a5f1075..02d87d1 100644
--- a/openpicc/application/ssc_picc.c
+++ b/openpicc/application/ssc_picc.c
@@ -205,6 +205,7 @@ void ssc_tx_start(ssc_dma_tx_buffer_t *buf)
ssc->SSC_TCMR = 0x01 | AT91C_SSC_CKO_NONE | start_cond;
AT91F_PDC_SetTx(tx_pdc, buf->data, num_data);
+ buf->state = PENDING;
#ifdef TEST_WHETHER_NOT_ENABLING_IT_HELPS
AT91F_SSC_EnableIt(ssc, AT91C_SSC_TXSYN | AT91C_SSC_ENDTX | AT91C_SSC_TXBUFE);
@@ -227,6 +228,7 @@ void ssc_tx_start(ssc_dma_tx_buffer_t *buf)
#ifdef USE_SSC_TX_TF_WORKAROUND
void ssc_tf_irq(u_int32_t pio) {
(void)pio;
+ if(!AT91F_PIO_IsInputSet(AT91C_BASE_PIOA, OPENPICC_SSC_TF)) return;
pio_irq_disable(OPENPICC_SSC_TF);
if(ssc_tx_pending) { /* Transmit has not yet been started by the FIQ */
AT91F_SSC_EnableTx(AT91C_BASE_SSC);
@@ -397,7 +399,15 @@ static void __ramfunc ssc_irq(void)
DEBUGP("CP0 ");
if (ssc_sr & AT91C_SSC_TXSYN)
- usb_print_string_f("TXSYN ", 0);
+ DEBUGP("TXSYN ");
+
+ if(ssc_sr & AT91C_SSC_ENDTX) {
+ if(ssc_tx_buffer.state == PENDING)
+ ssc_tx_buffer.state = FREE;
+ }
+
+ if(ssc_sr & AT91C_SSC_TXBUFE)
+ DEBUGP("TXBUFE ");
if(irq_extension != NULL)
irq_extension(ssc_sr, ssc_state.mode, inbuf?inbuf->data:NULL);
personal git repositories of Harald Welte. Your mileage may vary