diff --git a/cMIPS/serial.inp b/cMIPS/serial.inp index a7519304fd7c1e28fa2c91d5919126d1bdf816c8..5427aab4c0e40ae492e818b23eed512213047e59 100644 --- a/cMIPS/serial.inp +++ b/cMIPS/serial.inp @@ -4,4 +4,3 @@ ffffffff 7C2 - diff --git a/cMIPS/tests/handlerUART.s b/cMIPS/tests/handlerUART.s index a0a0e3b27246b92e82724d889feccf50630bf685..e88dce142ab9725cc49b3d62a3b538fae1fcc020 100644 --- a/cMIPS/tests/handlerUART.s +++ b/cMIPS/tests/handlerUART.s @@ -31,9 +31,14 @@ 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 + + lw $k1, 0($a1) + j RX + nop + @@ -75,5 +80,9 @@ TX: # 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 6ca6fd5557de91b3048098eccc27d984877ab456..b13652117b92b5b896dd8f210455abedd36480cc 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(); @@ -76,35 +76,27 @@ int main(){ ctrl.ign = 0; ctrl.intTX = 1; ctrl.intRX = 1; - ctrl.speed = 1; // operate at 1/2 of the highest data rate + ctrl.speed = 2; // operate at 1/2 of the highest data rate uart->cs.ctl = ctrl; initUd(); - int lol; char last = EOF; - char first = EOF; + // FIXME: Não tah saindo do while (por causa do ctrl.intTX =1) while(!((c = getc()) == '\n' && c == last)) { - last = c; - print(c); if(c != EOF) { - 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); - } + print(c); + last = c; + Putc(c); } } - // for(i=0;i<Ud.ntx;i++){ - // print(Ud.tx_q[i]); - // } - // to_stdout('\n'); - //uart->d.tx = '\n'; //Send STX (Start of Text) + 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(); + } + while(1); // while((c = getc()) != '\0') { // if(c != EOF) { @@ -148,16 +140,22 @@ char getc(){ return c; } -int Putc(char c){ +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(); - return 1; + }else{ + 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 0; } int proberx(){