This is the mail archive of the
ecos-patches@sourceware.org
mailing list for the eCos project.
patch to lpc2xxx serial isr
- From: Alexey Shusharin <mrfinch at mail dot ru>
- To: ecos-patches at ecos dot sourceware dot org
- Date: Mon, 04 Jun 2007 14:44:35 +0700
- Subject: patch to lpc2xxx serial isr
Hello,
This patch corrects the issue with a serial isr handler
(cyg_hal_plf_serial_isr) in lpc2xxx variant layer.
The old version of this function does't read UxIIR register in order to
clear the interrupt flag. So, the cyg_hal_plf_serial_isr calling never
stops and prevents dsr and thread execution.
Best regards
Alexey Shusharin
Index: hal/arm/lpc2xxx/var/current/ChangeLog
===================================================================
RCS file: /cvs/ecos/ecos/packages/hal/arm/lpc2xxx/var/current/ChangeLog,v
retrieving revision 1.5
diff -b -u -r1.5 ChangeLog
--- hal/arm/lpc2xxx/var/current/ChangeLog 4 Feb 2007 00:16:42 -0000 1.5
+++ hal/arm/lpc2xxx/var/current/ChangeLog 4 Jun 2007 06:51:26 -0000
@@ -1,3 +1,9 @@
+2007-06-04 Alexey Shusharin <mrfinch@mail.ru>
+ * src/hal_diag.c (cyg_hal_plf_serial_isr): Fixed issue with UART ISR
+ handling. Old handler doesn't read UxIIR register in order to clear
+ interrupt flag. So, the handler calling never stops and prevents DSR and
+ thread execution.
+
2006-02-03 Sergei Gavrikov <sg@sgs.gomel.by>
* cdl/hal_arm_lpc2xxx.cdl: Added CYGNUM_HAL_ARM_VECTOR_0x14. That
Index: hal/arm/lpc2xxx/var/current/src/hal_diag.c
===================================================================
RCS file: /cvs/ecos/ecos/packages/hal/arm/lpc2xxx/var/current/src/hal_diag.c,v
retrieving revision 1.1
diff -b -u -r1.1 hal_diag.c
--- hal/arm/lpc2xxx/var/current/src/hal_diag.c 14 Nov 2004 14:12:44 -0000 1.1
+++ hal/arm/lpc2xxx/var/current/src/hal_diag.c 4 Jun 2007 06:51:27 -0000
@@ -242,16 +242,21 @@
int res = 0;
channel_data_t* chan = (channel_data_t*)__ch_data;
cyg_uint8 c;
- cyg_uint8 stat;
+ cyg_uint8 iir;
+
CYGARC_HAL_SAVE_GP();
*__ctrlc = 0;
- HAL_READ_UINT32(chan->base+CYGARC_HAL_LPC2XXX_REG_UxLSR, stat);
- if ( (stat & CYGARC_HAL_LPC2XXX_REG_UxLSR_RDR) != 0 ) {
+ HAL_READ_UINT32(chan->base + CYGARC_HAL_LPC2XXX_REG_UxIIR, iir);
+
+ if((iir & (CYGARC_HAL_LPC2XXX_REG_UxIIR_IIR0 | CYGARC_HAL_LPC2XXX_REG_UxIIR_IIR1 |
+ CYGARC_HAL_LPC2XXX_REG_UxIIR_IIR2)) == CYGARC_HAL_LPC2XXX_REG_UxIIR_IIR2)
+ {
+ // Rx data available or character timeout
+ // Read data in order to clear interrupt
HAL_READ_UINT32(chan->base+CYGARC_HAL_LPC2XXX_REG_UxRBR, c);
- if( cyg_hal_is_break( &c , 1 ) )
- *__ctrlc = 1;
+ if( cyg_hal_is_break( &c , 1 ) ) *__ctrlc = 1;
res = CYG_ISR_HANDLED;
}