| /* SPDX-License-Identifier: GPL-2.0 */ | |
| #ifndef _GPIB_CMD_H | |
| #define _GPIB_CMD_H | |
| #include <linux/types.h> | |
| /* 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 */ |