]> git.karo-electronics.de Git - karo-tx-redboot.git/blob - packages/hal/arm/edb7xxx/v2_0/support/io.c
Initial revision
[karo-tx-redboot.git] / packages / hal / arm / edb7xxx / v2_0 / support / io.c
1 //==========================================================================
2 //
3 //        io.c
4 //
5 //        Linux I/O support for Cirrus Logic EDB7xxx eval board tools
6 //
7 //==========================================================================
8 //####ECOSGPLCOPYRIGHTBEGIN####
9 // -------------------------------------------
10 // This file is part of eCos, the Embedded Configurable Operating System.
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
12 //
13 // eCos is free software; you can redistribute it and/or modify it under
14 // the terms of the GNU General Public License as published by the Free
15 // Software Foundation; either version 2 or (at your option) any later version.
16 //
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
20 // for more details.
21 //
22 // You should have received a copy of the GNU General Public License along
23 // with eCos; if not, write to the Free Software Foundation, Inc.,
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
25 //
26 // As a special exception, if other files instantiate templates or use macros
27 // or inline functions from this file, or you compile this file and link it
28 // with other works to produce a work based on this file, this file does not
29 // by itself cause the resulting work to be covered by the GNU General Public
30 // License. However the source code for this file must still be made available
31 // in accordance with section (3) of the GNU General Public License.
32 //
33 // This exception does not invalidate any other reasons why a work based on
34 // this file might be covered by the GNU General Public License.
35 //
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
37 // at http://sources.redhat.com/ecos/ecos-license/
38 // -------------------------------------------
39 //####ECOSGPLCOPYRIGHTEND####
40 //==========================================================================
41 //#####DESCRIPTIONBEGIN####
42 //
43 // Author(s):     gthomas
44 // Contributors:  gthomas
45 // Date:          1999-06-16
46 // Description:   Linux I/O support for Cirrus Logic EDB7xxx FLASH tools
47 //####DESCRIPTIONEND####
48
49 //
50 // io.c - I/O functions
51 //
52
53 #include <stdio.h>
54 #include <sys/ioctl.h>
55 #include <fcntl.h>
56 #include <termios.h>
57 #include <errno.h>
58
59 char _ReceiveChar(long port)
60 {
61     char buf;
62     int res;
63     // Port is in non-blocking mode, this needs to have a loop
64     do {
65         res = read(port, &buf, 1);
66     } while (res < 0);
67 //    printf("Read: %c\n", buf);
68     return buf;
69 }
70
71 static void
72 uspin(int len)
73 {
74     volatile int cnt;
75     while (--len >= 0) {
76         for (cnt = 1;  cnt < 2000;  cnt++) ;
77     }
78 }
79
80 void _SendChar(long port, char ch)
81 {
82     char buf = ch;
83     write(port, &buf, 1);
84 //    printf("Send: %x\n", ch);
85 //    usleep(100);
86     uspin(100);
87 }
88
89 void _SetBaud(long port, long reqRate)
90 {
91     struct termios buf;
92     int rate;
93
94     // Get original configuration
95     if (tcgetattr(port, &buf)) {
96         fprintf(stderr, "Can't get port config\n");
97         return;
98     }
99
100     // Reset to raw.
101     buf.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
102                      |INLCR|IGNCR|ICRNL|IXON);
103     buf.c_oflag &= ~OPOST;
104     buf.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
105     buf.c_cflag &= ~(CSIZE|PARENB);
106     buf.c_cflag |= CS8;
107
108     // Set baud rate.
109     switch (reqRate) {
110     case 9600:
111         rate = B9600;
112         break;
113     case 38400:
114         rate = B38400;
115         break;
116     case 57600:
117         rate = B57600;
118         break;
119     case 115200:
120         rate = B115200;
121         break;
122     }
123     cfsetispeed(&buf, rate);
124     cfsetospeed(&buf, rate);
125
126     // Set data bits.
127     buf.c_cflag &= ~CSIZE;
128     buf.c_cflag |= CS8;
129
130     // Set stop bits.
131     buf.c_cflag &= ~CSTOPB;  // One stop
132
133     // Set parity.
134     buf.c_cflag &= ~(PARENB | PARODD); // no parity.
135     
136     // Set the new settings
137     if (tcsetattr(port, TCSADRAIN, &buf)) {
138         fprintf(stderr, "Error: tcsetattr\n");
139         return;
140     }
141
142     tcdrain(port);
143     usleep(1000000/10*2);
144     sleep(2);
145 }
146
147 int _CharReady(long port)
148 {
149 #ifdef __CYGWIN__
150     // Windows doesn't support the below ioctl
151     return 1;
152 #else
153     int n, res;
154     res = ioctl(port, FIONREAD, &n);
155     if (res < 0) {
156         fprintf(stderr, "I/O error: %s\n", strerror(errno));
157         exit(1);
158     }
159     return n;  // Non-zero if characters ready to read
160 #endif
161 }
162
163 void _WaitForOutputEmpty(long port)
164 {
165     usleep(2000000);
166 }
167
168 long _OpenPort(char *name)
169 {
170     int fd;
171     fd = open(name, O_RDWR|O_NONBLOCK);
172     return fd;
173 }