kopia lustrzana https://gitlab.com/sane-project/backends
canon_dr backend v46
- split debug level 30 into two levels - simplify jpeg ifdefs - add support for DR-M160merge-requests/1/head
rodzic
0eabc04805
commit
522f4f4d0f
|
@ -285,7 +285,7 @@
|
||||||
- add support for paper sensors (P-215 & P-208)
|
- add support for paper sensors (P-215 & P-208)
|
||||||
- add initial support for card reader (P-215)
|
- add initial support for card reader (P-215)
|
||||||
- removed unused var from do_scsi_cmd()
|
- removed unused var from do_scsi_cmd()
|
||||||
v43 2014-04-13, MAN
|
v43 2014-03-13, MAN
|
||||||
- initial DR-M140 support
|
- initial DR-M140 support
|
||||||
- add extra_status config and code
|
- add extra_status config and code
|
||||||
- split status code into do_usb_status
|
- split status code into do_usb_status
|
||||||
|
@ -293,12 +293,16 @@
|
||||||
- add new color interlacing modes and code
|
- add new color interlacing modes and code
|
||||||
- comment out ssm2
|
- comment out ssm2
|
||||||
- add timestamp to do_usb_cmd
|
- add timestamp to do_usb_cmd
|
||||||
v44 2014-04-26, MAN
|
v44 2014-03-26, MAN
|
||||||
- buffermode support for machines with ssm2 command
|
- buffermode support for machines with ssm2 command
|
||||||
- DR-M140 needs always_op=0
|
- DR-M140 needs always_op=0
|
||||||
v45 2014-04-29, MAN
|
v45 2014-03-29, MAN
|
||||||
- dropout support for machines with ssm2 command
|
- dropout support for machines with ssm2 command
|
||||||
- doublefeed support for machines with ssm2 command
|
- doublefeed support for machines with ssm2 command
|
||||||
|
v46 2014-04-09, MAN
|
||||||
|
- split debug level 30 into two levels
|
||||||
|
- simplify jpeg ifdefs
|
||||||
|
- add support for DR-M160
|
||||||
|
|
||||||
SANE FLOW DIAGRAM
|
SANE FLOW DIAGRAM
|
||||||
|
|
||||||
|
@ -348,7 +352,7 @@
|
||||||
#include "canon_dr.h"
|
#include "canon_dr.h"
|
||||||
|
|
||||||
#define DEBUG 1
|
#define DEBUG 1
|
||||||
#define BUILD 45
|
#define BUILD 46
|
||||||
|
|
||||||
/* values for SANE_DEBUG_CANON_DR env var:
|
/* values for SANE_DEBUG_CANON_DR env var:
|
||||||
- errors 5
|
- errors 5
|
||||||
|
@ -361,6 +365,12 @@
|
||||||
- useless noise 35
|
- useless noise 35
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
/* if JPEG support is not enabled in sane.h, we setup our own defines */
|
||||||
|
#ifndef SANE_FRAME_JPEG
|
||||||
|
#define SANE_FRAME_JPEG 0x0B
|
||||||
|
#define SANE_JPEG_DISABLED 1
|
||||||
|
#endif
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
#define STRING_FLATBED SANE_I18N("Flatbed")
|
#define STRING_FLATBED SANE_I18N("Flatbed")
|
||||||
#define STRING_ADFFRONT SANE_I18N("ADF Front")
|
#define STRING_ADFFRONT SANE_I18N("ADF Front")
|
||||||
|
@ -1247,9 +1257,7 @@ init_model (struct scanner *s)
|
||||||
/* specific settings missing from vpd */
|
/* specific settings missing from vpd */
|
||||||
if (strstr (s->model_name,"DR-9080")
|
if (strstr (s->model_name,"DR-9080")
|
||||||
|| strstr (s->model_name,"DR-7580")){
|
|| strstr (s->model_name,"DR-7580")){
|
||||||
#ifdef SANE_FRAME_JPEG
|
|
||||||
s->has_comp_JPEG = 1;
|
s->has_comp_JPEG = 1;
|
||||||
#endif
|
|
||||||
s->rgb_format = 2;
|
s->rgb_format = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1445,8 +1453,48 @@ init_model (struct scanner *s)
|
||||||
s->has_card = 1;
|
s->has_card = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (strstr (s->model_name,"DR-M140")
|
else if (strstr (s->model_name,"DR-M160")){
|
||||||
){
|
|
||||||
|
/*missing*/
|
||||||
|
s->std_res_x[DPI_100]=1;
|
||||||
|
s->std_res_y[DPI_100]=1;
|
||||||
|
s->std_res_x[DPI_150]=1;
|
||||||
|
s->std_res_y[DPI_150]=1;
|
||||||
|
s->std_res_x[DPI_200]=1;
|
||||||
|
s->std_res_y[DPI_200]=1;
|
||||||
|
s->std_res_x[DPI_300]=1;
|
||||||
|
s->std_res_y[DPI_300]=1;
|
||||||
|
s->std_res_x[DPI_400]=1;
|
||||||
|
s->std_res_y[DPI_400]=1;
|
||||||
|
s->std_res_x[DPI_600]=1;
|
||||||
|
s->std_res_y[DPI_600]=1;
|
||||||
|
|
||||||
|
s->has_comp_JPEG = 1;
|
||||||
|
s->rgb_format = 1;
|
||||||
|
s->can_color = 1;
|
||||||
|
s->has_df_ultra = 1;
|
||||||
|
|
||||||
|
s->color_inter_by_res[DPI_100] = COLOR_INTERLACE_GBR;
|
||||||
|
s->color_inter_by_res[DPI_150] = COLOR_INTERLACE_GBR;
|
||||||
|
s->color_inter_by_res[DPI_200] = COLOR_INTERLACE_BRG;
|
||||||
|
s->color_inter_by_res[DPI_400] = COLOR_INTERLACE_GBR;
|
||||||
|
|
||||||
|
/*weirdness*/
|
||||||
|
s->always_op = 0;
|
||||||
|
s->fixed_width = 1;
|
||||||
|
s->invert_tly = 1;
|
||||||
|
s->can_write_panel = 0;
|
||||||
|
s->has_ssm = 0;
|
||||||
|
s->has_ssm2 = 1;
|
||||||
|
s->duplex_interlace = DUPLEX_INTERLACE_FFBB;
|
||||||
|
s->duplex_offset_side = SIDE_FRONT;
|
||||||
|
|
||||||
|
/*lies*/
|
||||||
|
s->can_halftone=0;
|
||||||
|
s->can_monochrome=0;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (strstr (s->model_name,"DR-M140")){
|
||||||
|
|
||||||
/*missing*/
|
/*missing*/
|
||||||
s->std_res_x[DPI_100]=1;
|
s->std_res_x[DPI_100]=1;
|
||||||
|
@ -1462,9 +1510,7 @@ init_model (struct scanner *s)
|
||||||
s->std_res_x[DPI_600]=1;
|
s->std_res_x[DPI_600]=1;
|
||||||
s->std_res_y[DPI_600]=1;
|
s->std_res_y[DPI_600]=1;
|
||||||
|
|
||||||
#ifdef SANE_FRAME_JPEG
|
|
||||||
s->has_comp_JPEG = 1;
|
s->has_comp_JPEG = 1;
|
||||||
#endif
|
|
||||||
s->rgb_format = 1;
|
s->rgb_format = 1;
|
||||||
s->can_color = 1;
|
s->can_color = 1;
|
||||||
s->has_df_ultra = 1;
|
s->has_df_ultra = 1;
|
||||||
|
@ -2102,7 +2148,9 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
||||||
s->compress_list[i++]=STRING_NONE;
|
s->compress_list[i++]=STRING_NONE;
|
||||||
|
|
||||||
if(s->has_comp_JPEG){
|
if(s->has_comp_JPEG){
|
||||||
|
#ifndef SANE_JPEG_DISABLED
|
||||||
s->compress_list[i++]=STRING_JPEG;
|
s->compress_list[i++]=STRING_JPEG;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
s->compress_list[i]=NULL;
|
s->compress_list[i]=NULL;
|
||||||
|
@ -3615,14 +3663,12 @@ update_params(struct scanner *s, int calib)
|
||||||
/* round down to pixel boundary for some scanners */
|
/* round down to pixel boundary for some scanners */
|
||||||
s->u.width -= s->u.width % s->ppl_mod;
|
s->u.width -= s->u.width % s->ppl_mod;
|
||||||
|
|
||||||
#ifdef SANE_FRAME_JPEG
|
|
||||||
/* jpeg requires 8x8 squares */
|
/* jpeg requires 8x8 squares */
|
||||||
if(s->compress == COMP_JPEG && s->u.mode >= MODE_GRAYSCALE){
|
if(s->compress == COMP_JPEG && s->u.mode >= MODE_GRAYSCALE){
|
||||||
s->u.format = SANE_FRAME_JPEG;
|
s->u.format = SANE_FRAME_JPEG;
|
||||||
s->u.width -= s->u.width % 8;
|
s->u.width -= s->u.width % 8;
|
||||||
s->u.height -= s->u.height % 8;
|
s->u.height -= s->u.height % 8;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
s->u.Bpl = s->u.width * s->u.bpp / 8;
|
s->u.Bpl = s->u.width * s->u.bpp / 8;
|
||||||
s->u.valid_Bpl = s->u.Bpl;
|
s->u.valid_Bpl = s->u.Bpl;
|
||||||
|
@ -4019,9 +4065,7 @@ sane_start (SANE_Handle handle)
|
||||||
* API has no way to inform the frontend of this,
|
* API has no way to inform the frontend of this,
|
||||||
* so we block and buffer. yuck */
|
* so we block and buffer. yuck */
|
||||||
if( (s->swdeskew || s->swdespeck || s->swcrop)
|
if( (s->swdeskew || s->swdespeck || s->swcrop)
|
||||||
#ifdef SANE_FRAME_JPEG
|
|
||||||
&& s->s.format != SANE_FRAME_JPEG
|
&& s->s.format != SANE_FRAME_JPEG
|
||||||
#endif
|
|
||||||
){
|
){
|
||||||
|
|
||||||
/* get image */
|
/* get image */
|
||||||
|
@ -4261,13 +4305,11 @@ set_window (struct scanner *s)
|
||||||
set_WD_compress_type(desc1, COMP_NONE);
|
set_WD_compress_type(desc1, COMP_NONE);
|
||||||
set_WD_compress_arg(desc1, 0);
|
set_WD_compress_arg(desc1, 0);
|
||||||
|
|
||||||
#ifdef SANE_FRAME_JPEG
|
|
||||||
/* some scanners support jpeg image compression, for color/gs only */
|
/* some scanners support jpeg image compression, for color/gs only */
|
||||||
if(s->s.format == SANE_FRAME_JPEG){
|
if(s->s.format == SANE_FRAME_JPEG){
|
||||||
set_WD_compress_type(desc1, COMP_JPEG);
|
set_WD_compress_type(desc1, COMP_JPEG);
|
||||||
set_WD_compress_arg(desc1, s->compress_arg);
|
set_WD_compress_arg(desc1, s->compress_arg);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/*build the command*/
|
/*build the command*/
|
||||||
memset(cmd,0,cmdLen);
|
memset(cmd,0,cmdLen);
|
||||||
|
@ -4553,7 +4595,6 @@ read_from_scanner(struct scanner *s, int side, int exact)
|
||||||
inLen = 0;
|
inLen = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SANE_FRAME_JPEG
|
|
||||||
/* this is jpeg data, we need to fix the missing image size */
|
/* this is jpeg data, we need to fix the missing image size */
|
||||||
if(s->s.format == SANE_FRAME_JPEG){
|
if(s->s.format == SANE_FRAME_JPEG){
|
||||||
|
|
||||||
|
@ -4603,7 +4644,6 @@ read_from_scanner(struct scanner *s, int side, int exact)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/*scanner may have sent more data than we asked for, chop it*/
|
/*scanner may have sent more data than we asked for, chop it*/
|
||||||
if(inLen > remain){
|
if(inLen > remain){
|
||||||
|
@ -4629,37 +4669,32 @@ read_from_scanner(struct scanner *s, int side, int exact)
|
||||||
|
|
||||||
if(ret == SANE_STATUS_EOF){
|
if(ret == SANE_STATUS_EOF){
|
||||||
|
|
||||||
switch (s->s.format){
|
/* this is jpeg data, we need to change the total size */
|
||||||
|
if(s->s.format == SANE_FRAME_JPEG){
|
||||||
|
s->s.bytes_tot[side] = s->s.bytes_sent[side];
|
||||||
|
s->i.bytes_tot[side] = s->i.bytes_sent[side];
|
||||||
|
s->u.bytes_tot[side] = s->i.bytes_sent[side];
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef SANE_FRAME_JPEG
|
/* this is non-jpeg data, fill remainder, change rx'd size */
|
||||||
/* this is jpeg data, we need to change the total size */
|
else{
|
||||||
case SANE_FRAME_JPEG:
|
|
||||||
s->s.bytes_tot[side] = s->s.bytes_sent[side];
|
|
||||||
s->i.bytes_tot[side] = s->i.bytes_sent[side];
|
|
||||||
s->u.bytes_tot[side] = s->i.bytes_sent[side];
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* this is non-jpeg data, fill remainder, change rx'd size */
|
DBG (15, "read_from_scanner: eof: %d %d\n", s->i.bytes_tot[side], s->i.bytes_sent[side]);
|
||||||
default:
|
|
||||||
|
|
||||||
DBG (15, "read_from_scanner: eof: %d %d\n", s->i.bytes_tot[side], s->i.bytes_sent[side]);
|
/* clone the last line repeatedly until the end */
|
||||||
|
while(s->i.bytes_tot[side] > s->i.bytes_sent[side]){
|
||||||
|
memcpy(
|
||||||
|
s->buffers[side]+s->i.bytes_sent[side]-s->i.Bpl,
|
||||||
|
s->buffers[side]+s->i.bytes_sent[side],
|
||||||
|
s->i.Bpl
|
||||||
|
);
|
||||||
|
s->i.bytes_sent[side] += s->i.Bpl;
|
||||||
|
}
|
||||||
|
|
||||||
/* clone the last line repeatedly until the end */
|
DBG (15, "read_from_scanner: eof2: %d %d\n", s->i.bytes_tot[side], s->i.bytes_sent[side]);
|
||||||
while(s->i.bytes_tot[side] > s->i.bytes_sent[side]){
|
|
||||||
memcpy(
|
|
||||||
s->buffers[side]+s->i.bytes_sent[side]-s->i.Bpl,
|
|
||||||
s->buffers[side]+s->i.bytes_sent[side],
|
|
||||||
s->i.Bpl
|
|
||||||
);
|
|
||||||
s->i.bytes_sent[side] += s->i.Bpl;
|
|
||||||
}
|
|
||||||
|
|
||||||
DBG (15, "read_from_scanner: eof2: %d %d\n", s->i.bytes_tot[side], s->i.bytes_sent[side]);
|
/* pretend we got all the data from scanner */
|
||||||
|
s->s.bytes_sent[side] = s->s.bytes_tot[side];
|
||||||
/* pretend we got all the data from scanner */
|
|
||||||
s->s.bytes_sent[side] = s->s.bytes_tot[side];
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
s->i.eof[side] = 1;
|
s->i.eof[side] = 1;
|
||||||
|
@ -4769,57 +4804,52 @@ read_from_scanner_duplex(struct scanner *s,int exact)
|
||||||
|
|
||||||
if(ret == SANE_STATUS_EOF){
|
if(ret == SANE_STATUS_EOF){
|
||||||
|
|
||||||
switch (s->s.format){
|
/* this is jpeg data, we need to change the total size */
|
||||||
|
if(s->s.format == SANE_FRAME_JPEG){
|
||||||
|
s->s.bytes_tot[SIDE_FRONT] = s->s.bytes_sent[SIDE_FRONT];
|
||||||
|
s->s.bytes_tot[SIDE_BACK] = s->s.bytes_sent[SIDE_BACK];
|
||||||
|
s->i.bytes_tot[SIDE_FRONT] = s->i.bytes_sent[SIDE_FRONT];
|
||||||
|
s->i.bytes_tot[SIDE_BACK] = s->i.bytes_sent[SIDE_BACK];
|
||||||
|
s->u.bytes_tot[SIDE_FRONT] = s->i.bytes_sent[SIDE_FRONT];
|
||||||
|
s->u.bytes_tot[SIDE_BACK] = s->i.bytes_sent[SIDE_BACK];
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef SANE_FRAME_JPEG
|
/* this is non-jpeg data, fill remainder, change rx'd size */
|
||||||
/* this is jpeg data, we need to change the total size */
|
else{
|
||||||
case SANE_FRAME_JPEG:
|
|
||||||
s->s.bytes_tot[SIDE_FRONT] = s->s.bytes_sent[SIDE_FRONT];
|
|
||||||
s->s.bytes_tot[SIDE_BACK] = s->s.bytes_sent[SIDE_BACK];
|
|
||||||
s->i.bytes_tot[SIDE_FRONT] = s->i.bytes_sent[SIDE_FRONT];
|
|
||||||
s->i.bytes_tot[SIDE_BACK] = s->i.bytes_sent[SIDE_BACK];
|
|
||||||
s->u.bytes_tot[SIDE_FRONT] = s->i.bytes_sent[SIDE_FRONT];
|
|
||||||
s->u.bytes_tot[SIDE_BACK] = s->i.bytes_sent[SIDE_BACK];
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* this is non-jpeg data, fill remainder, change rx'd size */
|
DBG (15, "read_from_scanner_duplex: eof: %d %d %d %d\n",
|
||||||
default:
|
s->i.bytes_tot[SIDE_FRONT], s->i.bytes_sent[SIDE_FRONT],
|
||||||
|
s->i.bytes_tot[SIDE_BACK], s->i.bytes_sent[SIDE_BACK]
|
||||||
|
);
|
||||||
|
|
||||||
DBG (15, "read_from_scanner_duplex: eof: %d %d %d %d\n",
|
/* clone the last line repeatedly until the end */
|
||||||
s->i.bytes_tot[SIDE_FRONT], s->i.bytes_sent[SIDE_FRONT],
|
while(s->i.bytes_tot[SIDE_FRONT] > s->i.bytes_sent[SIDE_FRONT]){
|
||||||
s->i.bytes_tot[SIDE_BACK], s->i.bytes_sent[SIDE_BACK]
|
memcpy(
|
||||||
|
s->buffers[SIDE_FRONT]+s->i.bytes_sent[SIDE_FRONT]-s->i.Bpl,
|
||||||
|
s->buffers[SIDE_FRONT]+s->i.bytes_sent[SIDE_FRONT],
|
||||||
|
s->i.Bpl
|
||||||
);
|
);
|
||||||
|
s->i.bytes_sent[SIDE_FRONT] += s->i.Bpl;
|
||||||
|
}
|
||||||
|
|
||||||
/* clone the last line repeatedly until the end */
|
/* clone the last line repeatedly until the end */
|
||||||
while(s->i.bytes_tot[SIDE_FRONT] > s->i.bytes_sent[SIDE_FRONT]){
|
while(s->i.bytes_tot[SIDE_BACK] > s->i.bytes_sent[SIDE_BACK]){
|
||||||
memcpy(
|
memcpy(
|
||||||
s->buffers[SIDE_FRONT]+s->i.bytes_sent[SIDE_FRONT]-s->i.Bpl,
|
s->buffers[SIDE_BACK]+s->i.bytes_sent[SIDE_BACK]-s->i.Bpl,
|
||||||
s->buffers[SIDE_FRONT]+s->i.bytes_sent[SIDE_FRONT],
|
s->buffers[SIDE_BACK]+s->i.bytes_sent[SIDE_BACK],
|
||||||
s->i.Bpl
|
s->i.Bpl
|
||||||
);
|
|
||||||
s->i.bytes_sent[SIDE_FRONT] += s->i.Bpl;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* clone the last line repeatedly until the end */
|
|
||||||
while(s->i.bytes_tot[SIDE_BACK] > s->i.bytes_sent[SIDE_BACK]){
|
|
||||||
memcpy(
|
|
||||||
s->buffers[SIDE_BACK]+s->i.bytes_sent[SIDE_BACK]-s->i.Bpl,
|
|
||||||
s->buffers[SIDE_BACK]+s->i.bytes_sent[SIDE_BACK],
|
|
||||||
s->i.Bpl
|
|
||||||
);
|
|
||||||
s->i.bytes_sent[SIDE_BACK] += s->i.Bpl;
|
|
||||||
}
|
|
||||||
|
|
||||||
DBG (15, "read_from_scanner_duplex: eof2: %d %d %d %d\n",
|
|
||||||
s->i.bytes_tot[SIDE_FRONT], s->i.bytes_sent[SIDE_FRONT],
|
|
||||||
s->i.bytes_tot[SIDE_BACK], s->i.bytes_sent[SIDE_BACK]
|
|
||||||
);
|
);
|
||||||
|
s->i.bytes_sent[SIDE_BACK] += s->i.Bpl;
|
||||||
|
}
|
||||||
|
|
||||||
/* pretend we got all the data from scanner */
|
DBG (15, "read_from_scanner_duplex: eof2: %d %d %d %d\n",
|
||||||
s->s.bytes_sent[SIDE_FRONT] = s->s.bytes_tot[SIDE_FRONT];
|
s->i.bytes_tot[SIDE_FRONT], s->i.bytes_sent[SIDE_FRONT],
|
||||||
s->s.bytes_sent[SIDE_BACK] = s->s.bytes_tot[SIDE_BACK];
|
s->i.bytes_tot[SIDE_BACK], s->i.bytes_sent[SIDE_BACK]
|
||||||
break;
|
);
|
||||||
|
|
||||||
|
/* pretend we got all the data from scanner */
|
||||||
|
s->s.bytes_sent[SIDE_FRONT] = s->s.bytes_tot[SIDE_FRONT];
|
||||||
|
s->s.bytes_sent[SIDE_BACK] = s->s.bytes_tot[SIDE_BACK];
|
||||||
}
|
}
|
||||||
|
|
||||||
s->i.eof[SIDE_FRONT] = 1;
|
s->i.eof[SIDE_FRONT] = 1;
|
||||||
|
|
|
@ -139,6 +139,11 @@ usb 0x1083 0x1638
|
||||||
# CR-135i
|
# CR-135i
|
||||||
usb 0x1083 0x1639
|
usb 0x1083 0x1639
|
||||||
|
|
||||||
|
# DR-M160
|
||||||
|
option extra-status 1
|
||||||
|
option duplex-offset 400
|
||||||
|
usb 0x1083 0x163e
|
||||||
|
|
||||||
# DR-M140
|
# DR-M140
|
||||||
option extra-status 1
|
option extra-status 1
|
||||||
option duplex-offset 400
|
option duplex-offset 400
|
||||||
|
|
|
@ -289,13 +289,12 @@
|
||||||
:model "DR-M140"
|
:model "DR-M140"
|
||||||
:interface "USB"
|
:interface "USB"
|
||||||
:usbid "0x1083" "0x163f"
|
:usbid "0x1083" "0x163f"
|
||||||
:status :untested
|
:status :good
|
||||||
:comment "Similar protocol to other canon_dr machines, but difficult to support."
|
|
||||||
|
|
||||||
:model "DR-M160"
|
:model "DR-M160"
|
||||||
:interface "USB"
|
:interface "USB"
|
||||||
;:usbid "0x1083" "0x"
|
:usbid "0x1083" "0x163e"
|
||||||
:status :untested
|
:status :good
|
||||||
|
|
||||||
:model "P-150"
|
:model "P-150"
|
||||||
:interface "USB"
|
:interface "USB"
|
||||||
|
|
Ładowanie…
Reference in New Issue