changeset 2540:d3fd907caafd

* cdl/ser_powerpc_mpc555.cdl: Add line status * src/mpc555_serial_with_ints.c: Fixed exception caused by attempt to clear scsr bits. Add line status callbacks
author asl
date Tue, 02 Sep 2008 05:56:02 +0000
parents 11949247abb3
children b93af20fcb81
files packages/devs/serial/powerpc/mpc555/current/ChangeLog packages/devs/serial/powerpc/mpc555/current/cdl/ser_powerpc_mpc555.cdl packages/devs/serial/powerpc/mpc555/current/src/mpc555_serial_with_ints.c
diffstat 3 files changed, 37 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/packages/devs/serial/powerpc/mpc555/current/ChangeLog
+++ b/packages/devs/serial/powerpc/mpc555/current/ChangeLog
@@ -1,3 +1,10 @@
+2008-05-13  Steven Clugston  <steven.clugston@ncl.ac.uk>
+
+	* cdl/ser_powerpc_mpc555.cdl: Add line status
+	* src/mpc555_serial_with_ints.c: 
+	  Fixed exception caused by attempt to clear scsr bits.
+	  Add line status callbacks
+
 2008-04-06  Steven Clugston <steven.clugston@ncl.ac.uk>
 
 	* Refactored cme555 package to more generic mpc555
--- a/packages/devs/serial/powerpc/mpc555/current/cdl/ser_powerpc_mpc555.cdl
+++ b/packages/devs/serial/powerpc/mpc555/current/cdl/ser_powerpc_mpc555.cdl
@@ -72,6 +72,7 @@ cdl_component CYGPKG_IO_SERIAL_POWERPC_M
     display       "mpc555 PowerPC serial port A driver"
     flavor        bool
     default_value 0
+    implements    CYGINT_IO_SERIAL_LINE_STATUS_HW
     description   "
         This option includes the serial device driver for the mpc555
         PowerPC port A."
@@ -110,6 +111,7 @@ cdl_component CYGPKG_IO_SERIAL_POWERPC_M
     display       "mpc555 PowerPC serial port B driver"
     flavor        bool
     default_value 1
+    implements    CYGINT_IO_SERIAL_LINE_STATUS_HW
     description   "
         This option includes the serial device driver for the mpc555
         PowerPC port B."
--- a/packages/devs/serial/powerpc/mpc555/current/src/mpc555_serial_with_ints.c
+++ b/packages/devs/serial/powerpc/mpc555/current/src/mpc555_serial_with_ints.c
@@ -609,14 +609,38 @@ static void mpc555_serial_rx_DSR(cyg_vec
   cyg_uint16 scdr;
   cyg_uint16 scsr;
 
-  // Allways read out the received character, in order to clear receiver flags
-  HAL_READ_UINT16(port + MPC555_SERIAL_SCxDR, scdr);
+#ifdef CYGOPT_IO_SERIAL_SUPPORT_LINE_STATUS
+  cyg_serial_line_status_t stat;
+#endif
 
   HAL_READ_UINT16(port + MPC555_SERIAL_SCxSR, scsr);
+  // Always read out the received character, in order to clear receiver flags
+  HAL_READ_UINT16(port + MPC555_SERIAL_SCxDR, scdr);
+  
   if(scsr & (cyg_uint16)MPC555_SERIAL_SCxSR_ERRORS)
   {
-    scsr &= ~((cyg_uint16)MPC555_SERIAL_SCxSR_ERRORS);
-    HAL_WRITE_UINT16(port + MPC555_SERIAL_SCxSR, scsr);
+#ifdef CYGOPT_IO_SERIAL_SUPPORT_LINE_STATUS
+    if(scsr & MPC555_SERIAL_SCxSR_OR)
+    {
+      stat.which = CYGNUM_SERIAL_STATUS_OVERRUNERR;
+      (chan->callbacks->indicate_status)(chan, &stat);
+    } 
+    if(scsr & MPC555_SERIAL_SCxSR_NF)
+    {
+      stat.which = CYGNUM_SERIAL_STATUS_NOISEERR;
+      (chan->callbacks->indicate_status)(chan, &stat);
+    } 
+    if(scsr & MPC555_SERIAL_SCxSR_FE)
+    {
+      stat.which = CYGNUM_SERIAL_STATUS_FRAMEERR;
+      (chan->callbacks->indicate_status)(chan, &stat);
+    } 
+    if(scsr & MPC555_SERIAL_SCxSR_PF)
+    {
+      stat.which = CYGNUM_SERIAL_STATUS_PARITYERR;
+      (chan->callbacks->indicate_status)(chan, &stat);
+    }
+#endif
   }
   else
   {