summaryrefslogtreecommitdiff
path: root/openpicc/application/ssc_picc.c
diff options
context:
space:
mode:
authorhenryk <henryk@6dc7ffe9-61d6-0310-9af1-9938baff3ed1>2007-12-16 02:01:58 +0000
committerhenryk <henryk@6dc7ffe9-61d6-0310-9af1-9938baff3ed1>2007-12-16 02:01:58 +0000
commit0df8e1e25ca0743898b4a1fa7e8b7ea0c5208b83 (patch)
tree38b09ab6ac437b7f90796078cee5af7eef17dd8f /openpicc/application/ssc_picc.c
parent7c198cbff3872795661b6ded45662dc0a9ba6db9 (diff)
Get SSC_MODE_14443A working
git-svn-id: https://svn.openpcd.org:2342/trunk@394 6dc7ffe9-61d6-0310-9af1-9938baff3ed1
Diffstat (limited to 'openpicc/application/ssc_picc.c')
-rw-r--r--openpicc/application/ssc_picc.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/openpicc/application/ssc_picc.c b/openpicc/application/ssc_picc.c
index e2bc213..64013ea 100644
--- a/openpicc/application/ssc_picc.c
+++ b/openpicc/application/ssc_picc.c
@@ -262,8 +262,15 @@ static ssc_dma_rx_buffer_t* __ramfunc __ssc_rx_unload(int secondary)
} else {
AT91F_PDC_SetRx(rx_pdc, 0, 0);
}
- if(buffer->state == PENDING) {
+ if(buffer->state == PENDING || buffer->state==FULL) {
buffer->len_transfers = elapsed_transfers;
+ {int i=usb_print_set_default_flush(0);
+ DumpStringToUSB("<");
+ DumpUIntToUSB((unsigned int)buffer);
+ DumpStringToUSB(": ");
+ DumpUIntToUSB(elapsed_transfers);
+ DumpStringToUSB("> ");
+ usb_print_set_default_flush(i);}
if(elapsed_transfers > 0) {
buffer->state = FULL;
} else {
@@ -293,6 +300,7 @@ void ssc_rx_mode_set(enum ssc_mode ssc_mode)
{
u_int8_t data_len=0, num_data=0, sync_len=0;
u_int32_t start_cond=0;
+ u_int32_t clock_gating=0;
u_int8_t stop = 0;
/* disable Rx and all Rx interrupt sources */
@@ -306,6 +314,7 @@ void ssc_rx_mode_set(enum ssc_mode ssc_mode)
ssc->SSC_RC0R = ISO14443A_SOF_SAMPLE;
data_len = ISO14443A_SHORT_LEN;
num_data = 2;
+ clock_gating = (0x2 << 6);
break;
case SSC_MODE_14443A_STANDARD:
start_cond = AT91C_SSC_START_0;
@@ -313,14 +322,17 @@ void ssc_rx_mode_set(enum ssc_mode ssc_mode)
ssc->SSC_RC0R = ISO14443A_SOF_SAMPLE;
data_len = 32;
num_data = 16; /* FIXME */
+ clock_gating = (0x2 << 6);
break;
case SSC_MODE_14443A:
start_cond = AT91C_SSC_START_0;
- sync_len = ISO14443A_SOF_LEN;
- ssc->SSC_RC0R = ISO14443A_SOF_SAMPLE;
+ sync_len = ISO14443A_EOF_LEN;
+ ssc->SSC_RC0R = ISO14443A_SOF_SAMPLE << (ISO14443A_EOF_LEN-ISO14443A_SOF_LEN);
+ ssc->SSC_RC1R = ISO14443A_EOF_SAMPLE;
data_len = ISO14443A_SAMPLE_LEN;
num_data = 16; /* Start with 16, then switch to continuous in the IRQ handler */
- stop = 1; /* Actually the documentation indicates that setting STOP makes switching to continuous unnecessary */
+ stop = 1; /* It's impossible to use "stop on compare 1" for the stop condition here */
+ clock_gating = (0x0 << 6);
break;
case SSC_MODE_14443B:
/* start sampling at first falling data edge */
@@ -336,6 +348,7 @@ void ssc_rx_mode_set(enum ssc_mode ssc_mode)
sync_len = 0;
data_len = 32;
num_data = 16;
+ clock_gating = (0x2 << 6);
break;
case SSC_MODE_NONE:
goto out_set_mode;
@@ -348,7 +361,7 @@ void ssc_rx_mode_set(enum ssc_mode ssc_mode)
//| AT91C_SSC_MSBF
;
ssc->SSC_RCMR = AT91C_SSC_CKS_RK | AT91C_SSC_CKO_NONE |
- (0x2 << 6) | AT91C_SSC_CKI | start_cond | (stop << 12);
+ clock_gating | AT91C_SSC_CKI | start_cond | (stop << 12);
/* Enable Rx DMA */
AT91F_PDC_EnableRx(rx_pdc);
@@ -471,7 +484,8 @@ static void __ramfunc ssc_irq(void)
if ((ssc_sr & AT91C_SSC_CP0) && (ssc_state.mode == SSC_MODE_14443A_SHORT || ssc_state.mode == SSC_MODE_14443A)) {
if(ssc_state.mode == SSC_MODE_14443A && ISO14443A_SOF_LEN != ISO14443A_EOF_LEN) {
/* Need to reprogram FSLEN */
- ssc->SSC_RFMR = (ssc->SSC_RFMR & ~(0xf << 16)) | ( ((ISO14443A_EOF_LEN-1)&0xf) << 16 );
+ //ssc->SSC_RFMR = (ssc->SSC_RFMR & ~(0xf << 16)) | ( ((ISO14443A_EOF_LEN-1)&0xf) << 16 );
+ //ssc->SSC_RCMR = (ssc->SSC_RCMR & ~(0xf << 8)) | AT91C_SSC_START_CONTINOUS;
}
/* Short frame, busy loop till the frame is received completely to
* prevent a second irq entrance delay when the actual frame end
personal git repositories of Harald Welte. Your mileage may vary