Skip to content
Snippets Groups Projects
Commit fa4bf4f8 authored by Jedian's avatar Jedian
Browse files

Started rx_queue


Signed-off-by: default avatarJedian <jmb15@c3sl.ufpr.br>
parent cedb68ed
No related branches found
No related tags found
No related merge requests found
Pipeline #
#include "cMIPS.h" #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) typedef struct control { // control register fields (uses only ls byte)
int ign : 24, // ignore uppermost bits int ign : 24, // ignore uppermost bits
rts : 1, // Request to Send output (bit 7) rts : 1, // Request to Send output (bit 7)
......
#UARTinterr: #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? andi $a1, $k1, UART_rx_irq # Is this reception?
beq $a1, $zero, UARTinterr2 # no, maybe transmission? beq $a1, $zero, UARTinterr2 # no, maybe transmission?
nop nop
...@@ -9,7 +14,44 @@ ...@@ -9,7 +14,44 @@
sw $a1, 2*4($k0) # and return from interrupt sw $a1, 2*4($k0) # and return from interrupt
addiu $a1, $zero, 1 addiu $a1, $zero, 1
sw $a1, 3*4($k0) # Signal new arrival 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: UARTinterr2:
andi $a1, $k1, UART_tx_irq # Is this transmission? andi $a1, $k1, UART_tx_irq # Is this transmission?
...@@ -19,5 +61,6 @@ UARTinterr2: ...@@ -19,5 +61,6 @@ UARTinterr2:
#handle transmission #handle transmission
# ... TODO # ... TODO
# Lembrar de inicializar os hd e tl com 0 no comeco do main
#UARTret: #UARTret:
#include "cMIPS.h" #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) typedef struct control { // control register fields (uses only ls byte)
int ign : 24, // ignore uppermost bits int ign : 24, // ignore uppermost bits
rts : 1, // Request to Send output (bit 7) rts : 1, // Request to Send output (bit 7)
...@@ -67,7 +80,7 @@ int main(void) { // receive a string through the UART serial interface ...@@ -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.rts = 1; // make RTS=1 to activate RemoteUnit
ctrl.ign2 = 0; ctrl.ign2 = 0;
ctrl.intTX = 0; ctrl.intTX = 0;
ctrl.intRX = 0; ctrl.intRX = 1;
ctrl.speed = 1; // operate at the second highest data rate ctrl.speed = 1; // operate at the second highest data rate
uart->cs.ctl = ctrl; uart->cs.ctl = ctrl;
...@@ -78,7 +91,7 @@ int main(void) { // receive a string through the UART serial interface ...@@ -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 if (state == 0) cmips_delay(1); // just do something with state
s[i] = (char)uart->d.rx; s[i] = (char)uart->d.rx;
to_stdout( s[i] ); to_stdout( s[i] );
//to_stdout( (Ud.rx_hd+'0') );
} while (s[i] != '\0'); } while (s[i] != '\0');
return(state); return(state);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment