2 * IOCTL calls for the CED1401 driver
3 * Copyright (C) 2010 Cambridge Electronic Design Ltd
4 * Author Greg P Smith (greg@ced.co.uk)
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.
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.
16 #ifndef __CED_IOCTL_H__
17 #define __CED_IOCTL_H__
19 #include <linux/ioctl.h>
21 /* dma modes, only MODE_CHAR and MODE_LINEAR are used in this driver */
25 /****************************************************************************
27 *****************************************************************************/
29 typedef unsigned short TBLOCKENTRY
; /* index the blk transfer table 0-7 */
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 */
38 typedef TRANSFERDESC
*LPTRANSFERDESC
;
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 */
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 */
52 typedef struct TGetSelfTest
{
53 int code
; /* self-test error code */
54 int x
, y
; /* additional information */
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 */
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 */
74 /* Used to clollect the 1401 status */
75 typedef struct TCSBlock
{
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:
86 #define CED_MAGIC_IOC 0xce
88 /* NBNB: READ and WRITE are from the point of view of the device, not user. */
89 typedef struct ced_ioc_string
{
94 #define IOCTL_CED_SENDSTRING(n) _IOC(_IOC_WRITE, CED_MAGIC_IOC, 2, n)
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)
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)
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)
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)
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)
137 * If nothing said about return value, it is a U14ERR_... error code
138 * (U14ERR_NOERROR for none)
140 inline int CED_SendString(int fh
, const char *szText
, int n
)
142 return ioctl(fh
, IOCTL_CED_SENDSTRING(n
), szText
);
145 inline int CED_Reset1401(int fh
)
147 return ioctl(fh
, IOCTL_CED_RESET1401
);
150 /* Return the singe character or a -ve error code. */
151 inline int CED_GetChar(int fh
)
153 return ioctl(fh
, IOCTL_CED_GETCHAR
);
156 /* Return character count in input buffer */
157 inline int CED_Stat1401(int fh
)
159 return ioctl(fh
, IOCTL_CED_STAT1401
);
162 inline int CED_SendChar(int fh
, char c
)
164 return ioctl(fh
, IOCTL_CED_SENDCHAR
, c
);
167 inline int CED_LineCount(int fh
)
169 return ioctl(fh
, IOCTL_CED_LINECOUNT
);
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.
178 inline int CED_GetString(int fh
, char *szText
, int nMax
)
180 return ioctl(fh
, IOCTL_CED_GETSTRING(nMax
), szText
);
183 /* returns space in the output buffer. */
184 inline int CED_GetOutBufSpace(int fh
)
186 return ioctl(fh
, IOCTL_CED_GETOUTBUFSPACE
);
189 /* This always returns -1 as not implemented. */
190 inline int CED_GetBaseAddress(int fh
)
192 return ioctl(fh
, IOCTL_CED_GETBASEADDRESS
);
195 /* returns the major revision <<16 | minor revision. */
196 inline int CED_GetDriverRevision(int fh
)
198 return ioctl(fh
, IOCTL_CED_GETDRIVERREVISION
);
201 inline int CED_SetTransfer(int fh
, TRANSFERDESC
*pTD
)
203 return ioctl(fh
, IOCTL_CED_SETTRANSFER
, pTD
);
206 inline int CED_UnsetTransfer(int fh
, int nArea
)
208 return ioctl(fh
, IOCTL_CED_UNSETTRANSFER
, nArea
);
211 inline int CED_SetEvent(int fh
, TRANSFEREVENT
*pTE
)
213 return ioctl(fh
, IOCTL_CED_SETEVENT
, pTE
);
216 inline int CED_GetTransfer(int fh
, TGET_TX_BLOCK
*pTX
)
218 return ioctl(fh
, IOCTL_CED_GETTRANSFER
, pTX
);
221 inline int CED_KillIO1401(int fh
)
223 return ioctl(fh
, IOCTL_CED_KILLIO1401
);
226 /* returns 0 if no active DMA, 1 if active */
227 inline int CED_BlkTransState(int fh
)
229 return ioctl(fh
, IOCTL_CED_BLKTRANSSTATE
);
232 inline int CED_StateOf1401(int fh
)
234 return ioctl(fh
, IOCTL_CED_STATEOF1401
);
237 inline int CED_Grab1401(int fh
)
239 return ioctl(fh
, IOCTL_CED_GRAB1401
);
242 inline int CED_Free1401(int fh
)
244 return ioctl(fh
, IOCTL_CED_FREE1401
);
247 inline int CED_StartSelfTest(int fh
)
249 return ioctl(fh
, IOCTL_CED_STARTSELFTEST
);
252 inline int CED_CheckSelfTest(int fh
, TGET_SELFTEST
*pGST
)
254 return ioctl(fh
, IOCTL_CED_CHECKSELFTEST
, pGST
);
257 inline int CED_TypeOf1401(int fh
)
259 return ioctl(fh
, IOCTL_CED_TYPEOF1401
);
262 inline int CED_TransferFlags(int fh
)
264 return ioctl(fh
, IOCTL_CED_TRANSFERFLAGS
);
267 inline int CED_DbgPeek(int fh
, TDBGBLOCK
*pDB
)
269 return ioctl(fh
, IOCTL_CED_DBGPEEK
, pDB
);
272 inline int CED_DbgPoke(int fh
, TDBGBLOCK
*pDB
)
274 return ioctl(fh
, IOCTL_CED_DBGPOKE
, pDB
);
277 inline int CED_DbgRampData(int fh
, TDBGBLOCK
*pDB
)
279 return ioctl(fh
, IOCTL_CED_DBGRAMPDATA
, pDB
);
282 inline int CED_DbgRampAddr(int fh
, TDBGBLOCK
*pDB
)
284 return ioctl(fh
, IOCTL_CED_DBGRAMPADDR
, pDB
);
287 inline int CED_DbgGetData(int fh
, TDBGBLOCK
*pDB
)
289 return ioctl(fh
, IOCTL_CED_DBGGETDATA
, pDB
);
292 inline int CED_DbgStopLoop(int fh
)
294 return ioctl(fh
, IOCTL_CED_DBGSTOPLOOP
);
297 inline int CED_FullReset(int fh
)
299 return ioctl(fh
, IOCTL_CED_FULLRESET
);
302 inline int CED_SetCircular(int fh
, TRANSFERDESC
*pTD
)
304 return ioctl(fh
, IOCTL_CED_SETCIRCULAR
, pTD
);
307 inline int CED_GetCircBlock(int fh
, TCIRCBLOCK
*pCB
)
309 return ioctl(fh
, IOCTL_CED_GETCIRCBLOCK
, pCB
);
312 inline int CED_FreeCircBlock(int fh
, TCIRCBLOCK
*pCB
)
314 return ioctl(fh
, IOCTL_CED_FREECIRCBLOCK
, pCB
);
317 inline int CED_WaitEvent(int fh
, int nArea
, int msTimeOut
)
319 return ioctl(fh
, IOCTL_CED_WAITEVENT
, (nArea
& 0xff)|(msTimeOut
<< 8));
322 inline int CED_TestEvent(int fh
, int nArea
)
324 return ioctl(fh
, IOCTL_CED_TESTEVENT
, nArea
);
329 #define IOCTL_CED_REGCALLBACK _IO(CED_MAGIC_IOC, 9) /* Not used */
330 #define IOCTL_CED_GETMONITORBUF _IO(CED_MAGIC_IOC, 10) /* Not used */
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 */
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 */
344 /* __CED_IOCTL_H__ */