]> Pileus Git - ~andy/csm213a-hw/blobdiff - hw2/main.cpp
Add dma timestamper
[~andy/csm213a-hw] / hw2 / main.cpp
index d6a074209846106991cb51d430cd112ca48b5666..006f85269dfcf1e55788f1a2027c7b8e461f4018 100644 (file)
@@ -1,5 +1,6 @@
 #include "mbed.h"\r
 #include "serial_dma.h"\r
+#include "timer_dma.h"\r
 \r
 /**\r
  * Mode of operation:\r
  *\r
  * Only port A, C, and D can do aysnc DMA (p. 67)\r
  *\r
+ * DMA Channel Allocation:\r
+ *     Ch  Trigger    Description\r
+ *     0   gpio       timestamp (async event)\r
+ *     1   uart1      transmit\r
+ *     2   uart2 tx   timestamp (time sync xmt)\r
+ *     3   uart2 rx   timestamp (time sync rcv)\r
+ *\r
  * Uart Sources:\r
  *      UART 0     UART 1     UART 2\r
  *     xmt  rcv   xmt  rcv   xmt  rcv\r
  *     ---  ---   ---  ---   ---  ---\r
- *     A2   A1  **A19  A18** -    -\r
+ *     A2   A1  --A19  A18-- -    -\r
  *     A14  A15   -    -     -    -\r
  *     B17  B16   -    -     -    -\r
- *     -    -   **C4   C3**  -    -\r
- *     D7   D6    -    -   **D3   D2** <<<\r
- *     -    -     -    -   **D5   D4**\r
- *     E20  E21   E0   E1    E16  E17 \r
- *     -    -     -    -     E22  E23 \r
+ *     -    -   **C4   C3--  -    -\r
+ *     D7   D6    -    -   **D3/3 D2/3** <<<\r
+ *     -    -     -    -   **D5/3 D4/3**\r
+ *     E20  E21   E0   E1    E16  E17\r
+ *     -    -     -    -     E22  E23\r
  *\r
  * Pinout\r
- *     A1    B18        E30  C1        \r
- *     A2    B19        B20  C2        \r
- *     D3    C0         E23  B3        \r
- *     A12   C4         E22  B2        \r
- *     A4    C6         E21  B1        \r
- *     A5    C7         E20  B0        \r
- *     C8    C10                       \r
- *     C9    C11        E2   P5-9V     \r
- *                      E3   GND       \r
- *     A13   C13        E6   GND       \r
- *     D2    C16        E16  P5V-USB   \r
- *     D4    A7         E17  P3V3      \r
- *     D6    A6         E18  RST       \r
- *     D7    A14        E19  P3V3      \r
- *     D5    A15        E31  SDA/D5  \r
- *     GND   A15 \r
- *     VREFH A17 \r
- *     E0    B9  \r
+ *     A1    B18        E30  C1\r
+ *     A2    B19        B20  C2\r
+ *     D3    C0         E23  B3\r
+ *     A12   C4         E22  B2\r
+ *     A4    C6         E21  B1\r
+ *     A5    C7         E20  B0\r
+ *     C8    C10\r
+ *     C9    C11        E2   P5-9V\r
+ *                      E3   GND\r
+ *     A13   C13        E6   GND\r
+ *     D2    C16        E16  P5V-USB\r
+ *     D4    A7         E17  P3V3\r
+ *     D6    A6         E18  RST\r
+ *     D7    A14        E19  P3V3\r
+ *     D5    A15        E31  SDA/D5\r
+ *     GND   A15\r
+ *     VREFH A17\r
+ *     E0    B9\r
  *     E1    --\r
  */\r
 \r
@@ -188,6 +196,12 @@ sdma_t    *sdma0;
 sdma_t    *sdma1;\r
 sdma_t    *sdma2;\r
 \r
+// Timer DMA\r
+tdma_t    *tdma0;\r
+tdma_t    *tdma1;\r
+tdma_t    *tdma2;\r
+tdma_t    *tdma3;\r
+\r
 /********\r
  * Main *\r
  ********/\r
@@ -338,13 +352,24 @@ void test_pit_run(void)
        uint64_t tm1 = ~((uint64_t)hi1 << 32 | lo1);\r
        double   bus = 24E6;   // 24 MHz bus clock\r
 \r
-       printf("tick   %08lx:%08lx", (uint32_t)(tm0>>32), (uint32_t)tm0);\r
-       printf(    "   %08lx:%08lx", (uint32_t)(tm1>>32), (uint32_t)tm1);\r
-       printf(    "   %08lx",       (uint32_t)(tm1-tm0));\r
-       printf(    "   %f\r\n",      (double)tm0 / bus);\r
+       printf(" - pit");\r
+       printf("  %08lx:%08lx", (uint32_t)(tm0>>32), (uint32_t)tm0);\r
+       printf("  %08lx:%08lx", (uint32_t)(tm1>>32), (uint32_t)tm1);\r
+       printf("  %08lx",       (uint32_t)(tm1-tm0));\r
+       printf("  %f",          (double)tm0 / bus);\r
+}\r
+\r
+void test_sdma_init(void)\r
+{\r
+       sdma0 = sdma_open(SDMA_UART0, SDMA_CHANNEL0, SDMA_CHANNEL1);\r
+       sdma1 = sdma_open(SDMA_UART1, SDMA_CHANNEL0, SDMA_CHANNEL1);\r
+       sdma2 = sdma_open(SDMA_UART2, SDMA_CHANNEL2, SDMA_CHANNEL3);\r
+\r
+       sdma_pinmap(sdma1, PTE0, PTE1);\r
+       sdma_pinmap(sdma2, PTD3, PTD2);\r
 }\r
 \r
-void test_uart(void)\r
+void test_sdma_run(void)\r
 {\r
        char xmt[32] = "hello, world";\r
        char rcv[32] = {};\r
@@ -354,27 +379,59 @@ void test_uart(void)
        sdma_write(sdma1, xmt, strlen(xmt));\r
        sdma_flush(sdma1, &tm1);\r
 \r
-       //sdma_read(sdma2, rcv, strlen(xmt));\r
+       sdma_read(sdma2, rcv, strlen(xmt));\r
        sdma_wait(sdma2, &tm2);\r
 \r
-       //printf("send: [%s] -> [%s] ", xmt, rcv);\r
-       //printf("time: %08lx / %08lx ", (uint32_t)tm1, (uint32_t)tm2);\r
-       //printf("tag: dir:%08lx in:%08lx\r\n",\r
-       //              FPTD->PDDR, FPTD->PDIR);\r
+       printf("send: [%s] -> [%s] ", xmt, rcv);\r
+       printf("time: %08lx / %08lx ", (uint32_t)tm1, (uint32_t)tm2);\r
+       printf("tag: dir:%08lx in:%08lx\r\n",\r
+                       FPTD->PDDR, FPTD->PDIR);\r
 \r
        (void)xmt; (void)rcv;\r
        (void)tm1; (void)tm2;\r
 }\r
 \r
-void test_leds(void)\r
+void test_tdma_init(void)\r
 {\r
-       led1 = 1; led2 = 0; wait(0.1);\r
-       led1 = 0; led2 = 1; wait(0.1);\r
+       tdma_init();\r
+\r
+       tdma0 = tdma_open(TDMA_CHAN0, PTA1, PullNone);\r
+       tdma1 = tdma_open(TDMA_CHAN1, PTC1, PullNone);\r
+       tdma2 = tdma_open(TDMA_CHAN2, PTD3, PullUp);\r
+       tdma3 = tdma_open(TDMA_CHAN3, PTD2, PullUp);\r
 }\r
 \r
-void test_irq(void)\r
+void test_tdma_run(void)\r
 {\r
-       printf("\r\nirq");\r
+       static uint32_t time0[2];\r
+       static uint32_t time1[2];\r
+       static uint32_t time2[2];\r
+       static uint32_t time3[2];\r
+\r
+       tdma_stamp(tdma0, (uint64_t*)&time0);\r
+       tdma_stamp(tdma1, (uint64_t*)&time1);\r
+       tdma_stamp(tdma2, (uint64_t*)&time2);\r
+       tdma_stamp(tdma3, (uint64_t*)&time3);\r
+\r
+       tdma_reset(tdma0);\r
+       tdma_reset(tdma1);\r
+       tdma_reset(tdma2);\r
+       tdma_reset(tdma3);\r
+\r
+       printf(" - timer:");\r
+       printf(" %08lx:%08lx", time0[1], time0[0]);\r
+       printf(" %08lx:%08lx", time1[1], time1[0]);\r
+       printf(" %08lx:%08lx", time2[1], time2[0]);\r
+       printf(" %08lx:%08lx", time3[1], time3[0]);\r
+       //printf(" do:%08lx", FPTD->PDOR);\r
+       //printf(" di:%08lx", FPTD->PDIR);\r
+       //printf(" dd:%08lx", FPTD->PDDR);\r
+}\r
+\r
+void test_leds(void)\r
+{\r
+       led1 = 1; led2 = 0; wait(0.1);\r
+       led1 = 0; led2 = 1; wait(0.1);\r
 }\r
 \r
 int main(int argc, char **argv)\r
@@ -383,23 +440,20 @@ int main(int argc, char **argv)
        uart1.baud(115200);\r
        uart2.baud(115200);\r
 \r
-       //sdma0 = sdma_open(SDMA_UART0, SDMA_CHANNEL0, SDMA_CHANNEL1);\r
-       sdma1 = sdma_open(SDMA_UART1, SDMA_CHANNEL0, SDMA_CHANNEL1);\r
-       sdma2 = sdma_open(SDMA_UART2, SDMA_CHANNEL2, SDMA_CHANNEL3);\r
-\r
-       sdma_pinmap(sdma1, PTE0, PTE1);\r
-       sdma_pinmap(sdma2, PTD3, PTD2);\r
-\r
-       //test_uart();\r
-       //test_leds();\r
-       test_pit_init();\r
+       printf("init\r\n");\r
        //test_tpm_init();\r
+       //test_pit_init();\r
+       //test_sdma_init();\r
+       test_tdma_init();\r
 \r
-       while (1) {\r
-               test_uart();\r
+       printf("run\r\n");\r
+       for (int i = 0; true; i++) {\r
+               printf("%8d", i);\r
                //test_leds();\r
-               //test_pit_run();\r
                //test_tpm_run();\r
+               //test_pit_run();\r
+               //test_sdma_run();\r
+               test_tdma_run();\r
                printf("\r\n");\r
        }\r
 }\r