コード例 #1
0
ファイル: serial.c プロジェクト: tijuo/Silverbox-OS
void scan_serports(void)
{
  word *port_addr = (word *)0x400;
  int i, io, irq;
  mid_t mbox = __allocMbox( 50 );

  i = 0;
/*
  for(i=0; i < 4; i++, port_addr++)
  {
    if(*port_addr != 0) {
      switch(i) {
        case 0:
          io = SER1_BASE;
          irq = 4;
          break;
        case 1:
          io = SER2_BASE;
          irq = 3;
          break;
        case 2:
          io = SER3_BASE;
          irq = 4;
          break;
        case 3:
          io = SER4_BASE;
          irq = 3;
          break;
        default:
          break;
      }

      print("SER%d: found. Addr: 0x%x IRQ: 0x%02x\n", i + 1, io, irq);
/ *
      if((i == 0) || (i == 2)) {
        register_irq(IRQ4);
        add_ISR(&serial, IRQ4);
      }
      else {
        register_irq(IRQ3);
        add_ISR(&serial, IRQ3);
      }
* /
    }
  }
*/
  __sleep( 1000 );

  __registerInt(mbox, IRQ4);
  __registerInt(mbox, IRQ3);

  set_dlab(1, SER1_BASE);
  set_baudrate(S9600BAUD, SER1_BASE);
  set_line_ctrl(0x03, SER1_BASE);
  ser_fifo_ctrl(0xC7, SER1_BASE);
  set_modem_ctl(0x0B, SER1_BASE);
  ser_enable_int(0x07, SER1_BASE);

  serialHandler();
}
コード例 #2
0
ファイル: serial.c プロジェクト: MorganCook61/camkes-vm
void pre_init(void) {
    morecore_area = core_buf;
    morecore_size = SERVER_CORE_SIZE;
    serial_lock();
    // Initialize the serial port
    set_dlab(0); // we always assume the dlab is 0 unless we explicitly change it
    disable_interrupt();
    disable_fifo();
    reset_lcr();
    reset_mcr();
    clear_iir();
    set_baud_rate(BAUD_RATE);
    reset_state();
    enable_fifo();
    enable_interrupt();
    clear_iir();
    // all done
    init_colours();
    /* query what getchar clients exist */
    num_getchar_clients = getchar_num_badges();
    getchar_clients = calloc(num_getchar_clients, sizeof(getchar_client_t));
    for (int i = 0; i < num_getchar_clients; i++) {
        unsigned int badge = getchar_enumerate_badge(i);
        assert(badge <= num_getchar_clients);
        getchar_clients[badge].client_id = badge;
        getchar_clients[badge].buf = getchar_buf(badge);
        getchar_clients[badge].last_head = -1;
    }
    set_putchar(serial_putchar);
    serial_irq_reg_callback(serial_irq, 0);
    /* Start regular heartbeat of 500ms */
    timeout_periodic(0, 500000000);
    serial_unlock();
}
コード例 #3
0
ファイル: serial.c プロジェクト: tijuo/Silverbox-OS
int set_baudrate(int baud, word port)
{
  byte dll, dlh;

  switch(baud) {
    case S50BAUD:
      dll = 0x00;
      dlh = 0x09;
      break;
    case S300BAUD:
      dll = 0x80;
      dlh = 0x01;
      break;
    case S600BAUD:
      dll = 0xC0;
      dlh = 0x00;
      break;
    case S2400BAUD:
      dll = 0x30;
      dlh = 0x00;
      break;
    case S4800BAUD:
      dll = 0x18;
      dlh = 0x00;
      break;
    case S9600BAUD:
      dll = 0x0C;
      dlh = 0x00;
      break;
    case S19200BAUD:
      dll = 0x06;
      dlh = 0x00;
      break;
    case S39400BAUD:
      dll = 0x03;
      dlh = 0x00;
      break;
    case S57600BAUD:
      dll = 0x02;
      dlh = 0x00;
      break;
    case S115200BAUD:
      dll = 0x01;
      dlh = 0x00;
      break;
    default:
      return -1;
  }

  set_dlab(1, port);
  outByte(DLL_BYTE + port, dll);
  outByte(DLH_BYTE + port, dlh);
  return 0;
}
コード例 #4
0
ファイル: serial.c プロジェクト: GaloisInc/camkes-tool
void serial_init(gdb_state_t *gdb) {
    // Initialize the serial port
    int UNUSED error;
    error = serial_lock();
    gdb_state = gdb;
    set_dlab(0); // we always assume the dlab is 0 unless we explicitly change it
    disable_interrupt();
    disable_fifo();
    reset_lcr();
    reset_mcr();
    clear_iir();
    set_baud_rate(BAUD_RATE);
    reset_state();
    enable_fifo();
    enable_interrupt();
    clear_iir();
    initialise_buffer();
    error = serial_unlock();

}
コード例 #5
0
ファイル: serial.c プロジェクト: tijuo/Silverbox-OS
void ser_enable_int(byte data, word port)
{
  set_dlab(0, port);
  outByte(port + INT_ENABLE, data);
}
コード例 #6
0
ファイル: serial.c プロジェクト: tijuo/Silverbox-OS
void ser_write_buffer(byte data, word port)
{
  set_dlab(0, port);
  outByte(port + TRANS_BUFF, data);
}
コード例 #7
0
ファイル: serial.c プロジェクト: tijuo/Silverbox-OS
byte ser_read_buffer(word port)
{
  set_dlab(0, port);
  return inByte(port + RECEIVER_BUFF);
}
コード例 #8
0
ファイル: serial.c プロジェクト: MorganCook61/camkes-vm
static inline void write_latch(uint16_t val) {
    set_dlab(1);
    write_latch_high(val >> 8);
    write_latch_low(val & 0xff);
    set_dlab(0);
}