From 023d33a140887ded39860038fe35bbd6c7e93217 Mon Sep 17 00:00:00 2001 From: Jedian Marcos Brambilla <jmb15@inf.ufpr.br> Date: Sat, 18 Jun 2016 13:26:23 -0300 Subject: [PATCH] Overrun sinalizado, falta fazer o nrx ser o rxnum e iniciar os testes de verdade Signed-off-by: Jedian Marcos Brambilla <jmb15@inf.ufpr.br> --- cMIPS/include/handlers.s | 8 +++++++- cMIPS/include/structUart.h | 9 +++++++++ cMIPS/tests/handlerUART.s | 14 ++++++++++++-- cMIPS/tests/jedidafu.c | 13 ++++++++++--- 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/cMIPS/include/handlers.s b/cMIPS/include/handlers.s index 59d06e1..f981f56 100644 --- a/cMIPS/include/handlers.s +++ b/cMIPS/include/handlers.s @@ -70,7 +70,7 @@ extCounter: # interrupt handler for UART attached to IP6=HW4 # for UART's address see vhdl/packageMemory.vhd # - .global Ud, _uart_buff + .global Ud, _uart_buff, proberxs .bss .align 2 Ud: @@ -83,6 +83,12 @@ tx_q: .space 16 # transmission queue and pointers nrx: .space 4 # characters in RX_queue ntx: .space 4 # spaces left in TX_queue +proberxs: +framing:.space 1 +overun: .space 1 +ign22: .space 22 +rxnum: .space 8 + _uart_buff: .space 16*4 # up to 16 registers to be saved here .set UART_rx_irq,0x08 diff --git a/cMIPS/include/structUart.h b/cMIPS/include/structUart.h index c2fa908..296b6af 100644 --- a/cMIPS/include/structUart.h +++ b/cMIPS/include/structUart.h @@ -47,4 +47,13 @@ typedef struct serial { TctlStat cs; // @ (int *)IO_UART_ADDR Tdata d; // @ (int *)(IO_UART_ADDR+1) } Tserial; + +typedef struct proberx { + unsigned int + framing : 1, // framing error + overun : 1, // overrun + ign22 : 22, // padding + rxnum : 8; // até 255 caracteres na fila (são <= 16) +} Tproberx; + #endif diff --git a/cMIPS/tests/handlerUART.s b/cMIPS/tests/handlerUART.s index 2c4d739..627910a 100644 --- a/cMIPS/tests/handlerUART.s +++ b/cMIPS/tests/handlerUART.s @@ -106,8 +106,18 @@ UARTrxinter: nop overrun: - jal print - li $a0, 64017 + lui $5, %hi(proberxs) + ori $5, $5, %lo(proberxs) + lw $7, 0($5) + nop + + la $6, 0x40000000 + or $6, $6, $7 + sw $6, 0($5) + nop + + #jal print + #move $a0, $6 # move $a0, $7 # do something if rx queue is full or tx is empty # set overrun bit on uart statusReg diff --git a/cMIPS/tests/jedidafu.c b/cMIPS/tests/jedidafu.c index 14f95ae..5aaa726 100644 --- a/cMIPS/tests/jedidafu.c +++ b/cMIPS/tests/jedidafu.c @@ -5,6 +5,8 @@ #define MAXPOW 7 extern UARTdriver Ud ; +extern Tproberx proberxs ; + volatile Tserial *uart; // tell GCC not to optimize away code int proberx () { @@ -142,13 +144,18 @@ int main(void) { // receive a string through the UART serial interface uart = (void *)IO_UART_ADDR; // bottom of UART address range Ud.ntx = 16; // initializing number of empty spaces in tx queue - ioctl(ctrl_util(2, 1, 1, 1)); // Speed = 2, intRX = 1, intTX = 1, rts = 1 + ioctl(ctrl_util(1, 1, 1, 1)); // Speed = 2, intRX = 1, intTX = 1, rts = 1 do { state++; // state is a volatile variable just for optimize blocking - while(!proberx()) to_stdout('-'); // wait until first reception - + if(proberxs.overun){ + to_stdout('e'); + to_stdout('r'); + to_stdout('r'); + to_stdout('\0'); + return state; + } while((c=Getc()) != -1){ // dump the reception queue to the big queue filona[tlona] = c; tlona++; -- GitLab