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