/* Global timer initialization */\r
void tdma_init(void)\r
{\r
+ static int tdma_init_done = 0;\r
+ if (tdma_init_done)\r
+ return;\r
+\r
// Enable DMA Cock\r
SIM->SCGC5 |= SIM_SCGC5_PORTA_MASK;\r
SIM->SCGC5 |= SIM_SCGC5_PORTC_MASK;\r
// Start timers\r
PIT->CHANNEL[0].TCTRL |= PIT_TCTRL_TEN_MASK;\r
PIT->CHANNEL[1].TCTRL |= PIT_TCTRL_TEN_MASK;\r
+\r
+ // Done\r
+ tdma_init_done = 1;\r
}\r
\r
/* DMA Functions */\r
pin >= PTC0 ? TDMA_REQ_PTC :\r
pin >= PTA0 ? TDMA_REQ_PTA : 0;\r
\r
- int irqc = mode == PullUp ? 1 : 2;\r
+ int irqc = mode == PullDown ? 1 : 2;\r
+\r
+ // Initialize global registers\r
+ tdma_init();\r
\r
// Allocate port\r
tdma_t *port = &tdma_ports[chan];\r
//sirq_printf("isfr3: %08x\r\n", PORTD->ISFR);\r
}\r
\r
-void tdma_stop(tdma_t *port)\r
+void tdma_stop(tdma_t *port, int wait)\r
{\r
if (!port)\r
return;\r
\r
//sirq_printf("isfr0: %08x\r\n", PORTD->ISFR);\r
\r
+ for (int i = 0; port->dma->dsr & DMA_DSR_BCR_BCR_MASK; i++)\r
+ if (i > wait)\r
+ return;\r
+\r
// Disable DMA Mux\r
port->mux->cfg &= DMAMUX_CHCFG_ENBL_MASK;\r
\r
| ((uint64_t)~tml) << 0;\r
\r
// Convert to nanoseconds\r
- return clocks * 1000 / 24;\r
+ return clocks * 125 / 3;\r
}\r
\r
void tdma_debug(tdma_t *port)\r