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(); }
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(); }
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; }
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(); }
void ser_enable_int(byte data, word port) { set_dlab(0, port); outByte(port + INT_ENABLE, data); }
void ser_write_buffer(byte data, word port) { set_dlab(0, port); outByte(port + TRANS_BUFF, data); }
byte ser_read_buffer(word port) { set_dlab(0, port); return inByte(port + RECEIVER_BUFF); }
static inline void write_latch(uint16_t val) { set_dlab(1); write_latch_high(val >> 8); write_latch_low(val & 0xff); set_dlab(0); }