1 #define PIO_op_RI(op, reg, sz, val) {UDI_PIO_##op+UDI_PIO_DIRECT+UDI_PIO_##reg, UDI_PIO_##sz##BYTE, val}
2 #define PIO_MOV_RI2(reg, val) PIO_op_RI(LOAD_IMM, reg, 2, val)
3 #define PIO_ADD_RI2(reg, val) PIO_op_RI(ADD, reg, 2, val)
4 #define PIO_SUB_RI2(reg, val) PIO_op_RI(SUB, reg, 2, val)
5 #define PIO_OUT_RI1(reg, ofs) PIO_op_RI(OUT, reg, 1, ofs)
6 #define PIO_IN_RI1(reg, ofs) PIO_op_RI(IN, reg, 1, ofs)
11 udi_pio_trans_t uart_pio_reset[] = {
12 // TODO: Programmable baud rate
13 //PIO_MOV_RI2(R0, 0x3F8), // TODO: programmable port number
15 PIO_OUT_RI1(R0, 0x00), // +1 = 0x00 - Disable interrupts
17 PIO_OUT_RI1(R0, 0x80), // +3 = 0x80 - Enable DLAB
19 PIO_OUT_RI1(R0, 0x01), // +0 = 0x01 - Divisor low (115200 baud)
21 PIO_OUT_RI1(R0, 0x00), // +1 = 0x00 - Divisor high
23 PIO_OUT_RI1(R0, 0x03), // +3 = 0x03 - 8n1
25 PIO_OUT_RI1(R0, 0xC7), // +2 = 0xC7 - Clear FIFO, 14-byte threshold
27 PIO_OUT_RI1(R0, 0x0B), // +4 = 0x0B - IRQs enabled, RTS/DSR set
29 PIO_OUT_RI1(R0, 0x0B), // +1 = 0x05 - Enable ERBFI (Rx Full), ELSI (Line Status)
30 {UDI_PIO_END, UDI_PIO_2BYTE, 0}
35 udi_pio_trans_t uart_pio_tx[] = {
36 // while( (inb(SERIAL_PORT + 5) & 0x20) == 0 );
37 // outb(SERIAL_PORT, ch);
38 {UDI_PIO_END, UDI_PIO_2BYTE, 0}
41 // Recieve (interrupt)
43 udi_pio_trans_t uart_pio_rx[] = {
44 // if( (inb(SERIAL_PORT+5) & 0x01) == 0 )
46 // return inb(SERIAL_PORT);
47 {UDI_PIO_END, UDI_PIO_2BYTE, 0}
50 #define ARRAY_SIZEOF(arr) (sizeof(arr)/sizeof(arr[0]))
53 udi_pio_trans_t *trans_list;
54 udi_ubit16_t list_length;
55 udi_ubit16_t pio_attributes;
57 [PIO_RESET] = {uart_pio_reset, ARRAY_SIZEOF(uart_pio_reset), 0},
58 [PIO_TX] = {uart_pio_tx, ARRAY_SIZEOF(uart_pio_tx), 0},
59 [PIO_RX] = {uart_pio_rx, ARRAY_SIZEOF(uart_pio_rx), 0},
61 //const int UART_NUM_PIO_OPS = ARRAY_SIZEOF(uart_pio_ops);