Пример #1
0
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");
}
Пример #2
0
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;
}
Пример #3
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");
}
Пример #4
0
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");
}
Пример #5
0
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;
}
Пример #6
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;
}
Пример #7
0
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;
}
Пример #8
0
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;
}
Пример #9
0
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;
}