1/*
2   Copyright (C) 2008, Panasonic Russia Ltd.
3*/
4/* sane - Scanner Access Now Easy.
5   Panasonic KV-S1020C / KV-S1025C USB scanners.
6*/
7
8#ifndef KVS1025_CMDS_H
9#define KVS1025_CMDS_H
10
11/* Commands supported by the KV-S1020C / KV-S1025C scanner. */
12#define SCSI_TEST_UNIT_READY        0x00
13#define SCSI_INQUIRY                0x12
14#define SCSI_SET_WINDOW             0x24
15#define SCSI_SCAN                   0x1B
16#define SCSI_SEND_10                0x2A
17#define SCSI_READ_10                0x28
18#define SCSI_REQUEST_SENSE          0x03
19#define SCSI_GET_BUFFER_STATUS      0x34
20#define SCSI_SET_TIMEOUT	    0xE1
21
22typedef enum
23{
24  KV_CMD_NONE = 0,
25  KV_CMD_IN = 0x81,		/* scanner to pc */
26  KV_CMD_OUT = 0x02		/* pc to scanner */
27} KV_CMD_DIRECTION;		/* equals to endpoint address */
28
29typedef struct
30{
31  KV_CMD_DIRECTION direction;
32  unsigned char cdb[12];
33  int cdb_size;
34  int data_size;
35  void *data;
36} KV_CMD_HEADER, *PKV_CMD_HEADER;
37
38#define KV_CMD_TIMEOUT          10000
39
40static inline int
41getbitfield (unsigned char *pageaddr, int mask, int shift)
42{
43  return ((*pageaddr >> shift) & mask);
44}
45
46/* defines for request sense return block */
47#define get_RS_information_valid(b)       getbitfield(b + 0x00, 1, 7)
48#define get_RS_error_code(b)              getbitfield(b + 0x00, 0x7f, 0)
49#define get_RS_filemark(b)                getbitfield(b + 0x02, 1, 7)
50#define get_RS_EOM(b)                     getbitfield(b + 0x02, 1, 6)
51#define get_RS_ILI(b)                     getbitfield(b + 0x02, 1, 5)
52#define get_RS_sense_key(b)               getbitfield(b + 0x02, 0x0f, 0)
53#define get_RS_information(b)             getnbyte(b+0x03, 4)
54#define get_RS_additional_length(b)       b[0x07]
55#define get_RS_ASC(b)                     b[0x0c]
56#define get_RS_ASCQ(b)                    b[0x0d]
57#define get_RS_SKSV(b)                    getbitfield(b+0x0f,1,7)
58
59typedef enum
60{
61  KV_SUCCESS = 0,
62  KV_FAILED = 1,
63  KV_CHK_CONDITION = 2
64} KV_STATUS;
65
66typedef struct
67{
68  KV_STATUS status;
69  unsigned char reserved[16];
70  unsigned char sense[18];
71} KV_CMD_RESPONSE, *PKV_CMD_RESPONSE;
72
73
74#endif /*#ifndef KVS1025_CMDS_H */
75