This is the mail archive of the ecos-patches@sourceware.org mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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;
     }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]