From 6e50bd822df9e02d51c7abfef824ab162b04056c Mon Sep 17 00:00:00 2001
From: "Israel B. Sant'Anna" <ibsa14@inf.ufpr.br>
Date: Mon, 15 Jun 2015 18:01:54 -0300
Subject: [PATCH] Transmission almost complete. It works, but still has some
 problems

Signed-off-by: Israel B. Sant'Anna <ibsa14@inf.ufpr.br>
---
 cMIPS/serial.inp          |  1 -
 cMIPS/tests/handlerUART.s | 15 +++++++++---
 cMIPS/tests/uart.c        | 48 +++++++++++++++++++--------------------
 3 files changed, 35 insertions(+), 29 deletions(-)

diff --git a/cMIPS/serial.inp b/cMIPS/serial.inp
index a751930..5427aab 100644
--- a/cMIPS/serial.inp
+++ b/cMIPS/serial.inp
@@ -4,4 +4,3 @@ ffffffff
 7C2
 
 
-
diff --git a/cMIPS/tests/handlerUART.s b/cMIPS/tests/handlerUART.s
index a0a0e3b..e88dce1 100644
--- a/cMIPS/tests/handlerUART.s
+++ b/cMIPS/tests/handlerUART.s
@@ -31,9 +31,14 @@ RX:
     nop
     sb    $k1, 0($a0)           # Put data on RX_queue tail
 
-    lui $a0, %hi(x_IO_BASE_ADDR)
-    ori $a0, $a0, %lo(x_IO_BASE_ADDR)
-    sw  $k1, 0($a0)               # Print for debug
+    # lui $a0, %hi(x_IO_BASE_ADDR)
+    # ori $a0, $a0, %lo(x_IO_BASE_ADDR)
+    # sw  $k1, 0($a0)               # Print for debug
+
+    lw    $k1, 0($a1)
+    j     RX
+    nop
+
 
 
 
@@ -75,5 +80,9 @@ TX:
     # ori $a0, $a0, %lo(x_IO_BASE_ADDR)
     # sw  $a1, 0($a0)               # Print for debug
 
+    lw    $k1, 0($a0)
+    j     RX
+    nop
+
 END:
 
diff --git a/cMIPS/tests/uart.c b/cMIPS/tests/uart.c
index 6ca6fd5..b136521 100644
--- a/cMIPS/tests/uart.c
+++ b/cMIPS/tests/uart.c
@@ -56,7 +56,7 @@ int probetx(void);         // returns ntx
 int iostat(void);          // returns integer with status at lsb
 void ioctl(int);           // write lsb in control register
 char getc(void);           // returns char in queue, decrements nrx
-int Putc(char);            // inserts char in queue, decrements ntx
+void Putc(char);            // inserts char in queue, decrements ntx
 int ctoi(char);            // converts a character to an integer
 
 void initUd();
@@ -76,35 +76,27 @@ int main(){
     ctrl.ign   = 0;
     ctrl.intTX = 1;
     ctrl.intRX = 1;
-    ctrl.speed = 1;        // operate at 1/2 of the highest data rate
+    ctrl.speed = 2;        // operate at 1/2 of the highest data rate
     uart->cs.ctl = ctrl;
 
     initUd();
-    int lol;
     char last = EOF;
-    char first = EOF;
+    // FIXME: Não tah saindo do while (por causa do ctrl.intTX =1)
     while(!((c = getc()) == '\n' && c == last)) {
-        last = c;
-        print(c);
         if(c != EOF) {
-            if(!Putc(c)){
-                print(0);
-                while(!(TXempty&uart->cs.stat.s));
-                disableInterr();
-                first = Ud.tx_q[Ud.tx_hd];
-                Ud.tx_hd = (Ud.tx_hd+1)%16;
-                Ud.ntx++;
-                enableInterr();
-                uart->d.tx = first;
-                Putc(c);
-            }
+            print(c);
+            last = c;
+            Putc(c);
         }
     }
-    // for(i=0;i<Ud.ntx;i++){
-    //     print(Ud.tx_q[i]);
-    // }
-    // to_stdout('\n');
-    //uart->d.tx = '\n'; //Send STX (Start of Text)
+    if(Ud.ntx < 16){
+        disableInterr();
+        uart->d.tx = Ud.tx_q[Ud.tx_hd];
+        Ud.tx_hd = (Ud.tx_hd+1)%16;
+        Ud.ntx++;
+        enableInterr();
+    }
+    while(1);
     
     // while((c = getc()) != '\0') {
     //     if(c != EOF) {
@@ -148,16 +140,22 @@ char getc(){
     return c;
 }
 
-int Putc(char c){
+void Putc(char c){
     if(Ud.ntx > 0){
         disableInterr();
         Ud.tx_q[Ud.tx_tl] = c;
         Ud.tx_tl = (Ud.tx_tl+1)%16;
         Ud.ntx--;
         enableInterr();
-        return 1;
+    }else{
+        while(!(TXempty&uart->cs.stat.s));
+        disableInterr();
+        uart->d.tx = Ud.tx_q[Ud.tx_hd];
+        Ud.tx_hd = (Ud.tx_hd+1)%16;
+        Ud.ntx++;
+        enableInterr();
+        Putc(c);
     }
-    return 0;
 }
 
 int proberx(){
-- 
GitLab