/* SPDX-License-Identifier: GPL-2.0 */ #ifndef _GPIB_CMD_H #define _GPIB_CMD_H #include /* Command byte definitions tests and functions */ /* mask of bits that actually matter in a command byte */ enum { gpib_command_mask = 0x7f, }; /* Possible GPIB command messages */ enum cmd_byte { GTL = 0x1, /* go to local */ SDC = 0x4, /* selected device clear */ PP_CONFIG = 0x5, GET = 0x8, /* group execute trigger */ TCT = 0x9, /* take control */ LLO = 0x11, /* local lockout */ DCL = 0x14, /* device clear */ PPU = 0x15, /* parallel poll unconfigure */ SPE = 0x18, /* serial poll enable */ SPD = 0x19, /* serial poll disable */ CFE = 0x1f, /* configure enable */ LAD = 0x20, /* value to be 'ored' in to obtain listen address */ UNL = 0x3F, /* unlisten */ TAD = 0x40, /* value to be 'ored' in to obtain talk address */ UNT = 0x5F, /* untalk */ SAD = 0x60, /* my secondary address (base) */ PPE = 0x60, /* parallel poll enable (base) */ PPD = 0x70 /* parallel poll disable */ }; /* confine address to range 0 to 30. */ static inline unsigned int gpib_address_restrict(u32 addr) { addr &= 0x1f; if (addr == 0x1f) addr = 0; return addr; } static inline u8 MLA(u32 addr) { return gpib_address_restrict(addr) | LAD; } static inline u8 MTA(u32 addr) { return gpib_address_restrict(addr) | TAD; } static inline u8 MSA(u32 addr) { return (addr & 0x1f) | SAD; } static inline s32 gpib_address_equal(u32 pad1, s32 sad1, u32 pad2, s32 sad2) { if (pad1 == pad2) { if (sad1 == sad2) return 1; if (sad1 < 0 && sad2 < 0) return 1; } return 0; } static inline s32 is_PPE(u8 command) { return (command & 0x70) == 0x60; } static inline s32 is_PPD(u8 command) { return (command & 0x70) == 0x70; } static inline s32 in_addressed_command_group(u8 command) { return (command & 0x70) == 0x0; } static inline s32 in_universal_command_group(u8 command) { return (command & 0x70) == 0x10; } static inline s32 in_listen_address_group(u8 command) { return (command & 0x60) == 0x20; } static inline s32 in_talk_address_group(u8 command) { return (command & 0x60) == 0x40; } static inline s32 in_primary_command_group(u8 command) { return in_addressed_command_group(command) || in_universal_command_group(command) || in_listen_address_group(command) || in_talk_address_group(command); } #endif /* _GPIB_CMD_H */