imx8x: Fix lpuart Mackerel file
authorDaniel Schwyn <daniel.schwyn@inf.ethz.ch>
Tue, 8 Oct 2019 15:35:58 +0000 (17:35 +0200)
committerDaniel Schwyn <daniel.schwyn@inf.ethz.ch>
Tue, 8 Oct 2019 15:35:58 +0000 (17:35 +0200)
Mackerel functions would read the data register when writing it.
Therefore dropping any received character.

Signed-off-by: Daniel Schwyn <daniel.schwyn@inf.ethz.ch>

devices/lpuart.dev
kernel/arch/arm/lpuart.c

index cb82255..a6e086d 100644 (file)
@@ -161,15 +161,33 @@ device lpuart msbfirst (addr base) "LPUART" {
                pt      1 "Parity Type";
        };
 
-       register data addr(base, 0x1c) "LPUART Receive Data Register" {
+       /*
+        * Data register is actually two registers for RX/TX
+        * To prevent Mackerel from generating code for reading
+        * things via the TX register and therefore clearing the RX
+        * register we declare the readonly fields as mbz in the TX
+        * register.
+        */
+       register rxdata ro addr(base, 0x1c) "LPUART Receive Data Register" {
                _      16;
-               noisy   1 ro "Whether received with noise.";
-               paritye 1 ro "Whether received with parity error.";
-               fretsc  1    "Whether received with frame error/Transmit Special Character";
-               rxempt  1 ro "Receive Buffer Empty";
-               idline  1 ro "Idle Line";
+               noisy   1 "Whether received with noise.";
+               paritye 1 "Whether received with parity error.";
+               fre     1 "Whether received with frame error";
+               rxempt  1 "Receive Buffer Empty";
+               idline  1 "Idle Line";
                _       1;
-               buf    10    "Data buffer";
+               buf    10 "Data buffer";
+       };
+
+       register txdata wo also addr(base, 0x1c) "LPUART Transmit Data Register" {
+               _      16 mbz;
+               _       1 mbz;
+               _       1 mbz;
+               tsc     1 "Transmit Special Character";
+               _       1 mbz;
+               _       1 mbz;
+               _       1 mbz;
+               buf    10 "Data buffer";
        };
 
        register match addr(base, 0x20) "LPUART Match Address Register" {
index c46f250..77fddb8 100644 (file)
@@ -123,7 +123,12 @@ void serial_putchar(unsigned port, char c)
     assert(u->base != 0);
 
     while(lpuart_stat_tdre_rdf(u) == 0);
-    lpuart_data_buf_wrf(u, c);
+
+    lpuart_txdata_t txdata = lpuart_txdata_default;
+    // We don't handle break/idle char currently
+    txdata = lpuart_txdata_tsc_insert(txdata, 0);
+    txdata = lpuart_txdata_buf_insert(txdata, c);
+    lpuart_txdata_wr(u, txdata);
 }
 
 /*
@@ -138,5 +143,5 @@ char serial_getchar(unsigned port)
     /* Wait for data. */
     while(lpuart_stat_rdrf_rdf(u) == 0);
 
-    return (char)lpuart_data_buf_rdf(u);
+    return (char)lpuart_rxdata_buf_rdf(u);
 }