1#ifndef FUJITSU_SCSI_H
2#define FUJITSU_SCSI_H
3
4/*
5 * Part of SANE - Scanner Access Now Easy.
6 *
7 * Please see to opening comments in fujitsu.c
8 */
9
10/****************************************************/
11
12#define USB_COMMAND_CODE   0x43
13#define USB_COMMAND_LEN    0x1F
14#define USB_COMMAND_OFFSET 0x13
15#define USB_COMMAND_TIME   30000
16#define USB_DATA_TIME      30000
17#define USB_STATUS_CODE    0x53
18#define USB_STATUS_LEN     0x0D
19#define USB_STATUS_OFFSET  0x09
20#define USB_STATUS_TIME    30000
21
22/*static inline void */
23static void
24setbitfield (unsigned char *pageaddr, int mask, int shift, int val)
25{
26  *pageaddr = (*pageaddr & ~(mask << shift)) | ((val & mask) << shift);
27}
28
29/* ------------------------------------------------------------------------- */
30
31/*static inline int */
32static int
33getbitfield (unsigned char *pageaddr, int mask, int shift)
34{
35  return ((*pageaddr >> shift) & mask);
36}
37
38/* ------------------------------------------------------------------------- */
39
40static int
41getnbyte (unsigned char *pnt, int nbytes)
42{
43  unsigned int result = 0;
44  int i;
45
46#ifdef DEBUG
47  assert (nbytes < 5);
48#endif
49  for (i = 0; i < nbytes; i++)
50    result = (result << 8) | (pnt[i] & 0xff);
51  return result;
52}
53
54/* ------------------------------------------------------------------------- */
55
56/*static inline void */
57static void
58putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes)
59{
60  int i;
61
62#ifdef DEBUG
63  assert (nbytes < 5);
64#endif
65  for (i = nbytes - 1; i >= 0; i--)
66
67    {
68      pnt[i] = value & 0xff;
69      value = value >> 8;
70    }
71}
72
73/* ==================================================================== */
74/* SCSI commands */
75
76#define set_SCSI_opcode(out, val)          out[0]=val
77#define set_SCSI_lun(out, val)             setbitfield(out + 1, 7, 5, val)
78
79/* ==================================================================== */
80/* TEST_UNIT_READY */
81#define TEST_UNIT_READY_code    0x00
82#define TEST_UNIT_READY_len     6
83
84/* ==================================================================== */
85/* REQUEST_SENSE */
86#define REQUEST_SENSE_code      0x03
87#define REQUEST_SENSE_len       6
88
89#define RS_return_size          0x12
90#define set_RS_return_size(icb,val)        icb[0x04]=val
91
92/* defines for request sense return block */
93#define get_RS_information_valid(b)       getbitfield(b + 0x00, 1, 7)
94#define get_RS_error_code(b)              getbitfield(b + 0x00, 0x7f, 0)
95#define get_RS_filemark(b)                getbitfield(b + 0x02, 1, 7)
96#define get_RS_EOM(b)                     getbitfield(b + 0x02, 1, 6)
97#define get_RS_ILI(b)                     getbitfield(b + 0x02, 1, 5)
98#define get_RS_sense_key(b)               getbitfield(b + 0x02, 0x0f, 0)
99#define get_RS_information(b)             getnbyte(b+0x03, 4)	/* normally 0 */
100#define get_RS_additional_length(b)       b[0x07]	/* always 10 */
101#define get_RS_ASC(b)                     b[0x0c]
102#define get_RS_ASCQ(b)                    b[0x0d]
103#define get_RS_SKSV(b)                    getbitfield(b+0x0f,1,7) /* valid=0 */
104#define get_RS_SKSB(b)                    getnbyte(b+0x0f, 3)
105
106/* when RS is 0x05/0x26 bad bytes listed in sksb */
107#define get_RS_offending_byte(b)          getnbyte(b+0x10, 2)
108
109/* 3091 and 3092 use RS instead of ghs. RS must be 0x00/0x80 */
110/* in ascq */
111#define get_RS_adf_open(in)        getbitfield(in+0x0d, 1, 7)
112#define get_RS_send_sw(in)         getbitfield(in+0x0d, 1, 5)
113#define get_RS_scan_sw(in)         getbitfield(in+0x0d, 1, 4)
114#define get_RS_duplex_sw(in)       getbitfield(in+0x0d, 1, 2)
115#define get_RS_top(in)             getbitfield(in+0x0d, 1, 1)
116#define get_RS_hopper(in)          getbitfield(in+0x0d, 1, 0)
117
118/* in sksb */
119#define get_RS_function(in)        getbitfield(in+0x0f, 0x0f, 3)
120#define get_RS_density(in)         getbitfield(in+0x0f, 0x07, 0)
121
122/* ==================================================================== */
123/* INQUIRY */
124#define INQUIRY_code            0x12
125#define INQUIRY_len             6
126
127#define INQUIRY_std_len         96
128#define INQUIRY_vpd_len         204        /* unlikely maximum value */
129
130#define set_IN_evpd(icb, val)              setbitfield(icb + 1, 1, 0, val)
131#define set_IN_page_code(icb, val)         icb[0x02]=val
132#define set_IN_return_size(icb,val)        icb[0x04]=val
133#define set_IN_length(out,n)               out[0x04]=n-5
134
135#define get_IN_periph_qual(in)             getbitfield(in, 0x07, 5)
136#define IN_periph_qual_lun                    0x00
137#define IN_periph_qual_nolun                  0x03
138#define get_IN_periph_devtype(in)          getbitfield(in, 0x1f, 0)
139#define IN_periph_devtype_scanner             0x06
140#define IN_periph_devtype_unknown             0x1f
141#define get_IN_response_format(in)         getbitfield(in + 0x03, 0x07, 0)
142#define IN_recognized                         0x02
143#define get_IN_vendor(in, buf)             snprintf(buf, 0x08 + 1, "%.*s", \
144                                                    0x08, (char *)in + 0x08)
145#define get_IN_product(in, buf)            snprintf(buf, 0x10 + 1, "%.*s", \
146                                                    0x10, (char *)in + 0x10)
147#define get_IN_version(in, buf)            snprintf(buf, 0x04 + 1, "%.*s", \
148                                                    0x04, (char *)in + 0x20)
149#define get_IN_color_offset(in)            getnbyte (in+0x2A, 2) /* offset between colors */
150
151/* these only in some scanners */
152#define get_IN_long_gray(in)               getbitfield(in+0x2C, 1, 1)
153#define get_IN_long_color(in)              getbitfield(in+0x2C, 1, 0)
154
155#define get_IN_emulation(in)               getbitfield(in+0x2D, 1, 6)
156#define get_IN_cmp_cga(in)                 getbitfield(in+0x2D, 1, 5)
157#define get_IN_bg_back(in)                 getbitfield(in+0x2D, 1, 3)
158#define get_IN_bg_front(in)                getbitfield(in+0x2D, 1, 2)
159#define get_IN_bg_fb(in)                   getbitfield(in+0x2D, 1, 1)
160#define get_IN_has_back(in)                getbitfield(in+0x2D, 1, 0)
161
162#define get_IN_duplex_offset(in)           getnbyte (in+0x2E, 2)
163
164/* the VPD response */
165#define get_IN_page_length(in)             in[0x04]
166#define get_IN_basic_x_res(in)             getnbyte(in + 0x05, 2)
167#define get_IN_basic_y_res(in)             getnbyte(in + 0x07, 2)
168#define get_IN_step_x_res(in)              getbitfield(in+0x09, 1, 0)
169#define get_IN_step_y_res(in)              getbitfield(in+0x09, 1, 4)
170#define get_IN_max_x_res(in)               getnbyte(in + 0x0a, 2)
171#define get_IN_max_y_res(in)               getnbyte(in + 0x0c, 2)
172#define get_IN_min_x_res(in)               getnbyte(in + 0x0e, 2)
173#define get_IN_min_y_res(in)               getnbyte(in + 0x10, 2)
174#define get_IN_std_res_200(in)             getbitfield(in+ 0x12, 1, 0)
175#define get_IN_std_res_180(in)             getbitfield(in+ 0x12, 1, 1)
176#define get_IN_std_res_160(in)             getbitfield(in+ 0x12, 1, 2)
177#define get_IN_std_res_150(in)             getbitfield(in+ 0x12, 1, 3)
178#define get_IN_std_res_120(in)             getbitfield(in+ 0x12, 1, 4)
179#define get_IN_std_res_100(in)             getbitfield(in+ 0x12, 1, 5)
180#define get_IN_std_res_75(in)              getbitfield(in+ 0x12, 1, 6)
181#define get_IN_std_res_60(in)              getbitfield(in+ 0x12, 1, 7)
182#define get_IN_std_res_1200(in)            getbitfield(in+ 0x13, 1, 0)
183#define get_IN_std_res_800(in)             getbitfield(in+ 0x13, 1, 1)
184#define get_IN_std_res_600(in)             getbitfield(in+ 0x13, 1, 2)
185#define get_IN_std_res_480(in)             getbitfield(in+ 0x13, 1, 3)
186#define get_IN_std_res_400(in)             getbitfield(in+ 0x13, 1, 4)
187#define get_IN_std_res_320(in)             getbitfield(in+ 0x13, 1, 5)
188#define get_IN_std_res_300(in)             getbitfield(in+ 0x13, 1, 6)
189#define get_IN_std_res_240(in)             getbitfield(in+ 0x13, 1, 7)
190#define get_IN_window_width(in)            getnbyte(in + 0x14, 4)
191#define get_IN_window_length(in)           getnbyte(in + 0x18, 4)
192#define get_IN_overflow(in)                getbitfield(in+0x1c, 1, 0)
193#define get_IN_monochrome(in)              getbitfield(in+0x1c, 1, 1)
194#define get_IN_half_tone(in)               getbitfield(in+0x1c, 1, 2)
195#define get_IN_multilevel(in)              getbitfield(in+0x1c, 1, 3)
196#define get_IN_monochrome_rgb(in)          getbitfield(in+0x1c, 1, 5)
197#define get_IN_half_tone_rgb(in)           getbitfield(in+0x1c, 1, 6)
198#define get_IN_multilevel_rgb(in)          getbitfield(in+0x1c, 1, 7)
199
200/* vendor unique section */
201#define get_IN_adf(in)                     getbitfield(in+0x20, 1, 7)
202#define get_IN_flatbed(in)                 getbitfield(in+0x20, 1, 6)
203#define get_IN_transparency(in)            getbitfield(in+0x20, 1, 5)
204#define get_IN_duplex(in)                  getbitfield(in+0x20, 1, 4)
205#define get_IN_endorser_b(in)              getbitfield(in+0x20, 1, 3)
206#define get_IN_barcode(in)                 getbitfield(in+0x20, 1, 2)
207#define get_IN_operator_panel(in)          getbitfield(in+0x20, 1, 1)
208#define get_IN_endorser_f(in)              getbitfield(in+0x20, 1, 0)
209
210#define get_IN_mp_stacker(in)              getbitfield(in+0x21, 1, 7)
211#define get_IN_prepick(in)                 getbitfield(in+0x21, 1, 6)
212#define get_IN_mf_detect(in)               getbitfield(in+0x21, 1, 5)
213#define get_IN_paperprot(in)               getbitfield(in+0x21, 1, 4)
214#define get_IN_adbits(in)                  getbitfield(in+0x21, 0x0f, 0)
215
216#define get_IN_buffer_bytes(in)            getnbyte(in + 0x22, 4)
217
218/*supported scsi commands*/
219#define get_IN_has_cmd_msen10(in)       getbitfield(in+0x26, 1, 1)
220#define get_IN_has_cmd_msel10(in)	getbitfield(in+0x26, 1, 0)
221
222#define get_IN_has_cmd_lsen(in)		getbitfield(in+0x27, 1, 7)
223#define get_IN_has_cmd_lsel(in)		getbitfield(in+0x27, 1, 6)
224#define get_IN_has_cmd_change(in)	getbitfield(in+0x27, 1, 5)
225#define get_IN_has_cmd_rbuff(in)	getbitfield(in+0x27, 1, 4)
226#define get_IN_has_cmd_wbuff(in)	getbitfield(in+0x27, 1, 3)
227#define get_IN_has_cmd_cav(in)		getbitfield(in+0x27, 1, 2)
228#define get_IN_has_cmd_comp(in)		getbitfield(in+0x27, 1, 1)
229#define get_IN_has_cmd_gdbs(in)		getbitfield(in+0x27, 1, 0)
230
231#define get_IN_has_cmd_op(in)		getbitfield(in+0x28, 1, 7)
232#define get_IN_has_cmd_send(in)		getbitfield(in+0x28, 1, 6)
233#define get_IN_has_cmd_read(in)		getbitfield(in+0x28, 1, 5)
234#define get_IN_has_cmd_gwin(in)		getbitfield(in+0x28, 1, 4)
235#define get_IN_has_cmd_swin(in)		getbitfield(in+0x28, 1, 3)
236#define get_IN_has_cmd_sdiag(in)	getbitfield(in+0x28, 1, 2)
237#define get_IN_has_cmd_rdiag(in)	getbitfield(in+0x28, 1, 1)
238#define get_IN_has_cmd_scan(in)		getbitfield(in+0x28, 1, 0)
239
240#define get_IN_has_cmd_msen6(in)	getbitfield(in+0x29, 1, 7)
241#define get_IN_has_cmd_copy(in)		getbitfield(in+0x29, 1, 6)
242#define get_IN_has_cmd_rel(in)		getbitfield(in+0x29, 1, 5)
243#define get_IN_has_cmd_runit(in)	getbitfield(in+0x29, 1, 4)
244#define get_IN_has_cmd_msel6(in)	getbitfield(in+0x29, 1, 3)
245#define get_IN_has_cmd_inq(in)		getbitfield(in+0x29, 1, 2)
246#define get_IN_has_cmd_rs(in)		getbitfield(in+0x29, 1, 1)
247#define get_IN_has_cmd_tur(in)		getbitfield(in+0x29, 1, 0)
248
249/* more stuff here? (vendor commands) */
250#define get_IN_has_cmd_subwindow(in)       getbitfield(in+0x2b, 1, 0)
251#define get_IN_has_cmd_endorser(in)        getbitfield(in+0x2b, 1, 1)
252#define get_IN_has_cmd_hw_status(in)       getbitfield(in+0x2b, 1, 2)
253#define get_IN_has_cmd_hw_status_2(in)     getbitfield(in+0x2b, 1, 3)
254#define get_IN_has_cmd_hw_status_3(in)     getbitfield(in+0x2b, 1, 4)
255#define get_IN_has_cmd_scanner_ctl(in)     getbitfield(in+0x31, 1, 1)
256#define get_IN_has_cmd_device_restart(in)  getbitfield(in+0x31, 1, 2)
257
258#define get_IN_brightness_steps(in)        getnbyte(in+0x52, 1)
259#define get_IN_threshold_steps(in)         getnbyte(in+0x53, 1)
260#define get_IN_contrast_steps(in)          getnbyte(in+0x54, 1)
261
262#define get_IN_num_dither_internal(in)     getbitfield(in+0x56, 15, 4)
263#define get_IN_num_dither_download(in)     getbitfield(in+0x56, 15, 0)
264
265#define get_IN_num_gamma_internal(in)      getbitfield(in+0x57, 15, 4)
266#define get_IN_num_gamma_download(in)      getbitfield(in+0x57, 15, 0)
267
268#define get_IN_ipc_bw_rif(in)              getbitfield(in+0x58, 1, 7)
269#define get_IN_ipc_dtc(in)                 getbitfield(in+0x58, 1, 6)
270#define get_IN_ipc_sdtc(in)                getbitfield(in+0x58, 1, 5)
271#define get_IN_ipc_outline_extraction(in)  getbitfield(in+0x58, 1, 4)
272#define get_IN_ipc_image_emphasis(in)      getbitfield(in+0x58, 1, 3)
273#define get_IN_ipc_auto_separation(in)     getbitfield(in+0x58, 1, 2)
274#define get_IN_ipc_mirroring(in)           getbitfield(in+0x58, 1, 1)
275#define get_IN_ipc_wl_follow(in)           getbitfield(in+0x58, 1, 0)
276
277#define get_IN_ipc_subwindow(in)           getbitfield(in+0x59, 1, 7)
278#define get_IN_ipc_diffusion(in)           getbitfield(in+0x59, 1, 6)
279#define get_IN_ipc_ipc3(in)                getbitfield(in+0x59, 1, 5)
280#define get_IN_ipc_rotation(in)            getbitfield(in+0x59, 1, 4)
281#define get_IN_ipc_hybrid_crop_deskew(in)  getbitfield(in+0x59, 1, 3)
282#define get_IN_vpd_thru_byte_6f(in)        getbitfield(in+0x59, 1, 0)
283
284#define get_IN_compression_MH(in)          getbitfield(in+0x5a, 1, 7)
285#define get_IN_compression_MR(in)          getbitfield(in+0x5a, 1, 6)
286#define get_IN_compression_MMR(in)         getbitfield(in+0x5a, 1, 5)
287#define get_IN_compression_JBIG(in)        getbitfield(in+0x5a, 1, 4)
288#define get_IN_compression_JPG_BASE(in)    getbitfield(in+0x5a, 1, 3)
289#define get_IN_compression_JPG_EXT(in)     getbitfield(in+0x5a, 1, 2)
290#define get_IN_compression_JPG_INDEP(in)   getbitfield(in+0x5a, 1, 1)
291
292#define get_IN_compression_JPG_gray(in)    getbitfield(in+0x5b, 3, 6)
293#define IN_comp_JPG_gray_unsup 1
294#define IN_comp_JPG_gray_color 2
295#define IN_comp_JPG_gray_gray  3
296#define get_IN_compression_JPG_YUV_422(in) getbitfield(in+0x5b, 1, 0)
297
298#define get_IN_endorser_b_mech(in)          getbitfield(in+0x5c, 1, 7)
299#define get_IN_endorser_b_stamp(in)         getbitfield(in+0x5c, 1, 6)
300#define get_IN_endorser_b_elec(in)          getbitfield(in+0x5c, 1, 5)
301#define get_IN_endorser_max_id(in)          getbitfield(in+0x5c, 0x0f, 0)
302
303#define get_IN_endorser_f_mech(in)          getbitfield(in+0x5d, 1, 7)
304#define get_IN_endorser_f_stamp(in)         getbitfield(in+0x5d, 1, 6)
305#define get_IN_endorser_f_elec(in)          getbitfield(in+0x5d, 1, 5)
306#define get_IN_endorser_f_type(in)          getbitfield(in+0x5d, 3, 2)
307#define get_IN_endorser_b_type(in)          getbitfield(in+0x5d, 3, 0)
308
309#define get_IN_connection(in)               getbitfield(in+0x62, 3, 0)
310
311#define get_IN_endorser_type_ext(in)        getbitfield(in+0x63, 1, 4)
312#define get_IN_endorser_pre_back(in)        getbitfield(in+0x63, 1, 3)
313#define get_IN_endorser_pre_front(in)       getbitfield(in+0x63, 1, 2)
314#define get_IN_endorser_post_back(in)       getbitfield(in+0x63, 1, 1)
315#define get_IN_endorser_post_front(in)      getbitfield(in+0x63, 1, 0)
316
317#define get_IN_x_overscan_size(in)  getnbyte(in + 0x64, 2)
318#define get_IN_y_overscan_size(in)  getnbyte(in + 0x66, 2)
319
320#define get_IN_default_bg_adf_b(in)      getbitfield(in+0x68, 1, 3)
321#define get_IN_default_bg_adf_f(in)      getbitfield(in+0x68, 1, 2)
322#define get_IN_default_bg_fb(in)         getbitfield(in+0x68, 1, 1)
323
324#define get_IN_auto_color(in)         getbitfield(in+0x69, 1, 7)
325#define get_IN_blank_skip(in)         getbitfield(in+0x69, 1, 6)
326#define get_IN_multi_image(in)        getbitfield(in+0x69, 1, 5)
327#define get_IN_f_b_type_indep(in)     getbitfield(in+0x69, 1, 4)
328#define get_IN_f_b_res_indep(in)      getbitfield(in+0x69, 1, 3)
329
330#define get_IN_dropout_spec(in)       getbitfield(in+0x6a, 1, 7)
331#define get_IN_dropout_non(in)        getbitfield(in+0x6a, 1, 7)
332#define get_IN_dropout_white(in)      getbitfield(in+0x6a, 1, 7)
333
334#define get_IN_skew_check(in)         getbitfield(in+0x6d, 1, 7)
335#define get_IN_new_fd_roll(in)        getbitfield(in+0x6d, 1, 6)
336#define get_IN_paper_prot_2(in)       getbitfield(in+0x6d, 1, 1)
337
338#define get_IN_evpd_len(in)           getnbyte(in + 0x6f, 1)
339
340#define get_IN_paper_count(in)        getbitfield(in+0x70, 1, 7)
341#define get_IN_paper_number(in)       getbitfield(in+0x70, 1, 6)
342#define get_IN_ext_send_to(in)        getbitfield(in+0x70, 1, 5)
343#define get_IN_staple_det(in)         getbitfield(in+0x70, 1, 4)
344#define get_IN_pause_host(in)         getbitfield(in+0x70, 1, 3)
345#define get_IN_pause_panel(in)        getbitfield(in+0x70, 1, 2)
346#define get_IN_pause_conf(in)         getbitfield(in+0x70, 1, 1)
347#define get_IN_hq_print(in)           getbitfield(in+0x70, 1, 0)
348
349#define get_IN_ext_GHS_len(in)        getnbyte(in + 0x71, 1)
350
351#define get_IN_smbc_func(in)          getbitfield(in+0x72, 1, 7)
352#define get_IN_imprint_chk_b(in)      getbitfield(in+0x72, 1, 6)
353#define get_IN_imprint_chk_f(in)      getbitfield(in+0x72, 1, 5)
354#define get_IN_force_w_bg(in)         getbitfield(in+0x72, 1, 4)
355#define get_IN_mf_recover_lvl(in)     getbitfield(in+0x72, 0x0f, 0)
356
357#define get_IN_first_read_time(in)    getbitfield(in+0x73, 1, 7)
358#define get_IN_div_scanning(in)       getbitfield(in+0x73, 1, 6)
359#define get_IN_start_job(in)          getbitfield(in+0x73, 1, 5)
360#define get_IN_lifetime_log(in)       getbitfield(in+0x73, 1, 4)
361#define get_IN_imff_save_rest(in)     getbitfield(in+0x73, 1, 3)
362#define get_IN_wide_scsi_type(in)     getbitfield(in+0x73, 0x07, 0)
363
364#define get_IN_lut_hybrid_crop(in)    getbitfield(in+0x74, 1, 7)
365#define get_IN_over_under_amt(in)     getbitfield(in+0x74, 1, 6)
366#define get_IN_rgb_lut(in)            getbitfield(in+0x74, 1, 5)
367#define get_IN_num_lut_dl(in)         getbitfield(in+0x74, 0x0f, 0)
368
369/*byte 75 is poorly documented*/
370
371#define get_IN_erp_lot6_supp(in)      getbitfield(in+0x76, 1, 7)
372#define get_IN_mode_change_jpeg(in)   getbitfield(in+0x76, 1, 5)
373#define get_IN_mode_change_irdc(in)   getbitfield(in+0x76, 1, 4)
374#define get_IN_mode_change_iomf(in)   getbitfield(in+0x76, 1, 3)
375#define get_IN_sync_next_feed(in)     getbitfield(in+0x76, 0x07, 0)
376
377#define get_IN_imp_func3(in)          getbitfield(in+0x77, 1, 7)
378
379#define get_IN_reset_ms(in)           getbitfield(in+0x78, 1, 7)
380#define get_IN_read_size(in)          getbitfield(in+0x78, 1, 6)
381#define get_IN_start_end_ms(in)       getbitfield(in+0x78, 1, 5)
382
383#define get_IN_battery(in)            getbitfield(in+0x79, 1, 7)
384#define get_IN_battery_save(in)       getbitfield(in+0x79, 1, 6)
385#define get_IN_op_reverse(in)         getbitfield(in+0x79, 1, 1)
386
387#define get_IN_op_halt(in)            getbitfield(in+0x7a, 1, 7)
388
389#define get_IN_return_path(in)        getbitfield(in+0x7c, 1, 7)
390#define get_IN_energy_star3(in)       getbitfield(in+0x7c, 1, 6)
391
392/* ==================================================================== */
393/* page codes used by mode_sense and mode_select */
394#define MS_pc_unk     0x2c /* Used by iX500 */
395#define MS_pc_patch   0x2e /* Patch code scanning */
396#define MS_pc_counter 0x2f /* Page number and counter reset */
397#define MS_pc_autocolor 0x32 /* Automatic color detection */
398#define MS_pc_prepick 0x33 /* Prepick next adf page */
399#define MS_pc_sleep   0x34 /* Sleep mode */
400#define MS_pc_duplex  0x35 /* ADF duplex transfer mode */
401#define MS_pc_rand    0x36 /* All sorts of device controls */
402#define MS_pc_bg      0x37 /* Backing switch control */
403#define MS_pc_df      0x38 /* Double feed detection */
404#define MS_pc_dropout 0x39 /* Drop out color */
405#define MS_pc_buff    0x3a /* Scan buffer control */
406#define MS_pc_auto    0x3c /* Auto paper size detection */
407#define MS_pc_lamp    0x3d /* Lamp light timer set */
408#define MS_pc_jobsep  0x3e /* Detect job separation sheet */
409#define MS_pc_all     0x3f /* Only used with mode_sense */
410
411/* ==================================================================== */
412/* MODE_SELECT */
413#define MODE_SELECT_code        0x15
414#define MODE_SELECT_len         6
415
416#define set_MSEL_pf(sb, val) setbitfield(sb + 1, 1, 4, val)
417#define set_MSEL_xferlen(sb, val) sb[0x04] = (unsigned char)val
418
419/* MS payloads are combined 4 byte header and 8 or 10 byte page
420 * there is also 'descriptor block' & 'vendor-specific block'
421 * but fujitsu seems not to use these */
422/* 10 byte page only used by dropout? */
423#define MSEL_header_len           4
424#define MSEL_data_min_len         8
425#define MSEL_data_max_len         10
426
427#define set_MSEL_pc(sb, val) sb[0x00]=val
428#define set_MSEL_page_len(sb, val) sb[0x01]=val
429
430#define set_MSEL_sleep_mode(sb, val) sb[0x02]=val
431
432#define set_MSEL_transfer_mode(sb, val) setbitfield(sb + 0x02, 0x01, 0, val)
433
434#define set_MSEL_bg_enable(sb, val) setbitfield(sb + 2, 1, 7, val)
435#define set_MSEL_bg_front(sb, val) setbitfield(sb + 2, 1, 5, val)
436#define set_MSEL_bg_back(sb, val) setbitfield(sb + 2, 1, 4, val)
437#define set_MSEL_bg_fb(sb, val) setbitfield(sb + 2, 1, 3, val)
438
439#define set_MSEL_df_enable(sb, val) setbitfield(sb + 2, 1, 7, val)
440#define set_MSEL_df_continue(sb, val) setbitfield(sb + 2, 1, 6, val)
441#define set_MSEL_df_skew(sb, val) setbitfield(sb + 2, 1, 5, val)
442#define set_MSEL_df_thickness(sb, val) setbitfield(sb + 2, 1, 4, val)
443#define set_MSEL_df_length(sb, val) setbitfield(sb + 2, 1, 3, val)
444#define set_MSEL_df_diff(sb, val) setbitfield(sb + 2, 3, 0, val)
445#define MSEL_df_diff_DEFAULT 0
446#define MSEL_df_diff_10MM 1
447#define MSEL_df_diff_15MM 2
448#define MSEL_df_diff_20MM 3
449#define set_MSEL_df_paperprot(sb, val) setbitfield(sb + 3, 3, 6, val)
450#define set_MSEL_df_stapledet(sb, val) setbitfield(sb + 3, 3, 4, val)
451#define set_MSEL_df_recovery(sb, val)  setbitfield(sb + 3, 3, 2, val)
452#define set_MSEL_df_paperprot2(sb, val) setbitfield(sb + 5, 3, 6, val)
453
454#define set_MSEL_dropout_front(sb, val) setbitfield(sb + 0x02, 0x0f, 0, val)
455#define set_MSEL_dropout_back(sb, val) setbitfield(sb + 0x02, 0x0f, 4, val)
456#define MSEL_dropout_DEFAULT 0
457#define MSEL_dropout_GREEN   8
458#define MSEL_dropout_RED     9
459#define MSEL_dropout_BLUE    11
460#define MSEL_dropout_CUSTOM  12
461
462#define set_MSEL_buff_mode(sb, val) setbitfield(sb + 0x02, 0x03, 6, val)
463#define set_MSEL_buff_clear(sb, val) setbitfield(sb + 0x03, 0x03, 6, val)
464
465#define set_MSEL_prepick(sb, val) setbitfield(sb + 0x02, 0x03, 6, val)
466
467/*more automatic stuff with this one...*/
468#define set_MSEL_awd(sb, val)           setbitfield(sb + 0x02, 0x01, 7, val)
469#define set_MSEL_w_wfill(sb, val)       setbitfield(sb + 0x02, 0x01, 6, val)
470#define set_MSEL_req_driv_lut(sb, val)  setbitfield(sb + 0x02, 0x01, 1, val)
471#define set_MSEL_req_driv_crop(sb, val) setbitfield(sb + 0x02, 0x01, 0, val)
472
473#define set_MSEL_ald(sb, val)       setbitfield(sb + 0x03, 0x01, 7, val)
474#define set_MSEL_l_wfill(sb, val)   setbitfield(sb + 0x03, 0x01, 6, val)
475
476#define set_MSEL_deskew(sb, val)    setbitfield(sb + 0x04, 0x01, 7, val)
477
478#define set_MSEL_overscan(sb, val)  setbitfield(sb + 0x05, 0x03, 6, val)
479#define set_MSEL_overcrop(sb, val)  setbitfield(sb + 0x05, 0x01, 5, val)
480#define set_MSEL_undercrop(sb, val) setbitfield(sb + 0x05, 0x01, 4, val)
481
482#define set_MSEL_over_under_amt(sb, val) sb[0x06]=val
483
484/*buffer, prepick, overscan and df use these*/
485#define MSEL_DEFAULT 0
486#define MSEL_OFF 2
487#define MSEL_ON 3
488
489/* ==================================================================== */
490/* RESERVE_UNIT */
491#define RESERVE_UNIT_code       0x16
492#define RESERVE_UNIT_len        6
493
494/* ==================================================================== */
495/* RELEASE_UNIT */
496
497#define RELEASE_UNIT_code       0x17
498#define RELEASE_UNIT_len        6
499
500/* ==================================================================== */
501/* MODE_SENSE */
502#define MODE_SENSE_code         0x1a
503#define MODE_SENSE_len          6
504
505#define MODE_SENSE_data_len     0x14
506
507#define set_MSEN_DBD(b, val)    setbitfield(b, 0x01, 3, (val?1:0))
508#define set_MSEN_pc(sb, val)    setbitfield(sb + 0x02, 0x3f, 0, val)
509#define set_MSEN_xfer_length(sb, val) sb[0x04] = (unsigned char)val
510#define get_MSEN_MUD(b)		getnbyte(b+(0x04+((int)*(b+0x3)))+0x4,2)
511
512/* ==================================================================== */
513/* SCAN */
514#define SCAN_code               0x1b
515#define SCAN_len                6
516
517#define set_SC_xfer_length(sb, val) sb[0x04] = (unsigned char)val
518
519/* ==================================================================== */
520/* READ_DIAGNOSTIC */
521#define READ_DIAGNOSTIC_code    0x1c
522#define READ_DIAGNOSTIC_len     6
523
524#define set_RD_xferlen(in, len) putnbyte(in + 3, len, 2)
525
526/* for 'FIRST READ DATE \0YMD' */
527#define RD_frd_len                      10
528#define get_RD_date_status(in)          in[0]
529#define RD_date_stored			0
530#define RD_date_not_stored		0xff
531
532/* for 'GET FIRST DATE  ' */
533#define RD_gfd_len                      10
534#define get_RD_date_year(in)            in[1]
535#define get_RD_date_month(in)           in[2]
536#define get_RD_date_date(in)            in[3]
537
538/* for 'GET DEVICE ID   ' */
539#define RD_gdi_len                      10
540#define get_RD_id_serial(in)            getnbyte (in, 4)
541
542/* ==================================================================== */
543/* SEND_DIAGNOSTIC */
544#define SEND_DIAGNOSTIC_code    0x1d
545#define SEND_DIAGNOSTIC_len     6
546
547#define set_SD_slftst(in, val) setbitfield(in + 1, 1, 2, val)
548#define set_SD_xferlen(in, len) putnbyte(in + 3, len, 2)
549
550#define SD_frd_string                   "FIRST READ DATE \0YMD"
551#define SD_frd_len                      20
552#define set_SD_frd_year(in, b) 		putnbyte(in + 0x11, b, 1)
553#define set_SD_frd_month(in, b) 	putnbyte(in + 0x12, b, 1)
554#define set_SD_frd_date(in, b) 		putnbyte(in + 0x13, b, 1)
555
556#define SD_gfd_string                   "GET FIRST DATE  "
557#define SD_gfd_len                      16
558
559#define SD_gdi_string                   "GET DEVICE ID   "
560#define SD_gdi_len                      16
561
562#define SD_preread_string               "SET PRE READMODE"
563#define SD_preread_stringlen            16
564#define SD_preread_len                  32
565#define set_SD_preread_xres(in, b)      putnbyte(in + 0x10, b, 2)
566#define set_SD_preread_yres(in, b)      putnbyte(in + 0x12, b, 2)
567#define set_SD_preread_paper_width(sb, val)   putnbyte(sb + 0x14, val, 4)
568#define set_SD_preread_paper_length(sb, val)  putnbyte(sb + 0x18, val, 4)
569#define set_SD_preread_composition(sb, val)   putnbyte(sb + 0x1c, val, 1)
570#define set_SD_preread_escan(sb, val)   putnbyte(sb + 0x1d, val, 1)
571
572#define SD_powoff_string                "SET POWOFF TIME "
573#define SD_powoff_stringlen             16
574#define SD_powoff_len                   18
575#define set_SD_powoff_disable(in, val)  setbitfield(in + 16, 1, 7, val)
576#define set_SD_powoff_interval(in, val) setbitfield(in + 16, 0x7f, 0, val)
577#define set_SD_powoff_notify(sb, val)   putnbyte(sb + 0x17, val, 1)
578
579/* ==================================================================== */
580/* SET_WINDOW */
581#define SET_WINDOW_code         0x24
582#define SET_WINDOW_len          10
583
584#define set_SW_xferlen(sb, len) putnbyte(sb + 0x06, len, 3)
585
586#define SW_header_len		8
587#define SW_desc_len		64
588
589/* ==================================================================== */
590/* GET_WINDOW */
591#define GET_WINDOW_code         0x25
592#define GET_WINDOW_len          0
593
594/* ==================================================================== */
595/* READ */
596#define READ_code               0x28
597#define READ_len                10
598
599#define set_R_datatype_code(sb, val) sb[0x02] = val
600#define R_datatype_imagedata		0x00
601#define R_datatype_pixelsize		0x80
602#define R_datatype_papersize		0x81
603#define R_datatype_effective_id         0x82
604#define set_R_window_id(sb, val)       sb[0x05] = val
605#define set_R_xfer_length(sb, val)     putnbyte(sb + 0x06, val, 3)
606
607#define R_PSIZE_len                0x20
608#define get_PSIZE_num_x(in)            getnbyte(in + 0x00, 4)
609#define get_PSIZE_num_y(in)            getnbyte(in + 0x04, 4)
610#define get_PSIZE_paper_w(in)          getnbyte(in + 0x08, 4)
611#define get_PSIZE_paper_l(in)          getnbyte(in + 0x0C, 4)
612#define get_PSIZE_req_driv_crop(in)    getbitfield(in + 0x10, 1, 7)
613#define get_PSIZE_req_driv_lut(in)     getbitfield(in + 0x10, 1, 6)
614#define get_PSIZE_req_driv_valid(in)   getbitfield(in + 0x10, 1, 0)
615
616#define R_PAPER_len                0x08
617#define get_PAPER_job_sep(in)          getnbyte(in + 0x02, 1)
618#define get_PAPER_paper_w(in)          getnbyte(in + 0x03, 1)
619
620/* ==================================================================== */
621/* SEND */
622#define SEND_code               0x2a
623#define SEND_len                10
624
625#define set_S_xfer_datatype(sb, val) sb[0x02] = (unsigned char)val
626#define S_datatype_halftone_mask        0x02
627#define S_datatype_gamma_function       0x03
628#define S_datatype_lut_data             0x83
629#define S_datatype_lut_dropout          0x84
630#define S_datatype_jpg_q_table          0x88
631#define S_datatype_endorser_data        0x90
632#define S_datatype_sendto_name          0xa0
633/*#define S_EX_datatype_lut		0x01
634#define S_EX_datatype_shading_data	0xa0
635#define S_user_reg_gamma		0xc0
636#define S_device_internal_info		0x03
637#define set_S_datatype_qual_upper(sb, val) sb[0x04] = (unsigned char)val
638#define S_DQ_none	0x00
639#define S_DQ_Rcomp	0x06
640#define S_DQ_Gcomp	0x07
641#define S_DQ_Bcomp	0x08
642#define S_DQ_Reg1	0x01
643#define S_DQ_Reg2	0x02
644#define S_DQ_Reg3	0x03*/
645#define set_S_xfer_id(sb, val)    putnbyte(sb + 4, val, 2)
646#define set_S_xfer_length(sb, val)    putnbyte(sb + 6, val, 3)
647
648/*lut*/
649#define S_lut_header_len   0x0a
650#define set_S_lut_order(sb, val)    putnbyte(sb + 2, val, 1)
651#define S_lut_order_single 0x10
652#define set_S_lut_ssize(sb, val)    putnbyte(sb + 4, val, 2)
653#define set_S_lut_dsize(sb, val)    putnbyte(sb + 6, val, 2)
654#define S_lut_data_min_len          256
655#define S_lut_data_max_len          1024
656
657/*q-table*/
658#define S_q_table_header_len   0x0a
659#define S_q_table_y_len        0x40
660#define set_S_q_table_y_len(sb, val)    putnbyte(sb + 4, val, 2)
661#define S_q_table_uv_len       0x40
662#define set_S_q_table_uv_len(sb, val)   putnbyte(sb + 6, val, 2)
663
664/*endorser*/
665#define S_e_data_min_len	18 /*minimum 18 bytes no string bytes*/
666#define S_e_data_max_len	98 /*maximum 18 bytes plus 80 string bytes*/
667
668#define set_S_endorser_data_id(sb, val) sb[0] = val
669
670#define set_S_endorser_stamp(sb, val) setbitfield(sb + 0x01, 1, 7, val)
671#define set_S_endorser_elec(sb, val) setbitfield(sb + 0x01, 1, 6, val)
672#define set_S_endorser_decr(sb, val) setbitfield(sb + 0x01, 1, 5, val)
673#define S_e_decr_inc 0
674#define S_e_decr_dec 1
675#define set_S_endorser_lap24(sb, val) setbitfield(sb + 0x01, 1, 4, val)
676#define S_e_lap_24bit 1
677#define S_e_lap_16bit 0
678#define set_S_endorser_ctstep(sb, val) setbitfield(sb + 0x01, 0x03, 0, val)
679
680#define set_S_endorser_ulx(sb, val) putnbyte(sb + 0x02, val, 4)
681#define set_S_endorser_uly(sb, val) putnbyte(sb + 0x06, val, 4)
682
683#define set_S_endorser_font(sb, val) sb[0xa] = val
684#define S_e_font_horiz 0
685#define S_e_font_vert 1
686#define S_e_font_horiz_narrow 2
687#define set_S_endorser_size(sb, val) sb[0xb] = val
688
689#define set_S_endorser_revs(sb, val) setbitfield(sb + 0x0c, 0x01, 7, val)
690#define S_e_revs_fwd 0
691#define S_e_revs_rev 1
692#define set_S_endorser_bold(sb, val) setbitfield(sb + 0x0c, 0x01, 2, val)
693#define set_S_endorser_dirs(sb, val) setbitfield(sb + 0x0c, 0x03, 0, val)
694#define S_e_dir_left_right 0
695#define S_e_dir_top_bottom 1
696#define S_e_dir_right_left 2
697#define S_e_dir_bottom_top 3
698
699#define set_S_endorser_string_length(sb, len)  sb[0x11] = len
700#define set_S_endorser_string(sb,val,len) memcpy(sb+0x12,val,(size_t)len)
701
702/* ==================================================================== */
703/* OBJECT_POSITION */
704#define OBJECT_POSITION_code    0x31
705#define OBJECT_POSITION_len     10
706
707#define set_OP_action(b,val)    setbitfield(b+0x01, 0x07, 0, val)
708#define OP_Discharge	0x00
709#define OP_Feed	        0x01
710#define OP_Halt	        0x04
711
712/* ==================================================================== */
713/* SET_SUBWINDOW */
714#define SET_SUBWINDOW_code      0xc0
715#define SET_SUBWINDOW_len       0
716
717/* ==================================================================== */
718/* ENDORSER */
719#define ENDORSER_code           0xc1
720#define ENDORSER_len            10
721
722#define set_E_xferlen(sb, val) putnbyte(sb + 0x7, val, 2)
723
724/*endorser data*/
725#define ED_min_len               4
726#define ED_max_len               6
727
728#define set_ED_endorser_data_id(sb, val) sb[0] = val
729
730/* enable/disable endorser printing*/
731#define set_ED_stop(sb, val) setbitfield(sb + 0x01, 1, 7, val)
732#define ED_start 0
733#define ED_stop 1
734/* specifies the side of a document to be printed */
735#define set_ED_side(sb, val) setbitfield(sb + 0x01, 1, 6, val)
736#define ED_front 0
737#define ED_back 1
738
739/* format of the counter 16/24 bit*/
740#define set_ED_lap24(sb, val) setbitfield(sb + 0x01, 1, 5, val)
741#define ED_lap_16bit 0
742#define ED_lap_24bit 1
743
744/* initial count */
745#define set_ED_initial_count_16(sb, val) putnbyte(sb + 0x02, val, 2)
746#define set_ED_initial_count_24(sb, val) putnbyte(sb + 0x03, val, 3)
747
748/* ==================================================================== */
749/* GET_HW_STATUS*/
750#define GET_HW_STATUS_code      0xc2
751#define GET_HW_STATUS_len       10
752
753#define set_GHS_allocation_length(sb, len) putnbyte(sb + 0x07, len, 2)
754
755#define GHS_data_len            12
756
757#define get_GHS_top(in)             getbitfield(in+0x02, 1, 7)
758#define get_GHS_fedalm(in)          getbitfield(in+0x02, 1, 5)
759#define get_GHS_adjalm(in)          getbitfield(in+0x02, 1, 4)
760#define get_GHS_A3(in)              getbitfield(in+0x02, 1, 3)
761#define get_GHS_B4(in)              getbitfield(in+0x02, 1, 2)
762#define get_GHS_A4(in)              getbitfield(in+0x02, 1, 1)
763#define get_GHS_B5(in)              getbitfield(in+0x02, 1, 0)
764
765#define get_GHS_hopper(in)          !getbitfield(in+0x03, 1, 7)
766#define get_GHS_omr(in)             getbitfield(in+0x03, 1, 6)
767#define get_GHS_adf_open(in)        getbitfield(in+0x03, 1, 5)
768#define get_GHS_imp_open(in)        getbitfield(in+0x03, 1, 4)
769#define get_GHS_fb_open(in)         getbitfield(in+0x03, 1, 3)
770#define get_GHS_paper_end(in)       getbitfield(in+0x03, 1, 2)
771#define get_GHS_fb_on(in)           getbitfield(in+0x03, 1, 1)
772#define get_GHS_exit(in)            getbitfield(in+0x03, 1, 0)
773
774#define get_GHS_sleep(in)           getbitfield(in+0x04, 1, 7)
775#define get_GHS_clean(in)           getbitfield(in+0x04, 1, 6)
776#define get_GHS_scan_sw_long(in)    getbitfield(in+0x04, 1, 5)
777#define get_GHS_hpos(in)            getbitfield(in+0x04, 1, 4)
778#define get_GHS_send_sw(in)         getbitfield(in+0x04, 1, 2)
779#define get_GHS_manual_feed(in)     getbitfield(in+0x04, 1, 1)
780#define get_GHS_scan_sw(in)         getbitfield(in+0x04, 1, 0)
781
782#define get_GHS_picalm(in)          getbitfield(in+0x05, 1, 7)
783#define get_GHS_padalm(in)          getbitfield(in+0x05, 1, 6)
784#define get_GHS_brkalm(in)          getbitfield(in+0x05, 1, 5)
785#define get_GHS_sepalm(in)          getbitfield(in+0x05, 1, 4)
786#define get_GHS_function(in)        getbitfield(in+0x05, 0x0f, 0)
787
788#define get_GHS_ink_empty(in)      getbitfield(in+0x06, 1, 7)
789#define get_GHS_consume(in)        getbitfield(in+0x06, 1, 6)
790#define get_GHS_overskew(in)       getbitfield(in+0x06, 1, 5)
791#define get_GHS_overthick(in)      getbitfield(in+0x06, 1, 4)
792#define get_GHS_plen(in)           getbitfield(in+0x06, 1, 3)
793#define get_GHS_ink_side(in)       getbitfield(in+0x06, 1, 2)
794#define get_GHS_mf_to(in)          getbitfield(in+0x06, 1, 1)
795#define get_GHS_double_feed(in)    getbitfield(in+0x06, 1, 0)
796
797#define get_GHS_error_code(in)      in[0x07]
798
799#define get_GHS_skew_angle(in)      in[0x09]
800
801#define get_GHS_ink_remain(in)      in[0x0a]
802
803#define get_GHS_lang_code(in)      getnbyte(in+0x0c, 2)
804
805#define get_GHS_adjalm_fed(in)     getbitfield(in+0x0e, 1, 7)
806#define get_GHS_non_sep(in)        getbitfield(in+0x0e, 1, 4)
807#define get_GHS_ext_sendto(in)     getbitfield(in+0x0e, 1, 2)
808#define get_GHS_rq_hldimg(in)      getbitfield(in+0x0e, 1, 1)
809#define get_GHS_pacnt(in)          getbitfield(in+0x0e, 1, 0)
810
811#define get_GHS_wifi_sw(in)      getbitfield(in+0x10, 1, 7)
812#define get_GHS_w_use(in)        getbitfield(in+0x10, 1, 6)
813#define get_GHS_w_use2(in)       getbitfield(in+0x10, 1, 5)
814#define get_GHS_w_use3(in)       getbitfield(in+0x10, 1, 4)
815#define get_GHS_w_use4(in)       getbitfield(in+0x10, 1, 3)
816
817#define get_GHS_battery(in)         getbitfield(in+0x11, 1, 7)
818#define get_GHS_btr_charge(in)      getbitfield(in+0x11, 1, 6)
819#define get_GHS_btr_chg_tmp_stp(in) getbitfield(in+0x11, 1, 5)
820#define get_GHS_ibtr_ene_sav(in)    getbitfield(in+0x11, 1, 4)
821#define get_GHS_fngr_caut(in)       getbitfield(in+0x11, 1, 2)
822#define get_GHS_trnpg_l(in)         getbitfield(in+0x11, 1, 1)
823#define get_GHS_trnpg_r(in)         getbitfield(in+0x11, 1, 0)
824
825#define get_GHS_btr_power(in)       in[0x12]
826
827/* ==================================================================== */
828/* SCANNER_CONTROL */
829#define SCANNER_CONTROL_code    0xf1
830#define SCANNER_CONTROL_len     10
831
832#define set_SC_ric(icb, val)                   setbitfield(icb + 1, 1, 4, val)
833#define set_SC_function_1(icb, val)            setbitfield(icb + 1, 0xf, 0, val)
834#define set_SC_function_2(icb, val)            icb[2] = (val >> 4)
835#define SC_function_adf                        0x00
836#define SC_function_fb                         0x01
837#define SC_function_fb_hs                      0x02
838#define SC_function_lamp_off                   0x03
839#define SC_function_cancel                     0x04
840#define SC_function_lamp_on                    0x05
841#define SC_function_lamp_normal                0x06
842#define SC_function_lamp_saving                0x07
843#define SC_function_panel                      0x08
844#define SC_function_scan_complete              0x09
845#define SC_function_eject_complete             0x0a
846#define SC_function_manual_feed                0x0c
847#define SC_function_mfeed                      0x0f
848#define SC_function_continuous                 0x1f
849#define SC_function_rpath                      0x2f
850
851/* used with SC_function_panel */
852#define set_SC_led_eb(icb, val)                setbitfield(icb + 5, 1, 7, val)
853#define set_SC_led(icb, val)                   setbitfield(icb + 5, 1, 6, val)
854#define set_SC_fcno_eb(icb, val)               setbitfield(icb + 5, 1, 4, val)
855#define set_SC_fcno(icb, val)                  setbitfield(icb + 5, 0xf, 0, val)
856
857#define set_SC_ric_dtq(sb, val) sb[2] = val
858#define set_SC_ric_len(sb, val) putnbyte(sb + 0x06, val, 3)
859
860/* ==================================================================== */
861/* window descriptor macros for SET_WINDOW and GET_WINDOW */
862
863#define set_WPDB_wdblen(sb, len) putnbyte(sb + 0x06, len, 2)
864
865/* ==================================================================== */
866
867  /* 0x00 - Window Identifier
868   *        0x00 for 3096
869   *        0x00 (front) or 0x80 (back) for 3091
870   */
871#define set_WD_wid(sb, val) sb[0] = val
872#define WD_wid_front 0x00
873#define WD_wid_back 0x80
874
875  /* 0x01 - Reserved (bits 7-1), AUTO (bit 0)
876   *        Use 0x00 for 3091, 3096
877   */
878#define set_WD_auto(sb, val) setbitfield(sb + 0x01, 1, 0, val)
879#define get_WD_auto(sb)	getbitfield(sb + 0x01, 1, 0)
880
881  /* 0x02,0x03 - X resolution in dpi
882   *        3091 supports 50-300 in steps of 1
883   *        3096 suppors 200,240,300,400; or 100-1600 in steps of 4
884   *             if image processiong option installed
885   */
886#define set_WD_Xres(sb, val) putnbyte(sb + 0x02, val, 2)
887#define get_WD_Xres(sb)	getnbyte(sb + 0x02, 2)
888
889  /* 0x04,0x05 - X resolution in dpi
890   *        3091 supports 50-600 in steps of 1; 75,150,300,600 only
891   *             in color mode
892   *        3096 suppors 200,240,300,400; or 100-1600 in steps of 4
893   *             if image processiong option installed
894   */
895#define set_WD_Yres(sb, val) putnbyte(sb + 0x04, val, 2)
896#define get_WD_Yres(sb)	getnbyte(sb + 0x04, 2)
897
898  /* 0x06-0x09 - Upper Left X in 1/1200 inch
899   */
900#define set_WD_ULX(sb, val) putnbyte(sb + 0x06, val, 4)
901#define get_WD_ULX(sb) getnbyte(sb + 0x06, 4)
902
903  /* 0x0a-0x0d - Upper Left Y in 1/1200 inch
904   */
905#define set_WD_ULY(sb, val) putnbyte(sb + 0x0a, val, 4)
906#define get_WD_ULY(sb) getnbyte(sb + 0x0a, 4)
907
908  /* 0x0e-0x11 - Width in 1/1200 inch
909   *        3091 left+width max 10200
910   *        3096 left+width max 14592
911   *        also limited to page size, see bytes 0x35ff.
912   */
913#define set_WD_width(sb, val) putnbyte(sb + 0x0e, val, 4)
914#define get_WD_width(sb) getnbyte(sb + 0x0e, 4)
915
916  /* 0x12-0x15 - Height in 1/1200 inch
917   *        3091 top+height max 16832
918   *        3096 top+height max 20736, also if left+width>13199,
919   *             top+height has to be less than 19843
920   */
921#define set_WD_length(sb, val) putnbyte(sb + 0x12, val, 4)
922#define get_WD_length(sb) getnbyte(sb + 0x12, 4)
923
924  /* 0x16 - Brightness
925   *        3091 always use 0x00
926   *        3096 if in halftone mode, 8 levels supported (01-1F, 20-3F,
927   ..., E0-FF)
928   *             use 0x00 for user defined dither pattern
929   */
930#define set_WD_brightness(sb, val) sb[0x16] = val
931#define get_WD_brightness(sb)  sb[0x16]
932
933  /* 0x17 - Threshold
934   *        3091 0x00 = use floating slice; 0x01..0xff fixed slice
935   *             with 0x01=brightest, 0x80=medium, 0xff=darkest;
936   *             only effective for line art mode.
937   *        3096 0x00 = use "simplified dynamic threshold", otherwise
938   *             same as above but resolution is only 64 steps.
939   */
940#define set_WD_threshold(sb, val) sb[0x17] = val
941#define get_WD_threshold(sb)  sb[0x17]
942
943  /* 0x18 - Contrast
944   *        3091 - not supported, always use 0x00
945   *        3096 - the same
946   */
947#define set_WD_contrast(sb, val) sb[0x18] = val
948#define get_WD_contrast(sb) sb[0x18]
949
950  /* 0x19 - Image Composition (color mode)
951   *        3091 - use 0x00 for line art, 0x01 for halftone,
952   *               0x02 for grayscale, 0x05 for color.
953   *        3096 - same but minus color.
954   */
955#define set_WD_composition(sb, val)  sb[0x19] = val
956#define get_WD_composition(sb) sb[0x19]
957#define WD_comp_LA 0
958#define WD_comp_HT 1
959#define WD_comp_GS 2
960#define WD_comp_CL 3
961#define WD_comp_CH 4
962#define WD_comp_CG 5
963
964  /* 0x1a - Depth
965   *        3091 - use 0x01 for b/w or 0x08 for gray/color
966   *        3096 - use 0x01 for b/w or 0x08 for gray
967   */
968#define set_WD_bitsperpixel(sb, val) sb[0x1a] = val
969#define get_WD_bitsperpixel(sb)	sb[0x1a]
970
971  /* 0x1b,0x1c - Halftone Pattern
972   *        3091 byte 1b: 00h default(=dither), 01h dither,
973   *                      02h error dispersion
974   *                  1c: 00 dark images, 01h dark text+images,
975   *                      02h light images,
976   *                      03h light text+images, 80h download pattern
977   *        3096: 1b unused; 1c bit 7=1: use downloadable pattern,
978   *              bit 7=0: use builtin pattern; rest of byte 1b denotes
979   *              pattern number, three builtin and five downloadable
980   *              supported; higher numbers = error.
981   */
982#define set_WD_ht_type(sb, val) sb[0x1b] = val
983#define get_WD_ht_type(sb)	sb[0x1b]
984#define WD_ht_type_DEFAULT 0
985#define WD_ht_type_DITHER 1
986#define WD_ht_type_DIFFUSION 2
987
988#define set_WD_ht_pattern(sb, val) sb[0x1c] = val
989#define get_WD_ht_pattern(sb)	   sb[0x1c]
990
991  /* 0x1d - Reverse image, padding type
992   *        3091: bit 7=1: reverse black&white
993   *              bits 0-2: padding type, must be 0
994   *        3096: the same; bit 7 must be set for gray and not
995   *              set for b/w.
996   */
997#define set_WD_rif(sb, val) setbitfield(sb + 0x1d, 1, 7, val)
998#define get_WD_rif(sb)	getbitfield(sb + 0x1d, 1, 7)
999
1000  /* 0x1e,0x1f - Bit ordering
1001   *        3091 not supported, use 0x00
1002   *        3096 not supported, use 0x00
1003   */
1004#define set_WD_bitorder(sb, val) putnbyte(sb + 0x1e, val, 2)
1005#define get_WD_bitorder(sb)	getnbyte(sb + 0x1e, 2)
1006
1007  /* 0x20 - compression type
1008   *          not supported on smaller models, use 0x00
1009   */
1010#define set_WD_compress_type(sb, val)  sb[0x20] = val
1011#define get_WD_compress_type(sb) sb[0x20]
1012#define WD_cmp_NONE 0
1013#define WD_cmp_MH   1
1014#define WD_cmp_MR   2
1015#define WD_cmp_MMR  3
1016#define WD_cmp_JBIG 0x80
1017#define WD_cmp_JPG1 0x81
1018#define WD_cmp_JPG2 0x82
1019#define WD_cmp_JPG3 0x83
1020
1021
1022  /* 0x21 - compression argument
1023   *          specify "k" parameter with MR compress,
1024   *          or with JPEG- Q param, 0-7
1025   */
1026#define set_WD_compress_arg(sb, val)  sb[0x21] = val
1027#define get_WD_compress_arg(sb) sb[0x21]
1028
1029  /* 0x22-0x27 - reserved */
1030
1031  /* 0x28 - vendor unique id code, decides meaning of remaining bytes
1032   *        0xc1 = color mode (fi-series)
1033   *        0xc0 = weird mode (M3091 and M3092)
1034   *        0x00 = mono mode (other M-series and fi-series)
1035   */
1036#define set_WD_vendor_id_code(sb, val)  sb[0x28] = val
1037#define get_WD_vendor_id_code(sb) sb[0x28]
1038#define WD_VUID_MONO 0x00
1039#define WD_VUID_3091 0xc0
1040#define WD_VUID_COLOR 0xc1
1041
1042  /* 0x29 common gamma */
1043#define set_WD_gamma(sb, val)  sb[0x29] = val
1044#define get_WD_gamma(sb) sb[0x29]
1045#define WD_gamma_DEFAULT 0
1046#define WD_gamma_NORMAL  1
1047#define WD_gamma_SOFT    2
1048#define WD_gamma_SHARP   3
1049
1050/*==================================================================*/
1051/* 0x2a-0x3F - vary based on vuid */
1052
1053/*==================================================================*/
1054/* vuid 0x00, mono params */
1055
1056#define set_WD_outline(sb, val)  setbitfield(sb + 0x2a, 1, 7, val)
1057#define get_WD_outline(sb) getbitfield(sb + 0x2a, 1, 7)
1058
1059#define set_WD_emphasis(sb, val)  sb[0x2b] = val
1060#define get_WD_emphasis(sb) sb[0x2b]
1061
1062#define set_WD_separation(sb, val)  setbitfield(sb + 0x2c, 1, 7, val)
1063#define get_WD_separation(sb) getbitfield(sb + 0x2c, 1, 7)
1064
1065#define set_WD_mirroring(sb, val)  setbitfield(sb + 0x2d, 1, 7, val)
1066#define get_WD_mirroring(sb) getbitfield(sb + 0x2d, 1, 7)
1067
1068/* SDTC also called Auto-II mode?*/
1069#define set_WD_variance(sb, val)  sb[0x2e] = val
1070#define get_WD_variance(sb) sb[0x2e]
1071
1072/* DTC also called Auto-I mode?*/
1073/*warning: filtering uses inverse logic*/
1074#define set_WD_filtering(sb, val) setbitfield(sb + 0x2f, 1, 7, !val)
1075#define get_WD_filtering(sb) !getbitfield(sb + 0x2f, 1, 7)
1076
1077/*warning: smoothing uses inverse logic*/
1078#define set_WD_smoothing(sb, val) setbitfield(sb + 0x2f, 3, 5, !val)
1079#define get_WD_smoothing(sb) !getbitfield(sb + 0x2f, 3, 5)
1080
1081#define set_WD_gamma_curve(sb, val) setbitfield(sb + 0x2f, 3, 3, val)
1082#define get_WD_gamma_curve(sb) getbitfield(sb + 0x2f, 3, 3)
1083
1084#define set_WD_threshold_curve(sb, val) setbitfield(sb + 0x2f, 7, 0, val)
1085#define get_WD_threshold_curve(sb) getbitfield(sb + 0x2f, 7, 0)
1086
1087/*warning: noise removal uses inverse logic*/
1088#define set_WD_noise_removal(sb, val) setbitfield(sb + 0x30, 1, 5, !val)
1089#define get_WD_noise_removal(sb) !getbitfield(sb + 0x30, 1, 5)
1090
1091#define set_WD_matrix5x5(sb, val) setbitfield(sb + 0x30, 1, 4, val)
1092#define get_WD_matrix5x5(sb) getbitfield(sb + 0x30, 1, 4)
1093#define set_WD_matrix4x4(sb, val) setbitfield(sb + 0x30, 1, 3, val)
1094#define get_WD_matrix4x4(sb) getbitfield(sb + 0x30, 1, 3)
1095#define set_WD_matrix3x3(sb, val) setbitfield(sb + 0x30, 1, 2, val)
1096#define get_WD_matrix3x3(sb) getbitfield(sb + 0x30, 1, 2)
1097#define set_WD_matrix2x2(sb, val) setbitfield(sb + 0x30, 1, 1, val)
1098#define get_WD_matrix2x2(sb) getbitfield(sb + 0x30, 1, 1)
1099
1100#define set_WD_background(sb, val) setbitfield(sb + 0x30, 1, 0, val)
1101#define get_WD_background(sb) getbitfield(sb + 0x30, 1, 0)
1102#define WD_background_WHITE  0
1103#define WD_background_BLACK  1
1104
1105/*31 reserved*/
1106
1107#define set_WD_wl_follow(sb, val) setbitfield(sb + 0x32, 3, 6, val)
1108#define get_WD_wl_follow(sb) getbitfield(sb + 0x32, 3, 6)
1109#define WD_wl_follow_DEFAULT  0
1110#define WD_wl_follow_ON  2
1111#define WD_wl_follow_OFF 3
1112
1113#define set_WD_subwindow_list(sb, val) putnbyte(sb + 0x33, val, 2)
1114#define get_WD_subwindow_list(sb)	getnbyte(sb + 0x33, 2)
1115
1116/* 0x35-0x3d - paper size */
1117#define set_WD_paper_selection(sb, val) setbitfield(sb + 0x35, 3, 6, val)
1118#define WD_paper_SEL_UNDEFINED     0
1119#define WD_paper_SEL_NON_STANDARD  3
1120
1121#define set_WD_paper_width_X(sb, val) putnbyte(sb + 0x36, val, 4)
1122#define get_WD_paper_width_X(sb)	getnbyte(sb + 0x36, 4)
1123
1124#define set_WD_paper_length_Y(sb, val) putnbyte(sb+0x3a, val, 4)
1125#define get_WD_paper_length_Y(sb)	getnbyte(sb+0x3a, 4)
1126
1127/* 3e switch ipc mode */
1128#define set_WD_ipc_mode(sb, val) setbitfield(sb + 0x3e, 3, 6, val)
1129#define get_WD_ipc_mode(sb) getbitfield(sb + 0x3e, 3, 6)
1130#define WD_ipc_DEFAULT  0
1131#define WD_ipc_DTC      1
1132#define WD_ipc_SDTC     2
1133
1134/*3f reserved*/
1135
1136/*==================================================================*/
1137/* vuid 0xc1, color params */
1138
1139#define set_WD_scanning_order(sb, val)  sb[0x2a] = val
1140#define get_WD_scanning_order(sb) sb[0x2a]
1141#define WD_SCAN_ORDER_LINE 0
1142#define WD_SCAN_ORDER_DOT 1
1143#define WD_SCAN_ORDER_FACE 2
1144
1145#define set_WD_scanning_order_arg(sb, val)  sb[0x2b] = val
1146#define get_WD_scanning_order_arg(sb) sb[0x2b]
1147#define WD_SCAN_ARG_RGB 0
1148#define WD_SCAN_ARG_RBG 1
1149#define WD_SCAN_ARG_GRB 2
1150#define WD_SCAN_ARG_GBR 3
1151#define WD_SCAN_ARG_BRG 4
1152#define WD_SCAN_ARG_BGR 5
1153
1154/*2c-2d reserved*/
1155
1156/*like vuid 00, but in different location*/
1157#define set_WD_c1_emphasis(sb, val)  sb[0x2e] = val
1158#define get_WD_c1_emphasis(sb) sb[0x2e]
1159#define set_WD_c1_mirroring(sb, val)  setbitfield(sb + 0x2f, 1, 7, val)
1160#define get_WD_c1_mirroring(sb) getbitfield(sb + 0x2f, 1, 7)
1161
1162/*30-31 reserved*/
1163
1164/*32 wlf (see vuid 00)*/
1165
1166/*33-34 reserved*/
1167
1168/*35-3d paper size (see vuid 00)*/
1169
1170/*3e-3f reserved*/
1171
1172/*==================================================================*/
1173/* vuid 0xc0, 3091/2 params */
1174
1175/*2a-2b same as vuid 0xc1*/
1176
1177#define set_WD_lamp_color(sb, val)  sb[0x2d] = val
1178#define get_WD_lamp_color(sb) sb[0x2d]
1179#define WD_LAMP_DEFAULT 0x00
1180#define WD_LAMP_BLUE 0x01
1181#define WD_LAMP_RED 0x02
1182#define WD_LAMP_GREEN 0x04
1183
1184/*2e-31 reserved*/
1185
1186#define set_WD_quality(sb, val)  sb[0x32] = val
1187#define get_WD_quality(sb) sb[0x32]
1188#define WD_QUAL_NORMAL 0x00
1189#define WD_QUAL_HIGH   0x02
1190
1191/*33-34 reserved*/
1192
1193/*35-3d paper size (see vuid 00)*/
1194
1195/*3e-3f reserved*/
1196
1197/*FIXME: more params here*/
1198
1199/* ==================================================================== */
1200
1201#endif
1202