dc3f307e0ec8bb3e847963703fca1f31abd8baee
[tpg/acess2.git] / UDI / drivers / uart_16c550 / uart16c550_pio.h
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)
7
8 //
9 // Reset
10 // 
11 udi_pio_trans_t uart_pio_reset[] = {
12         // TODO: Programmable baud rate
13         //PIO_MOV_RI2(R0, 0x3F8),       // TODO: programmable port number
14         PIO_ADD_RI2(R0, 1),
15         PIO_OUT_RI1(R0, 0x00),  // +1 = 0x00 - Disable interrupts
16         PIO_ADD_RI2(R0, 2),
17         PIO_OUT_RI1(R0, 0x80),  // +3 = 0x80 - Enable DLAB
18         PIO_SUB_RI2(R0, 3),
19         PIO_OUT_RI1(R0, 0x01),  // +0 = 0x01 - Divisor low      (115200 baud)
20         PIO_ADD_RI2(R0, 1),
21         PIO_OUT_RI1(R0, 0x00),  // +1 = 0x00 - Divisor high
22         PIO_ADD_RI2(R0, 2),
23         PIO_OUT_RI1(R0, 0x03),  // +3 = 0x03 - 8n1
24         PIO_SUB_RI2(R0, 1),
25         PIO_OUT_RI1(R0, 0xC7),  // +2 = 0xC7 - Clear FIFO, 14-byte threshold
26         PIO_ADD_RI2(R0, 2),
27         PIO_OUT_RI1(R0, 0x0B),  // +4 = 0x0B - IRQs enabled, RTS/DSR set
28         PIO_SUB_RI2(R0, 3),
29         PIO_OUT_RI1(R0, 0x0B),  // +1 = 0x05 - Enable ERBFI (Rx Full), ELSI (Line Status)
30         {UDI_PIO_END, UDI_PIO_2BYTE, 0}
31 };
32 //
33 // Transmit
34 //
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}
39 };
40 //
41 // Recieve (interrupt)
42 //
43 udi_pio_trans_t uart_pio_rx[] = {
44         // if( (inb(SERIAL_PORT+5) & 0x01) == 0 )
45         //      return -1;
46         // return inb(SERIAL_PORT); 
47         {UDI_PIO_END, UDI_PIO_2BYTE, 0}
48 };
49
50 #define ARRAY_SIZEOF(arr)       (sizeof(arr)/sizeof(arr[0]))
51
52 struct {
53         udi_pio_trans_t *trans_list;
54         udi_ubit16_t    list_length;
55         udi_ubit16_t    pio_attributes;
56 } uart_pio_ops[] = {
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},
60 };
61 //const int UART_NUM_PIO_OPS = ARRAY_SIZEOF(uart_pio_ops);
62

UCC git Repository :: git.ucc.asn.au