}
udi_intr_attach_cb_t *intr_cb = UDI_MCB(new_cb, udi_intr_attach_cb_t);
intr_cb->interrupt_idx = 0;
- intr_cb->min_event_pend = 2;
- intr_cb->preprocessing_handle = rdata->pio_handles[PIO_RX];
+ intr_cb->min_event_pend = 1;
+ intr_cb->preprocessing_handle = rdata->pio_handles[PIO_INTR];
// Attach interrupt
udi_intr_attach_req(intr_cb);
}
void uart_bus_dev_intr_attach_ack(udi_intr_attach_cb_t *intr_attach_cb, udi_status_t status)
{
+ udi_cb_t *gcb = UDI_GCB(intr_attach_cb);
+ rdata_t *rdata = gcb->context;
+
+ // TODO: Allocate interrupt cbs
+ CONTIN(uart_bus_dev_intr_attach_ack, udi_cb_alloc, (UART_CB_INTR_EVENT, rdata->interrupt_channel),
+ (udi_cb_t *new_cb))
+
+ udi_intr_event_cb_t *cb = UDI_MCB(new_cb, udi_intr_event_cb_t);
+ udi_intr_event_rdy(cb);
+
+ udi_channel_event_cb_t *channel_cb = UDI_MCB(rdata->active_cb, udi_channel_event_cb_t);
+
+ udi_channel_event_complete(channel_cb, UDI_OK);
+ // = = = = =
}
void uart_bus_dev_intr_detach_ack(udi_intr_detach_cb_t *intr_detach_cb)
{
#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)
// 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)
// 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},
//
// 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}
};
} 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);