Example #1
0
void irq_handler(){
  uint32_t pending = inw(VIC_VBASE+INTERRUPT_STATUS);
  uint32_t irq = 0;
  while(pending > 0){
    irq = inw(VIC_VBASE+INTERRUPT_NUMBER);
    if(actions[irq].handler){
      (*actions[irq].handler)(irq, actions[irq].opaque);
    }else{
      pic_disable(irq);
    }
    pending = inw(VIC_VBASE+INTERRUPT_STATUS);
  }
#if 0
  if(status & (1<<TIMER0_IRQ)){
    //kprintf("@");
    ticks++;
		//assert(pls_read(current) != NULL);
    run_timer_list();
    clock_clear();
  }
  if( status & (1<<UART_IRQ) ){
    //if ((c = cons_getc()) == 13) {
    //  debug_monitor(tf);
    //}
    //else {
      extern void dev_stdin_write(char c);
      char c = cons_getc();
      dev_stdin_write(c);
    //}
    //kprintf("#");
    serial_clear();
  }
#endif
}
Example #2
0
/** Note: Must _not_ be called twice! */
WINDOW *initscr(void)
{
	int i;

	// newterm(name, stdout, stdin);
	// def_prog_mode();

	for (i = 0; i < 128; i++)
	  acs_map[i] = (chtype) i | A_ALTCHARSET;
#if IS_ENABLED(CONFIG_LP_SERIAL_CONSOLE)
	if (curses_flags & F_ENABLE_SERIAL) {
		serial_clear();
	}
#endif
#if IS_ENABLED(CONFIG_LP_VIDEO_CONSOLE)
	if (curses_flags & F_ENABLE_CONSOLE) {
		/* Clear the screen and kill the cursor */

		video_console_clear();
		video_console_cursor_enable(0);
	}
#endif

	// Speaker init?

	stdscr = newwin(SCREEN_Y, SCREEN_X, 0, 0);
	// TODO: curscr, newscr?

	werase(stdscr);

	return stdscr;
}
Example #3
0
/*
 * 串口波特率设置
 */
int serial_set_baudrate(urg_serial_t *serial, long baudrate)
{
    long baudrate_value = -1;

    switch (baudrate) {
    case 4800:
        baudrate_value = B4800;
        break;

    case 9600:
        baudrate_value = B9600;
        break;

    case 19200:
        baudrate_value = B19200;
        break;

    case 38400:
        baudrate_value = B38400;
        break;

    case 57600:
        baudrate_value = B57600;
        break;

    case 115200:
        baudrate_value = B115200;
        break;

    default:
        return -1;
    }

    /*  设置输入输出波特率(Linux系统调用) */
    cfsetospeed(&serial->sio, baudrate_value);
    cfsetispeed(&serial->sio, baudrate_value);
	/* 设置终端属性 */
    tcsetattr(serial->fd, TCSADRAIN, &serial->sio);
    serial_clear(serial);

    return 0;
}
Example #4
0
/* �{�[���[�g�̐ݒ� */
int serial_setBaudrate(serial_t *serial, long baudrate)
{
  long baudrate_value = -1;

  switch (baudrate) {
  case 4800:
    baudrate_value = B4800;
    break;

  case 9600:
    baudrate_value = B9600;
    break;

  case 19200:
    baudrate_value = B19200;
    break;

  case 38400:
    baudrate_value = B38400;
    break;

  case 57600:
    baudrate_value = B57600;
    break;

  case 115200:
    baudrate_value = B115200;
    break;

  default:
    return SerialSetBaudrateFail;
  }

  /* �{�[���[�g�ύX */
  cfsetospeed(&serial->sio_, baudrate_value);
  cfsetispeed(&serial->sio_, baudrate_value);
  tcsetattr(serial->fd_, TCSADRAIN, &serial->sio_);
  serial_clear(serial);

  return 0;
}
Example #5
0
static int urg_firstConnection(urg_t *urg, long baudrate)
{
  long try_baudrates[] = { 115200, 19200, 38400 };
  int try_size = sizeof(try_baudrates) / sizeof(try_baudrates[0]);
  long pre_ticks;
  int reply = 0;
  int ret;
  int i;

  /* The baud rate to be connected is replaced with the first element
     of the array. */
  for (i = 1; i < try_size; ++i) {
    if (baudrate == try_baudrates[i]) {
      long swap_tmp = try_baudrates[i];
      try_baudrates[i] = try_baudrates[0];
      try_baudrates[0] = swap_tmp;
      break;
    }
  }

  /* Try to connect with the specified baudrate , and check for response */
  for (i = 0; i < try_size; ++i) {

    /* Change host side baudrate  */
    ret = serial_setBaudrate(&urg->serial_, try_baudrates[i]);
    if (ret < 0) {
      return ret;
    }

    serial_clear(&urg->serial_);

    /* Send QT command */
    ret = scip_qt(&urg->serial_, &reply, ScipWaitReply);
    if (ret == UrgSerialRecvFail) {
      /* If there is no response, consider that there is mismatch in baudrate */
      continue;
    }

    if ((ret == UrgMismatchResponse) && (reply != -0xE)) {
      /* Process when response from MD/MS command is received  */
      /* Read out all data and then proceed for the next one */
      /* (reply == -0xE) means SCIP1.1 error 'E' */
      serial_clear(&urg->serial_);
      serial_skip(&urg->serial_, ScipTimeout, EachTimeout);
      reply = 0x00;
    }

    /* If the response is returned, consider that sensor is already in SCIP2.0
       mode and no need to send SCIP2.0 */
    if (reply != 0x00) {
      if ((ret = scip_scip20(&urg->serial_)) < 0) {
        /* If there is no response , continue with other baudrate */
        continue;
      }
      if (ret == 12) {
        /* SCIP1.1 protocol */
        return UrgScip10;
      }
    }

    /* Returns if there is no need to change baudrate */
    if (baudrate == try_baudrates[i]) {
      return 0;
    }

    /* Change the baud rate as specified by URG */
    pre_ticks = urg_ticks();
    if (scip_ss(&urg->serial_, baudrate) < 0) {
      return UrgSsFail;

    } else {
      /* In case of serial communication, it is necessary to wait for
         one scan after baud rate is changed. */
      long reply_msec = urg_ticks() - pre_ticks;
      urg_delay((reply_msec * 4 / 3) + 10);

      return serial_setBaudrate(&urg->serial_, baudrate);
    }
  }

  return UrgAdjustBaudrateFail;
}
Example #6
0
void serial_init(serial_t *obj, PinName tx, PinName rx)
{
    uint32_t uart_ctrl = 0;

    /* Determine the UART to use */
    UARTName uart_tx = (UARTName)pinmap_peripheral(tx, PinMap_UART_TX);
    UARTName uart_rx = (UARTName)pinmap_peripheral(rx, PinMap_UART_RX);
    UARTName uart = (UARTName)pinmap_merge(uart_tx, uart_rx);

    if ((int)uart == NC) {
        error("Serial pinout mapping failed");
        return;
    }

    obj->uart = (CMSDK_UART_TypeDef *)uart;

    if (tx != NC) {
        uart_ctrl = 0x01;   /* TX enable */
    }
    if (rx != NC) {
        uart_ctrl |= 0x02;  /* RX enable */
    }

    switch (uart) {
        case UART_0:
            CMSDK_UART0->CTRL = uart_ctrl;
            obj->index = 0;
            break;
        case UART_1:
            CMSDK_UART1->CTRL = uart_ctrl;
            obj->index = 1;
            break;
        case UART_2:
            CMSDK_UART2->CTRL = 0;
            obj->index = 2;
            pin_function(tx, ALTERNATE_FUNC);
            pin_function(rx, ALTERNATE_FUNC);
            CMSDK_UART2->CTRL = uart_ctrl;
            break;
        case UART_3:
            CMSDK_UART3->CTRL = 0;
            obj->index = 3;
            pin_function(tx, ALTERNATE_FUNC);
            pin_function(rx, ALTERNATE_FUNC);
            CMSDK_UART3->CTRL = uart_ctrl;
            break;
        case UART_4:
            CMSDK_UART4->CTRL = 0;
            obj->index = 4;
            pin_function(tx, ALTERNATE_FUNC);
            pin_function(rx, ALTERNATE_FUNC);
            CMSDK_UART4->CTRL = uart_ctrl;
            break;
    }

    /* Set default baud rate and format */
    serial_baud(obj, 9600);

    /*
     *  The CMSDK APB UART doesn't have support for flow control.
     *  Ref. DDI0479C_cortex_m_system_design_kit_r1p0_trm.pdf
     */
    uart_data[obj->index].sw_rts.pin = NC;
    uart_data[obj->index].sw_cts.pin = NC;

    if (uart == STDIO_UART) {
        stdio_uart_inited = 1;
        memcpy(&stdio_uart, obj, sizeof(serial_t));
    }

    /* Clear UART */
    serial_clear(obj);
}