Skip to content
Snippets Groups Projects
Commit 054d1a8c authored by Israel Barreto Sant'Anna's avatar Israel Barreto Sant'Anna
Browse files

Fixed push on rx_queue and pull on tx_queue (addresses were not taking head...

Fixed push on rx_queue and pull on tx_queue (addresses were not taking head and tail in account). Also rearrenged handler code since the inclusion of a new register was needed.

Signed-off-by: default avatarIsrael B. Sant'Anna <ibsa14@inf.ufpr.br>
parent a213bfc0
No related branches found
No related tags found
No related merge requests found
...@@ -106,6 +106,7 @@ UARTinterr: ...@@ -106,6 +106,7 @@ UARTinterr:
sw $a0, 12($k0) # save registers $a0,$a1, others? sw $a0, 12($k0) # save registers $a0,$a1, others?
sw $a1, 16($k0) sw $a1, 16($k0)
sw $a2, 18($k0)
#---------------------------------- #----------------------------------
# while you are developing the complete handler, # while you are developing the complete handler,
...@@ -125,6 +126,7 @@ UARTinterr: ...@@ -125,6 +126,7 @@ UARTinterr:
# sw $a1, 8($k0) # Signal new arrival # sw $a1, 8($k0) # Signal new arrival
UARTret: UARTret:
lw $a2, 18($k0)
lw $a1, 16($k0) # restore registers $a0,$a1, others? lw $a1, 16($k0) # restore registers $a0,$a1, others?
lw $a0, 12($k0) lw $a0, 12($k0)
......
...@@ -9,32 +9,30 @@ RX: ...@@ -9,32 +9,30 @@ RX:
ori $a0, $a0, %lo(nrx) ori $a0, $a0, %lo(nrx)
lw $a1, 0($a0) # Read nrx lw $a1, 0($a0) # Read nrx
addiu $a0, $zero, 16 addiu $a2, $zero, 16
slt $a0, $a1, $a0 # If nrx >= 16 the queue is full slt $a2, $a1, $a2 # If nrx >= 16 the queue is full
beq $a0, $zero, END beq $a2, $zero, END
lui $a0, %hi(HW_uart_addr) addiu $a1, $a1, 1 # Increment nrx right now so we dont need to read it again
ori $a0, $a0, %lo(HW_uart_addr) sw $a1, 0($a0) # Save incremented nrx
lw $a1, 4($a0) # Read data
lui $a0, %hi(rx_queue)
ori $a0, $a0, %lo(rx_queue)
sw $a1, 0($a0) # Put data on RX_queue
lui $a0, %hi(rx_tl) lui $a0, %hi(rx_tl)
ori $a0, $a0, %lo(rx_tl) ori $a0, $a0, %lo(rx_tl)
lw $a1, 0($a0) # Read rx_tl lw $a1, 0($a0) # Read rx_tl
nop nop
addiu $a1, $a1, 1 # Increment RX_tail addiu $a2, $a1, 1 # Increment RX_tail
andi $a1, $a1, 15 # It's a circular queue so: (rx_tl+1)%16 andi $a2, $a2, 15 # It's a circular queue so: (rx_tl+1)%16
sw $a1, 0($a0) # Save new rx_tl sw $a2, 0($a0) # Save new rx_tl
lui $a0, %hi(HW_uart_addr)
ori $a0, $a0, %lo(HW_uart_addr)
lw $a2, 4($a0) # Read data
lui $a0, %hi(rx_queue)
ori $a0, $a0, %lo(rx_queue)
add $a0, $a1, $a0 # Get queue tail address (before the increment)
sw $a2, 0($a0) # Put data on RX_queue tail
lui $a0, %hi(nrx)
ori $a0, $a0, %lo(nrx)
lw $a1, 0($a0) # Read nrx
nop
addiu $a1, $a1, 1 # Increment nrx
sw $a1, 0($a0) # Save incremented nrx
TX: TX:
andi $a0, $k1, UART_tx_irq # Is this transmission? andi $a0, $k1, UART_tx_irq # Is this transmission?
...@@ -44,32 +42,29 @@ TX: ...@@ -44,32 +42,29 @@ TX:
ori $a0, $a0, %lo(ntx) ori $a0, $a0, %lo(ntx)
lw $a1, 0($a0) # Read ntx lw $a1, 0($a0) # Read ntx
addiu $a0, $zero, 16 addiu $a2, $zero, 16
slt $a0, $a1, $a0 # If ntx < 16 there's something on the queue slt $a2, $a1, $a2 # If ntx < 16 there's something on the queue
beq $a0, $zero, END beq $a2, $zero, END
lui $a0, %hi(tx_queue) addiu $a1, $a1, 1 # Increment ntx
ori $a0, $a0, %lo(tx_queue) sw $a1, 0($a0) # Save incremented ntx
lw $a1, 0($a0) # Read TX_queue
lui $a0, %hi(HW_uart_addr)
ori $a0, $a0, %lo(HW_uart_addr)
sw $a1, 0($a0) # Put data on UART
lui $a0, %hi(tx_hd) lui $a0, %hi(tx_hd)
ori $a0, $a0, %lo(tx_hd) ori $a0, $a0, %lo(tx_hd)
lw $a1, 0($a0) # Read tx_hd lw $a1, 0($a0) # Read tx_hd
nop nop
addiu $a1, $a1, 1 # Increment tx_hd: we've transmitted, there's space on the queue addiu $a2, $a1, 1 # Increment tx_hd: we've transmitted, there's space on the queue
andi $a1, $a1, 15 # It's a circular queue so: (tx_hd+1)%16 andi $a2, $a2, 15 # It's a circular queue so: (tx_hd+1)%16
sw $a1, 0($a0) # Save tx_hd sw $a2, 0($a0) # Save tx_hd
lui $a0, %hi(ntx) lui $a0, %hi(tx_queue)
ori $a0, $a0, %lo(ntx) ori $a0, $a0, %lo(tx_queue)
lw $a1, 0($a0) # Read ntx add $a0, $a1, $a0 # Get queue head address (before the increment)
nop lw $a1, 0($a0) # Read TX_queue head
addiu $a1, $a1, 1 # Increment ntx
sw $a1, 0($a0) # Save incremented ntx lui $a0, %hi(HW_uart_addr)
ori $a0, $a0, %lo(HW_uart_addr)
sw $a1, 0($a0) # Put data on UART
END: END:
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment