From fa4bf4f8b51569a84859f0b6f122564381d371c6 Mon Sep 17 00:00:00 2001
From: Jedian <jmb15@c3sl.ufpr.br>
Date: Tue, 24 May 2016 21:57:32 -0300
Subject: [PATCH] Started rx_queue

Signed-off-by: Jedian <jmb15@c3sl.ufpr.br>
---
 cMIPS/include/mainjedi.c      | 12 ++++++++++
 cMIPS/tests/handlerUARTjedi.s | 45 ++++++++++++++++++++++++++++++++++-
 cMIPS/tests/uartrx.c          | 17 +++++++++++--
 3 files changed, 71 insertions(+), 3 deletions(-)

diff --git a/cMIPS/include/mainjedi.c b/cMIPS/include/mainjedi.c
index 668d307..23e6718 100644
--- a/cMIPS/include/mainjedi.c
+++ b/cMIPS/include/mainjedi.c
@@ -1,5 +1,17 @@
 #include "cMIPS.h"
 
+typedef struct UARTdriver {
+int rx_hd ; // reception queue head index
+int rx_tl ; // reception queue tail index
+char rx_q [16]; // reception queue
+int tx_hd ; // transmission queue head index
+int tx_tl ; // transmission queue tail index
+char tx_q [16]; // transmission queue
+int nrx ; // number of characters in rx_queue
+int ntx ; // number of spaces in tx_queue
+} UARTdriver ;
+extern UARTdriver Ud ;
+
 typedef struct control { // control register fields (uses only ls byte)
   int ign   : 24,        // ignore uppermost bits
     rts     : 1,         // Request to Send output (bit 7)
diff --git a/cMIPS/tests/handlerUARTjedi.s b/cMIPS/tests/handlerUARTjedi.s
index 4336d21..8f2915d 100644
--- a/cMIPS/tests/handlerUARTjedi.s
+++ b/cMIPS/tests/handlerUARTjedi.s
@@ -1,4 +1,9 @@
 #UARTinterr:
+    # There is space on _uart_buff
+    # _uart_buff[0]=UARTstatus, [1]=UARTcontrol, [2]=data_inp, [3]=new,
+    #           [4]=$ra, [5]=$a0, [6]=$a1, [7]=$a2, [8]=$a3
+    #k0 = _uart_buff
+
     andi  $a1, $k1, UART_rx_irq # Is this reception?
     beq   $a1, $zero, UARTinterr2   #   no, maybe transmission?
     nop
@@ -9,7 +14,44 @@
     sw    $a1, 2*4($k0)         #   and return from interrupt
     addiu $a1, $zero, 1
     sw    $a1, 3*4($k0)         # Signal new arrival
-                                # Jedian: when a new char is on the UART's buffer, i have to enqueue it and update nrx
+                                # Jedian: when a new char is on the UART's buffer, 
+                                #         i have to enqueue it and update nrx.
+
+    #ACHO QUE ELE NAO TA RESETANDO O INTERRUPTION REQUEST, AI FICA TRAVADAO
+    # saving used registers on _uart_buff
+    sw    $5, 9*4($k0)
+    sw    $6, 10*4($k0)
+    sw    $7, 11*4($k0)
+    
+    # enqueue
+    lui   $5, %hi(rx_hd)        # get rx head address
+    ori   $5, $5, %lo(rx_hd)    
+
+    lw    $7, 0($5)
+
+    #### stores on queue on calculated new head
+    lui   $6, %hi(rx_q)         # get queue address
+    ori   $6, $6, %lo(rx_q)
+
+    sll   $7, $7, 2             # multiply by 4
+    addu  $6, $7, $6            # calculate address to move new char
+    lw    $7, 2*4($k0)          # get char to be stored
+    nop
+    sw    $7, 0($6)             # and store it!
+
+    #### process rx_hd
+    lw    $7, 0($5)
+    addiu $7, $7, 1             # increment in 1 the head of the circular queue
+    li    $6, 16                # calculate mod 16
+    div   $7, $6
+    mfhi  $7
+    sw    $7, 0($5)
+
+
+    # loading back used registers
+    lw    $5, 9*4($k0)
+    lw    $6, 10*4($k0)
+    lw    $7, 11*4($k0)
 
 UARTinterr2:
     andi  $a1, $k1, UART_tx_irq # Is this transmission?
@@ -19,5 +61,6 @@ UARTinterr2:
     #handle transmission
     # ... TODO
 
+    # Lembrar de inicializar os hd e tl com 0 no comeco do main
 
 #UARTret: 
diff --git a/cMIPS/tests/uartrx.c b/cMIPS/tests/uartrx.c
index cc00516..7ded407 100644
--- a/cMIPS/tests/uartrx.c
+++ b/cMIPS/tests/uartrx.c
@@ -1,5 +1,18 @@
 #include "cMIPS.h"
 
+typedef struct UARTdriver {
+int rx_hd ; // reception queue head index
+int rx_tl ; // reception queue tail index
+char rx_q [16]; // reception queue
+int tx_hd ; // transmission queue head index
+int tx_tl ; // transmission queue tail index
+char tx_q [16]; // transmission queue
+int nrx ; // number of characters in rx_queue
+int ntx ; // number of spaces in tx_queue
+} UARTdriver ;
+extern UARTdriver Ud ;
+
+
 typedef struct control { // control register fields (uses only ls byte)
   int ign   : 24,        // ignore uppermost bits
     rts     : 1,         // Request to Send output (bit 7)
@@ -67,7 +80,7 @@ int main(void) { // receive a string through the UART serial interface
   ctrl.rts   = 1;   // make RTS=1 to activate RemoteUnit
   ctrl.ign2  = 0;
   ctrl.intTX = 0;
-  ctrl.intRX = 0;
+  ctrl.intRX = 1;
   ctrl.speed = 1;   // operate at the second highest data rate
   uart->cs.ctl = ctrl;
 
@@ -78,7 +91,7 @@ int main(void) { // receive a string through the UART serial interface
       if (state == 0) cmips_delay(1); // just do something with state
     s[i] = (char)uart->d.rx;
     to_stdout( s[i] );
-
+    //to_stdout( (Ud.rx_hd+'0') );
   } while (s[i] != '\0');
 
   return(state);
-- 
GitLab