• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * IOCTL calls for the CED1401 driver
3  * Copyright (C) 2010 Cambridge Electronic Design Ltd
4  * Author Greg P Smith (greg@ced.co.uk)
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  */
16 #ifndef __CED_IOCTL_H__
17 #define __CED_IOCTL_H__
18 
19 #include <linux/ioctl.h>
20 
21 /* dma modes, only MODE_CHAR and MODE_LINEAR are used in this driver */
22 #define MODE_CHAR		0
23 #define MODE_LINEAR		1
24 
25 /****************************************************************************
26 ** TypeDefs
27 *****************************************************************************/
28 
29 typedef unsigned short TBLOCKENTRY;	/* index the blk transfer table 0-7 */
30 
31 typedef struct TransferDesc {
32 	long long lpvBuff;	/* address of transfer area (for 64 or 32 bit) */
33 	unsigned int dwLength;	/* length of the area */
34 	TBLOCKENTRY wAreaNum;	/* number of transfer area to set up */
35 	short eSize;		/* element size - is tohost flag for circular */
36 } TRANSFERDESC;
37 
38 typedef TRANSFERDESC * LPTRANSFERDESC;
39 
40 typedef struct TransferEvent {
41 	unsigned int dwStart;		/* offset into the area */
42 	unsigned int dwLength;		/* length of the region */
43 	unsigned short wAreaNum;	/* the area number */
44 	unsigned short wFlags;		/* bit 0 set for toHost */
45 	int iSetEvent;			/* could be dummy in LINUX */
46 } TRANSFEREVENT;
47 
48 #define MAX_TRANSFER_SIZE	0x4000		/* Maximum data bytes per IRP */
49 #define MAX_AREA_LENGTH		0x100000	/* Maximum size of transfer area */
50 #define MAX_TRANSAREAS		8		/* definitions for dma set up  */
51 
52 typedef struct TGetSelfTest {
53 	int code;			/* self-test error code */
54 	int x, y;			/* additional information */
55 } TGET_SELFTEST;
56 
57 /* Debug block used for several commands. Not all fields are used for all commands. */
58 typedef struct TDbgBlock {
59 	int iAddr;			/* the address in the 1401 */
60 	int iRepeats;			/* number of repeats */
61 	int iWidth;			/* width in bytes 1, 2, 4 */
62 	int iDefault;			/* default value */
63 	int iMask;			/* mask to apply */
64 	int iData;			/* data for poke, result for peek */
65 } TDBGBLOCK;
66 
67 /* Used to collect information about a circular block from the device driver */
68 typedef struct TCircBlock {
69 	unsigned int nArea;		/* the area to collect information from */
70 	unsigned int dwOffset;		/* offset into the area to the available block */
71 	unsigned int dwSize;		/* size of the area */
72 } TCIRCBLOCK;
73 
74 /* Used to clollect the 1401 status */
75 typedef struct TCSBlock {
76 	unsigned int uiState;
77 	unsigned int uiError;
78 } TCSBLOCK;
79 
80 /*
81  * As seen by the user, an ioctl call looks like: int ioctl(int fd, unsigned
82  * long cmd, char* argp); We will then have all sorts of variants on this that
83  * can be used to pass stuff to our driver. We will generate macros for each
84  * type of call so as to provide some sort of type safety in the calling:
85  */
86 #define CED_MAGIC_IOC 0xce
87 
88 /* NBNB: READ and WRITE are from the point of view of the device, not user. */
89 typedef struct ced_ioc_string {
90 	int nChars;
91 	char buffer[256];
92 } CED_IOC_STRING;
93 
94 #define IOCTL_CED_SENDSTRING(n)		_IOC(_IOC_WRITE, CED_MAGIC_IOC, 2, n)
95 
96 #define IOCTL_CED_RESET1401		_IO(CED_MAGIC_IOC, 3)
97 #define IOCTL_CED_GETCHAR		_IO(CED_MAGIC_IOC, 4)
98 #define IOCTL_CED_SENDCHAR		_IO(CED_MAGIC_IOC, 5)
99 #define IOCTL_CED_STAT1401		_IO(CED_MAGIC_IOC, 6)
100 #define IOCTL_CED_LINECOUNT		_IO(CED_MAGIC_IOC, 7)
101 #define IOCTL_CED_GETSTRING(nMax)	_IOC(_IOC_READ, CED_MAGIC_IOC, 8, nMax)
102 
103 #define IOCTL_CED_SETTRANSFER		_IOW(CED_MAGIC_IOC, 11, TRANSFERDESC)
104 #define IOCTL_CED_UNSETTRANSFER		_IO(CED_MAGIC_IOC, 12)
105 #define IOCTL_CED_SETEVENT		_IOW(CED_MAGIC_IOC, 13, TRANSFEREVENT)
106 #define IOCTL_CED_GETOUTBUFSPACE	_IO(CED_MAGIC_IOC, 14)
107 #define IOCTL_CED_GETBASEADDRESS	_IO(CED_MAGIC_IOC, 15)
108 #define IOCTL_CED_GETDRIVERREVISION	_IO(CED_MAGIC_IOC, 16)
109 
110 #define IOCTL_CED_GETTRANSFER		_IOR(CED_MAGIC_IOC, 17, TGET_TX_BLOCK)
111 #define IOCTL_CED_KILLIO1401		_IO(CED_MAGIC_IOC, 18)
112 #define IOCTL_CED_BLKTRANSSTATE		_IO(CED_MAGIC_IOC, 19)
113 
114 #define IOCTL_CED_STATEOF1401		_IO(CED_MAGIC_IOC, 23)
115 #define IOCTL_CED_GRAB1401		_IO(CED_MAGIC_IOC, 25)
116 #define IOCTL_CED_FREE1401		_IO(CED_MAGIC_IOC, 26)
117 #define IOCTL_CED_STARTSELFTEST		_IO(CED_MAGIC_IOC, 31)
118 #define IOCTL_CED_CHECKSELFTEST		_IOR(CED_MAGIC_IOC, 32, TGET_SELFTEST)
119 #define IOCTL_CED_TYPEOF1401		_IO(CED_MAGIC_IOC, 33)
120 #define IOCTL_CED_TRANSFERFLAGS		_IO(CED_MAGIC_IOC, 34)
121 
122 #define IOCTL_CED_DBGPEEK		_IOW(CED_MAGIC_IOC, 35, TDBGBLOCK)
123 #define IOCTL_CED_DBGPOKE		_IOW(CED_MAGIC_IOC, 36, TDBGBLOCK)
124 #define IOCTL_CED_DBGRAMPDATA		_IOW(CED_MAGIC_IOC, 37, TDBGBLOCK)
125 #define IOCTL_CED_DBGRAMPADDR		_IOW(CED_MAGIC_IOC, 38, TDBGBLOCK)
126 #define IOCTL_CED_DBGGETDATA		_IOR(CED_MAGIC_IOC, 39, TDBGBLOCK)
127 #define IOCTL_CED_DBGSTOPLOOP		_IO(CED_MAGIC_IOC, 40)
128 #define IOCTL_CED_FULLRESET		_IO(CED_MAGIC_IOC, 41)
129 #define IOCTL_CED_SETCIRCULAR		_IOW(CED_MAGIC_IOC, 42, TRANSFERDESC)
130 #define IOCTL_CED_GETCIRCBLOCK		_IOWR(CED_MAGIC_IOC, 43, TCIRCBLOCK)
131 #define IOCTL_CED_FREECIRCBLOCK		_IOWR(CED_MAGIC_IOC, 44, TCIRCBLOCK)
132 #define IOCTL_CED_WAITEVENT		_IO(CED_MAGIC_IOC, 45)
133 #define IOCTL_CED_TESTEVENT		_IO(CED_MAGIC_IOC, 46)
134 
135 #ifndef __KERNEL__
136 /*
137  * If nothing said about return value, it is a U14ERR_... error code
138  * (U14ERR_NOERROR for none)
139  */
CED_SendString(int fh,const char * szText,int n)140 inline int CED_SendString(int fh, const char *szText, int n)
141 {
142 	return ioctl(fh, IOCTL_CED_SENDSTRING(n), szText);
143 }
144 
CED_Reset1401(int fh)145 inline int CED_Reset1401(int fh)
146 {
147 	return ioctl(fh, IOCTL_CED_RESET1401);
148 }
149 
150 /* Return the singe character or a -ve error code. */
CED_GetChar(int fh)151 inline int CED_GetChar(int fh)
152 {
153 	return ioctl(fh, IOCTL_CED_GETCHAR);
154 }
155 
156 /* Return character count in input buffer */
CED_Stat1401(int fh)157 inline int CED_Stat1401(int fh)
158 {
159 	return ioctl(fh, IOCTL_CED_STAT1401);
160 }
161 
CED_SendChar(int fh,char c)162 inline int CED_SendChar(int fh, char c)
163 {
164 	return ioctl(fh, IOCTL_CED_SENDCHAR, c);
165 }
166 
CED_LineCount(int fh)167 inline int CED_LineCount(int fh)
168 {
169 	return ioctl(fh, IOCTL_CED_LINECOUNT);
170 }
171 
172 /*
173  * return the count of characters returned. If the string was terminated by CR
174  * or 0, then the 0 is part of the count. Otherwise, we will add a zero if
175  * there is room, but it is not included in the count.  The return value is 0
176  * if there was nothing to read.
177  */
CED_GetString(int fh,char * szText,int nMax)178 inline int CED_GetString(int fh, char *szText, int nMax)
179 {
180 	return ioctl(fh, IOCTL_CED_GETSTRING(nMax), szText);
181 }
182 
183 /* returns space in the output buffer. */
CED_GetOutBufSpace(int fh)184 inline int CED_GetOutBufSpace(int fh)
185 {
186 	return ioctl(fh, IOCTL_CED_GETOUTBUFSPACE);
187 }
188 
189 /* This always returns -1 as not implemented. */
CED_GetBaseAddress(int fh)190 inline int CED_GetBaseAddress(int fh)
191 {
192 	return ioctl(fh, IOCTL_CED_GETBASEADDRESS);
193 }
194 
195 /* returns the major revision <<16 | minor revision. */
CED_GetDriverRevision(int fh)196 inline int CED_GetDriverRevision(int fh)
197 {
198 	return ioctl(fh, IOCTL_CED_GETDRIVERREVISION);
199 }
200 
CED_SetTransfer(int fh,TRANSFERDESC * pTD)201 inline int CED_SetTransfer(int fh, TRANSFERDESC *pTD)
202 {
203 	return ioctl(fh, IOCTL_CED_SETTRANSFER, pTD);
204 }
205 
CED_UnsetTransfer(int fh,int nArea)206 inline int CED_UnsetTransfer(int fh, int nArea)
207 {
208 	return ioctl(fh, IOCTL_CED_UNSETTRANSFER, nArea);
209 }
210 
CED_SetEvent(int fh,TRANSFEREVENT * pTE)211 inline int CED_SetEvent(int fh, TRANSFEREVENT *pTE)
212 {
213 	return ioctl(fh, IOCTL_CED_SETEVENT, pTE);
214 }
215 
CED_GetTransfer(int fh,TGET_TX_BLOCK * pTX)216 inline int CED_GetTransfer(int fh, TGET_TX_BLOCK *pTX)
217 {
218 	return ioctl(fh, IOCTL_CED_GETTRANSFER, pTX);
219 }
220 
CED_KillIO1401(int fh)221 inline int CED_KillIO1401(int fh)
222 {
223 	return ioctl(fh, IOCTL_CED_KILLIO1401);
224 }
225 
226 /* returns 0 if no active DMA, 1 if active */
CED_BlkTransState(int fh)227 inline int CED_BlkTransState(int fh)
228 {
229 	return ioctl(fh, IOCTL_CED_BLKTRANSSTATE);
230 }
231 
CED_StateOf1401(int fh)232 inline int CED_StateOf1401(int fh)
233 {
234 	return ioctl(fh, IOCTL_CED_STATEOF1401);
235 }
236 
CED_Grab1401(int fh)237 inline int CED_Grab1401(int fh)
238 {
239 	return ioctl(fh, IOCTL_CED_GRAB1401);
240 }
241 
CED_Free1401(int fh)242 inline int CED_Free1401(int fh)
243 {
244 	return ioctl(fh, IOCTL_CED_FREE1401);
245 }
246 
CED_StartSelfTest(int fh)247 inline int CED_StartSelfTest(int fh)
248 {
249 	return ioctl(fh, IOCTL_CED_STARTSELFTEST);
250 }
251 
CED_CheckSelfTest(int fh,TGET_SELFTEST * pGST)252 inline int CED_CheckSelfTest(int fh, TGET_SELFTEST *pGST)
253 {
254 	return ioctl(fh, IOCTL_CED_CHECKSELFTEST, pGST);
255 }
256 
CED_TypeOf1401(int fh)257 inline int CED_TypeOf1401(int fh)
258 {
259 	return ioctl(fh, IOCTL_CED_TYPEOF1401);
260 }
261 
CED_TransferFlags(int fh)262 inline int CED_TransferFlags(int fh)
263 {
264 	return ioctl(fh, IOCTL_CED_TRANSFERFLAGS);
265 }
266 
CED_DbgPeek(int fh,TDBGBLOCK * pDB)267 inline int CED_DbgPeek(int fh, TDBGBLOCK *pDB)
268 {
269 	return ioctl(fh, IOCTL_CED_DBGPEEK, pDB);
270 }
271 
CED_DbgPoke(int fh,TDBGBLOCK * pDB)272 inline int CED_DbgPoke(int fh, TDBGBLOCK *pDB)
273 {
274 	return ioctl(fh, IOCTL_CED_DBGPOKE, pDB);
275 }
276 
CED_DbgRampData(int fh,TDBGBLOCK * pDB)277 inline int CED_DbgRampData(int fh, TDBGBLOCK *pDB)
278 {
279 	return ioctl(fh, IOCTL_CED_DBGRAMPDATA, pDB);
280 }
281 
CED_DbgRampAddr(int fh,TDBGBLOCK * pDB)282 inline int CED_DbgRampAddr(int fh, TDBGBLOCK *pDB)
283 {
284 	return ioctl(fh, IOCTL_CED_DBGRAMPADDR, pDB);
285 }
286 
CED_DbgGetData(int fh,TDBGBLOCK * pDB)287 inline int CED_DbgGetData(int fh, TDBGBLOCK *pDB)
288 {
289 	return ioctl(fh, IOCTL_CED_DBGGETDATA, pDB);
290 }
291 
CED_DbgStopLoop(int fh)292 inline int CED_DbgStopLoop(int fh)
293 {
294 	return ioctl(fh, IOCTL_CED_DBGSTOPLOOP);
295 }
296 
CED_FullReset(int fh)297 inline int CED_FullReset(int fh)
298 {
299 	return ioctl(fh, IOCTL_CED_FULLRESET);
300 }
301 
CED_SetCircular(int fh,TRANSFERDESC * pTD)302 inline int CED_SetCircular(int fh, TRANSFERDESC *pTD)
303 {
304 	return ioctl(fh, IOCTL_CED_SETCIRCULAR, pTD);
305 }
306 
CED_GetCircBlock(int fh,TCIRCBLOCK * pCB)307 inline int CED_GetCircBlock(int fh, TCIRCBLOCK *pCB)
308 {
309 	return ioctl(fh, IOCTL_CED_GETCIRCBLOCK, pCB);
310 }
311 
CED_FreeCircBlock(int fh,TCIRCBLOCK * pCB)312 inline int CED_FreeCircBlock(int fh, TCIRCBLOCK *pCB)
313 {
314 	return ioctl(fh, IOCTL_CED_FREECIRCBLOCK, pCB);
315 }
316 
CED_WaitEvent(int fh,int nArea,int msTimeOut)317 inline int CED_WaitEvent(int fh, int nArea, int msTimeOut)
318 {
319 	return ioctl(fh, IOCTL_CED_WAITEVENT, (nArea & 0xff)|(msTimeOut << 8));
320 }
321 
CED_TestEvent(int fh,int nArea)322 inline int CED_TestEvent(int fh, int nArea)
323 {
324 	return ioctl(fh, IOCTL_CED_TESTEVENT, nArea);
325 }
326 #endif
327 
328 #ifdef NOTWANTEDYET
329 #define IOCTL_CED_REGCALLBACK		_IO(CED_MAGIC_IOC, 9)	/* Not used */
330 #define IOCTL_CED_GETMONITORBUF		_IO(CED_MAGIC_IOC, 10)	/* Not used */
331 
332 #define IOCTL_CED_BYTECOUNT		_IO(CED_MAGIC_IOC, 20)	/* Not used */
333 #define IOCTL_CED_ZEROBLOCKCOUNT	_IO(CED_MAGIC_IOC, 21)	/* Not used */
334 #define IOCTL_CED_STOPCIRCULAR		_IO(CED_MAGIC_IOC, 22)	/* Not used */
335 
336 #define IOCTL_CED_REGISTERS1401		_IO(CED_MAGIC_IOC, 24)	/* Not used */
337 #define IOCTL_CED_STEP1401		_IO(CED_MAGIC_IOC, 27)	/* Not used */
338 #define IOCTL_CED_SET1401REGISTERS	_IO(CED_MAGIC_IOC, 28)	/* Not used */
339 #define IOCTL_CED_STEPTILL1401		_IO(CED_MAGIC_IOC, 29)	/* Not used */
340 #define IOCTL_CED_SETORIN		_IO(CED_MAGIC_IOC, 30)	/* Not used */
341 
342 #endif
343 
344 /* __CED_IOCTL_H__ */
345 #endif
346