8 #include "timer_dma.h"
\r
17 /* Port structure */
\r
21 uint32_t sar; // offset 0x00, Source Address Register
\r
22 uint32_t dar; // offset 0x04, Destination Address Register
\r
23 uint32_t dsr; // offset 0x08, DMA Status Register / Byte Count Register
\r
24 uint32_t dcr; // offset 0x0C, DMA Control Register
\r
29 uint8_t cfg; // offset 0x00, Channel Configuration register
\r
34 uint32_t pcr; // offset 0x00, Pin Control register
\r
42 static tdma_t tdma_ports[TDMA_NUM_CHAN];
\r
44 /* Global timer initialization */
\r
45 void tdma_init(void)
\r
48 SIM->SCGC5 |= SIM_SCGC5_PORTA_MASK;
\r
49 SIM->SCGC5 |= SIM_SCGC5_PORTC_MASK;
\r
50 SIM->SCGC5 |= SIM_SCGC5_PORTD_MASK;
\r
51 SIM->SCGC6 |= SIM_SCGC6_DMAMUX_MASK;
\r
52 SIM->SCGC7 |= SIM_SCGC7_DMA_MASK;
\r
54 // Enable timer Clock
\r
55 SIM->SCGC6 |= SIM_SCGC6_PIT_MASK;
\r
61 PIT->CHANNEL[0].LDVAL = 0xFFFFFFFF;
\r
62 PIT->CHANNEL[0].TCTRL = 0;
\r
65 PIT->CHANNEL[1].LDVAL = 0xFFFFFFFF;
\r
66 PIT->CHANNEL[1].TCTRL = PIT_TCTRL_CHN_MASK;
\r
69 PIT->CHANNEL[0].TCTRL |= PIT_TCTRL_TEN_MASK;
\r
70 PIT->CHANNEL[1].TCTRL |= PIT_TCTRL_TEN_MASK;
\r
74 tdma_t *tdma_open(tdma_chan_t chan, PinName pin, PinMode mode)
\r
76 int req = pin >= PTD0 ? TDMA_REQ_PTD :
\r
77 pin >= PTC0 ? TDMA_REQ_PTC :
\r
78 pin >= PTA0 ? TDMA_REQ_PTA : 0;
\r
80 int ircq = mode == PullUp ? 2 : 1;
\r
83 tdma_t *port = &tdma_ports[chan];
\r
85 // Setup port pointers
\r
86 port->dma = (void*)&DMA0->DMA[chan];
\r
87 port->mux = (void*)&DMAMUX0->CHCFG[chan];
\r
88 port->pin = (void*)(PORTA_BASE + pin);
\r
90 // Reset DMA channel
\r
91 port->dma->dsr = DMA_DSR_BCR_DONE_MASK;
\r
93 // Configure DMA channel
\r
94 port->dma->dcr = DMA_DCR_SINC_MASK // Source increment
\r
95 | DMA_DCR_DINC_MASK // Dest increment
\r
96 | DMA_DCR_SSIZE(0) // 32-bit access
\r
97 | DMA_DCR_DSIZE(0) // 32-bit access
\r
98 | DMA_DCR_ERQ_MASK; // Enable port request
\r
100 // Setup and enable DMA MUX
\r
101 port->mux->cfg = DMAMUX_CHCFG_SOURCE(req) // Request source
\r
102 | DMAMUX_CHCFG_ENBL_MASK; // Enable DMA mux
\r
104 // Set pin to generate DMA req
\r
105 port->pin->pcr = PORT_PCR_ISF_MASK // Clear ISR flag
\r
106 | PORT_PCR_MUX(3) // Pin mapping
\r
107 | PORT_PCR_IRQC(ircq) // DMA on falling edge
\r
108 | mode; // Pin pull up/down
\r
113 void tdma_reset(tdma_t *port)
\r
115 // Clear previous time
\r
119 // Reset DMA channel
\r
120 port->dma->dsr = DMA_DSR_BCR_DONE_MASK;
\r
122 // Set addresses and size
\r
123 port->dma->sar = (uint32_t)&PIT->LTMR64H; // Global timer
\r
124 port->dma->dar = (uint32_t)&port->time; // Temp timer buffer
\r
125 port->dma->dsr = DMA_DSR_BCR_BCR(8); // 64-bit timer
\r
128 int tdma_stamp(tdma_t *port, uint64_t *time)
\r
130 if (port->dma->dsr & DMA_DSR_BCR_BCR_MASK)
\r
133 // Read the timestamp
\r
134 *time = ((uint64_t)~port->time[0]) << 32
\r
135 | ((uint64_t)~port->time[1]) << 0;
\r
138 //printf(" - sar:%08lx dar:%08lx pcr:%08lx dsr:%08lx time:%08lx:%08lx",
\r
139 // port->dma->sar, port->dma->dar,
\r
140 // port->pin->pcr, port->dma->dsr,
\r
141 // (uint32_t)(*time >> 32), (uint32_t)*time);
\r