Skip to content
Snippets Groups Projects
Commit 3f25a0d9 authored by Jedian's avatar Jedian
Browse files

Embonitando tudo, parece funcional por enquanto


Signed-off-by: default avatarJedian <jmb15@c3sl.ufpr.br>
parent 5e5dcead
No related branches found
No related tags found
No related merge requests found
...@@ -13,7 +13,7 @@ int ntx ; // number of spaces in tx_queue ...@@ -13,7 +13,7 @@ int ntx ; // number of spaces in tx_queue
} UARTdriver; } UARTdriver;
typedef struct control { // control register fields (uses only ls byte) typedef struct control { // control register fields (uses only ls byte)
int ign : 24, // ignore uppermost bits unsigned int ign : 24, // ignore uppermost bits
rts : 1, // Request to Send output (bit 7) rts : 1, // Request to Send output (bit 7)
ign2 : 2, // bits 6,5 ignored ign2 : 2, // bits 6,5 ignored
intTX : 1, // interrupt on TX buffer empty (bit 4) intTX : 1, // interrupt on TX buffer empty (bit 4)
...@@ -22,7 +22,7 @@ typedef struct control { // control register fields (uses only ls byte) ...@@ -22,7 +22,7 @@ typedef struct control { // control register fields (uses only ls byte)
} Tcontrol; } Tcontrol;
typedef struct status { // status register fields (uses only ls byte) typedef struct status { // status register fields (uses only ls byte)
int ign : 24, // ignore uppermost bits unsigned int ign : 24, // ignore uppermost bits
ign7 : 1, // ignored (bit 7) ign7 : 1, // ignored (bit 7)
txEmpty : 1, // TX register is empty (bit 6) txEmpty : 1, // TX register is empty (bit 6)
rxFull : 1, // octet available from RX register (bit 5) rxFull : 1, // octet available from RX register (bit 5)
...@@ -43,12 +43,6 @@ typedef union data { // data registers on same address ...@@ -43,12 +43,6 @@ typedef union data { // data registers on same address
int rx; // read-only int rx; // read-only
} Tdata; } Tdata;
/*****************************************************
?typedef struct serial { **
? TctlStat cs; // @ (int *)IO_UART_ADDR **
?} **
*****************************************************/
typedef struct serial { typedef struct serial {
TctlStat cs; // @ (int *)IO_UART_ADDR TctlStat cs; // @ (int *)IO_UART_ADDR
Tdata d; // @ (int *)(IO_UART_ADDR+1) Tdata d; // @ (int *)(IO_UART_ADDR+1)
......
...@@ -44,3 +44,4 @@ f ...@@ -44,3 +44,4 @@ f
2a 2a
2b 2b
...@@ -107,7 +107,7 @@ UARTrxinter: ...@@ -107,7 +107,7 @@ UARTrxinter:
overrun: overrun:
jal print jal print
li $a0, 111 li $a0, 64017
# move $a0, $7 # move $a0, $7
# do something if rx queue is full or tx is empty # do something if rx queue is full or tx is empty
# set overrun bit on uart statusReg # set overrun bit on uart statusReg
......
#include "cMIPS.h" #include "cMIPS.h"
#include "../include/vetorFib.h" #include "../include/vetorFib.h"
#include "../include/structUart.h"
#define MAXPOW 7 #define MAXPOW 7
typedef struct UARTdriver {
int rx_hd ; // reception queue head index
int rx_tl ; // reception queue tail index
char rx_q [16]; // reception queue
int tx_hd ; // transmission queue head index
int tx_tl ; // transmission queue tail index
char tx_q [16]; // transmission queue
int nrx ; // number of characters in rx_queue
int ntx ; // number of spaces in tx_queue
} UARTdriver ;
extern UARTdriver Ud ; extern UARTdriver Ud ;
volatile Tserial *uart; // tell GCC not to optimize away code
int proberx () {
return Ud.nrx;
}
typedef struct control { // control register fields (uses only ls byte) int probetx () {
int ign : 24, // ignore uppermost bits return Ud.ntx;
rts : 1, // Request to Send output (bit 7) }
ign2 : 2, // bits 6,5 ignored
intTX : 1, // interrupt on TX buffer empty (bit 4) int ctrl_util(int speed, int trx, int ttx, int rts) {
intRX : 1, // interrupt on RX buffer full (bit 3) int ctl = 0;
speed : 3; // 4,8,16..256 tx-rx clock data rates (bits 0..2) ctl |= speed;
} Tcontrol; ctl |= trx<<3;
ctl |= ttx<<4;
typedef struct status { // status register fields (uses only ls byte) ctl |= rts<<6;
unsigned int ign : 24, // ignore uppermost 3 bytes return ctl;
cts : 1, // Clear To Send input=1 (bit 7) }
txEmpty : 1, // TX register is empty (bit 6)
rxFull : 1, // octet available from RX register (bit 5) void ioctl(int ctl){
int_TX_empt: 1, // interrupt pending on TX empty (bit 4) Tcontrol aux;
int_RX_full: 1, // interrupt pending on RX full (bit 3) aux.speed = ctl;
ign1 : 1, // ignored (bit 2) aux.intRX = ctl>>3;
framing : 1, // framing error (bit 1) aux.intTX = ctl>>4;
overun : 1; // overun error (bit 0) aux.rts = ctl>>6;
} Tstatus; uart->cs.ctl= aux;
}
typedef union ctlStat { // control + status on same address int iostat(){
Tcontrol ctl; // write-only int stat = 0;
Tstatus stat; // read-only stat |= uart->cs.stat.overun;
} TctlStat; stat |= uart->cs.stat.framing<<1;
stat |= uart->cs.stat.int_RX_full<<3;
typedef union data { // data registers on same address stat |= uart->cs.stat.int_TX_empt<<4;
int tx; // write-only stat |= uart->cs.stat.rxFull<<5;
int rx; // read-only stat |= uart->cs.stat.txEmpty<<6;
} Tdata; return stat;
}
typedef struct serial {
TctlStat cs; int Putc (char c) {
Tdata d; int ntx = Ud.ntx;
} Tserial; if (ntx == 0)
return 0;
if (ntx == 16 && uart->cs.stat.txEmpty) // Empty Q && Tx
uart->d.tx = (unsigned int) c; // 32-bits
else { // Sending smthng
disableInterr();
Ud.ntx--;
// INCREMENTS AND THEN STORE
Ud.tx_tl = (Ud.tx_tl+1)&0xF; // modulo 16
Ud.tx_q[Ud.tx_tl] = c;
enableInterr();
}
return 1;
}
volatile Tserial *uart; // tell GCC not to optimize away code
char Getc () { char Getc () {
char c ; char c ;
if ( Ud.nrx > 0) { if ( Ud.nrx > 0) {
...@@ -68,9 +76,6 @@ char Getc () { ...@@ -68,9 +76,6 @@ char Getc () {
return c ; return c ;
} }
int proberx () {
return Ud.nrx;
}
int Strlen (char *c) { int Strlen (char *c) {
int i= 0; int i= 0;
while(c[i++]-10); while(c[i++]-10);
...@@ -85,28 +90,9 @@ int pow16 (int ex) { ...@@ -85,28 +90,9 @@ int pow16 (int ex) {
return (ex%2?ret*16:ret); return (ex%2?ret*16:ret);
} }
int hex2int (char *hex) { int hex2int (int tam, char *hex) {
int s= Strlen(hex), i, ans= 0; int i, ans= 0;
#if 0 for (i = 0; i < tam; i++) {
Test Signal...
switch (hex[0]) {
case 'F':
case 'f':
case 'E':
case 'e':
case 'D':
case 'd':
case 'C':
case 'c':
case 'B':
case 'b':
case 'A':
case 'a':
case '9':
ans = hex[0]*pow16(s-1);
}
#endif
for (i= 0; i< s; i++) {
hex[i]-= 48; hex[i]-= 48;
if (hex[i] > 9) if (hex[i] > 9)
hex[i] -= 7; hex[i] -= 7;
...@@ -114,10 +100,11 @@ int hex2int (char *hex) { ...@@ -114,10 +100,11 @@ int hex2int (char *hex) {
hex[i] -= 32; hex[i] -= 32;
if(hex[i] < 0) if(hex[i] < 0)
hex[i]=0; hex[i]=0;
ans += hex[i] * pow16(s-(i+1)); ans += hex[i] * pow16(tam-(i+1));
} }
return ans; return ans;
} }
int int2hex (char *c, int i) { int int2hex (char *c, int i) {
int j= 0, val; int j= 0, val;
int p; int p;
...@@ -138,22 +125,7 @@ int int2hex (char *c, int i) { ...@@ -138,22 +125,7 @@ int int2hex (char *c, int i) {
c[j] = 0; c[j] = 0;
return j-1; return j-1;
} }
int Putc (char c) {
int ntx = Ud.ntx;
if (ntx == 0)
return 0;
if (ntx == 16 && uart->cs.stat.txEmpty) // Empty Q && Tx
uart->d.tx = (unsigned int) c; // 32-bits
else { // Sending smthng
disableInterr();
Ud.ntx--;
// INCREMENTS AND THEN STORE
Ud.tx_tl = (Ud.tx_tl+1)&0xF; // modulo 16
Ud.tx_q[Ud.tx_tl] = c;
enableInterr();
}
return 1;
}
int main(void) { // receive a string through the UART serial interface int main(void) { // receive a string through the UART serial interface
...@@ -165,29 +137,15 @@ int main(void) { // receive a string through the UART serial interface ...@@ -165,29 +137,15 @@ int main(void) { // receive a string through the UART serial interface
int tlona=0; int tlona=0;
int filonx = 0; int filonx = 0;
int valfib, qt, rxz, q; int valfib, qt, rxz, q;
int fim = 0;
char p[15]; char p[15];
Tcontrol ctrl; Tcontrol ctrl;
uart = (void *)IO_UART_ADDR; // bottom of UART address range uart = (void *)IO_UART_ADDR; // bottom of UART address range
ctrl.ign = 0;
ctrl.rts = 0; // make RTS=0 to hold RemoteUnit
ctrl.ign2 = 0;
ctrl.intTX = 1;
ctrl.intRX = 1;
ctrl.speed = 2; // operate at the second highest data rate
uart->cs.ctl = ctrl;
i = -1; i = -1;
ioctl(ctrl_util(2, 1, 1, 1));
ctrl.ign = 0;
ctrl.rts = 1; // make RTS=1 to activate RemoteUnit
ctrl.ign2 = 0;
ctrl.intTX = 1;
ctrl.intRX = 1;
ctrl.speed = 2; // operate at the second highest data rate
uart->cs.ctl = ctrl;
Ud.ntx = 16; Ud.ntx = 16;
do { do {
state = i = i+1; state = i = i+1;
// se tirar fode (b520 vira 15) // se tirar fode (b520 vira 15)
...@@ -209,11 +167,10 @@ int main(void) { // receive a string through the UART serial interface ...@@ -209,11 +167,10 @@ int main(void) { // receive a string through the UART serial interface
} }
while(filonx > 0){ while(filonx > 0){
qt = Strlen(filona+hdona); qt = Strlen(filona+hdona);
valfib = hex2int((filona+hdona)); valfib = hex2int(qt, (filona+hdona));
valfib = buf[valfib]; valfib = buf[valfib];
hdona += qt+1; hdona += qt+1;
hdona %= 145; hdona %= 145;
//print(valfib);
qt = int2hex(p, valfib); qt = int2hex(p, valfib);
j = -1; j = -1;
do { do {
...@@ -234,7 +191,10 @@ int main(void) { // receive a string through the UART serial interface ...@@ -234,7 +191,10 @@ int main(void) { // receive a string through the UART serial interface
} while (p[j] != 0); } while (p[j] != 0);
filonx--; filonx--;
} }
if(filonx == 0 && !fim)
fim = 1;
else if (filonx == 0 && fim)
return state+i;
} while (i<20); } while (i<20);
return(state+i); return(state+i);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment