SH4 scif serial driver

Andrew Lunn andrew@lunn.ch
Tue Aug 9 16:15:00 GMT 2005


Hi Folks

A while back Hajime Ishitani submitted a patch for the scif serial
driver on the SH architecuture to work with SH4. This has now been
committed.

        Andrew
-------------- next part --------------
Index: packages/devs/serial/sh/scif/current/ChangeLog
===================================================================
RCS file: /cvs/ecos/ecos/packages/devs/serial/sh/scif/current/ChangeLog,v
retrieving revision 1.9
diff -u -r1.9 ChangeLog
--- packages/devs/serial/sh/scif/current/ChangeLog	18 Mar 2003 18:18:38 -0000	1.9
+++ packages/devs/serial/sh/scif/current/ChangeLog	4 Aug 2005 18:43:09 -0000
@@ -1,3 +1,8 @@
+2005-08-04  Andrew Lunn  <andrew.lunn@ascom.ch>
+2005-05-02  Hajime Ishitani <pigmon@mail.snd.co.jp>
+
+	* src/sh_scif_serial.c: support SH4 register access
+
 2003-03-18  Gary Thomas  <gary@mlbassoc.com>
 
 	* src/sh_scif_serial.c (sh_scif_set_config): 
Index: packages/devs/serial/sh/scif/current/src/sh_scif_serial.c
===================================================================
RCS file: /cvs/ecos/ecos/packages/devs/serial/sh/scif/current/src/sh_scif_serial.c,v
retrieving revision 1.8
diff -u -r1.8 sh_scif_serial.c
--- packages/devs/serial/sh/scif/current/src/sh_scif_serial.c	18 Mar 2003 18:18:38 -0000	1.8
+++ packages/devs/serial/sh/scif/current/src/sh_scif_serial.c	4 Aug 2005 18:43:11 -0000
@@ -32,9 +32,6 @@
 //
 // This exception does not invalidate any other reasons why a work based on
 // this file might be covered by the GNU General Public License.
-//
-// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
-// at http://sources.redhat.com/ecos/ecos-license/
 // -------------------------------------------
 //####ECOSGPLCOPYRIGHTEND####
 //==========================================================================
@@ -85,6 +82,9 @@
 # define SCIF_SCFDR      0x10      // FIFO data count register
 # define SCIF_SCFER      0x12      // FIFO error register
 # define SCIF_SCIMR      0x14      // IrDA mode register
+# define HAL_READ(x,y)  HAL_READ_UINT8(x,y)
+# define HAL_WRITE(x,y) HAL_WRITE_UINT8(x,y)  
+
 #elif defined(CYGPKG_HAL_SH_SH3)
 // The SCIF controller register layout on the SH3
 // The controller base is defined in the board specification file.
@@ -96,7 +96,22 @@
 # define SCIF_SCFRDR     0x0a      // receive data register
 # define SCIF_SCFCR      0x0c      // FIFO control
 # define SCIF_SCFDR      0x0e      // FIFO data count register
+# define HAL_READ(x,y)  HAL_READ_UINT8(x,y)
+# define HAL_WRITE(x,y) HAL_WRITE_UINT8(x,y)  
+#elif defined(CYGPKG_HAL_SH_SH4)
+// The SCIF controller register layout on the SH4
+// The controller base is defined in the board specification file.
+# define SCIF_SCSMR      0x00      // serial mode register
+# define SCIF_SCBRR      0x04      // bit rate register
+# define SCIF_SCSCR      0x08      // serial control register
+# define SCIF_SCFTDR     0x0C      // transmit data register
+# define SCIF_SCSSR      0x10      // serial status register
+# define SCIF_SCFRDR     0x14      // receive data register
+# define SCIF_SCFCR      0x18      // FIFO control
+# define SCIF_SCFDR      0x1C      // FIFO data count register
+# define HAL_READ(x,y)  HAL_READ_UINT16(x,y)
+# define HAL_WRITE(x,y) HAL_WRITE_UINT16(x,y)  
 #else
 # error "Unsupported variant"
 #endif
 
@@ -254,12 +269,12 @@
         return false;
 
     // Disable SCI interrupts while changing hardware
-    HAL_READ_UINT8(base+SCIF_SCSCR, _scr);
-    HAL_WRITE_UINT8(base+SCIF_SCSCR, 0);
+    HAL_READ(base+SCIF_SCSCR, _scr);
+    HAL_WRITE(base+SCIF_SCSCR, 0);
 
     // Reset FIFO.
-    HAL_WRITE_UINT8(base+SCIF_SCFCR, 
-                    CYGARC_REG_SCIF_SCFCR_TFRST|CYGARC_REG_SCIF_SCFCR_RFRST);
+    HAL_WRITE(base+SCIF_SCFCR, 
+              CYGARC_REG_SCIF_SCFCR_TFRST|CYGARC_REG_SCIF_SCFCR_RFRST);
 
 #ifdef CYGINT_IO_SERIAL_SH_SCIF_ASYNC_RXTX
     sh_chan->async_rxtx_mode = false;
@@ -285,16 +300,16 @@
 #ifdef CYGINT_IO_SERIAL_SH_SCIF_IRDA
 #ifdef SCIF_SCIMR
         // Disable IrDA mode
-        HAL_WRITE_UINT8(base+SCIF_SCIMR, 0);
+        HAL_WRITE(base+SCIF_SCIMR, 0);
 #endif
 #endif
     }
-    HAL_WRITE_UINT8(base+SCIF_SCSMR, _smr);
+    HAL_WRITE(base+SCIF_SCSMR, _smr);
 
     // Set baud rate.
     _smr &= ~CYGARC_REG_SCIF_SCSMR_CKSx_MASK;
     _smr |= baud_divisor >> 8;
-    HAL_WRITE_UINT8(base+SCIF_SCSMR, _smr);
+    HAL_WRITE(base+SCIF_SCSMR, _smr);
     HAL_WRITE_UINT8(base+SCIF_SCBRR, baud_divisor & 0xff);
 
     // FIXME: Should delay 1/<baud> second here.
@@ -322,10 +337,10 @@
     // and actual transmission stop, it may be necessary to reduce the
     // trigger level further.
 #ifdef CYGOPT_IO_SERIAL_FLOW_CONTROL_HW
-    HAL_WRITE_UINT8(base+SCIF_SCFCR, 
+    HAL_WRITE(base+SCIF_SCFCR, 
                     CYGARC_REG_SCIF_SCFCR_RTRG_8|CYGARC_REG_SCIF_SCFCR_TTRG_8);
 #else
-    HAL_WRITE_UINT8(base+SCIF_SCFCR, 
+    HAL_WRITE(base+SCIF_SCFCR, 
                     CYGARC_REG_SCIF_SCFCR_RTRG_14|CYGARC_REG_SCIF_SCFCR_TTRG_8);
 #endif
 
@@ -345,7 +360,7 @@
             _scr |= CYGARC_REG_SCIF_SCSCR_RIE; // enable rx interrupts
     }
      
-    HAL_WRITE_UINT8(base+SCIF_SCSCR, _scr);
+    HAL_WRITE(base+SCIF_SCSCR, _scr);
 
     if (new_config != &chan->config) {
         chan->config = *new_config;
@@ -537,12 +552,12 @@
               // RX interrupt.  When disabled, FIFO will fill up and
               // clear RTS.
               cyg_uint8 _scscr;
-              HAL_READ_UINT8(base+SCIF_SCSCR, _scscr);
+              HAL_READ(base+SCIF_SCSCR, _scscr);
               if (*f) // we should throttle
                   _scscr &= ~CYGARC_REG_SCIF_SCSCR_RIE;
               else // we should no longer throttle
                   _scscr |= CYGARC_REG_SCIF_SCSCR_RIE;
-              HAL_WRITE_UINT8(base+SCIF_SCSCR, _scscr);
+              HAL_WRITE(base+SCIF_SCSCR, _scscr);
           }
 #ifdef CYGHWR_SH_SCIF_FLOW_DSRDTR
           if ( chan->config.flags & CYGNUM_SERIAL_FLOW_DSRDTR_RX ) {
@@ -562,12 +577,12 @@
               cyg_addrword_t base = ser_chan->ctrl_base;
               cyg_uint8 *f = (cyg_uint8 *)xbuf;
 
-              HAL_READ_UINT8(base+SCIF_SCFCR, _scfcr);
+              HAL_READ(base+SCIF_SCFCR, _scfcr);
               if (*f) // enable RTS/CTS flow control
                   _scfcr |= CYGARC_REG_SCIF_SCFCR_MCE;
               else // disable RTS/CTS flow control
                   _scfcr &= ~CYGARC_REG_SCIF_SCFCR_MCE;
-              HAL_WRITE_UINT8(base+SCIF_SCFCR, _scfcr);
+              HAL_WRITE(base+SCIF_SCFCR, _scfcr);
           }
 #ifndef CYGHWR_SH_SCIF_FLOW_DSRDTR
           // Clear DSR/DTR flag as it's not supported.
@@ -630,9 +645,9 @@
                          | CYGARC_REG_CHCR_IE | CYGARC_REG_CHCR_DE);
 
         // Enable serial interrupts
-        HAL_READ_UINT8(sh_chan->ctrl_base+SCIF_SCSCR, scr);
+        HAL_READ(sh_chan->ctrl_base+SCIF_SCSCR, scr);
         scr |= CYGARC_REG_SCIF_SCSCR_TIE;
-        HAL_WRITE_UINT8(sh_chan->ctrl_base+SCIF_SCSCR, scr);
+        HAL_WRITE(sh_chan->ctrl_base+SCIF_SCSCR, scr);
     }
 
     return res;
@@ -690,9 +705,9 @@
     cyg_uint32 _cr;
 
     // mask serial interrupt
-    HAL_READ_UINT8(sh_chan->ctrl_base+SCIF_SCSCR, _cr);
+    HAL_READ(sh_chan->ctrl_base+SCIF_SCSCR, _cr);
     _cr &= ~CYGARC_REG_SCIF_SCSCR_TIE;      // Disable xmit interrupt
-    HAL_WRITE_UINT8(sh_chan->ctrl_base+SCIF_SCSCR, _cr);
+    HAL_WRITE(sh_chan->ctrl_base+SCIF_SCSCR, _cr);
 
     // mask DMA interrupt and disable engine
     HAL_READ_UINT32(sh_chan->dma_xmt_base+CYGARC_REG_CHCR, _cr);
@@ -753,7 +768,7 @@
         // middle of this would result in a bad CR state.
         cyg_drv_isr_lock();
         {
-            HAL_READ_UINT8(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
+            HAL_READ(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
             _scr |= CYGARC_REG_SCIF_SCSCR_TIE;       // Enable xmit interrupt
 #ifdef CYGINT_IO_SERIAL_SH_SCIF_IRDA
             if (sh_chan->irda_mode) {
@@ -773,7 +788,7 @@
                 _scr &= ~CYGARC_REG_SCIF_SCSCR_RE;
             }
 #endif
-            HAL_WRITE_UINT8(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
+            HAL_WRITE(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
             sh_chan->tx_enabled = true;
         }
         cyg_drv_isr_unlock();
@@ -812,7 +827,7 @@
     // result in a bad CR state.
     cyg_drv_isr_lock();
     {
-            HAL_READ_UINT8(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
+            HAL_READ(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
             _scr &= ~CYGARC_REG_SCIF_SCSCR_TIE;      // Disable xmit interrupt
 #ifdef CYGINT_IO_SERIAL_SH_SCIF_IRDA
             if (sh_chan->irda_mode) {
@@ -841,7 +856,7 @@
                 _scr &= ~CYGARC_REG_SCIF_SCSCR_TE;
             }
 #endif
-            HAL_WRITE_UINT8(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
+            HAL_WRITE(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
     }
     cyg_drv_isr_unlock();
 
@@ -862,9 +877,9 @@
     sh_scif_info *sh_chan = (sh_scif_info *)chan->dev_priv;
     cyg_uint8 _scr;
 
-    HAL_READ_UINT8(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
+    HAL_READ(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
     _scr &= ~CYGARC_REG_SCIF_SCSCR_TIE;      // mask out tx interrupts
-    HAL_WRITE_UINT8(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
+    HAL_WRITE(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
 
     return CYG_ISR_CALL_DSR;  // Cause DSR to be run
 }
@@ -925,9 +940,9 @@
 
     if (sh_chan->tx_enabled) {
         cyg_uint8 _scr;
-        HAL_READ_UINT8(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
+        HAL_READ(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
         _scr |= CYGARC_REG_SCIF_SCSCR_TIE;       // unmask tx interrupts
-        HAL_WRITE_UINT8(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
+        HAL_WRITE(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
     }
 }
 
@@ -939,9 +954,9 @@
     sh_scif_info *sh_chan = (sh_scif_info *)chan->dev_priv;
     cyg_uint8 _scr;
 
-    HAL_READ_UINT8(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
+    HAL_READ(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
     _scr &= ~CYGARC_REG_SCIF_SCSCR_RIE;      // mask rx interrupts
-    HAL_WRITE_UINT8(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
+    HAL_WRITE(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
     return CYG_ISR_CALL_DSR;            // Cause DSR to be run
 }
 
@@ -998,9 +1013,9 @@
     HAL_WRITE_UINT16(sh_chan->ctrl_base+SCIF_SCSSR, 
                      CYGARC_REG_SCIF_SCSSR_CLEARMASK & ~(CYGARC_REG_SCIF_SCSSR_RDF|CYGARC_REG_SCIF_SCSSR_DR));
 
-    HAL_READ_UINT8(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
+    HAL_READ(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
     _scr |= CYGARC_REG_SCIF_SCSCR_RIE;       // unmask rx interrupts
-    HAL_WRITE_UINT8(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
+    HAL_WRITE(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
 }
 
 // Serial I/O - low level error interrupt handler (ISR)
@@ -1011,9 +1026,9 @@
     sh_scif_info *sh_chan = (sh_scif_info *)chan->dev_priv;
     cyg_uint8 _scr;
 
-    HAL_READ_UINT8(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
+    HAL_READ(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
     _scr &= ~CYGARC_REG_SCIF_SCSCR_RIE;      // mask rx interrupts
-    HAL_WRITE_UINT8(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
+    HAL_WRITE(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
     return CYG_ISR_CALL_DSR;            // Cause DSR to be run
 }
 
@@ -1070,9 +1085,9 @@
     }
     HAL_WRITE_UINT16(sh_chan->ctrl_base+SCIF_SCSSR, _ssr_mask);
 
-    HAL_READ_UINT8(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
+    HAL_READ(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
     _scr |= CYGARC_REG_SCIF_SCSCR_RIE;       // unmask rx interrupts
-    HAL_WRITE_UINT8(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
+    HAL_WRITE(sh_chan->ctrl_base+SCIF_SCSCR, _scr);
 }
 
 #endif // ifdef CYGDAT_IO_SERIAL_SH_SCIF_INL


More information about the Ecos-patches mailing list