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