summaryrefslogtreecommitdiff
path: root/openpicc/application
diff options
context:
space:
mode:
Diffstat (limited to 'openpicc/application')
-rw-r--r--openpicc/application/cmd.c46
-rw-r--r--openpicc/application/main.c3
-rw-r--r--openpicc/application/pio_irq.c8
-rw-r--r--openpicc/application/pio_irq.h1
-rw-r--r--openpicc/application/tc_cdiv_sync.c47
-rw-r--r--openpicc/application/tc_cdiv_sync.h1
6 files changed, 66 insertions, 40 deletions
diff --git a/openpicc/application/cmd.c b/openpicc/application/cmd.c
index 7ff7f53..d7ce784 100644
--- a/openpicc/application/cmd.c
+++ b/openpicc/application/cmd.c
@@ -11,6 +11,8 @@
#include "openpicc.h"
#include "led.h"
#include "da.h"
+#include "tc_cdiv_sync.h"
+#include "pio_irq.h"
xQueueHandle xCmdQueue;
xTaskHandle xCmdTask;
@@ -26,7 +28,7 @@ static const portBASE_TYPE USE_COLON_FOR_LONG_COMMANDS = 0;
/* When not USE_COLON_FOR_LONG_COMMANDS then short commands will be recognized by including
* their character in the string SHORT_COMMANDS
* */
-static const char *SHORT_COMMANDS = "c+-l?h";
+static const char *SHORT_COMMANDS = "pc+-l?h";
/* Note that the long/short command distinction only applies to the USB serial console
* */
@@ -92,6 +94,29 @@ int atoiEx(const char * nptr, char * * eptr)
return sign * curval;
}
+static const struct { int pin; char * description; } PIO_PINS[] = {
+ {OPENPICC_PIO_PLL_LOCK, "pll lock "},
+ {OPENPICC_PIO_FRAME, "frame start"},
+};
+void print_pio(void)
+{
+ int data = *AT91C_PIOA_PDSR;
+ unsigned int i;
+ DumpStringToUSB(
+ " *****************************************************\n\r"
+ " * Current PIO readings: *\n\r"
+ " *****************************************************\n\r"
+ " *\n\r");
+ for(i=0; i<sizeof(PIO_PINS)/sizeof(PIO_PINS[0]); i++) {
+ DumpStringToUSB(" * ");
+ DumpStringToUSB(PIO_PINS[i].description);
+ DumpStringToUSB(": ");
+ DumpUIntToUSB((data & PIO_PINS[i].pin) ? 1 : 0 );
+ DumpStringToUSB("\n\r");
+ }
+ DumpStringToUSB(" *****************************************************\n\r");
+}
+
static const AT91PS_SPI spi = AT91C_BASE_SPI;
#define SPI_MAX_XFER_LEN 33
@@ -157,6 +182,19 @@ void prvExecCommand(u_int32_t cmd, portCHAR *args) {
DumpStringToUSB("\n\r");
}
break;
+ case 'Z':
+ i=atoiEx(args, &args);
+ if(i==0) {
+ tc_cdiv_sync_disable();
+ DumpStringToUSB("cdiv_sync disabled \n\r");
+ } else {
+ tc_cdiv_sync_enable();
+ DumpStringToUSB("cdiv_sync enabled \n\r");
+ }
+ break;
+ case 'P':
+ print_pio();
+ break;
case 'C':
DumpStringToUSB(
" *****************************************************\n\r"
@@ -188,6 +226,10 @@ void prvExecCommand(u_int32_t cmd, portCHAR *args) {
DumpStringToUSB(" * The comparator threshold is ");
DumpUIntToUSB(da_get_value());
DumpStringToUSB("\n\r");
+ DumpStringToUSB(" * Number of PIO IRQs handled: ");
+ i = pio_irq_get_count() & (~(unsigned int)0);
+ DumpUIntToUSB(i);
+ DumpStringToUSB("\n\r");
DumpStringToUSB(
" *\n\r"
" *****************************************************\n\r"
@@ -232,6 +274,8 @@ void prvExecCommand(u_int32_t cmd, portCHAR *args) {
" * 1..4 - automatic transmit at selected power levels\n\r"
" * +,- - decrease/increase comparator threshold\n\r"
" * l - cycle LEDs\n\r"
+ " * p - print PIO pins\n\r"
+ " * z 0/1- enable or disable tc_cdiv_sync\n\r"
" * ?,h - display this help screen\n\r"
" *\n\r"
" *****************************************************\n\r"
diff --git a/openpicc/application/main.c b/openpicc/application/main.c
index 1bd23ae..8f950ab 100644
--- a/openpicc/application/main.c
+++ b/openpicc/application/main.c
@@ -42,6 +42,7 @@
#include "pll.h"
#include "pio_irq.h"
#include "ssc_picc.h"
+#include "tc_cdiv_sync.h"
/**********************************************************************/
static inline void prvSetupHardware (void)
@@ -84,7 +85,9 @@ int main (void)
pio_irq_init();
+ tc_cdiv_sync_init();
ssc_tx_init();
+ //ssc_rx_init();
vLedInit();
diff --git a/openpicc/application/pio_irq.c b/openpicc/application/pio_irq.c
index 572a4e4..c7238d8 100644
--- a/openpicc/application/pio_irq.c
+++ b/openpicc/application/pio_irq.c
@@ -38,6 +38,7 @@ struct pioirq_state {
};
static struct pioirq_state pirqs;
+static unsigned long count = 0;
/* low-level handler, used by Cstartup_app.S PIOA fast forcing and
* by regular interrupt handler below */
@@ -45,6 +46,7 @@ void __ramfunc __pio_irq_demux(u_int32_t pio)
{
u_int8_t send_usb = 0;
int i;
+ count++;
DEBUGPCRF("PIO_ISR_STATUS = 0x%08x", pio);
@@ -101,6 +103,12 @@ void pio_irq_disable(u_int32_t pio)
AT91F_PIO_InterruptDisable(AT91C_BASE_PIOA, pio);
}
+/* Return the number of PIO IRQs received */
+long pio_irq_get_count(void)
+{
+ return count;
+}
+
int pio_irq_register(u_int32_t pio, irq_handler_t *handler)
{
u_int8_t num = ffs(pio);
diff --git a/openpicc/application/pio_irq.h b/openpicc/application/pio_irq.h
index 65a0f9d..ecb6fef 100644
--- a/openpicc/application/pio_irq.h
+++ b/openpicc/application/pio_irq.h
@@ -8,6 +8,7 @@ typedef void irq_handler_t(u_int32_t pio);
extern void pio_irq_enable(u_int32_t pio);
extern void pio_irq_disable(u_int32_t pio);
+extern long pio_irq_get_count(void);
extern int pio_irq_register(u_int32_t pio, irq_handler_t *func);
extern void pio_irq_unregister(u_int32_t pio);
extern void pio_irq_init(void);
diff --git a/openpicc/application/tc_cdiv_sync.c b/openpicc/application/tc_cdiv_sync.c
index 486e93b..45c65b6 100644
--- a/openpicc/application/tc_cdiv_sync.c
+++ b/openpicc/application/tc_cdiv_sync.c
@@ -5,12 +5,12 @@
#include "dbgu.h"
#include "pio_irq.h"
#include "openpicc.h"
+#include "led.h"
#define USE_IRQ
static u_int8_t enabled;
-#if 0
static void pio_data_change(u_int32_t pio)
{
(void)pio;
@@ -24,29 +24,9 @@ static void pio_data_change(u_int32_t pio)
*AT91C_TC0_CV);
} else
DEBUGPCR("");
+ vLedSetGreen(0);
}
-#else
-
-static void __ramfunc cdsync_cb(void)
-{
- DEBUGP("PIO_IRQ: ");
- if (*AT91C_PIOA_ISR & OPENPICC_PIO_FRAME) {
- DEBUGP("PIO_FRAME_IRQ: ");
- /* we get one interrupt for each change. If now, after the
- * change the level is high, then it must have been a rising
- * edge */
- if (*AT91C_PIOA_PDSR & OPENPICC_PIO_FRAME) {
- *AT91C_TC0_CCR = AT91C_TC_SWTRG;
- DEBUGPCR("CDIV_SYNC_FLIP SWTRG CV=0x%08x",
- *AT91C_TC0_CV);
- } else
- DEBUGPCR("");
- } else
- DEBUGPCR("");
-}
-#endif
-
void tc_cdiv_sync_reset(void)
{
if (enabled) {
@@ -54,6 +34,7 @@ void tc_cdiv_sync_reset(void)
(void)tmp;
volatile int i;
DEBUGPCRF("CDIV_SYNC_FLOP");
+ vLedSetGreen(1);
/* reset the hardware flipflop */
AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,
@@ -87,24 +68,12 @@ void tc_cdiv_sync_init(void)
enabled = 0;
AT91F_PIOA_CfgPMC();
-
-#ifdef USE_IRQ
- /* Configure IRQ */
- AT91F_AIC_ConfigureIt(AT91C_ID_PIOA,
- AT91C_AIC_PRIOR_HIGHEST,
- AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, (THandler)&cdsync_cb);
-#else
- /* Configure FIQ */
- AT91F_AIC_ConfigureIt(AT91C_ID_FIQ,
- //0, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, &cdsync_cb);
- 0, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, (THandler)&fiq_handler);
- /* enable fast forcing for PIOA interrupt */
- *AT91C_AIC_FFER = (1 << AT91C_ID_PIOA);
-
- /* register pio irq handler */
+
+ AT91F_PIO_CfgOutput(AT91C_BASE_PIOA, OPENPICC_PIO_SSC_DATA_CONTROL);
+
pio_irq_register(OPENPICC_PIO_FRAME, &pio_data_change);
-#endif
AT91F_AIC_EnableIt(AT91C_ID_PIOA);
-
+
+ vLedSetGreen(0);
tc_cdiv_sync_disable();
}
diff --git a/openpicc/application/tc_cdiv_sync.h b/openpicc/application/tc_cdiv_sync.h
index 0101321..0c7bd37 100644
--- a/openpicc/application/tc_cdiv_sync.h
+++ b/openpicc/application/tc_cdiv_sync.h
@@ -1,5 +1,6 @@
#ifndef _TC_CDIV_SYNC_H
#define _TC_CDIV_SYNC_H
+extern void tc_cdiv_sync_disable(void);
extern void tc_cdiv_sync_enable(void);
extern void tc_cdiv_sync_init(void);
extern void tc_cdiv_sync_reset(void);
personal git repositories of Harald Welte. Your mileage may vary