uint8_t test_long_frame(){ uint8_t stream[] = {4, 1, 2, 3, 0, 6, 1, 2, 3, 4, 5, 0}; counter = 0; uint8_t rc, i; uint8_t response[6]; rc = serial_receive(response, 5, stream, sizeof(stream)); printf("Test: long frame\n"); printf(" rc = %d\n", rc); for(i=0; i<6; i++) printf(" %02X",response[i]); printf("\n"); rc = serial_receive(response, 5, stream, sizeof(stream)); printf(" rc = %d\n", rc); for(i=0; i<6; i++) printf(" %02X",response[i]); printf("\n\n"); }
static int fetch_nodelist(struct motefs_node *nodes) { int n, i, k, op, result, res = 0; uint8_t buf[MFS_DATA_SIZE]; serial_lock(); if (serial_send(0, MFS_OP_NODELIST, NULL, 0)) { res = -EIO; goto ret; } /* the mote should send exactly `node_count` packets */ for (i = 0; i < node_count; i++) { res = serial_receive(&n, &op, &result, buf, sizeof buf); if (res == -1 || !result || !(op & MFS_OP_NODELIST)) { res = -1; goto ret; } nodes[n].type = result; for (k = 0; k < MFS_DATA_SIZE; k++) nodes[n].name[k] = buf[k]; } ret: serial_unlock(); if (res < 0) return -1; return 0; }
uint8_t test_single_char(){ uint8_t stream[] = {1, 1, 0, 2, 1, 0}; counter = 0; uint8_t rc, i; uint8_t response[6] = {0, 0, 0, 0, 0, 0}; printf("Test: single char\n"); rc = serial_receive(response, 6, stream, sizeof(stream)); printf(" rc = %d\n", rc); for(i=0; i<rc; i++) printf(" %02X",response[i]); printf("\n"); rc = serial_receive(response, 6, stream, sizeof(stream)); printf(" rc = %d\n", rc); for(i=0; i<rc; i++) printf(" %02X",response[i]); printf("\n"); }
uint8_t test_many_0(){ uint8_t stream[] = {0, 0, 0, 4, 1, 2, 3, 0, 0, 2, 6, 0}; counter = 0; uint8_t rc, i; uint8_t response[6] = {0, 0, 0, 0, 0, 0}; printf("Test: many 0s\n"); rc = serial_receive(response, 6, stream, sizeof(stream)); printf(" rc = %d\n", rc); for(i=0; i<rc; i++) printf(" %02X",response[i]); printf("\n"); rc = serial_receive(response, 6, stream, sizeof(stream)); printf(" rc = %d\n", rc); for(i=0; i<rc; i++) printf(" %02X",response[i]); printf("\n"); rc = serial_receive(response, 6, stream, sizeof(stream)); printf(" rc = %d\n", rc); for(i=0; i<rc; i++) printf(" %02X",response[i]); printf("\n"); rc = serial_receive(response, 6, stream, sizeof(stream)); printf(" rc = %d\n", rc); for(i=0; i<rc; i++) printf(" %02X",response[i]); printf("\n"); rc = serial_receive(response, 6, stream, sizeof(stream)); printf(" rc = %d\n", rc); for(i=0; i<rc; i++) printf(" %02X",response[i]); printf("\n"); rc = serial_receive(response, 6, stream, sizeof(stream)); printf(" rc = %d\n", rc); for(i=0; i<rc; i++) printf(" %02X",response[i]); printf("\n\n"); }
static int serial_handler(struct context *ctxt, void *arg) { struct serial_port *sp = (struct serial_port *) arg; unsigned char iir; unsigned char lsr; int boguscnt = ISR_LIMIT; while (1) { lsr = inp((unsigned short) (sp->iobase + UART_LSR)); // If receiver ready drain FIFO if (lsr & LSR_RXRDY) serial_receive(sp); // If transmitter ready send next bytes from tx queue if (lsr & LSR_TXRDY) serial_transmit(sp); // Get interrupt identification register iir = inp((unsigned short) (sp->iobase + UART_IIR)); //kprintf("[sisr %d %x]", sp->irq, iir); if (iir & IIR_NOPEND) break; switch (iir & IIR_IMASK) { case IIR_MLSC: // Modem status changed sp->msr = inp((unsigned short) (sp->iobase + UART_MSR)); sp->mlsc = 1; break; case IIR_RLS: // Line status changed sp->linestatus |= (lsr & (LSR_OE | LSR_PE | LSR_FE | LSR_BI)); sp->rls = 1; break; } if (--boguscnt < 0) { kprintf("serial: Too much work at interrupt, iir=0x%02x\n", iir); break; } } // Set OUT2 to enable interrupts outp(sp->iobase + UART_MCR, sp->mcr); queue_irq_dpc(&sp->dpc, serial_dpc, sp); eoi(sp->irq); return 0; }
uint8_t test_first_0(){ uint8_t stream[] = {0, 4, 1, 2, 3, 0, 2, 5, 0}; counter = 0; uint8_t response[5]; uint8_t rc, i; printf("Test: first char 0\n"); rc = serial_receive(response, 5, stream, sizeof(stream)); printf(" rc = %d\n", rc); for(i=0; i<5; i++) printf(" %02X",response[i]); printf("\n"); rc = serial_receive(response, 5, stream, sizeof(stream)); printf(" rc = %d\n", rc); for(i=0; i<5; i++) printf(" %02X",response[i]); printf("\n"); rc = serial_receive(response, 5, stream, sizeof(stream)); printf(" rc = %d\n", rc); for(i=0; i<5; i++) printf(" %02X",response[i]); printf("\n\n"); return 1; }
static int fetch_nodecount(int *count) { int op, result, res = 0; serial_lock(); res = serial_send(0, MFS_OP_NODECOUNT, NULL, 0); if (res == -1) goto ret; res = serial_receive(NULL, &op, &result, NULL, 0); if (res == -1 || !result || op != MFS_OP_NODECOUNT) { res = -EIO; goto ret; } *count = result; res = 0; ret: serial_unlock(); return res; }
static int op_write(const char *path, const char *buf, size_t size, off_t offset, struct fuse_file_info *fi) { (void) fi; (void) offset; int n, op, result, res = 0; uint8_t data[MFS_DATA_SIZE]; size_t i, len; char line[MFS_DATA_SIZE]; n = get_node(path); if (n == -1) return -ENOENT; /* copy one line without '\n' to temporary buffer * (and truncate it if too long) */ for (i = 0; i < MFS_DATA_SIZE - 1 && i < size && buf[i] != '\n'; i++) line[i] = buf[i]; line[i] = '\0'; len = i; /* convert the line to appropriate format which can be send as a serial * packet */ if (nodes[n].type & MFS_BOOL) { if (!strcmp(line, "true")) data[0] = 1; else if (!strcmp(line, "false")) data[0] = 0; else data[0] = atoi(line) != 0; len = 1; } else if (nodes[n].type & MFS_INT) { int64_t val = atoll(line); len = pack(data, "l", val); } else if (nodes[n].type & MFS_STR) { unsigned i; for (i = 0; i < len; i++) data[i] = line[i]; data[len] = '\0'; } serial_lock(); if (serial_send(n, MFS_OP_WRITE, data, len)) { res = -EIO; goto ret; } res = serial_receive(NULL, &op, &result, NULL, 0); if (res == -1 || !result || op != MFS_OP_WRITE) { res = -EIO; goto ret; } ret: serial_unlock(); if (!res) return size; return res; }
static int op_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi) { (void) fi; (void) offset; int n, i, op, result, res = 0; uint8_t data[MFS_DATA_SIZE]; n = get_node(path); if (n == -1) return -ENOENT; if (size <= MFSMSG_SIZE) return -EIO; serial_lock(); if (serial_send(n, MFS_OP_READ, NULL, 0)) { res = -EIO; goto ret; } res = serial_receive(NULL, &op, &result, data, sizeof data); if (res == -1 || !result || op != MFS_OP_READ) { res = -EIO; goto ret; } /* format reply */ switch (MFS_TYPE(nodes[n].type)) { case MFS_BOOL: strcpy(buf, (*data) ? "1" : "0"); break; case MFS_INT: { int64_t val; unpack(data, "l", &val); sprintf(buf, "%" PRIi64, val); } break; case MFS_STR: for (i = 0; i < MFS_DATA_SIZE - 1; i++) buf[i] = data[i]; buf[i] = '\0'; break; } /* add a newline because that looks better */ strcat(buf, "\n"); res = strlen(buf); ret: serial_unlock(); return res; }