summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--openpcd/firmware/Makefile5
-rw-r--r--openpcd/firmware/src/os/tc_cdiv.h3
-rw-r--r--openpcd/firmware/src/picc/main_openpicc.c66
-rw-r--r--openpcd/firmware/src/picc/ssc_picc.c22
4 files changed, 84 insertions, 12 deletions
diff --git a/openpcd/firmware/Makefile b/openpcd/firmware/Makefile
index 4d8f2a6..1098c4f 100644
--- a/openpcd/firmware/Makefile
+++ b/openpcd/firmware/Makefile
@@ -86,7 +86,8 @@ endif
SRCARM += src/os/pcd_enumerate.c src/os/fifo.c src/os/dbgu.c \
src/os/led.c src/os/req_ctx.c src/os/trigger.c \
src/os/main.c src/os/syscalls.c src/os/usb_handler.c \
- src/os/usb_benchmark.c src/os/dfu.c src/start/Cstartup_SAM7.c
+ src/os/usb_benchmark.c src/os/dfu.c src/start/Cstartup_SAM7.c \
+ src/os/tc_cdiv.c
ifdef PCD
# PCD support code
@@ -96,7 +97,7 @@ SRCARM += src/pcd/rc632.c src/pcd/rc632_highlevel.c \
SRCARM += src/pcd/$(TARGET).c
else
# PICC support code
-SRCARM += src/picc/tc.c src/picc/ssc.c
+SRCARM += src/picc/tc_fdt.c src/picc/ssc_picc.c
# finally, the actual main application
SRCARM += src/picc/$(TARGET).c
endif
diff --git a/openpcd/firmware/src/os/tc_cdiv.h b/openpcd/firmware/src/os/tc_cdiv.h
index 8b4031d..4f2bc02 100644
--- a/openpcd/firmware/src/os/tc_cdiv.h
+++ b/openpcd/firmware/src/os/tc_cdiv.h
@@ -2,6 +2,9 @@
#define _TC_CDIV_H
#include <sys/types.h>
+#include <lib_AT91SAM7.h>
+
+static AT91PS_TCB tcb;
extern void tc_cdiv_phase_add(int16_t inc);
extern void tc_cdiv_set_divider(u_int16_t div);
diff --git a/openpcd/firmware/src/picc/main_openpicc.c b/openpcd/firmware/src/picc/main_openpicc.c
new file mode 100644
index 0000000..795f460
--- /dev/null
+++ b/openpcd/firmware/src/picc/main_openpicc.c
@@ -0,0 +1,66 @@
+#include <errno.h>
+#include <include/lib_AT91SAM7.h>
+#include <include/openpcd.h>
+#include <os/dbgu.h>
+#include "ssc_picc.h"
+#include <os/led.h>
+#include <os/pcd_enumerate.h>
+#include <os/usb_handler.h>
+#include "../openpcd.h"
+#include <os/main.h>
+
+void _init_func(void)
+{
+ tc_cdiv_init();
+ ssc_rx_init();
+ // ssc_tx_init();
+}
+
+int _main_dbgu(char key)
+{
+ unsigned char value;
+
+ switch (key) {
+ #if 0
+ case '4':
+ AT91F_DBGU_Printk("Testing RC632 : ");
+ if (rc632_test(RAH) == 0)
+ AT91F_DBGU_Printk("SUCCESS!\n\r");
+ else
+ AT91F_DBGU_Printk("ERROR!\n\r");
+
+ break;
+ case '5':
+ rc632_reg_read(RAH, RC632_REG_RX_WAIT, &value);
+ DEBUGPCR("Reading RC632 Reg RxWait: 0x%02xr", value);
+
+ break;
+ case '6':
+ DEBUGPCR("Writing RC632 Reg RxWait: 0x55");
+ rc632_reg_write(RAH, RC632_REG_RX_WAIT, 0x55);
+ break;
+ case '7':
+ rc632_dump();
+ break;
+ case 'P':
+ rc632_power(1);
+ break;
+ case 'p':
+ rc632_power(0);
+ break;
+#endif
+ }
+
+ return -EINVAL;
+}
+
+void _main_func(void)
+{
+ /* first we try to get rid of pending to-be-sent stuff */
+ usb_out_process();
+
+ /* next we deal with incoming reqyests from USB EP1 (OUT) */
+ usb_in_process();
+
+ ssc_rx_unthrottle();
+}
diff --git a/openpcd/firmware/src/picc/ssc_picc.c b/openpcd/firmware/src/picc/ssc_picc.c
index 0cd20cc..ac371b7 100644
--- a/openpcd/firmware/src/picc/ssc_picc.c
+++ b/openpcd/firmware/src/picc/ssc_picc.c
@@ -15,9 +15,9 @@
#include <lib_AT91SAM7.h>
#include <openpcd.h>
-#include "usb_handler.h"
-#include "openpcd.h"
-#include "dbgu.h"
+#include <os/usb_handler.h>
+#include <os/dbgu.h>
+#include "../openpcd.h"
/* definitions for four-times oversampling */
#define REQA 0x10410441
@@ -27,9 +27,11 @@ static const AT91PS_SSC ssc = AT91C_BASE_SSC;
static AT91PS_PDC rx_pdc;
enum ssc_mode {
+ SSC_MODE_NONE,
SSC_MODE_14443A_SHORT,
SSC_MODE_14443A_STANDARD,
SSC_MODE_14443B,
+ SSC_MODE_EDGE_ONE_SHOT,
};
struct ssc_state {
@@ -57,7 +59,6 @@ static void ssc_rx_mode_set(enum ssc_mode ssc_mode)
AT91C_SSC_CP0 | AT91C_SSC_CP1);
switch (ssc_mode) {
-#ifdef CONFIG_PICCSIM
case SSC_MODE_14443A_SHORT:
start_cond = AT91C_SSC_START_0;
sync_len = ISO14443A_SOF_LEN;
@@ -76,7 +77,12 @@ static void ssc_rx_mode_set(enum ssc_mode ssc_mode)
/* start sampling at first falling data edge */
//start_cond =
break;
-#endif /* CONFIG_PICCSIM */
+ case SSC_MODE_EDGE_ONE_SHOT:
+ start_cond = AT91C_SSC_START_EDGE_RF;
+ sync_len = 0;
+ data_len = 8;
+ num_data = 50;
+ break;
default:
return;
}
@@ -107,7 +113,6 @@ static void ssc_tx_mode_set(enum ssc_mode ssc_mode)
AT91C_SSC_TXBUFE | AT91C_SSC_TXSYN;
switch (ssc_mode) {
-#ifdef CONFIG_PICCSIM
case SSC_MODE_14443A_SHORT:
start_cond = AT91C_SSC_START_RISE_RF;
sync_len = ISO14443A_SOF_LEN;
@@ -121,7 +126,6 @@ static void ssc_tx_mode_set(enum ssc_mode ssc_mode)
data_len = 1;
num_data = 1; /* FIXME */
break;
-#endif /* CONFIG_PICCSIM */
}
ssc->SSC_TFMR = (data_len-1) & 0x1f |
(((num_data-1) & 0x0f) << 8) |
@@ -169,7 +173,7 @@ static char dmabuf2[512];
*/
static int8_t ssc_rx_refill(void)
{
-#if 0
+#if 1
struct req_ctx *rctx;
rctx = req_ctx_find_get(RCTX_STATE_FREE, RCTX_STATE_SSC_RX_BUSY);
@@ -230,7 +234,6 @@ static void ssc_irq(void)
DEBUGP("RX OVERRUN ");
switch (ssc_state.mode) {
-#ifdef CONFIG_PICCSIM
case SSC_MODE_14443A_SHORT:
if (ssc_sr & AT91C_SSC_RXSYN)
DEBUGP("RXSYN ");
@@ -274,7 +277,6 @@ static void ssc_irq(void)
AT91C_SSC_OVRUN);
}
break;
-#endif /* CONFIG_PICCSIM */
}
}
personal git repositories of Harald Welte. Your mileage may vary