xref: /linux/drivers/gpib/include/gpib_cmd.h (revision e6ab504633e4c06e35377ecf3c8cbc304de79858)
1*781c58ecSDave Penkler /* SPDX-License-Identifier: GPL-2.0 */
2*781c58ecSDave Penkler 
3*781c58ecSDave Penkler #ifndef _GPIB_CMD_H
4*781c58ecSDave Penkler #define _GPIB_CMD_H
5*781c58ecSDave Penkler 
6*781c58ecSDave Penkler #include <linux/types.h>
7*781c58ecSDave Penkler 
8*781c58ecSDave Penkler /* Command byte definitions tests and functions */
9*781c58ecSDave Penkler 
10*781c58ecSDave Penkler /* mask of bits that actually matter in a command byte */
11*781c58ecSDave Penkler enum {
12*781c58ecSDave Penkler 	gpib_command_mask = 0x7f,
13*781c58ecSDave Penkler };
14*781c58ecSDave Penkler 
15*781c58ecSDave Penkler /* Possible GPIB command messages */
16*781c58ecSDave Penkler 
17*781c58ecSDave Penkler enum cmd_byte {
18*781c58ecSDave Penkler 	GTL = 0x1,	/* go to local			*/
19*781c58ecSDave Penkler 	SDC = 0x4,	/* selected device clear	*/
20*781c58ecSDave Penkler 	PP_CONFIG = 0x5,
21*781c58ecSDave Penkler 	GET = 0x8,	/* group execute trigger	*/
22*781c58ecSDave Penkler 	TCT = 0x9,	/* take control			*/
23*781c58ecSDave Penkler 	LLO = 0x11,	/* local lockout		*/
24*781c58ecSDave Penkler 	DCL = 0x14,	/* device clear			*/
25*781c58ecSDave Penkler 	PPU = 0x15,	/* parallel poll unconfigure	*/
26*781c58ecSDave Penkler 	SPE = 0x18,	/* serial poll enable		*/
27*781c58ecSDave Penkler 	SPD = 0x19,	/* serial poll disable		*/
28*781c58ecSDave Penkler 	CFE = 0x1f,     /* configure enable */
29*781c58ecSDave Penkler 	LAD = 0x20,	/* value to be 'ored' in to obtain listen address */
30*781c58ecSDave Penkler 	UNL = 0x3F,	/* unlisten			*/
31*781c58ecSDave Penkler 	TAD = 0x40,	/* value to be 'ored' in to obtain talk address	  */
32*781c58ecSDave Penkler 	UNT = 0x5F,	/* untalk			*/
33*781c58ecSDave Penkler 	SAD = 0x60,	/* my secondary address (base) */
34*781c58ecSDave Penkler 	PPE = 0x60,	/* parallel poll enable (base)	*/
35*781c58ecSDave Penkler 	PPD = 0x70	/* parallel poll disable	*/
36*781c58ecSDave Penkler };
37*781c58ecSDave Penkler 
38*781c58ecSDave Penkler /* confine address to range 0 to 30. */
gpib_address_restrict(u32 addr)39*781c58ecSDave Penkler static inline unsigned int gpib_address_restrict(u32 addr)
40*781c58ecSDave Penkler {
41*781c58ecSDave Penkler 	addr &= 0x1f;
42*781c58ecSDave Penkler 	if (addr == 0x1f)
43*781c58ecSDave Penkler 		addr = 0;
44*781c58ecSDave Penkler 	return addr;
45*781c58ecSDave Penkler }
46*781c58ecSDave Penkler 
MLA(u32 addr)47*781c58ecSDave Penkler static inline u8 MLA(u32 addr)
48*781c58ecSDave Penkler {
49*781c58ecSDave Penkler 	return gpib_address_restrict(addr) | LAD;
50*781c58ecSDave Penkler }
51*781c58ecSDave Penkler 
MTA(u32 addr)52*781c58ecSDave Penkler static inline u8 MTA(u32 addr)
53*781c58ecSDave Penkler {
54*781c58ecSDave Penkler 	return gpib_address_restrict(addr) | TAD;
55*781c58ecSDave Penkler }
56*781c58ecSDave Penkler 
MSA(u32 addr)57*781c58ecSDave Penkler static inline u8 MSA(u32 addr)
58*781c58ecSDave Penkler {
59*781c58ecSDave Penkler 	return (addr & 0x1f) | SAD;
60*781c58ecSDave Penkler }
61*781c58ecSDave Penkler 
gpib_address_equal(u32 pad1,s32 sad1,u32 pad2,s32 sad2)62*781c58ecSDave Penkler static inline s32 gpib_address_equal(u32 pad1, s32 sad1, u32 pad2, s32 sad2)
63*781c58ecSDave Penkler {
64*781c58ecSDave Penkler 	if (pad1 == pad2) {
65*781c58ecSDave Penkler 		if (sad1 == sad2)
66*781c58ecSDave Penkler 			return 1;
67*781c58ecSDave Penkler 		if (sad1 < 0 && sad2 < 0)
68*781c58ecSDave Penkler 			return 1;
69*781c58ecSDave Penkler 	}
70*781c58ecSDave Penkler 
71*781c58ecSDave Penkler 	return 0;
72*781c58ecSDave Penkler }
73*781c58ecSDave Penkler 
is_PPE(u8 command)74*781c58ecSDave Penkler static inline s32 is_PPE(u8 command)
75*781c58ecSDave Penkler {
76*781c58ecSDave Penkler 	return (command & 0x70) == 0x60;
77*781c58ecSDave Penkler }
78*781c58ecSDave Penkler 
is_PPD(u8 command)79*781c58ecSDave Penkler static inline s32 is_PPD(u8 command)
80*781c58ecSDave Penkler {
81*781c58ecSDave Penkler 	return (command & 0x70) == 0x70;
82*781c58ecSDave Penkler }
83*781c58ecSDave Penkler 
in_addressed_command_group(u8 command)84*781c58ecSDave Penkler static inline s32 in_addressed_command_group(u8 command)
85*781c58ecSDave Penkler {
86*781c58ecSDave Penkler 	return (command & 0x70) == 0x0;
87*781c58ecSDave Penkler }
88*781c58ecSDave Penkler 
in_universal_command_group(u8 command)89*781c58ecSDave Penkler static inline s32 in_universal_command_group(u8 command)
90*781c58ecSDave Penkler {
91*781c58ecSDave Penkler 	return (command & 0x70) == 0x10;
92*781c58ecSDave Penkler }
93*781c58ecSDave Penkler 
in_listen_address_group(u8 command)94*781c58ecSDave Penkler static inline s32 in_listen_address_group(u8 command)
95*781c58ecSDave Penkler {
96*781c58ecSDave Penkler 	return (command & 0x60) == 0x20;
97*781c58ecSDave Penkler }
98*781c58ecSDave Penkler 
in_talk_address_group(u8 command)99*781c58ecSDave Penkler static inline s32 in_talk_address_group(u8 command)
100*781c58ecSDave Penkler {
101*781c58ecSDave Penkler 	return (command & 0x60) == 0x40;
102*781c58ecSDave Penkler }
103*781c58ecSDave Penkler 
in_primary_command_group(u8 command)104*781c58ecSDave Penkler static inline s32 in_primary_command_group(u8 command)
105*781c58ecSDave Penkler {
106*781c58ecSDave Penkler 	return in_addressed_command_group(command) ||
107*781c58ecSDave Penkler 		in_universal_command_group(command) ||
108*781c58ecSDave Penkler 		in_listen_address_group(command) ||
109*781c58ecSDave Penkler 		in_talk_address_group(command);
110*781c58ecSDave Penkler }
111*781c58ecSDave Penkler 
112*781c58ecSDave Penkler #endif /* _GPIB_CMD_H */
113