aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/ced1401/ced_ioctl.h
blob: 4b6c9dedb21e97f742ee4ea1b4bc7d1d8385ea2e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
/*
 * IOCTL calls for the CED1401 driver
 * Copyright (C) 2010 Cambridge Electronic Design Ltd
 * Author Greg P Smith (greg@ced.co.uk)
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */
#ifndef __CED_IOCTL_H__
#define __CED_IOCTL_H__

#include <linux/ioctl.h>

/* dma modes, only MODE_CHAR and MODE_LINEAR are used in this driver */
#define MODE_CHAR		0
#define MODE_LINEAR		1

/****************************************************************************
** TypeDefs
*****************************************************************************/

struct transfer_area_desc {
	long long lpvBuff;	/* address of transfer area (for 64 or 32 bit) */
	unsigned int dwLength;	/* length of the area */
	unsigned short wAreaNum;	/* number of transfer area to set up */
	short eSize;		/* element size - is tohost flag for circular */
};


struct transfer_event {
	unsigned int dwStart;		/* offset into the area */
	unsigned int dwLength;		/* length of the region */
	unsigned short wAreaNum;	/* the area number */
	unsigned short wFlags;		/* bit 0 set for toHost */
	int iSetEvent;			/* could be dummy in LINUX */
};

#define MAX_TRANSFER_SIZE	0x4000		/* Maximum data bytes per IRP */
#define MAX_AREA_LENGTH		0x100000	/* Maximum size of transfer area */
#define MAX_TRANSAREAS		8		/* definitions for dma set up  */

typedef struct TGetSelfTest {
	int code;			/* self-test error code */
	int x, y;			/* additional information */
} TGET_SELFTEST;

/* Debug block used for several commands. Not all fields are used for all commands. */
typedef struct TDbgBlock {
	int iAddr;			/* the address in the 1401 */
	int iRepeats;			/* number of repeats */
	int iWidth;			/* width in bytes 1, 2, 4 */
	int iDefault;			/* default value */
	int iMask;			/* mask to apply */
	int iData;			/* data for poke, result for peek */
} TDBGBLOCK;

/* Used to collect information about a circular block from the device driver */
typedef struct TCircBlock {
	unsigned int nArea;		/* the area to collect information from */
	unsigned int dwOffset;		/* offset into the area to the available block */
	unsigned int dwSize;		/* size of the area */
} TCIRCBLOCK;

/* Used to clollect the 1401 status */
typedef struct TCSBlock {
	unsigned int uiState;
	unsigned int uiError;
} TCSBLOCK;

/*
 * As seen by the user, an ioctl call looks like: int ioctl(int fd, unsigned
 * long cmd, char* argp); We will then have all sorts of variants on this that
 * can be used to pass stuff to our driver. We will generate macros for each
 * type of call so as to provide some sort of type safety in the calling:
 */
#define CED_MAGIC_IOC 0xce

#define IOCTL_CED_SENDSTRING(n)		_IOC(_IOC_WRITE, CED_MAGIC_IOC, 2, n)

#define IOCTL_CED_RESET1401		_IO(CED_MAGIC_IOC, 3)
#define IOCTL_CED_GETCHAR		_IO(CED_MAGIC_IOC, 4)
#define IOCTL_CED_SENDCHAR		_IO(CED_MAGIC_IOC, 5)
#define IOCTL_CED_STAT1401		_IO(CED_MAGIC_IOC, 6)
#define IOCTL_CED_LINECOUNT		_IO(CED_MAGIC_IOC, 7)
#define IOCTL_CED_GETSTRING(nMax)	_IOC(_IOC_READ, CED_MAGIC_IOC, 8, nMax)

#define IOCTL_CED_SETTRANSFER		_IOW(CED_MAGIC_IOC, 11, struct transfer_area_desc)
#define IOCTL_CED_UNSETTRANSFER		_IO(CED_MAGIC_IOC, 12)
#define IOCTL_CED_SETEVENT		_IOW(CED_MAGIC_IOC, 13, struct transfer_event)
#define IOCTL_CED_GETOUTBUFSPACE	_IO(CED_MAGIC_IOC, 14)
#define IOCTL_CED_GETBASEADDRESS	_IO(CED_MAGIC_IOC, 15)
#define IOCTL_CED_GETDRIVERREVISION	_IO(CED_MAGIC_IOC, 16)

#define IOCTL_CED_GETTRANSFER		_IOR(CED_MAGIC_IOC, 17, TGET_TX_BLOCK)
#define IOCTL_CED_KILLIO1401		_IO(CED_MAGIC_IOC, 18)
#define IOCTL_CED_BLKTRANSSTATE		_IO(CED_MAGIC_IOC, 19)

#define IOCTL_CED_STATEOF1401		_IO(CED_MAGIC_IOC, 23)
#define IOCTL_CED_GRAB1401		_IO(CED_MAGIC_IOC, 25)
#define IOCTL_CED_FREE1401		_IO(CED_MAGIC_IOC, 26)
#define IOCTL_CED_STARTSELFTEST		_IO(CED_MAGIC_IOC, 31)
#define IOCTL_CED_CHECKSELFTEST		_IOR(CED_MAGIC_IOC, 32, TGET_SELFTEST)
#define IOCTL_CED_TYPEOF1401		_IO(CED_MAGIC_IOC, 33)
#define IOCTL_CED_TRANSFERFLAGS		_IO(CED_MAGIC_IOC, 34)

#define IOCTL_CED_DBGPEEK		_IOW(CED_MAGIC_IOC, 35, TDBGBLOCK)
#define IOCTL_CED_DBGPOKE		_IOW(CED_MAGIC_IOC, 36, TDBGBLOCK)
#define IOCTL_CED_DBGRAMPDATA		_IOW(CED_MAGIC_IOC, 37, TDBGBLOCK)
#define IOCTL_CED_DBGRAMPADDR		_IOW(CED_MAGIC_IOC, 38, TDBGBLOCK)
#define IOCTL_CED_DBGGETDATA		_IOR(CED_MAGIC_IOC, 39, TDBGBLOCK)
#define IOCTL_CED_DBGSTOPLOOP		_IO(CED_MAGIC_IOC, 40)
#define IOCTL_CED_FULLRESET		_IO(CED_MAGIC_IOC, 41)
#define IOCTL_CED_SETCIRCULAR		_IOW(CED_MAGIC_IOC, 42, struct transfer_area_desc)
#define IOCTL_CED_GETCIRCBLOCK		_IOWR(CED_MAGIC_IOC, 43, TCIRCBLOCK)
#define IOCTL_CED_FREECIRCBLOCK		_IOWR(CED_MAGIC_IOC, 44, TCIRCBLOCK)
#define IOCTL_CED_WAITEVENT		_IO(CED_MAGIC_IOC, 45)
#define IOCTL_CED_TESTEVENT		_IO(CED_MAGIC_IOC, 46)

#ifndef __KERNEL__
/*
 * If nothing said about return value, it is a U14ERR_... error code
 * (U14ERR_NOERROR for none)
 */
inline int CED_SendString(int fh, const char *szText, int n)
{
	return ioctl(fh, IOCTL_CED_SENDSTRING(n), szText);
}

inline int CED_Reset1401(int fh)
{
	return ioctl(fh, IOCTL_CED_RESET1401);
}

/* Return the singe character or a -ve error code. */
inline int CED_GetChar(int fh)
{
	return ioctl(fh, IOCTL_CED_GETCHAR);
}

/* Return character count in input buffer */
inline int CED_Stat1401(int fh)
{
	return ioctl(fh, IOCTL_CED_STAT1401);
}

inline int CED_SendChar(int fh, char c)
{
	return ioctl(fh, IOCTL_CED_SENDCHAR, c);
}

inline int CED_LineCount(int fh)
{
	return ioctl(fh, IOCTL_CED_LINECOUNT);
}

/*
 * return the count of characters returned. If the string was terminated by CR
 * or 0, then the 0 is part of the count. Otherwise, we will add a zero if
 * there is room, but it is not included in the count.  The return value is 0
 * if there was nothing to read.
 */
inline int CED_GetString(int fh, char *szText, int nMax)
{
	return ioctl(fh, IOCTL_CED_GETSTRING(nMax), szText);
}

/* returns space in the output buffer. */
inline int CED_GetOutBufSpace(int fh)
{
	return ioctl(fh, IOCTL_CED_GETOUTBUFSPACE);
}

/* This always returns -1 as not implemented. */
inline int CED_GetBaseAddress(int fh)
{
	return ioctl(fh, IOCTL_CED_GETBASEADDRESS);
}

/* returns the major revision <<16 | minor revision. */
inline int CED_GetDriverRevision(int fh)
{
	return ioctl(fh, IOCTL_CED_GETDRIVERREVISION);
}

inline int CED_SetTransfer(int fh, struct transfer_area_desc *pTD)
{
	return ioctl(fh, IOCTL_CED_SETTRANSFER, pTD);
}

inline int CED_UnsetTransfer(int fh, int nArea)
{
	return ioctl(fh, IOCTL_CED_UNSETTRANSFER, nArea);
}

inline int CED_SetEvent(int fh, struct transfer_event *pTE)
{
	return ioctl(fh, IOCTL_CED_SETEVENT, pTE);
}

inline int CED_GetTransfer(int fh, TGET_TX_BLOCK *pTX)
{
	return ioctl(fh, IOCTL_CED_GETTRANSFER, pTX);
}

inline int CED_KillIO1401(int fh)
{
	return ioctl(fh, IOCTL_CED_KILLIO1401);
}

/* returns 0 if no active DMA, 1 if active */
inline int CED_BlkTransState(int fh)
{
	return ioctl(fh, IOCTL_CED_BLKTRANSSTATE);
}

inline int CED_StateOf1401(int fh)
{
	return ioctl(fh, IOCTL_CED_STATEOF1401);
}

inline int CED_Grab1401(int fh)
{
	return ioctl(fh, IOCTL_CED_GRAB1401);
}

inline int CED_Free1401(int fh)
{
	return ioctl(fh, IOCTL_CED_FREE1401);
}

inline int CED_StartSelfTest(int fh)
{
	return ioctl(fh, IOCTL_CED_STARTSELFTEST);
}

inline int CED_CheckSelfTest(int fh, TGET_SELFTEST *pGST)
{
	return ioctl(fh, IOCTL_CED_CHECKSELFTEST, pGST);
}

inline int CED_TypeOf1401(int fh)
{
	return ioctl(fh, IOCTL_CED_TYPEOF1401);
}

inline int CED_TransferFlags(int fh)
{
	return ioctl(fh, IOCTL_CED_TRANSFERFLAGS);
}

inline int CED_DbgPeek(int fh, TDBGBLOCK *pDB)
{
	return ioctl(fh, IOCTL_CED_DBGPEEK, pDB);
}

inline int CED_DbgPoke(int fh, TDBGBLOCK *pDB)
{
	return ioctl(fh, IOCTL_CED_DBGPOKE, pDB);
}

inline int CED_DbgRampData(int fh, TDBGBLOCK *pDB)
{
	return ioctl(fh, IOCTL_CED_DBGRAMPDATA, pDB);
}

inline int CED_DbgRampAddr(int fh, TDBGBLOCK *pDB)
{
	return ioctl(fh, IOCTL_CED_DBGRAMPADDR, pDB);
}

inline int CED_DbgGetData(int fh, TDBGBLOCK *pDB)
{
	return ioctl(fh, IOCTL_CED_DBGGETDATA, pDB);
}

inline int CED_DbgStopLoop(int fh)
{
	return ioctl(fh, IOCTL_CED_DBGSTOPLOOP);
}

inline int CED_FullReset(int fh)
{
	return ioctl(fh, IOCTL_CED_FULLRESET);
}

inline int CED_SetCircular(int fh, struct transfer_area_desc *pTD)
{
	return ioctl(fh, IOCTL_CED_SETCIRCULAR, pTD);
}

inline int CED_GetCircBlock(int fh, TCIRCBLOCK *pCB)
{
	return ioctl(fh, IOCTL_CED_GETCIRCBLOCK, pCB);
}

inline int CED_FreeCircBlock(int fh, TCIRCBLOCK *pCB)
{
	return ioctl(fh, IOCTL_CED_FREECIRCBLOCK, pCB);
}

inline int CED_WaitEvent(int fh, int nArea, int msTimeOut)
{
	return ioctl(fh, IOCTL_CED_WAITEVENT, (nArea & 0xff)|(msTimeOut << 8));
}

inline int CED_TestEvent(int fh, int nArea)
{
	return ioctl(fh, IOCTL_CED_TESTEVENT, nArea);
}
#endif

#ifdef NOTWANTEDYET
#define IOCTL_CED_REGCALLBACK		_IO(CED_MAGIC_IOC, 9)	/* Not used */
#define IOCTL_CED_GETMONITORBUF		_IO(CED_MAGIC_IOC, 10)	/* Not used */

#define IOCTL_CED_BYTECOUNT		_IO(CED_MAGIC_IOC, 20)	/* Not used */
#define IOCTL_CED_ZEROBLOCKCOUNT	_IO(CED_MAGIC_IOC, 21)	/* Not used */
#define IOCTL_CED_STOPCIRCULAR		_IO(CED_MAGIC_IOC, 22)	/* Not used */

#define IOCTL_CED_REGISTERS1401		_IO(CED_MAGIC_IOC, 24)	/* Not used */
#define IOCTL_CED_STEP1401		_IO(CED_MAGIC_IOC, 27)	/* Not used */
#define IOCTL_CED_SET1401REGISTERS	_IO(CED_MAGIC_IOC, 28)	/* Not used */
#define IOCTL_CED_STEPTILL1401		_IO(CED_MAGIC_IOC, 29)	/* Not used */
#define IOCTL_CED_SETORIN		_IO(CED_MAGIC_IOC, 30)	/* Not used */

#endif

/* __CED_IOCTL_H__ */
#endif