diff packages/hal/arm/edb7xxx/current/support/io.c @ 54:f10165814f1e ecos-sw-1999-11-19

Merge from eCos master repository on 1999-11-19-22:24:39-GMT
author jlarmour
date Fri, 19 Nov 1999 23:37:56 +0000
parents
children c38311975d4f
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/packages/hal/arm/edb7xxx/current/support/io.c
@@ -0,0 +1,151 @@
+//==========================================================================
+//
+//        io.c
+//
+//        Linux I/O support for Cirrus Logic EDB7xxx eval board tools
+//
+//==========================================================================
+//####COPYRIGHTBEGIN####
+//
+// -------------------------------------------
+// The contents of this file are subject to the Cygnus eCos Public License
+// Version 1.0 (the "License"); you may not use this file except in
+// compliance with the License.  You may obtain a copy of the License at
+// http://sourceware.cygnus.com/ecos
+// 
+// Software distributed under the License is distributed on an "AS IS"
+// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the
+// License for the specific language governing rights and limitations under
+// the License.
+// 
+// The Original Code is eCos - Embedded Cygnus Operating System, released
+// September 30, 1998.
+// 
+// The Initial Developer of the Original Code is Cygnus.  Portions created
+// by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions.  All Rights Reserved.
+// -------------------------------------------
+//
+//####COPYRIGHTEND####
+//==========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):     gthomas
+// Contributors:  gthomas
+// Date:          1999-06-16
+// Description:   Linux I/O support for Cirrus Logic EDB7xxx FLASH tools
+//####DESCRIPTIONEND####
+
+//
+// io.c - I/O functions
+//
+
+#include <stdio.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <termios.h>
+
+char ReceiveChar(long port)
+{
+    char buf;
+    int res;
+    // Port is in non-blocking mode, this needs to have a loop
+    do {
+        res = read(port, &buf, 1);
+    } while (res < 0);
+//    printf("Read: %c\n", buf);
+    return buf;
+}
+
+static void
+uspin(int len)
+{
+    volatile int cnt;
+    while (--len >= 0) {
+        for (cnt = 1;  cnt < 2000;  cnt++) ;
+    }
+}
+
+void SendChar(long port, char ch)
+{
+    char buf = ch;
+    write(port, &buf, 1);
+//    printf("Send: %x\n", ch);
+//    usleep(100);
+    uspin(100);
+}
+
+void SetBaud(long port, long reqRate)
+{
+    struct termios buf;
+    int rate;
+
+    // Get original configuration
+    if (tcgetattr(port, &buf)) {
+        fprintf(stderr, "Can't get port config\n");
+        return;
+    }
+
+    // Reset to raw.
+    buf.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
+                     |INLCR|IGNCR|ICRNL|IXON);
+    buf.c_oflag &= ~OPOST;
+    buf.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
+    buf.c_cflag &= ~(CSIZE|PARENB);
+    buf.c_cflag |= CS8;
+
+    // Set baud rate.
+    switch (reqRate) {
+    case 9600:
+        rate = B9600;
+        break;
+    case 38400:
+        rate = B38400;
+        break;
+    case 57600:
+        rate = B57600;
+        break;
+    case 115200:
+        rate = B115200;
+        break;
+    }
+    cfsetispeed(&buf, rate);
+    cfsetospeed(&buf, rate);
+
+    // Set data bits.
+    buf.c_cflag &= ~CSIZE;
+    buf.c_cflag |= CS8;
+
+    // Set stop bits.
+    buf.c_cflag &= ~CSTOPB;  // One stop
+
+    // Set parity.
+    buf.c_cflag &= ~(PARENB | PARODD); // no parity.
+    
+    // Set the new settings
+    if (tcsetattr(port, TCSADRAIN, &buf)) {
+	fprintf(stderr, "Error: tcsetattr\n");
+	return;
+    }
+
+    tcdrain(port);
+    usleep(1000000/10*2);
+}
+
+int CharReady(long port)
+{
+    int n, res;
+    res = ioctl(port, FIONREAD, &n);
+    return n;  // Non-zero if characters ready to read
+}
+
+void WaitForOutputEmpty(long port)
+{
+    usleep(2000000);
+}
+
+long OpenPort(char *name)
+{
+    int fd;
+    fd = open(name, O_RDWR|O_NONBLOCK);
+    return fd;
+}