Commit a301a69e authored by Miguel Jimenez Lopez's avatar Miguel Jimenez Lopez

Implement a command option for the spec-vuart tool.

parent 50a86c94
......@@ -24,38 +24,23 @@ static void print_version(char *pname)
static void *card;
static int transfer_byte(int from, int is_control) {
char c;
int ret;
do {
ret = read(from, &c, 1);
} while (ret < 0 && errno == EINTR);
if(ret == 1) {
if(is_control) {
if(c == '\x01') { // C-a
return -1;
}
}
spec_vuart_tx(card, &c, 1);
} else {
fprintf(stderr, "nothing to read. Port disconnected?\n");
return -2;
}
return 0;
}
void term_main(int keep_term)
void term_main(int keep_term, int cmd_mode, char * cmd)
{
struct termios oldkey, newkey;
//above is place for old and new port settings for keyboard teletype
int need_exit = 0;
char c;
int prompt_det = 0;
char tmp[20];
int tmp_idx;
int i;
fprintf(stderr, "[press C-a to exit]\n");
if (cmd_mode == 0)
fprintf(stderr, "[press C-a to exit]\n");
if(!keep_term) {
tcgetattr(STDIN_FILENO,&oldkey);
newkey.c_cflag = B9600 | CS8 | CLOCAL | CREAD;
newkey.c_cflag = B115200 | CS8 | CLOCAL | CREAD;
newkey.c_iflag = IGNPAR;
newkey.c_oflag = 0;
newkey.c_lflag = 0;
......@@ -64,6 +49,19 @@ void term_main(int keep_term)
tcflush(STDIN_FILENO, TCIFLUSH);
tcsetattr(STDIN_FILENO,TCSANOW,&newkey);
}
if (cmd_mode == 1) {
char endc;
vuart_flush(card);
spec_vuart_tx(card,cmd,strlen(cmd));
do {
spec_vuart_rx(card, &endc, 1);
} while(endc != 13);
}
while(!need_exit) {
fd_set fds;
int ret;
......@@ -78,12 +76,59 @@ void term_main(int keep_term)
perror("select");
} else if (ret > 0) {
if(FD_ISSET(STDIN_FILENO, &fds)) {
need_exit = transfer_byte(STDIN_FILENO, 1);
need_exit = vuart_check_end(STDIN_FILENO, 1, &c);
if(need_exit == 0 && cmd_mode == 0) {
spec_vuart_tx(card, &c, 1);
}
else {
if(need_exit == 0 && cmd_mode == 1 && c == 27) {
spec_vuart_tx(card, &c, 1);
}
}
}
}
while((spec_vuart_rx(card, &rx, 1)) == 1)
fprintf(stderr,"%c", rx);
prompt_det = 0;
tmp_idx = 0;
while((spec_vuart_rx(card, &rx, 1)) == 1) {
#if VUART_RX_USLEEP > 0
usleep(VUART_RX_USLEEP);
#endif
if(cmd_mode == 1) {
vuart_detect_prompt(rx,&prompt_det,VUART_PROMPT_DET_MODE_FULL);
switch(prompt_det)
{
case VUART_PROMT_DETECTED:
need_exit=-1;
break;
case VUART_W_DETECTED:
tmp[tmp_idx] = rx;
tmp_idx++;
break;
case VUART_R_DETECTED:
tmp[tmp_idx] = rx;
tmp_idx++;
break;
case VUART_C_DETECTED:
tmp[tmp_idx] = rx;
tmp_idx++;
break;
default:
for(i = 0 ; i < tmp_idx ; i++)
fprintf(stderr,"%c",tmp[tmp_idx]);
tmp_idx = 0;
fprintf(stderr,"%c",rx);
break;
}
} else {
fprintf(stderr,"%c", rx);
}
}
}
......@@ -96,8 +141,11 @@ int main(int argc, char **argv)
int bus = -1, dev_fn = -1, c;
uint32_t vuart_base = 0x20500;
int keep_term = 0;
int cmd_len;
int cmd_mode=0;
char cmd[VUART_SIZE_CMD];
while ((c = getopt (argc, argv, "b:d:u:kV")) != -1)
while ((c = getopt (argc, argv, "b:d:u:c:kV")) != -1)
{
switch(c)
{
......@@ -113,6 +161,13 @@ int main(int argc, char **argv)
case 'k':
keep_term = 1;
break;
case 'c':
cmd_mode=1;
strcpy(cmd,optarg);
cmd_len = strlen(cmd);
cmd[cmd_len] = 13;
cmd[cmd_len+1] = 0;
break;
case 'V':
print_version(argv[0]);
exit(0);
......@@ -139,7 +194,7 @@ int main(int argc, char **argv)
}
spec_vuart_init(card, vuart_base);
term_main(keep_term);
term_main(keep_term,cmd_mode,cmd);
spec_close(card);
return 0;
......
......@@ -225,6 +225,80 @@ static void vuart_tx(void *card, int c)
p->vuart_base + UART_REG_HOST_TDR);
}
void vuart_flush(void * card) {
char rx;
while((spec_vuart_rx(card, &rx, 1)) == 1) { }
}
int vuart_check_end(int from, int is_control, char * c) {
int ret;
do {
ret = read(from, c, 1);
} while (ret < 0 && errno == EINTR);
if(ret == 1) {
if(is_control) {
if(*c == '\x01') { // C-a
return -1;
}
}
} else {
fprintf(stderr, "nothing to read. Port disconnected?\n");
return -2;
}
return 0;
}
void vuart_detect_prompt(char c, int * det, int mode_det) {
switch (mode_det) {
case VUART_PROMPT_DET_MODE_FULL:
switch(*det) {
case VUART_INIT_PROMT_DET:
if(c == 'w')
*det = VUART_W_DETECTED;
break;
case VUART_W_DETECTED:
if(c == 'r')
*det = VUART_R_DETECTED;
else
*det = VUART_INIT_PROMT_DET;
break;
case VUART_R_DETECTED:
if(c == 'c')
*det = VUART_C_DETECTED;
else
*det = VUART_INIT_PROMT_DET;
break;
case VUART_C_DETECTED:
if(c == '#')
*det = VUART_PROMT_DETECTED;
else
*det = VUART_INIT_PROMT_DET;
break;
case VUART_PROMT_DETECTED:
break;
default:
*det = VUART_INIT_PROMT_DET;
break;
}
break;
case VUART_PROMPT_DET_MODE_FAST:
if(c == '#')
*det = VUART_PROMT_DETECTED;
break;
case VUART_PROMPT_DET_MODE_NONE:
*det = VUART_INIT_PROMT_DET;
break;
}
}
static char *load_binary_file(const char *filename, size_t *size)
{
int i;
......
......@@ -13,17 +13,23 @@
/* For compatibility */
#define PCI_DEVICE_ID_SPEC PCI_DEVICE_ID_SPEC_45T
/* 'Opens' the SPEC card at PCI bus [bus], device/function [dev].
Returns a handle to the card or NULL in case of failure. */
void *spec_open(int bus, int dev);
#define VUART_SIZE_CMD 1024
/* Closes the SPEC handle [card] */
void spec_close(void *card);
#define VUART_PROMPT_DET_MODE_FULL 0
#define VUART_PROMPT_DET_MODE_FAST 1
#define VUART_PROMPT_DET_MODE_NONE 2
/* Loads the FPGA bitstream into card [card] from file [filename].
Returns 0 on success. */
int spec_load_bitstream(void *card, const char *filename);
#define VUART_INIT_PROMT_DET 0
#define VUART_W_DETECTED 1
#define VUART_R_DETECTED 2
#define VUART_C_DETECTED 3
#define VUART_PROMT_DETECTED 4
#define VUART_RX_USLEEP 1
void *spec_open();
void spec_close(void *card);
int spec_load_bitstream(void *card, const char *filename);
/* Load the FPGA bitstram into car [card] from a given buffer [buf]
of size [size] */
int spec_load_bitstream_buffer(void *card, void *buf, size_t size);
......@@ -43,6 +49,9 @@ int spec_vuart_init(void *card, uint32_t base_addr);
/* Virtual uart Rx (VUART->Host) and Tx (Host->VUART) functions */
size_t spec_vuart_rx(void *card, char *buffer, size_t size);
size_t spec_vuart_tx(void *card, char *buffer, size_t size);
void vuart_flush(void * card);
int vuart_check_end(int from, int is_control, char * c);
void vuart_detect_prompt(char c, int * det, int mode_det);
/* Get the pointer to access SPEC memory directly */
void *spec_get_base(void *card, int basenr);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment