X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=UDI%2Fdrivers%2Fuart_16c550%2Fuart16c550_pio.h;fp=UDI%2Fdrivers%2Fuart_16c550%2Fuart16c550_pio.h;h=db9998d131be13c01ebb4f983b3b6e4ee100cc34;hb=a32af8dfa5eb5184da620a4efd6484ef50f4a9de;hp=dc3f307e0ec8bb3e847963703fca1f31abd8baee;hpb=c050d8159389ab625fe1448e2cc3b47e07c999b8;p=tpg%2Facess2.git diff --git a/UDI/drivers/uart_16c550/uart16c550_pio.h b/UDI/drivers/uart_16c550/uart16c550_pio.h index dc3f307e..db9998d1 100644 --- a/UDI/drivers/uart_16c550/uart16c550_pio.h +++ b/UDI/drivers/uart_16c550/uart16c550_pio.h @@ -1,7 +1,6 @@ #define PIO_op_RI(op, reg, sz, val) {UDI_PIO_##op+UDI_PIO_DIRECT+UDI_PIO_##reg, UDI_PIO_##sz##BYTE, val} #define PIO_MOV_RI2(reg, val) PIO_op_RI(LOAD_IMM, reg, 2, val) -#define PIO_ADD_RI2(reg, val) PIO_op_RI(ADD, reg, 2, val) -#define PIO_SUB_RI2(reg, val) PIO_op_RI(SUB, reg, 2, val) +#define PIO_MOV_RI1(reg, val) PIO_op_RI(LOAD_IMM, reg, 1, val) #define PIO_OUT_RI1(reg, ofs) PIO_op_RI(OUT, reg, 1, ofs) #define PIO_IN_RI1(reg, ofs) PIO_op_RI(IN, reg, 1, ofs) @@ -10,23 +9,22 @@ // udi_pio_trans_t uart_pio_reset[] = { // TODO: Programmable baud rate - //PIO_MOV_RI2(R0, 0x3F8), // TODO: programmable port number - PIO_ADD_RI2(R0, 1), - PIO_OUT_RI1(R0, 0x00), // +1 = 0x00 - Disable interrupts - PIO_ADD_RI2(R0, 2), - PIO_OUT_RI1(R0, 0x80), // +3 = 0x80 - Enable DLAB - PIO_SUB_RI2(R0, 3), - PIO_OUT_RI1(R0, 0x01), // +0 = 0x01 - Divisor low (115200 baud) - PIO_ADD_RI2(R0, 1), - PIO_OUT_RI1(R0, 0x00), // +1 = 0x00 - Divisor high - PIO_ADD_RI2(R0, 2), - PIO_OUT_RI1(R0, 0x03), // +3 = 0x03 - 8n1 - PIO_SUB_RI2(R0, 1), - PIO_OUT_RI1(R0, 0xC7), // +2 = 0xC7 - Clear FIFO, 14-byte threshold - PIO_ADD_RI2(R0, 2), - PIO_OUT_RI1(R0, 0x0B), // +4 = 0x0B - IRQs enabled, RTS/DSR set - PIO_SUB_RI2(R0, 3), - PIO_OUT_RI1(R0, 0x0B), // +1 = 0x05 - Enable ERBFI (Rx Full), ELSI (Line Status) + PIO_MOV_RI1(R0, 0x00), + PIO_OUT_RI1(R0, 1), // +1 = 0x00 - Disable interrupts + PIO_MOV_RI1(R0, 0x80), + PIO_OUT_RI1(R0, 3), // +3 = 0x80 - Enable DLAB + PIO_MOV_RI1(R0, 0x01), + PIO_OUT_RI1(R0, 0), // +0 = 0x01 - Divisor low (115200 baud) + PIO_MOV_RI1(R0, 0x00), + PIO_OUT_RI1(R0, 1), // +1 = 0x00 - Divisor high + PIO_MOV_RI1(R0, 0x03), + PIO_OUT_RI1(R0, 3), // +3 = 0x03 - 8n1 + PIO_MOV_RI1(R0, 0xC7), + PIO_OUT_RI1(R0, 2), // +2 = 0xC7 - Clear FIFO, 14-byte threshold + PIO_MOV_RI1(R0, 0x0B), + PIO_OUT_RI1(R0, 4), // +4 = 0x0B - IRQs enabled, RTS/DSR set + PIO_MOV_RI1(R0, 0x0B), + PIO_OUT_RI1(R0, 1), // +1 = 0x05 - Enable ERBFI (Rx Full), ELSI (Line Status) {UDI_PIO_END, UDI_PIO_2BYTE, 0} }; // @@ -35,6 +33,38 @@ udi_pio_trans_t uart_pio_reset[] = { udi_pio_trans_t uart_pio_tx[] = { // while( (inb(SERIAL_PORT + 5) & 0x20) == 0 ); // outb(SERIAL_PORT, ch); + + // R0: Temp + // R1: Byte to write + // R2: Buffer size + // R3: Position + {UDI_PIO_LOAD_IMM+UDI_PIO_DIRECT+UDI_PIO_R0, UDI_PIO_2BYTE, 0}, + {UDI_PIO_LOAD+UDI_PIO_MEM+UDI_PIO_R0, UDI_PIO_4BYTE, UDI_PIO_R2}, + + {UDI_PIO_LABEL, 0, 1}, // Loop top + + PIO_op_RI(LOAD, R0, 2, UDI_PIO_R3), + PIO_op_RI(SUB, R0, 2, UDI_PIO_R2), + {UDI_PIO_CSKIP+UDI_PIO_R0, UDI_PIO_1BYTE, UDI_PIO_Z}, + {UDI_PIO_BRANCH, 0, 3}, + + // Load byte into R1 (and increment R3) + {UDI_PIO_LOAD+UDI_PIO_BUF+UDI_PIO_R3, UDI_PIO_1BYTE, UDI_PIO_R1}, + PIO_op_RI(ADD_IMM, R3, 2, 1), + + // TX single byte from R1 + // - Wait for FIFO to clear + {UDI_PIO_LABEL, 0, 2}, + PIO_IN_RI1(R0, 5), + {UDI_PIO_AND_IMM+UDI_PIO_DIRECT+UDI_PIO_DIRECT, UDI_PIO_1BYTE, 0x20}, + {UDI_PIO_CSKIP+UDI_PIO_R0, UDI_PIO_1BYTE, UDI_PIO_Z}, + {UDI_PIO_BRANCH, 0, 1}, + // - TX + PIO_OUT_RI1(R1, 0), + {UDI_PIO_BRANCH, 0, 2}, + + // Done + {UDI_PIO_LABEL, 0, 3}, {UDI_PIO_END, UDI_PIO_2BYTE, 0} }; //