• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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