1 #undef BACKEND_NAME
2 #define BACKEND_NAME epson2_scsi
3
4 #include "../include/sane/config.h"
5 #include "../include/sane/sanei_debug.h"
6 #include "../include/sane/sanei_scsi.h"
7 #include "epson2_scsi.h"
8
9 #ifdef HAVE_STDDEF_H
10 #include <stddef.h>
11 #endif
12
13 #ifdef HAVE_STDLIB_H
14 #include <stdlib.h>
15 #endif
16
17 #ifdef NEED_SYS_TYPES_H
18 #include <sys/types.h>
19 #endif
20
21 #include <string.h> /* for memset and memcpy */
22 #include <stdio.h>
23
24 /* sense handler for the sanei_scsi_xxx comands */
25 SANE_Status
sanei_epson2_scsi_sense_handler(int scsi_fd,unsigned char * result,void * arg)26 sanei_epson2_scsi_sense_handler(int scsi_fd,
27 unsigned char *result, void *arg)
28 {
29 /* to get rid of warnings */
30 (void) scsi_fd;
31 (void) arg;
32
33 if (result[0] && result[0] != 0x70) {
34 DBG(2, "%s: sense code = 0x%02x\n",
35 __func__, result[0]);
36 return SANE_STATUS_IO_ERROR;
37 } else {
38 return SANE_STATUS_GOOD;
39 }
40 }
41
42 SANE_Status
sanei_epson2_scsi_inquiry(int fd,void * buf,size_t * buf_size)43 sanei_epson2_scsi_inquiry(int fd, void *buf, size_t *buf_size)
44 {
45 unsigned char cmd[6];
46 int status;
47
48 memset(cmd, 0, 6);
49 cmd[0] = INQUIRY_COMMAND;
50 cmd[4] = *buf_size > 255 ? 255 : *buf_size;
51 status = sanei_scsi_cmd(fd, cmd, sizeof cmd, buf, buf_size);
52
53 return status;
54 }
55
56 SANE_Status
sanei_epson2_scsi_test_unit_ready(int fd)57 sanei_epson2_scsi_test_unit_ready(int fd)
58 {
59 unsigned char cmd[6];
60
61 memset(cmd, 0, 6);
62 cmd[0] = TEST_UNIT_READY_COMMAND;
63
64 return sanei_scsi_cmd2(fd, cmd, sizeof(cmd), NULL, 0, NULL, NULL);
65 }
66
67 int
sanei_epson2_scsi_read(int fd,void * buf,size_t buf_size,SANE_Status * status)68 sanei_epson2_scsi_read(int fd, void *buf, size_t buf_size,
69 SANE_Status *status)
70 {
71 unsigned char cmd[6];
72
73 memset(cmd, 0, 6);
74 cmd[0] = READ_6_COMMAND;
75 cmd[2] = buf_size >> 16;
76 cmd[3] = buf_size >> 8;
77 cmd[4] = buf_size;
78
79 *status = sanei_scsi_cmd2(fd, cmd, sizeof(cmd), NULL, 0, buf, &buf_size);
80 if (*status == SANE_STATUS_GOOD)
81 return buf_size;
82
83 return 0;
84 }
85
86 int
sanei_epson2_scsi_write(int fd,const void * buf,size_t buf_size,SANE_Status * status)87 sanei_epson2_scsi_write(int fd, const void *buf, size_t buf_size,
88 SANE_Status *status)
89 {
90 unsigned char cmd[6];
91
92 memset(cmd, 0, sizeof(cmd));
93 cmd[0] = WRITE_6_COMMAND;
94 cmd[2] = buf_size >> 16;
95 cmd[3] = buf_size >> 8;
96 cmd[4] = buf_size;
97
98 *status = sanei_scsi_cmd2(fd, cmd, sizeof(cmd), buf, buf_size, NULL, NULL);
99 if (*status == SANE_STATUS_GOOD)
100 return buf_size;
101
102 return 0;
103 }
104