diff --git a/cMIPS/serial.inp b/cMIPS/serial.inp index ce14040059ad11bfb716933c99b0e5566623b9c3..5427aab4c0e40ae492e818b23eed512213047e59 100644 --- a/cMIPS/serial.inp +++ b/cMIPS/serial.inp @@ -1,5 +1,6 @@ 0 -00 +11 ffffffff 7C2 + diff --git a/cMIPS/tests/handlerUART.s b/cMIPS/tests/handlerUART.s index 6b4a9981a93823adfa8c727a668ff434b2c9b397..e88dce142ab9725cc49b3d62a3b538fae1fcc020 100644 --- a/cMIPS/tests/handlerUART.s +++ b/cMIPS/tests/handlerUART.s @@ -35,6 +35,11 @@ RX: # ori $a0, $a0, %lo(x_IO_BASE_ADDR) # sw $k1, 0($a0) # Print for debug + lw $k1, 0($a1) + j RX + nop + + TX: @@ -46,6 +51,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 +68,21 @@ 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 + + lw $k1, 0($a0) + j RX + nop + END: diff --git a/cMIPS/tests/uart.c b/cMIPS/tests/uart.c index 05455d5c631fcc4d9947dbf10f286e62f90df9a0..3d962842ce7008f85b177afd353d6612bab2e397 100644 --- a/cMIPS/tests/uart.c +++ b/cMIPS/tests/uart.c @@ -56,7 +56,7 @@ int probetx(void); // returns ntx int iostat(void); // returns integer with status at lsb void ioctl(int); // write lsb in control register char getc(void); // returns char in queue, decrements nrx -int Putc(char); // inserts char in queue, decrements ntx +void Putc(char); // inserts char in queue, decrements ntx int ctoi(char); // converts a character to an integer void initUd(); @@ -65,41 +65,51 @@ extern UARTDriver Ud; volatile Tserial *uart; int main(){ - int i; - volatile int state; // tell GCC not to optimize away code - volatile Tstatus status; - volatile char c; uart = (void *)IO_UART_ADDR; // bottom of UART address range Tcontrol ctrl; - ctrl.ign = 0; - ctrl.intTX = 0; + ctrl.intTX = 1; ctrl.intRX = 1; ctrl.speed = 2; // operate at 1/2 of the highest data rate uart->cs.ctl = ctrl; initUd(); - - c = getc(); - while(c != '\0') { + volatile char c; + + while((c = getc()) != '\0') { 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 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 + Putc(c); } - c = getc(); } - Putc(c); // Sends EOF + if(Ud.ntx < 16){ + disableInterr(); + uart->d.tx = Ud.tx_q[Ud.tx_hd]; + Ud.tx_hd = (Ud.tx_hd+1)%16; + Ud.ntx++; + enableInterr(); + } + + int cont; + for(cont=0;cont<1000;cont++); //Wait for the remote uart + + // 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 +124,33 @@ 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; - } - +void Putc(char c){ 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; + while(!(TXempty&uart->cs.stat.s)); + disableInterr(); + uart->d.tx = Ud.tx_q[Ud.tx_hd]; + Ud.tx_hd = (Ud.tx_hd+1)%16; + Ud.ntx++; + enableInterr(); + Putc(c); } - return sent; } int proberx(){