diff options
Diffstat (limited to 'backend/epson_scsi.c')
-rw-r--r-- | backend/epson_scsi.c | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/backend/epson_scsi.c b/backend/epson_scsi.c new file mode 100644 index 0000000..698ec61 --- /dev/null +++ b/backend/epson_scsi.c @@ -0,0 +1,114 @@ +#ifdef _AIX +#include "../include/lalloca.h" /* MUST come first for AIX! */ +#endif +#undef BACKEND_NAME +#define BACKEND_NAME epson_scsi +#include "../include/sane/config.h" +#include "../include/sane/sanei_debug.h" +#include "../include/sane/sanei_scsi.h" +#include "epson_scsi.h" + +#include "../include/lalloca.h" + +#ifdef HAVE_STDDEF_H +#include <stddef.h> +#endif + +#ifdef HAVE_STDLIB_H +#include <stdlib.h> +#endif + +#ifdef NEED_SYS_TYPES_H +#include <sys/types.h> +#endif + +#include <string.h> /* for memset and memcpy */ +#include <stdio.h> + +/* + * sense handler for the sanei_scsi_XXX comands + */ +SANE_Status +sanei_epson_scsi_sense_handler (int scsi_fd, u_char * result, void *arg) +{ + /* to get rid of warnings */ + scsi_fd = scsi_fd; + arg = arg; + + if (result[0] && result[0] != 0x70) + { + DBG (2, "sense_handler() : sense code = 0x%02x\n", result[0]); + return SANE_STATUS_IO_ERROR; + } + else + { + return SANE_STATUS_GOOD; + } +} + +/* + * + * + */ +SANE_Status +sanei_epson_scsi_inquiry (int fd, int page_code, void *buf, size_t * buf_size) +{ + u_char cmd[6]; + int status; + + memset (cmd, 0, 6); + cmd[0] = INQUIRY_COMMAND; + cmd[2] = page_code; + cmd[4] = *buf_size > 255 ? 255 : *buf_size; + status = sanei_scsi_cmd (fd, cmd, sizeof cmd, buf, buf_size); + + return status; +} + +/* + * + * + */ +int +sanei_epson_scsi_read (int fd, void *buf, size_t buf_size, + SANE_Status * status) +{ + u_char cmd[6]; + + memset (cmd, 0, 6); + cmd[0] = READ_6_COMMAND; + cmd[2] = buf_size >> 16; + cmd[3] = buf_size >> 8; + cmd[4] = buf_size; + + if (SANE_STATUS_GOOD == + (*status = sanei_scsi_cmd (fd, cmd, sizeof (cmd), buf, &buf_size))) + return buf_size; + + return 0; +} + +/* + * + * + */ +int +sanei_epson_scsi_write (int fd, const void *buf, size_t buf_size, + SANE_Status * status) +{ + u_char *cmd; + + cmd = alloca (8 + buf_size); + memset (cmd, 0, 8); + cmd[0] = WRITE_6_COMMAND; + cmd[2] = buf_size >> 16; + cmd[3] = buf_size >> 8; + cmd[4] = buf_size; + memcpy (cmd + 8, buf, buf_size); + + if (SANE_STATUS_GOOD == + (*status = sanei_scsi_cmd2 (fd, cmd, 6, cmd + 8, buf_size, NULL, NULL))) + return buf_size; + + return 0; +} |