1 #ifndef CANON_DR_CMD_H
2 #define CANON_DR_CMD_H
3
4 /*
5 * Part of SANE - Scanner Access Now Easy.
6 * Please see opening comments in canon_dr.c
7 */
8
9 /****************************************************/
10
11 #define USB_HEADER_LEN 12
12 #define USB_COMMAND_LEN 12
13 #define USB_STATUS_LEN 4
14 #define USB_PACKET_TIMEOUT 30000
15
16 /*static inline void */
17 static void
setbitfield(unsigned char * pageaddr,int mask,int shift,int val)18 setbitfield (unsigned char *pageaddr, int mask, int shift, int val)
19 {
20 *pageaddr = (*pageaddr & ~(mask << shift)) | ((val & mask) << shift);
21 }
22
23 /* ------------------------------------------------------------------------- */
24
25 /*static inline int */
26 static int
getbitfield(unsigned char * pageaddr,int mask,int shift)27 getbitfield (unsigned char *pageaddr, int mask, int shift)
28 {
29 return ((*pageaddr >> shift) & mask);
30 }
31
32 /* ------------------------------------------------------------------------- */
33
34 static int
getnbyte(unsigned char * pnt,int nbytes)35 getnbyte (unsigned char *pnt, int nbytes)
36 {
37 unsigned int result = 0;
38 int i;
39
40 #ifdef DEBUG
41 assert (nbytes < 5);
42 #endif
43 for (i = 0; i < nbytes; i++)
44 result = (result << 8) | (pnt[i] & 0xff);
45 return result;
46 }
47
48 /* ------------------------------------------------------------------------- */
49
50 /*static inline void */
51 static void
putnbyte(unsigned char * pnt,unsigned int value,unsigned int nbytes)52 putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes)
53 {
54 int i;
55
56 #ifdef DEBUG
57 assert (nbytes < 5);
58 #endif
59 for (i = nbytes - 1; i >= 0; i--)
60
61 {
62 pnt[i] = value & 0xff;
63 value = value >> 8;
64 }
65 }
66
67 /* ==================================================================== */
68 /* extended status packet */
69 #define get_ES_length(b) getnbyte(b+0x04, 4)
70
71 /* ==================================================================== */
72 /* USB packets */
73 #define set_USB_CMD_xfer_length(sb, val) putnbyte(sb + 1, val, 3)
74 #define set_USB_OUT_xfer_length(sb, val) putnbyte(sb + 1, val, 3)
75
76 /* ==================================================================== */
77 /* SCSI commands */
78
79 #define set_SCSI_opcode(out, val) out[0]=val
80 #define set_SCSI_lun(out, val) setbitfield(out + 1, 7, 5, val)
81
82 /* ==================================================================== */
83 /* TEST_UNIT_READY */
84 #define TEST_UNIT_READY_code 0x00
85 #define TEST_UNIT_READY_len 6
86
87 /* ==================================================================== */
88 /* REQUEST_SENSE */
89 #define REQUEST_SENSE_code 0x03
90 #define REQUEST_SENSE_len 6
91
92 #define RS_return_size 0x0e
93 #define set_RS_return_size(icb,val) icb[0x04]=val
94
95 /* defines for request sense return block */
96 #define get_RS_information_valid(b) getbitfield(b + 0x00, 1, 7)
97 #define get_RS_error_code(b) getbitfield(b + 0x00, 0x7f, 0)
98 #define get_RS_filemark(b) getbitfield(b + 0x02, 1, 7)
99 #define get_RS_EOM(b) getbitfield(b + 0x02, 1, 6)
100 #define get_RS_ILI(b) getbitfield(b + 0x02, 1, 5)
101 #define get_RS_sense_key(b) getbitfield(b + 0x02, 0x0f, 0)
102 #define get_RS_information(b) getnbyte(b+0x03, 4) /* normally 0 */
103 #define get_RS_additional_length(b) b[0x07] /* always 6? */
104 #define get_RS_ASC(b) b[0x0c]
105 #define get_RS_ASCQ(b) b[0x0d]
106 #define get_RS_SKSV(b) getbitfield(b+0x0f,1,7) /* valid=0 */
107 #define get_RS_SKSB(b) getnbyte(b+0x0f, 3)
108
109 /* when RS is 0x05/0x26 bad bytes listed in sksb */
110 /* #define get_RS_offending_byte(b) getnbyte(b+0x10, 2) */
111
112 /* ==================================================================== */
113 /* INQUIRY */
114 #define INQUIRY_code 0x12
115 #define INQUIRY_len 6
116
117 #define INQUIRY_std_max_len 0x30
118 #define INQUIRY_std_typ_len 0x30
119 #define INQUIRY_vpd_max_len 0x30
120 #define INQUIRY_vpd_typ_len 0x1e
121
122 #define set_IN_evpd(icb, val) setbitfield(icb + 1, 1, 0, val)
123 #define set_IN_page_code(icb, val) icb[0x02]=val
124 #define set_IN_return_size(icb,val) icb[0x04]=val
125
126 #define get_IN_periph_qual(in) getbitfield(in, 0x07, 5)
127 #define IN_periph_qual_lun 0x00
128 #define IN_periph_qual_nolun 0x03
129 #define get_IN_periph_devtype(in) getbitfield(in, 0x1f, 0)
130 #define IN_periph_devtype_scanner 0x06
131 #define IN_periph_devtype_unknown 0x1f
132 #define get_IN_response_format(in) getbitfield(in + 0x03, 0x07, 0)
133 #define IN_recognized 0x02
134 #define get_IN_vendor(in, buf) snprintf(buf, 0x08 + 1, "%.*s", \
135 0x08, (char*)in + 0x08)
136 #define get_IN_product(in, buf) snprintf(buf, 0x10 + 1, "%.*s", \
137 0x10, (char*)in + 0x10)
138 #define get_IN_version(in, buf) snprintf(buf, 0x04 + 1, "%.*s", \
139 0x04, (char*)in + 0x20)
140
141 /* the VPD response */
142 #define get_IN_page_length(in) in[0x04]
143 #define get_IN_basic_x_res(in) getnbyte(in + 0x05, 2)
144 #define get_IN_basic_y_res(in) getnbyte(in + 0x07, 2)
145 #define get_IN_step_x_res(in) getbitfield(in+0x09, 1, 0)
146 #define get_IN_step_y_res(in) getbitfield(in+0x09, 1, 4)
147 #define get_IN_max_x_res(in) getnbyte(in + 0x0a, 2)
148 #define get_IN_max_y_res(in) getnbyte(in + 0x0c, 2)
149 #define get_IN_min_x_res(in) getnbyte(in + 0x0e, 2)
150 #define get_IN_min_y_res(in) getnbyte(in + 0x10, 2)
151 #define get_IN_std_res_60(in) getbitfield(in+ 0x12, 1, 7)
152 #define get_IN_std_res_75(in) getbitfield(in+ 0x12, 1, 6)
153 #define get_IN_std_res_100(in) getbitfield(in+ 0x12, 1, 5)
154 #define get_IN_std_res_120(in) getbitfield(in+ 0x12, 1, 4)
155 #define get_IN_std_res_150(in) getbitfield(in+ 0x12, 1, 3)
156 #define get_IN_std_res_160(in) getbitfield(in+ 0x12, 1, 2)
157 #define get_IN_std_res_180(in) getbitfield(in+ 0x12, 1, 1)
158 #define get_IN_std_res_200(in) getbitfield(in+ 0x12, 1, 0)
159 #define get_IN_std_res_240(in) getbitfield(in+ 0x13, 1, 7)
160 #define get_IN_std_res_300(in) getbitfield(in+ 0x13, 1, 6)
161 #define get_IN_std_res_320(in) getbitfield(in+ 0x13, 1, 5)
162 #define get_IN_std_res_400(in) getbitfield(in+ 0x13, 1, 4)
163 #define get_IN_std_res_480(in) getbitfield(in+ 0x13, 1, 3)
164 #define get_IN_std_res_600(in) getbitfield(in+ 0x13, 1, 2)
165 #define get_IN_std_res_800(in) getbitfield(in+ 0x13, 1, 1)
166 #define get_IN_std_res_1200(in) getbitfield(in+ 0x13, 1, 0)
167 #define get_IN_window_width(in) getnbyte(in + 0x14, 4)
168 #define get_IN_window_length(in) getnbyte(in + 0x18, 4)
169 #define get_IN_awd(in) getbitfield(in+0x1c, 1, 7)
170 #define get_IN_ce_emphasis(in) getbitfield(in+0x1c, 1, 6)
171 #define get_IN_c_emphasis(in) getbitfield(in+0x1c, 1, 5)
172 #define get_IN_high_quality(in) getbitfield(in+0x1c, 1, 4)
173 #define get_IN_multilevel(in) getbitfield(in+0x1c, 1, 3)
174 #define get_IN_half_tone(in) getbitfield(in+0x1c, 1, 2)
175 #define get_IN_monochrome(in) getbitfield(in+0x1c, 1, 1)
176 #define get_IN_overflow(in) getbitfield(in+0x1c, 1, 0)
177
178 /* some scanners need evpd inquiry data manipulated */
179 #define set_IN_page_length(in,val) in[0x04]=val
180
181 /* ==================================================================== */
182 /* RESERVE_UNIT */
183 #define RESERVE_UNIT_code 0x16
184 #define RESERVE_UNIT_len 6
185
186 /* ==================================================================== */
187 /* RELEASE_UNIT */
188
189 #define RELEASE_UNIT_code 0x17
190 #define RELEASE_UNIT_len 6
191
192 /* ==================================================================== */
193 /* SCAN */
194 #define SCAN_code 0x1b
195 #define SCAN_len 6
196
197 #define set_SC_xfer_length(sb, val) sb[0x04] = (unsigned char)val
198
199 /* ==================================================================== */
200 /* SET_WINDOW */
201 #define SET_WINDOW_code 0x24
202 #define SET_WINDOW_len 10
203
204 #define set_SW_xferlen(sb, len) putnbyte(sb + 0x06, len, 3)
205
206 #define SW_header_len 8
207 #define SW_desc_len 0x2c
208
209 /* ==================================================================== */
210 /* GET_WINDOW */
211 #define GET_WINDOW_code 0x25
212 #define GET_WINDOW_len 0
213
214 /* ==================================================================== */
215 /* READ/SEND page codes */
216 #define SR_datatype_image 0x00
217 #define SR_datatype_lut 0x03
218 #define SR_datatype_pixelsize 0x80 /*DR-G1130*/
219 #define SR_datatype_panel 0x84
220 #define SR_datatype_sensors 0x8b
221 #define SR_datatype_counters 0x8c
222 #define SR_datatype_endorser 0x90
223 #define SR_datatype_fineoffset 0x90
224 #define SR_datatype_finegain 0x91
225 #define SR_datatype_imprinters 0x96 /*DR-X10C*/
226
227 /* ==================================================================== */
228 /* READ */
229 #define READ_code 0x28
230 #define READ_len 10
231
232 #define set_R_datatype_code(sb, val) sb[0x02] = val
233 #define set_R_xfer_uid(sb, val) sb[4] = val
234 #define set_R_xfer_lid(sb, val) sb[5] = val
235 #define set_R_xfer_length(sb, val) putnbyte(sb + 0x06, val, 3)
236
237 /*image needs no macros?*/
238
239 /*lut unread?*/
240
241 /*panel*/
242 #define R_PANEL_len 0x08
243 #define get_R_PANEL_start(in) getbitfield(in, 1, 7)
244 #define get_R_PANEL_stop(in) getbitfield(in, 1, 6)
245 #define get_R_PANEL_butt3(in) getbitfield(in, 1, 2)
246 #define get_R_PANEL_new_file(in) getbitfield(in+1, 1, 0)
247 #define get_R_PANEL_count_only(in) getbitfield(in+1, 1, 1)
248 #define get_R_PANEL_bypass_mode(in) getbitfield(in+1, 1, 2)
249 #define get_R_PANEL_enable_led(in) getbitfield(in+2, 1, 0)
250 #define get_R_PANEL_counter(in) getnbyte(in + 0x04, 4)
251
252 /*sensors*/
253 #define R_SENSORS_len 0x01
254 #define get_R_SENSORS_card(in) getbitfield(in, 1, 3)
255 #define get_R_SENSORS_adf(in) getbitfield(in, 1, 0)
256
257 /*counters*/
258 #define R_COUNTERS_len 0x80
259 #define get_R_COUNTERS_total(in) getnbyte(in + 0x04, 4)
260 #define get_R_COUNTERS_last_srv(in) getnbyte(in + 0x44, 4)
261
262 /*imprinters*/
263 #define R_IMPRINTER_len 0x20
264 #define R_PRE_IMPRINTER 0
265 #define R_POST_IMPRINTER 1
266 #define get_R_IMPRINTER_found(in) getbitfield(in+1, 1, 0)
267 /*4 bytes at in + 0: (DR-X10C)
268 pre-imprinter on: 0x07010000
269 pre-imprinter off: 0x06000000
270 post-imprinter on: 0x03010000
271 post-imprinter off: 0x02000000
272 */
273
274 /*endorser unread?*/
275
276 /*fine gain*/
277 #define R_FINE_uid_gray 0x07
278 #define R_FINE_uid_red 0x0c
279 #define R_FINE_uid_green 0x0a
280 #define R_FINE_uid_blue 0x09
281 #define R_FINE_uid_unknown 0x14
282
283 /* get pixel size */
284 #define R_PSIZE_len 16
285 #define get_R_PSIZE_width(in) getnbyte(in + 0x08, 4)
286 #define get_R_PSIZE_length(in) getnbyte(in + 0x0c, 4)
287
288 /* ==================================================================== */
289 /* SEND */
290 #define SEND_code 0x2a
291 #define SEND_len 10
292
293 #define set_S_xfer_datatype(sb, val) sb[0x02] = (unsigned char)val
294 #define set_S_xfer_id(sb, val) putnbyte(sb + 4, val, 2)
295 #define set_S_xfer_length(sb, val) putnbyte(sb + 6, val, 3)
296
297 /*lut*/
298 #define S_LUT_len 0x100
299 #define S_LUT_id_front 0x82
300 #define S_LUT_id_unk1 0x84
301 #define S_LUT_id_unk2 0x88
302 #define S_LUT_id_unk3 0x90
303
304 /*panel*/
305 #define S_PANEL_len 0x08
306 #define set_S_PANEL_enable_led(in,val) setbitfield(in+2, 1, 0, val)
307 #define set_S_PANEL_counter(sb,val) putnbyte(sb + 0x04, val, 4)
308
309 /*counters*/
310 /*endorser*/
311
312 /*fine calibration*/
313 #define set_S_FCAL_datatype(sb, val) sb[0x00] = (unsigned char)val
314 /* these are offset, OR with 0x40 to get gain */
315 #define S_FCAL_id_f_red 0x00
316 #define S_FCAL_id_f_green 0x04
317 #define S_FCAL_id_f_blue 0x08
318 #define S_FCAL_id_b_red 0x01
319 #define S_FCAL_id_b_green 0x05
320 #define S_FCAL_id_b_blue 0x09
321
322
323 /* ==================================================================== */
324 /* OBJECT_POSITION */
325 #define OBJECT_POSITION_code 0x31
326 #define OBJECT_POSITION_len 10
327
328 #define set_OP_autofeed(b,val) setbitfield(b+0x01, 0x07, 0, val)
329 #define OP_Discharge 0x00
330 #define OP_Feed 0x01
331
332 /* ==================================================================== */
333 /* Page codes used by GET/SET SCAN MODE */
334 #define SM_pc_adf 0x01
335 #define SM_pc_tpu 0x02
336 #define SM_pc_scan_ctl 0x20
337
338 #define SM_pc_df 0x30
339 #define SM_pc_buffer 0x32
340 #define SM_pc_imprinter 0x34
341 #define SM_pc_dropout 0x36
342 #define SM_pc_unknown 0x37
343
344 #define SM_pc_all_pc 0x3F
345
346 /* ==================================================================== */
347 /* GET SCAN MODE */
348 #define GET_SCAN_MODE_code 0xd5
349 #define GET_SCAN_MODE_len 6
350
351 #define set_GSM_unknown(sb, val) sb[0x01] = val
352 #define set_GSM_page_code(sb, val) sb[0x02] = val
353 #define set_GSM_len(sb, val) sb[0x04] = val
354
355 #define GSM_PSIZE_len 0x5a
356
357 /* ==================================================================== */
358 /* SET SCAN MODE */
359 #define SET_SCAN_MODE_code 0xd6
360 #define SET_SCAN_MODE_len 6
361
362 #define set_SSM_pf(sb, val) setbitfield(sb + 1, 1, 4, val)
363 #define set_SSM_pay_len(sb, val) sb[0x04] = val
364
365 /* the payload */
366 #define SSM_PAY_len 0x14
367 #define SSM_PAY_HEAD_len 0x13
368 #define set_SSM_pay_head_len(sb, val) sb[0x01] = val
369 #define set_SSM_page_code(sb, val) sb[0x04] = val
370 #define SSM_PAGE_len 0x0e
371 #define set_SSM_page_len(sb, val) sb[0x05] = val
372
373 /* for DF (0x30) page */
374 #define set_SSM_DF_deskew_roll(sb, val) setbitfield(sb+7, 1, 5, val)
375 #define set_SSM_DF_staple(sb, val) setbitfield(sb+7, 1, 4, val)
376 #define set_SSM_DF_thick(sb, val) setbitfield(sb+7, 1, 2, val)
377 #define set_SSM_DF_len(sb, val) setbitfield(sb+7, 1, 0, val)
378 #define set_SSM_DF_textdir(sb, val) setbitfield(sb+9, 0xf, 0, val)
379
380 /* for BUFFER (0x32) page */
381 #define set_SSM_BUFF_duplex(sb, val) setbitfield(sb+6, 1, 1, val)
382 #define set_SSM_BUFF_unk(sb, val) sb[0x07] = val
383 #define set_SSM_BUFF_async(sb, val) setbitfield(sb+0x0a, 1, 6, val)
384 #define set_SSM_BUFF_ald(sb, val) setbitfield(sb+0x0a, 1, 5, val)
385 #define set_SSM_BUFF_fb(sb, val) setbitfield(sb+0x0a, 1, 4, val)
386 #define set_SSM_BUFF_card(sb, val) setbitfield(sb+0x0a, 1, 3, val)
387
388 /* for DO (0x36) page */
389 #define SSM_DO_none 0
390 #define SSM_DO_red 1
391 #define SSM_DO_green 2
392 #define SSM_DO_blue 3
393 #define set_SSM_DO_unk1(sb, val) sb[0x07] = val
394 #define set_SSM_DO_unk2(sb, val) sb[0x09] = val
395 #define set_SSM_DO_f_do(sb, val) sb[0x0b] = val
396 #define set_SSM_DO_b_do(sb, val) sb[0x0c] = val
397 #define set_SSM_DO_f_en(sb, val) sb[0x0d] = val
398 #define set_SSM_DO_b_en(sb, val) sb[0x0e] = val
399
400 /* ==================================================================== */
401 /* Cancel */
402 #define CANCEL_code 0xd8
403 #define CANCEL_len 6
404
405 /* ==================================================================== */
406 /* Coarse Calibration */
407 #define COR_CAL_code 0xe1
408 #define COR_CAL_len 10
409
410 #define set_CC_version(sb, val) sb[5] = val
411 #define set_CC_xferlen(sb, len) putnbyte(sb + 0x06, len, 3)
412
413 /* the payload */
414 #define CC_pay_len 0x20
415 #define CC_pay_ver 0x00
416
417 #define set_CC_f_gain(sb, val) sb[0] = val
418 #define set_CC_unk1(sb, val) sb[1] = val
419 #define set_CC_f_offset(sb, val) sb[2] = val
420 #define set_CC_unk2(sb, val) sb[3] = val
421
422 #define set_CC_exp_f_r1(sb, val) putnbyte(sb + 0x04, val, 2)
423 #define set_CC_exp_f_g1(sb, val) putnbyte(sb + 0x06, val, 2)
424 #define set_CC_exp_f_b1(sb, val) putnbyte(sb + 0x08, val, 2)
425 #define set_CC_exp_f_r2(sb, val) putnbyte(sb + 0x0a, val, 2)
426 #define set_CC_exp_f_g2(sb, val) putnbyte(sb + 0x0c, val, 2)
427 #define set_CC_exp_f_b2(sb, val) putnbyte(sb + 0x0e, val, 2)
428
429 #define set_CC_b_gain(sb, val) sb[0x10] = val
430 #define set_CC_b_offset(sb, val) sb[0x12] = val
431
432 #define set_CC_exp_b_r1(sb, val) putnbyte(sb + 0x14, val, 2)
433 #define set_CC_exp_b_g1(sb, val) putnbyte(sb + 0x16, val, 2)
434 #define set_CC_exp_b_b1(sb, val) putnbyte(sb + 0x18, val, 2)
435 #define set_CC_exp_b_r2(sb, val) putnbyte(sb + 0x1a, val, 2)
436 #define set_CC_exp_b_g2(sb, val) putnbyte(sb + 0x1c, val, 2)
437 #define set_CC_exp_b_b2(sb, val) putnbyte(sb + 0x1e, val, 2)
438
439 /* the 'version 3' payload (P-208 and P-215) */
440 #define CC3_pay_len 0x28
441 #define CC3_pay_ver 0x03
442
443 #define set_CC3_gain_f_r(sb, val) sb[0] = val
444 #define set_CC3_gain_f_g(sb, val) sb[1] = val
445 #define set_CC3_gain_f_b(sb, val) sb[2] = val
446
447 #define set_CC3_off_f_r(sb, val) sb[4] = val
448 #define set_CC3_off_f_g(sb, val) sb[5] = val
449 #define set_CC3_off_f_b(sb, val) sb[6] = val
450
451 #define set_CC3_exp_f_r(sb, val) putnbyte(sb + 0x08, val, 2)
452 #define set_CC3_exp_f_g(sb, val) putnbyte(sb + 0x0a, val, 2)
453 #define set_CC3_exp_f_b(sb, val) putnbyte(sb + 0x0c, val, 2)
454
455 #define set_CC3_gain_b_r(sb, val) sb[0x14] = val
456 #define set_CC3_gain_b_g(sb, val) sb[0x15] = val
457 #define set_CC3_gain_b_b(sb, val) sb[0x16] = val
458
459 #define set_CC3_off_b_r(sb, val) sb[0x18] = val
460 #define set_CC3_off_b_g(sb, val) sb[0x19] = val
461 #define set_CC3_off_b_b(sb, val) sb[0x1a] = val
462
463 #define set_CC3_exp_b_r(sb, val) putnbyte(sb + 0x1c, val, 2)
464 #define set_CC3_exp_b_g(sb, val) putnbyte(sb + 0x1e, val, 2)
465 #define set_CC3_exp_b_b(sb, val) putnbyte(sb + 0x20, val, 2)
466
467 /* ==================================================================== */
468 /* Page codes used by GET/SET SCAN MODE 2 */
469 #define SM2_pc_df 0x00
470 #define SM2_pc_ultra 0x01
471 #define SM2_pc_buffer 0x02
472 #define SM2_pc_hw_enhancement 0x03
473 #define SM2_pc_dropout 0x06
474 #define SM2_pc_date_time 0x07
475 #define SM2_pc_imprinter_settings 0x33
476 #define SM2_pc_imprinter_specstring 0x34
477
478 /* ==================================================================== */
479 /* GET SCAN MODE 2 */
480 #define GET_SCAN_MODE2_code 0xe4
481 #define GET_SCAN_MODE2_len 12
482
483 /* ==================================================================== */
484 /* SET SCAN MODE 2 */
485 #define SET_SCAN_MODE2_code 0xe5
486 #define SET_SCAN_MODE2_len 12
487
488 #define set_SSM2_page_code(sb, val) sb[0x02] = val
489 #define set_SSM2_pay_len(sb, val) sb[0x08] = val
490
491 /* the payload */
492 #define SSM2_PAY_len 0x10
493 #define SSM2_IMPRINTER_STRING_PAY_len 0x8e
494
495 /* for DF (0x00) page */
496 #define set_SSM2_DF_imprint(sb, val) setbitfield(sb+2, 1, 0, val)
497 #define set_SSM2_DF_post_addon(sb, val) setbitfield(sb+2, 1, 1, val)
498 #define set_SSM2_DF_len(sb, val) setbitfield(sb+3, 1, 0, val)
499 #define set_SSM2_DF_thick(sb, val) setbitfield(sb+3, 1, 2, val)
500 #define set_SSM2_DF_staple(sb, val) setbitfield(sb+3, 1, 4, val)
501 #define set_SSM2_DF_imprint2(sb, val) setbitfield(sb+3, 1, 6, val)
502
503 /* for ULTRA (0x01) page */
504 #define set_SSM2_ULTRA_top(sb, val) putnbyte(sb + 0x07, val, 2)
505 #define set_SSM2_ULTRA_bot(sb, val) putnbyte(sb + 0x09, val, 2)
506
507 /* for BUFFER (0x02) page */
508 #define set_SSM2_BUFF_unk(sb, val) sb[0x03] = val
509 #define set_SSM2_BUFF_unk2(sb, val) sb[0x06] = val
510 #define set_SSM2_BUFF_sync(sb, val) sb[0x09] = val
511
512 /* for HARDWARE ENHANCEMENT (0x03) */
513 #define set_SSM2_roller_deskew(sb, val) setbitfield(sb+6, 1, 3, val)
514 #define set_SSM2_hw_crop(sb, val) setbitfield(sb+6, 1, 5, val)
515
516 /* for DROPOUT (0x06) page */
517 #define set_SSM2_DO_do(sb, val) sb[0x09] = val
518 #define set_SSM2_DO_en(sb, val) sb[0x0a] = val
519 #define set_SSM2_DO_side(sb, val) sb[0x05] = val
520
521 /* for IMPRINT DATE & TIME (0x07) */
522 #define set_SSM2_imprint_year(sb, val) putnbyte(sb + 0x02, val, 2)
523 #define set_SSM2_imprint_month(sb, val) putnbyte(sb + 0x04, val, 1)
524 #define set_SSM2_imprint_day(sb, val) putnbyte(sb + 0x05, val, 1)
525 #define set_SSM2_imprint_hour(sb, val) putnbyte(sb + 0x06, val, 1)
526 #define set_SSM2_imprint_min(sb, val) putnbyte(sb + 0x07, val, 1)
527 #define set_SSM2_imprint_sec(sb, val) putnbyte(sb + 0x08, val, 1)
528
529 /* for IMPRINTER SETTINGS (0x33) page */
530 #define set_SSM2_postimprint_cmd(sb) sb[0x04] = 1
531 #define set_SSM2_postimprint_addon(sb) setbitfield(sb, 1, 1, 1)
532 #define set_SSM2_imprint_hoffset(sb, val) putnbyte(sb + 0x05, val, 2)
533 #define set_SSM2_imprint_voffset(sb, val) putnbyte(sb + 0x07, val, 2)
534
535 /* for IMPRINTER STRING SPECIFICATION (0x34) page */
536 #define IMPRINTER_12x12_FONT 0
537 #define IMPRINTER_8x12_FONT 1
538 #define set_SSM2_imprint_fontsize(sb, val) setbitfield(sb + 0xA, 1, 0, val)
539 #define set_SSM2_imprint_spacing(sb, val) setbitfield(sb + 0xA, 1, 1, val)
540 #define set_SSM2_imprint_addonmode(sb, val) setbitfield(sb + 0x9, 3, 4, val)
541 #define IMPRINTER_0_FONT_ROT 0
542 #define IMPRINTER_90_FONT_ROT 1
543 #define IMPRINTER_180_FONT_ROT 2
544 #define IMPRINTER_270_FONT_ROT 3
545 #define set_SSM2_imprint_fontrot(sb, val) setbitfield(sb + 0x9, 3, 0, val)
546
547 /* ==================================================================== */
548 /* window descriptor macros for SET_WINDOW and GET_WINDOW */
549
550 #define set_WPDB_wdblen(sb, len) putnbyte(sb + 0x06, len, 2)
551
552 /* ==================================================================== */
553
554 /* 0x00 - Window Identifier */
555 #define set_WD_wid(sb, val) sb[0] = val
556 #define WD_wid_front 0x00
557 #define WD_wid_back 0x01
558
559 /* 0x01 - Reserved (bits 7-1), AUTO (bit 0) */
560 #define set_WD_auto(sb, val) setbitfield(sb + 0x01, 1, 0, val)
561 #define get_WD_auto(sb) getbitfield(sb + 0x01, 1, 0)
562
563 /* 0x02,0x03 - X resolution in dpi */
564 #define set_WD_Xres(sb, val) putnbyte(sb + 0x02, val, 2)
565 #define get_WD_Xres(sb) getnbyte(sb + 0x02, 2)
566
567 /* 0x04,0x05 - Y resolution in dpi */
568 #define set_WD_Yres(sb, val) putnbyte(sb + 0x04, val, 2)
569 #define get_WD_Yres(sb) getnbyte(sb + 0x04, 2)
570
571 /* 0x06-0x09 - Upper Left X in 1/1200 inch */
572 #define set_WD_ULX(sb, val) putnbyte(sb + 0x06, val, 4)
573 #define get_WD_ULX(sb) getnbyte(sb + 0x06, 4)
574
575 /* 0x0a-0x0d - Upper Left Y in 1/1200 inch */
576 #define set_WD_ULY(sb, val) putnbyte(sb + 0x0a, val, 4)
577 #define get_WD_ULY(sb) getnbyte(sb + 0x0a, 4)
578
579 /* 0x0e-0x11 - Width in 1/1200 inch */
580 #define set_WD_width(sb, val) putnbyte(sb + 0x0e, val, 4)
581 #define get_WD_width(sb) getnbyte(sb + 0x0e, 4)
582
583 /* 0x12-0x15 - Height in 1/1200 inch */
584 #define set_WD_length(sb, val) putnbyte(sb + 0x12, val, 4)
585 #define get_WD_length(sb) getnbyte(sb + 0x12, 4)
586
587 /* 0x16 - Brightness */
588 #define set_WD_brightness(sb, val) sb[0x16] = val
589 #define get_WD_brightness(sb) sb[0x16]
590
591 /* 0x17 - Threshold */
592 #define set_WD_threshold(sb, val) sb[0x17] = val
593 #define get_WD_threshold(sb) sb[0x17]
594
595 /* 0x18 - Contrast */
596 #define set_WD_contrast(sb, val) sb[0x18] = val
597 #define get_WD_contrast(sb) sb[0x18]
598
599 /* 0x19 - Image Composition (color mode) */
600 #define set_WD_composition(sb, val) sb[0x19] = val
601 #define get_WD_composition(sb) sb[0x19]
602 #define WD_comp_LA 0
603 #define WD_comp_HT 1
604 #define WD_comp_GS 2
605 #define WD_comp_CL 3
606 #define WD_comp_CH 4
607 #define WD_comp_CG 5
608
609 /* 0x1a - Depth */
610 #define set_WD_bitsperpixel(sb, val) sb[0x1a] = val
611 #define get_WD_bitsperpixel(sb) sb[0x1a]
612
613 /* 0x1b,0x1c - Halftone Pattern */
614 #define set_WD_ht_type(sb, val) sb[0x1b] = val
615 #define get_WD_ht_type(sb) sb[0x1b]
616 #define WD_ht_type_DEFAULT 0
617 #define WD_ht_type_DITHER 1
618 #define WD_ht_type_DIFFUSION 2
619
620 #define set_WD_ht_pattern(sb, val) sb[0x1c] = val
621 #define get_WD_ht_pattern(sb) sb[0x1c]
622
623 /* 0x1d - Reverse image, reserved area, padding type */
624 #define set_WD_rif(sb, val) setbitfield(sb + 0x1d, 1, 7, val)
625 #define get_WD_rif(sb) getbitfield(sb + 0x1d, 1, 7)
626 #define set_WD_rgb(sb, val) setbitfield(sb + 0x1d, 7, 4, val)
627 #define get_WD_rgb(sb) getbitfield(sb + 0x1d, 7, 4)
628 #define set_WD_padding(sb, val) setbitfield(sb + 0x1d, 7, 0, val)
629 #define get_WD_padding(sb) getbitfield(sb + 0x1d, 7, 0)
630
631 /* 0x1e,0x1f - Bit ordering */
632 #define set_WD_bitorder(sb, val) putnbyte(sb + 0x1e, val, 2)
633 #define get_WD_bitorder(sb) getnbyte(sb + 0x1e, 2)
634
635 /* 0x20 - compression type */
636 #define set_WD_compress_type(sb, val) sb[0x20] = val
637 #define get_WD_compress_type(sb) sb[0x20]
638 #define WD_cmp_NONE 0
639 #define WD_cmp_MH 1
640 #define WD_cmp_MR 2
641 #define WD_cmp_MMR 3
642 #define WD_cmp_JPEG 0x80
643
644 /* 0x21 - compression argument
645 * specify "k" parameter with MR compress,
646 * or with JPEG- Q param, 0-7
647 */
648 #define set_WD_compress_arg(sb, val) sb[0x21] = val
649 #define get_WD_compress_arg(sb) sb[0x21]
650
651 /* 0x22-0x27 - reserved */
652
653 /* 0x28-0x2c - vendor unique */
654 /* FIXME: more params here? */
655 #define set_WD_reserved2(sb, val) sb[0x2a] = val
656 #define get_WD_reserved2(sb) sb[0x2a]
657
658
659 /* ==================================================================== */
660
661 #endif
662