X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;ds=sidebyside;f=cpu%2Farm%2Fdrv%2Fser_at91.c;fp=cpu%2Farm%2Fdrv%2Fser_at91.c;h=650529b5d6f1a7b88464ea884af24435d0388d4b;hb=569cd794010c99ae8e3e2e37a207b0a2eaeb2c3f;hp=f64eb0f88a7adbb6c03294e05a597e6fc0f98574;hpb=2f58ecf977cf1e0cf8c86382d61e5148a7174051;p=bertos.git diff --git a/cpu/arm/drv/ser_at91.c b/cpu/arm/drv/ser_at91.c index f64eb0f8..650529b5 100644 --- a/cpu/arm/drv/ser_at91.c +++ b/cpu/arm/drv/ser_at91.c @@ -145,10 +145,15 @@ static void serirq_tx(void) { /* Enable Tx and Rx */ US0_CR = BV(US_RXEN) | BV(US_TXEN); + /* Enable Rx interrupt */ + US0_IER = BV(US_RXRDY); + /* Disable Tx interrupt */ + US0_IDR = BV(US_TXRDY); } else { char c = fifo_pop(txfifo); + kprintf("Tx char: %c\n", c); /* Send one char */ US0_THR = c; } @@ -163,7 +168,7 @@ static void serirq_rx(void) { SER_STROBE_ON; - /* Should be read before UDR */ + /* Should be read before US_CRS */ ser_uart0->status |= US0_CSR & (SERRF_RXSROVERRUN | SERRF_FRAMEERROR); char c = US0_RHR; @@ -173,6 +178,7 @@ static void serirq_rx(void) ser_uart0->status |= SERRF_RXFIFOOVERRUN; else { + kprintf("Recv char: %c\n", c); fifo_push(rxfifo, c); } @@ -188,11 +194,15 @@ static void serirq_dispatcher(void) IRQ_ENTRY(); if (US0_IMR & BV(US_RXRDY)) + { + kprintf("IRQ RX\n"); serirq_rx(); - + } if (US0_IMR & BV(US_TXRDY)) + { + kprintf("IRQ TX\n"); serirq_tx(); - + } IRQ_EXIT(); } @@ -219,17 +229,17 @@ static void uart0_init( /* Disable GPIO on UART tx/rx pins. */ PIOA_PDR = BV(5) | BV(6); - /* Set serial param: mode Normal, 8bit data, 1bit stop */ - US0_MR = US_CHMODE_NORMAL | US_CHRL_8 | US_NBSTOP_1; - /* Reset UART. */ US0_CR = BV(US_RSTRX) | BV(US_RSTTX); + /* Set serial param: mode Normal, 8bit data, 1bit stop */ + US0_MR = US_CHMODE_NORMAL | US_CHRL_8 | US_NBSTOP_1; + /* Enable Tx and Rx */ US0_CR = BV(US_RXEN) | BV(US_TXEN); - /* Enable Tx and Rx interrupt*/ - US0_IER = BV(US_RXRDY) | BV(US_TXRDY); + /* Enable Rx interrupt*/ + US0_IER = BV(US_RXRDY); } @@ -253,6 +263,8 @@ static void uart0_enabletxirq(struct SerialHardware *_hw) hw->sending = true; /* Enable Tx and Rx */ US0_CR = BV(US_RXEN) | BV(US_TXEN); + /* Enable Tx and Rx interrupt*/ + US0_IER = BV(US_TXRDY) | BV(US_RXRDY); } }