From eee0c716a49698ab6f744a9f465b0ae5ec9996ee Mon Sep 17 00:00:00 2001 From: "Israel B. Sant'Anna" <ibsa14@inf.ufpr.br> Date: Sat, 13 Jun 2015 20:36:29 -0300 Subject: [PATCH] Transmission kind of working (on a very weird way) Signed-off-by: Israel B. Sant'Anna <ibsa14@inf.ufpr.br> --- cMIPS/serial.inp | 4 ++- cMIPS/tests/handlerUART.s | 18 +++++++--- cMIPS/tests/uart.c | 75 +++++++++++++++++++++++---------------- 3 files changed, 60 insertions(+), 37 deletions(-) diff --git a/cMIPS/serial.inp b/cMIPS/serial.inp index ce14040..a751930 100644 --- a/cMIPS/serial.inp +++ b/cMIPS/serial.inp @@ -1,5 +1,7 @@ 0 -00 +11 ffffffff 7C2 + + diff --git a/cMIPS/tests/handlerUART.s b/cMIPS/tests/handlerUART.s index 6b4a998..a0a0e3b 100644 --- a/cMIPS/tests/handlerUART.s +++ b/cMIPS/tests/handlerUART.s @@ -31,9 +31,9 @@ RX: nop sb $k1, 0($a0) # Put data on RX_queue tail - # lui $a0, %hi(x_IO_BASE_ADDR) - # ori $a0, $a0, %lo(x_IO_BASE_ADDR) - # sw $k1, 0($a0) # Print for debug + lui $a0, %hi(x_IO_BASE_ADDR) + ori $a0, $a0, %lo(x_IO_BASE_ADDR) + sw $k1, 0($a0) # Print for debug @@ -46,6 +46,10 @@ TX: lw $a1, 52($a0) # Read ntx + # lui $k1, %hi(x_IO_BASE_ADDR) + # ori $k1, $k1, %lo(x_IO_BASE_ADDR) + # sw $a1, 0($k1) # Print for debug + addiu $k1, $zero, 16 slt $k1, $a1, $k1 # If ntx < 16 there's something on the queue beq $k1, $zero, END @@ -59,13 +63,17 @@ TX: andi $k1, $k1, 15 # It's a circular queue so: (tx_hd+1)%16 sw $k1, 40($a0) # Save tx_hd - addiu $a1, $a1, 24 # tx_hd position on tx_queue + # addiu $a1, $a1, 24 # tx_hd position on tx_queue add $a0, $a1, $a0 # tx_queue head address - lbu $a1, 0($a0) # Read TX_queue head + lbu $a1, 24($a0) # Read TX_queue head lui $a0, %hi(HW_uart_addr) ori $a0, $a0, %lo(HW_uart_addr) sb $a1, 4($a0) # Put data on UART + # lui $a0, %hi(x_IO_BASE_ADDR) + # ori $a0, $a0, %lo(x_IO_BASE_ADDR) + # sw $a1, 0($a0) # Print for debug + END: diff --git a/cMIPS/tests/uart.c b/cMIPS/tests/uart.c index 05455d5..6ca6fd5 100644 --- a/cMIPS/tests/uart.c +++ b/cMIPS/tests/uart.c @@ -74,32 +74,55 @@ int main(){ ctrl.ign = 0; - ctrl.intTX = 0; + ctrl.intTX = 1; ctrl.intRX = 1; - ctrl.speed = 2; // operate at 1/2 of the highest data rate + ctrl.speed = 1; // operate at 1/2 of the highest data rate uart->cs.ctl = ctrl; initUd(); - - c = getc(); - while(c != '\0') { + int lol; + char last = EOF; + char first = EOF; + while(!((c = getc()) == '\n' && c == last)) { + last = c; + print(c); if(c != EOF) { - int n = 0; - while(c != '\n' && c != '\0') { - int h = ctoi(c); - if(h != EOF) { - n = n*16 + h; - } - c = getc(); + if(!Putc(c)){ + print(0); + while(!(TXempty&uart->cs.stat.s)); + disableInterr(); + first = Ud.tx_q[Ud.tx_hd]; + Ud.tx_hd = (Ud.tx_hd+1)%16; + Ud.ntx++; + enableInterr(); + uart->d.tx = first; + Putc(c); } - //If it's a negative hex make it a negative integer as well - n = 0x8000&n ? (int)(0x7FFF&n)-0x8000 : n; - print(n); - //while(!Putc(c)); // Wait till there's space on queue } - c = getc(); } - Putc(c); // Sends EOF + // for(i=0;i<Ud.ntx;i++){ + // print(Ud.tx_q[i]); + // } + // to_stdout('\n'); + //uart->d.tx = '\n'; //Send STX (Start of Text) + + // while((c = getc()) != '\0') { + // if(c != EOF) { + // // while(!Putc(c)); // Wait till there's space on queue + // int n = 0; + // while(c != '\n' && c != '\0') { + // int h = ctoi(c); + // if(h != EOF) { + // n = n*16 + h; + // } + // c = getc(); + // } + // //If it's a negative hex make it a negative integer as well + // n = 0x8000&n ? (int)(0x7FFF&n)-0x8000 : n; + // // print(n); + // } + // } + // Putc(c); // Sends EOF return 0; } @@ -114,37 +137,27 @@ void initUd(){ } char getc(){ - char c; + char c = EOF; if(Ud.nrx > 0){ disableInterr(); c = Ud.rx_q[Ud.rx_hd]; Ud.rx_hd = (Ud.rx_hd+1)%16; Ud.nrx--; enableInterr(); - }else{ - c = EOF; } return c; } int Putc(char c){ - int sent; - if(Ud.ntx == 16) { - uart->d.tx = c; - return 1; - } - if(Ud.ntx > 0){ disableInterr(); Ud.tx_q[Ud.tx_tl] = c; Ud.tx_tl = (Ud.tx_tl+1)%16; Ud.ntx--; enableInterr(); - sent = 1; - }else{ - sent = 0; + return 1; } - return sent; + return 0; } int proberx(){ -- GitLab