Subversion Repositories shark

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
422 giacomo 1
/* r3964 linediscipline for linux
2
 *
3
 * -----------------------------------------------------------
4
 * Copyright by
5
 * Philips Automation Projects
6
 * Kassel (Germany)
7
 * http://www.pap-philips.de
8
 * -----------------------------------------------------------
9
 * This software may be used and distributed according to the terms of
10
 * the GNU General Public License, incorporated herein by reference.
11
 *
12
 * Author:
13
 * L. Haag
14
 *
15
 * $Log: not supported by cvs2svn $
16
 * Revision 1.3  2001/03/18 13:02:24  dwmw2
17
 * Fix timer usage, use spinlocks properly.
18
 *
19
 * Revision 1.2  2001/03/18 12:53:15  dwmw2
20
 * Merge changes in 2.4.2
21
 *
22
 * Revision 1.1.1.1  1998/10/13 16:43:14  dwmw2
23
 * This'll screw the version control
24
 *
25
 * Revision 1.6  1998/09/30 00:40:38  dwmw2
26
 * Updated to use kernel's N_R3964 if available
27
 *
28
 * Revision 1.4  1998/04/02 20:29:44  lhaag
29
 * select, blocking, ...
30
 *
31
 * Revision 1.3  1998/02/12 18:58:43  root
32
 * fixed some memory leaks
33
 * calculation of checksum characters
34
 *
35
 * Revision 1.2  1998/02/07 13:03:17  root
36
 * ioctl read_telegram
37
 *
38
 * Revision 1.1  1998/02/06 19:19:43  root
39
 * Initial revision
40
 *
41
 *
42
 */
43
 
44
#ifndef __LINUX_N_R3964_H__
45
#define __LINUX_N_R3964_H__
46
 
47
/* line disciplines for r3964 protocol */
48
#include <asm/termios.h>
49
 
50
#ifdef __KERNEL__
51
/*
52
 * Common ascii handshake characters:
53
 */
54
 
55
#define STX 0x02
56
#define ETX 0x03
57
#define DLE 0x10
58
#define NAK 0x15
59
 
60
/*
61
 * Timeouts (msecs/10 msecs per timer interrupt):
62
 */
63
 
64
#define R3964_TO_QVZ 550/10
65
#define R3964_TO_ZVZ 220/10
66
#define R3964_TO_NO_BUF 400/10
67
#define R3964_NO_TX_ROOM 100/10
68
#define R3964_TO_RX_PANIC 4000/10
69
#define R3964_MAX_RETRIES 5
70
 
71
#endif
72
 
73
/*
74
 * Ioctl-commands
75
 */
76
 
77
#define R3964_ENABLE_SIGNALS      0x5301
78
#define R3964_SETPRIORITY         0x5302
79
#define R3964_USE_BCC             0x5303
80
#define R3964_READ_TELEGRAM       0x5304
81
 
82
/* Options for R3964_SETPRIORITY */
83
#define R3964_MASTER   0
84
#define R3964_SLAVE    1
85
 
86
/* Options for R3964_ENABLE_SIGNALS */
87
#define R3964_SIG_ACK   0x0001
88
#define R3964_SIG_DATA  0x0002
89
#define R3964_SIG_ALL   0x000f
90
#define R3964_SIG_NONE  0x0000
91
#define R3964_USE_SIGIO 0x1000
92
 
93
/*
94
 * r3964 operation states:
95
 */
96
#ifdef __KERNEL__
97
 
98
enum { R3964_IDLE,
99
           R3964_TX_REQUEST, R3964_TRANSMITTING,
100
           R3964_WAIT_ZVZ_BEFORE_TX_RETRY, R3964_WAIT_FOR_TX_ACK,
101
           R3964_WAIT_FOR_RX_BUF,
102
           R3964_RECEIVING, R3964_WAIT_FOR_BCC, R3964_WAIT_FOR_RX_REPEAT
103
           };
104
 
105
/*
106
 * All open file-handles are 'clients' and are stored in a linked list:
107
 */
108
 
109
struct r3964_message;
110
 
111
struct r3964_client_info {
112
        spinlock_t     lock;
113
        pid_t          pid;
114
        unsigned int   sig_flags;
115
 
116
        struct r3964_client_info *next;
117
 
118
        struct r3964_message *first_msg;
119
        struct r3964_message *last_msg;
120
        struct r3964_block_header *next_block_to_read;
121
        int            msg_count;
122
};
123
 
124
 
125
#endif
126
 
127
/* types for msg_id: */
128
enum {R3964_MSG_ACK=1, R3964_MSG_DATA };
129
 
130
#define R3964_MAX_MSG_COUNT 32
131
 
132
/* error codes for client messages */
133
#define R3964_OK 0        /* no error. */
134
#define R3964_TX_FAIL -1  /* transmission error, block NOT sent */
135
#define R3964_OVERFLOW -2 /* msg queue overflow */
136
 
137
/* the client gets this struct when calling read(fd,...): */
138
struct r3964_client_message {
139
          int     msg_id;
140
          int     arg;
141
          int     error_code;
142
};
143
 
144
#define R3964_MTU      256
145
 
146
 
147
#ifdef __KERNEL__
148
 
149
struct r3964_block_header;
150
 
151
/* internal version of client_message: */
152
struct r3964_message {
153
          int     msg_id;
154
          int     arg;
155
          int     error_code;
156
          struct r3964_block_header *block;
157
          struct r3964_message *next;
158
};
159
 
160
/*
161
 * Header of received block in rx_buf/tx_buf:
162
 */
163
 
164
struct r3964_block_header
165
{
166
        unsigned int length;             /* length in chars without header */
167
        unsigned char *data;             /* usually data is located
168
                                        immediately behind this struct */
169
        unsigned int locks;              /* only used in rx_buffer */
170
 
171
    struct r3964_block_header *next;
172
        struct r3964_client_info *owner;  /* =NULL in rx_buffer */
173
};
174
 
175
/*
176
 * If rx_buf hasn't enough space to store R3964_MTU chars,
177
 * we will reject all incoming STX-requests by sending NAK.
178
 */
179
 
180
#define RX_BUF_SIZE    4000
181
#define TX_BUF_SIZE    4000
182
#define R3964_MAX_BLOCKS_IN_RX_QUEUE 100
183
 
184
#define R3964_PARITY 0x0001
185
#define R3964_FRAME  0x0002
186
#define R3964_OVERRUN 0x0004
187
#define R3964_UNKNOWN 0x0008
188
#define R3964_BREAK   0x0010
189
#define R3964_CHECKSUM 0x0020
190
#define R3964_ERROR  0x003f
191
#define R3964_BCC   0x4000
192
#define R3964_DEBUG 0x8000
193
 
194
 
195
struct r3964_info {
196
        spinlock_t     lock;
197
        struct tty_struct *tty;
198
        unsigned char priority;
199
        unsigned char *rx_buf;            /* ring buffer */
200
        unsigned char *tx_buf;
201
 
202
        wait_queue_head_t read_wait;
203
        //struct wait_queue *read_wait;
204
 
205
        struct r3964_block_header *rx_first;
206
        struct r3964_block_header *rx_last;
207
        struct r3964_block_header *tx_first;
208
        struct r3964_block_header *tx_last;
209
        unsigned int tx_position;
210
        unsigned int rx_position;
211
        unsigned char last_rx;
212
        unsigned char bcc;
213
        unsigned int  blocks_in_rx_queue;
214
 
215
 
216
        struct r3964_client_info *firstClient;
217
        unsigned int state;
218
        unsigned int flags;
219
 
220
        struct timer_list tmr;
221
        int nRetry;
222
};
223
 
224
#endif  
225
 
226
#endif