Skip to content
Snippets Groups Projects
Commit a241a6ad authored by Vytor Calixto's avatar Vytor Calixto :space_invader:
Browse files

Transmission working

Merge branch 'transmission' into 'master'

See merge request !1
parents 2a1c0925 1cb73496
Branches
No related tags found
No related merge requests found
0
00
11
ffffffff
7C2
......@@ -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:
......@@ -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();
volatile char c;
c = getc();
while(c != '\0') {
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;
Putc(c);
}
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
}
c = getc();
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();
}
Putc(c); // Sends EOF
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(){
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment