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=850cb81df18d5d2e778f634d63a312800aa4132c;hb=5b80adc9ea328e519329ba299fcf8ffe0daf2704;hp=db9998d131be13c01ebb4f983b3b6e4ee100cc34;hpb=a32af8dfa5eb5184da620a4efd6484ef50f4a9de;p=tpg%2Facess2.git diff --git a/UDI/drivers/uart_16c550/uart16c550_pio.h b/UDI/drivers/uart_16c550/uart16c550_pio.h index db9998d1..850cb81d 100644 --- a/UDI/drivers/uart_16c550/uart16c550_pio.h +++ b/UDI/drivers/uart_16c550/uart16c550_pio.h @@ -1,6 +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_MOV_RI1(reg, val) PIO_op_RI(LOAD_IMM, reg, 1, val) +#define PIO_MOV_RI1(reg, val) PIO_op_RI(LOAD_IMM, reg, 2, val) // Load IMM has to be 2 bytes #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) @@ -38,14 +38,16 @@ udi_pio_trans_t uart_pio_tx[] = { // R1: Byte to write // R2: Buffer size // R3: Position + {UDI_PIO_LOAD_IMM+UDI_PIO_DIRECT+UDI_PIO_R3, UDI_PIO_2BYTE, 0}, {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), + + {UDI_PIO_STORE+UDI_PIO_DIRECT+UDI_PIO_R0, UDI_PIO_2BYTE, UDI_PIO_R3}, + //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_CSKIP+UDI_PIO_R0, UDI_PIO_1BYTE, UDI_PIO_NZ}, {UDI_PIO_BRANCH, 0, 3}, // Load byte into R1 (and increment R3) @@ -54,14 +56,16 @@ udi_pio_trans_t uart_pio_tx[] = { // TX single byte from R1 // - Wait for FIFO to clear + // while( (inb(SERIAL_PORT + 5) & 0x20) == 0 ); {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}, + PIO_op_RI(AND_IMM, R0, 1, 0x20), + {UDI_PIO_CSKIP+UDI_PIO_R0, UDI_PIO_1BYTE, UDI_PIO_NZ}, + {UDI_PIO_BRANCH, 0, 2}, // - TX + // outb(SERIAL_PORT, ch); PIO_OUT_RI1(R1, 0), - {UDI_PIO_BRANCH, 0, 2}, + {UDI_PIO_BRANCH, 0, 1}, // Done {UDI_PIO_LABEL, 0, 3}, @@ -70,10 +74,25 @@ udi_pio_trans_t uart_pio_tx[] = { // // Recieve (interrupt) // -udi_pio_trans_t uart_pio_rx[] = { +udi_pio_trans_t uart_pio_intr[] = { + // 0: Enable interrupts + {UDI_PIO_END, UDI_PIO_2BYTE, 0}, + // 1: Interrupt // if( (inb(SERIAL_PORT+5) & 0x01) == 0 ) // return -1; // return inb(SERIAL_PORT); + {UDI_PIO_LABEL, 0, 1}, + PIO_IN_RI1(R0, 5), + PIO_op_RI(AND_IMM, R0, 1, 0x01), + {UDI_PIO_CSKIP+UDI_PIO_R0, UDI_PIO_1BYTE, UDI_PIO_Z}, + {UDI_PIO_END, UDI_PIO_2BYTE, 0}, + PIO_MOV_RI1(R2, 0), + PIO_MOV_RI1(R1, UDI_INTR_UNCLAIMED), + {UDI_PIO_STORE+UDI_PIO_SCRATCH+UDI_PIO_R2, UDI_PIO_1BYTE, UDI_PIO_R1}, + {UDI_PIO_END, UDI_PIO_2BYTE, 0}, + + // 2: Interrupt Overrun + {UDI_PIO_LABEL, 0, 2}, {UDI_PIO_END, UDI_PIO_2BYTE, 0} }; @@ -86,7 +105,7 @@ struct { } uart_pio_ops[] = { [PIO_RESET] = {uart_pio_reset, ARRAY_SIZEOF(uart_pio_reset), 0}, [PIO_TX] = {uart_pio_tx, ARRAY_SIZEOF(uart_pio_tx), 0}, - [PIO_RX] = {uart_pio_rx, ARRAY_SIZEOF(uart_pio_rx), 0}, + [PIO_INTR] = {uart_pio_intr, ARRAY_SIZEOF(uart_pio_intr), 0}, }; //const int UART_NUM_PIO_OPS = ARRAY_SIZEOF(uart_pio_ops);