Merge branch 'genesys-gl646-common-sensor-table' into 'master'

genesys: Use common sensor table on gl646

See merge request sane-project/backends!141
merge-requests/142/merge
Povilas Kanapickas 2019-08-31 15:44:23 +00:00
commit 1a02dfc8cb
5 zmienionych plików z 994 dodań i 142 usunięć

Wyświetl plik

@ -5108,7 +5108,7 @@ probe_genesys_devices (void)
of Genesys_Calibration_Cache as is.
*/
static const char* CALIBRATION_IDENT = "sane_genesys";
static const int CALIBRATION_VERSION = 5;
static const int CALIBRATION_VERSION = 6;
bool read_calibration(std::istream& str, Genesys_Device::Calibration& calibration,
const std::string& path)

Wyświetl plik

@ -207,24 +207,24 @@ static void gl646_stop_motor(Genesys_Device* dev)
/**
* find the lowest resolution for the sensor in the given mode.
* @param sensor id of the sensor
* @param color true is color mode
* @return the closest resolution for the sensor and mode
* @param channels the channel count
* @return the minimum resolution for the sensor and mode
*/
static int
get_lowest_resolution(int sensor_id, unsigned channels)
static unsigned get_lowest_resolution(int sensor_id, unsigned channels)
{
int dpi = 9600;
for (const auto& sensor : sensor_master) {
unsigned min_res = 9600;
for (const auto& sensor : *s_sensors) {
// computes distance and keep mode if it is closer than previous
if (sensor_id == sensor.sensor && sensor.matches_channels(channels)) {
if (sensor.dpi < dpi) {
dpi = sensor.dpi;
if (sensor_id == sensor.sensor_id && sensor.matches_channel_count(channels)) {
for (auto res : sensor.resolutions.resolutions()) {
if (res < min_res)
min_res = res;
}
}
}
DBG(DBG_info, "%s: %d\n", __func__, dpi);
return dpi;
DBG(DBG_info, "%s: %d\n", __func__, min_res);
return min_res;
}
/**
@ -234,33 +234,35 @@ get_lowest_resolution(int sensor_id, unsigned channels)
* @param color true is color mode
* @return the closest resolution for the sensor and mode
*/
static int
get_closest_resolution(int sensor_id, int required, unsigned channels)
static unsigned get_closest_resolution(int sensor_id, int required, unsigned channels)
{
int dpi = 0;
int dist = 9600;
unsigned best_res = 0;
unsigned best_diff = 9600;
for (const auto& sensor : sensor_master) {
if (sensor_id != sensor.sensor)
for (const auto& sensor : *s_sensors) {
if (sensor_id != sensor.sensor_id)
continue;
// exit on perfect match
if (sensor.dpi == required && sensor.matches_channels(channels)) {
if (sensor.resolutions.matches(required) && sensor.matches_channel_count(channels)) {
DBG(DBG_info, "%s: match found for %d\n", __func__, required);
return required;
}
// computes distance and keep mode if it is closer than previous
if (sensor.matches_channels(channels)) {
if (std::abs(sensor.dpi - required) < dist) {
dpi = sensor.dpi;
dist = std::abs(sensor.dpi - required);
if (sensor.matches_channel_count(channels)) {
for (auto res : sensor.resolutions.resolutions()) {
unsigned curr_diff = std::abs(static_cast<int>(res) - static_cast<int>(required));
if (curr_diff < best_diff) {
best_res = res;
best_diff = curr_diff;
}
}
}
}
DBG(DBG_info, "%s: closest match for %d is %d\n", __func__, required, dpi);
return dpi;
DBG(DBG_info, "%s: closest match for %d is %d\n", __func__, required, best_res);
return best_res;
}
/**
@ -273,10 +275,10 @@ get_closest_resolution(int sensor_id, int required, unsigned channels)
*/
static unsigned get_ccd_size_divisor(int sensor_id, int required, unsigned channels)
{
for (const auto& sensor : sensor_master) {
for (const auto& sensor : *s_sensors) {
// exit on perfect match
if (sensor_id == sensor.sensor && sensor.dpi == required &&
sensor.matches_channels(channels))
if (sensor.sensor_id == sensor_id && sensor.resolutions.matches(required) &&
sensor.matches_channel_count(channels))
{
DBG(DBG_io, "%s: match found for %d (ccd_size_divisor=%d)\n", __func__, required,
sensor.ccd_size_divisor);
@ -296,14 +298,14 @@ static unsigned get_ccd_size_divisor(int sensor_id, int required, unsigned chann
*/
static int get_cksel(int sensor_id, int required, unsigned channels)
{
for (const auto& sensor : sensor_master) {
for (const auto& sensor : *s_sensors) {
// exit on perfect match
if (sensor_id == sensor.sensor && sensor.dpi == required &&
sensor.matches_channels(channels))
if (sensor.sensor_id == sensor_id && sensor.resolutions.matches(required) &&
sensor.matches_channel_count(channels))
{
DBG(DBG_io, "%s: match found for %d (cksel=%d)\n", __func__, required,
sensor.cksel);
return sensor.cksel;
unsigned cksel = sensor.ccd_pixels_per_system_pixel();
DBG(DBG_io, "%s: match found for %d (cksel=%d)\n", __func__, required, cksel);
return cksel;
}
}
DBG(DBG_error, "%s: failed to find match for %d dpi\n", __func__, required);
@ -406,10 +408,10 @@ static void gl646_setup_registers(Genesys_Device* dev,
}
// for the given resolution, search for master sensor mode setting
const Sensor_Master* sensor_mst = nullptr;
for (const auto& sensor : sensor_master) {
if (dev->model->ccd_type == sensor.sensor && sensor.dpi == xresolution &&
sensor.matches_channels(session.params.channels))
const Genesys_Sensor* sensor_mst = nullptr;
for (const auto& sensor : *s_sensors) {
if (sensor.sensor_id == dev->model->ccd_type && sensor.resolutions.matches(xresolution) &&
sensor.matches_channel_count(session.params.channels))
{
sensor_mst = &sensor;
break;
@ -638,15 +640,15 @@ static void gl646_setup_registers(Genesys_Device* dev,
}
/* scanner's x coordinates are expressed in physical DPI but they must be divided by cksel */
sx = startx / sensor_mst->cksel / ccd_size_divisor;
ex = endx / sensor_mst->cksel / ccd_size_divisor;
sx = startx / sensor_mst->ccd_pixels_per_system_pixel() / ccd_size_divisor;
ex = endx / sensor_mst->ccd_pixels_per_system_pixel() / ccd_size_divisor;
regs->set16(REG_STRPIXEL, sx);
regs->set16(REG_ENDPIXEL, ex);
DBG(DBG_info, "%s: startx=%d, endx=%d, ccd_size_divisor=%d\n", __func__, sx, ex, ccd_size_divisor);
/* words_per_line must be computed according to the scan's resolution */
/* in fact, words_per_line _gives_ the actual scan resolution */
words_per_line = (((endx - startx) * sensor_mst->xdpi) / sensor.optical_res);
words_per_line = (((endx - startx) * sensor_mst->real_resolution) / sensor.optical_res);
bpp = session.params.depth/8;
if (session.params.depth == 1) {
words_per_line = (words_per_line+7)/8 ;
@ -663,7 +665,8 @@ static void gl646_setup_registers(Genesys_Device* dev,
DBG(DBG_info, "%s: wpl=%d\n", __func__, words_per_line);
regs->set24(REG_MAXWD, words_per_line);
regs->set16(REG_DPISET, sensor_mst->xdpi * sensor_mst->ccd_size_divisor * sensor_mst->cksel);
regs->set16(REG_DPISET, sensor_mst->real_resolution * sensor_mst->ccd_size_divisor *
sensor_mst->ccd_pixels_per_system_pixel());
regs->set16(REG_LPERIOD, sensor_mst->exposure_lperiod);
/* move distance must be adjusted to take into account the extra lines
@ -843,11 +846,10 @@ static void gl646_setup_registers(Genesys_Device* dev,
dev->read_active = SANE_TRUE;
dev->session = session;
dev->current_setup.pixels =
((endx - startx) * sensor_mst->xdpi) / sensor.optical_res;
dev->current_setup.pixels = ((endx - startx) * sensor_mst->real_resolution) / sensor.optical_res;
dev->current_setup.lines = linecnt;
dev->current_setup.exposure_time = sensor_mst->exposure_lperiod;
dev->current_setup.xres = sensor_mst->xdpi;
dev->current_setup.xres = sensor_mst->real_resolution;
dev->current_setup.ccd_size_divisor = ccd_size_divisor;
dev->current_setup.stagger = stagger;
dev->current_setup.max_shift = max_shift + stagger;
@ -898,7 +900,7 @@ gl646_setup_sensor (Genesys_Device * dev, const Genesys_Sensor& sensor, Genesys_
(void) dev;
DBG(DBG_proc, "%s: start\n", __func__);
for (const auto& reg_setting : sensor.custom_regs) {
for (const auto& reg_setting : sensor.custom_base_regs) {
regs->set8(reg_setting.address, reg_setting.value);
}
// FIXME: all other drivers don't set exposure here
@ -2407,8 +2409,6 @@ static SensorExposure gl646_led_calibration(Genesys_Device* dev, const Genesys_S
loop:
average per color
adjust exposure times
Sensor_Master uint8_t regs_0x10_0x15[6];
*/
expr = sensor.exposure.red;
expg = sensor.exposure.green;

Wyświetl plik

@ -279,89 +279,6 @@ typedef struct
SANE_Int fwdbwd; /* forward/backward steps */
} Motor_Master;
/**
* master sensor settings table entry
*/
struct Sensor_Master
{
int sensor = 0; // sensor identifier */
int dpi = 0; // required dpi */
std::vector<unsigned> channels; // 3 channels if color scan, 1 channel for gray scan
int xdpi = 0; // real sensor dpi, may be different from the required resolution */
int exposure_lperiod = 0; // exposure time */
int cksel = 0; // dpiset 'divisor', part of reg 18h
// selects manual CCD/2 clock programming. I.e. we're scanning at high DPI, but clock is setup
// such that we acquire only every 2nd pixel data
unsigned ccd_size_divisor = 0;
SensorExposure exposure;
GenesysRegisterSettingSet custom_regs;
bool matches_channels(unsigned ch) const
{
return std::find(channels.begin(), channels.end(), ch) != channels.end();
}
};
/**
* master sensor settings, for a given sensor and dpi,
* it gives exposure and CCD time
*/
static std::vector<Sensor_Master> sensor_master = {
/* HP3670 master settings */
{CCD_HP3670, 75, {1, 3}, 75, 4879, 4, 1, { 0, 0, 0 }, { { 0x08, 0x00 }, { 0x09, 0x0a }, { 0x0a, 0x0b }, { 0x0b, 0x0d }, { 0x16, 0x33 }, { 0x17, 0x07 }, { 0x18, 0x33 }, { 0x19, 0x2a }, { 0x1a, 0x02 }, { 0x1b, 0x13 }, { 0x1c, 0xc0 }, { 0x1d, 0x43 }, { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 }, { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x15 }, { 0x5a, 0xc1 }, { 0x5b, 0x05 }, { 0x5c, 0x0a }, { 0x5d, 0x0f }, { 0x5e, 0x00 } } },
{CCD_HP3670, 100, {1, 3}, 100, 4487, 4, 1, { 0, 0, 0 }, { { 0x08, 0x00 }, { 0x09, 0x0a }, { 0x0a, 0x0b }, { 0x0b, 0x0d }, { 0x16, 0x33 }, { 0x17, 0x07 }, { 0x18, 0x33 }, { 0x19, 0x2a }, { 0x1a, 0x02 }, { 0x1b, 0x13 }, { 0x1c, 0xc0 }, { 0x1d, 0x43 }, { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 }, { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x15 }, { 0x5a, 0xc1 }, { 0x5b, 0x05 }, { 0x5c, 0x0a }, { 0x5d, 0x0f }, { 0x5e, 0x00 } } },
{CCD_HP3670, 150, {1, 3}, 150, 4879, 4, 1, { 0, 0, 0 }, { { 0x08, 0x00 }, { 0x09, 0x0a }, { 0x0a, 0x0b }, { 0x0b, 0x0d }, { 0x16, 0x33 }, { 0x17, 0x07 }, { 0x18, 0x33 }, { 0x19, 0x2a }, { 0x1a, 0x02 }, { 0x1b, 0x13 }, { 0x1c, 0xc0 }, { 0x1d, 0x43 }, { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 }, { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x15 }, { 0x5a, 0xc1 }, { 0x5b, 0x05 }, { 0x5c, 0x0a }, { 0x5d, 0x0f }, { 0x5e, 0x00 } } },
{CCD_HP3670, 300, {1, 3}, 300, 4503, 4, 1, { 0, 0, 0 }, { { 0x08, 0x00 }, { 0x09, 0x0a }, { 0x0a, 0x0b }, { 0x0b, 0x0d }, { 0x16, 0x33 }, { 0x17, 0x07 }, { 0x18, 0x33 }, { 0x19, 0x2a }, { 0x1a, 0x02 }, { 0x1b, 0x13 }, { 0x1c, 0xc0 }, { 0x1d, 0x43 }, { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 }, { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x15 }, { 0x5a, 0xc1 }, { 0x5b, 0x05 }, { 0x5c, 0x0a }, { 0x5d, 0x0f }, { 0x5e, 0x00 } } },
{CCD_HP3670, 600, {1, 3}, 600, 10251, 2, 1, { 0, 0, 0 }, { { 0x08, 0x00 }, { 0x09, 0x05 }, { 0x0a, 0x06 }, { 0x0b, 0x08 }, { 0x16, 0x33 }, { 0x17, 0x07 }, { 0x18, 0x31 }, { 0x19, 0x2a }, { 0x1a, 0x02 }, { 0x1b, 0x0e }, { 0x1c, 0xc0 }, { 0x1d, 0x43 }, { 0x52, 0x0b }, { 0x53, 0x0f }, { 0x54, 0x13 }, { 0x55, 0x17 }, { 0x56, 0x03 }, { 0x57, 0x07 }, { 0x58, 0x63 }, { 0x59, 0x00 }, { 0x5a, 0xc1 }, { 0x5b, 0x02 }, { 0x5c, 0x0e }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CCD_HP3670,1200, {1, 3}, 1200, 12750, 1, 1, { 0, 0, 0 }, { { 0x08, 0x0d }, { 0x09, 0x0f }, { 0x0a, 0x11 }, { 0x0b, 0x13 }, { 0x16, 0x2b }, { 0x17, 0x07 }, { 0x18, 0x30 }, { 0x19, 0x2a }, { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0xc0 }, { 0x1d, 0x43 }, { 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x0b }, { 0x55, 0x0f }, { 0x56, 0x13 }, { 0x57, 0x17 }, { 0x58, 0x23 }, { 0x59, 0x00 }, { 0x5a, 0xc1 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CCD_HP3670,2400, {1, 3}, 1200, 12750, 1, 1, { 0, 0, 0 }, { { 0x08, 0x0d }, { 0x09, 0x0f }, { 0x0a, 0x11 }, { 0x0b, 0x13 }, { 0x16, 0x2b }, { 0x17, 0x07 }, { 0x18, 0x30 }, { 0x19, 0x2a }, { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0xc0 }, { 0x1d, 0x43 }, { 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x0b }, { 0x55, 0x0f }, { 0x56, 0x13 }, { 0x57, 0x17 }, { 0x58, 0x23 }, { 0x59, 0x00 }, { 0x5a, 0xc1 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
/* HP 2400 master settings */
{CCD_HP2400, 50, {1, 3}, 50, 7211, 4, 1, { 0, 0, 0 }, { { 0x08, 0x14 }, { 0x09, 0x15 }, { 0x0a, 0x00 }, { 0x0b, 0x00 }, { 0x16, 0xbf }, { 0x17, 0x08 }, { 0x18, 0x3f }, { 0x19, 0x2a }, { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x02 }, { 0x52, 0x0b }, { 0x53, 0x0f }, { 0x54, 0x13 }, { 0x55, 0x17 }, { 0x56, 0x03 }, { 0x57, 0x07 }, { 0x58, 0x63 }, { 0x59, 0x00 }, { 0x5a, 0xc1 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CCD_HP2400, 100, {1, 3}, 100, 7211, 4, 1, { 0, 0, 0 }, { { 0x08, 0x14 }, { 0x09, 0x15 }, { 0x0a, 0x00 }, { 0x0b, 0x00 }, { 0x16, 0xbf }, { 0x17, 0x08 }, { 0x18, 0x3f }, { 0x19, 0x2a }, { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x02 }, { 0x52, 0x0b }, { 0x53, 0x0f }, { 0x54, 0x13 }, { 0x55, 0x17 }, { 0x56, 0x03 }, { 0x57, 0x07 }, { 0x58, 0x63 }, { 0x59, 0x00 }, { 0x5a, 0xc1 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CCD_HP2400, 150, {1, 3}, 150, 7211, 4, 1, { 0, 0, 0 }, { { 0x08, 0x14 }, { 0x09, 0x15 }, { 0x0a, 0x00 }, { 0x0b, 0x00 }, { 0x16, 0xbf }, { 0x17, 0x08 }, { 0x18, 0x3f }, { 0x19, 0x2a }, { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x02 }, { 0x52, 0x0b }, { 0x53, 0x0f }, { 0x54, 0x13 }, { 0x55, 0x17 }, { 0x56, 0x03 }, { 0x57, 0x07 }, { 0x58, 0x63 }, { 0x59, 0x00 }, { 0x5a, 0xc1 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CCD_HP2400, 300, {1, 3}, 300, 8751, 4, 1, { 0, 0, 0 }, { { 0x08, 0x14 }, { 0x09, 0x15 }, { 0x0a, 0x00 }, { 0x0b, 0x00 }, { 0x16, 0xbf }, { 0x17, 0x08 }, { 0x18, 0x3f }, { 0x19, 0x2a }, { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x02 }, { 0x52, 0x0b }, { 0x53, 0x0f }, { 0x54, 0x13 }, { 0x55, 0x17 }, { 0x56, 0x03 }, { 0x57, 0x07 }, { 0x58, 0x63 }, { 0x59, 0x00 }, { 0x5a, 0xc1 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CCD_HP2400, 600, {1, 3}, 600, 18760, 2, 1, { 0, 0, 0 }, { { 0x08, 0x0e }, { 0x09, 0x0f }, { 0x0a, 0x00 }, { 0x0b, 0x00 }, { 0x16, 0xbf }, { 0x17, 0x08 }, { 0x18, 0x31 }, { 0x19, 0x2a }, { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x02 }, { 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x0b }, { 0x55, 0x0f }, { 0x56, 0x13 }, { 0x57, 0x17 }, { 0x58, 0x23 }, { 0x59, 0x00 }, { 0x5a, 0xc1 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CCD_HP2400,1200, {1, 3}, 1200, 21749, 1, 1, { 0, 0, 0 }, { { 0x08, 0x02 }, { 0x09, 0x04 }, { 0x0a, 0x00 }, { 0x0b, 0x00 }, { 0x16, 0xbf }, { 0x17, 0x08 }, { 0x18, 0x30 }, { 0x19, 0x2a }, { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0xc0 }, { 0x1d, 0x42 }, { 0x52, 0x0b }, { 0x53, 0x0f }, { 0x54, 0x13 }, { 0x55, 0x17 }, { 0x56, 0x03 }, { 0x57, 0x07 }, { 0x58, 0x63 }, { 0x59, 0x00 }, { 0x5a, 0xc1 }, { 0x5b, 0x00 }, { 0x5c, 0x0e }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
/* XP 200 master settings */
{CIS_XP200 , 75, {3}, 75, 5700, 1, 1, { 0x1644, 0x0c80, 0x092e }, { { 0x08, 0x06 }, { 0x09, 0x07 }, { 0x0a, 0x0a }, { 0x0b, 0x04 }, { 0x16, 0x24 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x2a }, { 0x1a, 0x0a }, { 0x1b, 0x0a }, { 0x1c, 0x00 }, { 0x1d, 0x11 }, { 0x52, 0x08 }, { 0x53, 0x02 }, { 0x54, 0x00 }, { 0x55, 0x00 }, { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x1a }, { 0x59, 0x51 }, { 0x5a, 0x00 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CIS_XP200 , 100, {3}, 100, 5700, 1, 1, { 0x1644, 0x0c80, 0x092e }, { { 0x08, 0x06 }, { 0x09, 0x07 }, { 0x0a, 0x0a }, { 0x0b, 0x04 }, { 0x16, 0x24 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x2a }, { 0x1a, 0x0a }, { 0x1b, 0x0a }, { 0x1c, 0x00 }, { 0x1d, 0x11 }, { 0x52, 0x08 }, { 0x53, 0x02 }, { 0x54, 0x00 }, { 0x55, 0x00 }, { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x1a }, { 0x59, 0x51 }, { 0x5a, 0x00 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CIS_XP200 , 200, {3}, 200, 5700, 1, 1, { 0x1644, 0x0c80, 0x092e }, { { 0x08, 0x06 }, { 0x09, 0x07 }, { 0x0a, 0x0a }, { 0x0b, 0x04 }, { 0x16, 0x24 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x2a }, { 0x1a, 0x0a }, { 0x1b, 0x0a }, { 0x1c, 0x00 }, { 0x1d, 0x11 }, { 0x52, 0x08 }, { 0x53, 0x02 }, { 0x54, 0x00 }, { 0x55, 0x00 }, { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x1a }, { 0x59, 0x51 }, { 0x5a, 0x00 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CIS_XP200 , 300, {3}, 300, 9000, 1, 1, { 0x1644, 0x0c80, 0x092e }, { { 0x08, 0x06 }, { 0x09, 0x07 }, { 0x0a, 0x0a }, { 0x0b, 0x04 }, { 0x16, 0x24 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x2a }, { 0x1a, 0x0a }, { 0x1b, 0x0a }, { 0x1c, 0x00 }, { 0x1d, 0x11 }, { 0x52, 0x08 }, { 0x53, 0x02 }, { 0x54, 0x00 }, { 0x55, 0x00 }, { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x1a }, { 0x59, 0x51 }, { 0x5a, 0x00 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CIS_XP200 , 600, {3}, 600, 16000, 1, 1, { 0x1644, 0x0c80, 0x092e }, { { 0x08, 0x06 }, { 0x09, 0x07 }, { 0x0a, 0x0a }, { 0x0b, 0x04 }, { 0x16, 0x24 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x2a }, { 0x1a, 0x0a }, { 0x1b, 0x0a }, { 0x1c, 0x00 }, { 0x1d, 0x11 }, { 0x52, 0x08 }, { 0x53, 0x02 }, { 0x54, 0x00 }, { 0x55, 0x00 }, { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x1a }, { 0x59, 0x51 }, { 0x5a, 0x00 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CIS_XP200 , 75, {1}, 75, 16000, 1, 1, { 0x050a, 0x0fa0, 0x1010 }, { { 0x08, 0x06 }, { 0x09, 0x07 }, { 0x0a, 0x0a }, { 0x0b, 0x04 }, { 0x16, 0x24 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x2a }, { 0x1a, 0x0a }, { 0x1b, 0x0a }, { 0x1c, 0x00 }, { 0x1d, 0x11 }, { 0x52, 0x08 }, { 0x53, 0x02 }, { 0x54, 0x00 }, { 0x55, 0x00 }, { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x1a }, { 0x59, 0x51 }, { 0x5a, 0x00 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CIS_XP200 , 100, {1}, 100, 7800, 1, 1, { 0x050a, 0x0fa0, 0x1010 }, { { 0x08, 0x06 }, { 0x09, 0x07 }, { 0x0a, 0x0a }, { 0x0b, 0x04 }, { 0x16, 0x24 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x2a }, { 0x1a, 0x0a }, { 0x1b, 0x0a }, { 0x1c, 0x00 }, { 0x1d, 0x11 }, { 0x52, 0x08 }, { 0x53, 0x02 }, { 0x54, 0x00 }, { 0x55, 0x00 }, { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x1a }, { 0x59, 0x51 }, { 0x5a, 0x00 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CIS_XP200 , 200, {1}, 200, 11000, 1, 1, { 0x050a, 0x0fa0, 0x1010 }, { { 0x08, 0x06 }, { 0x09, 0x07 }, { 0x0a, 0x0a }, { 0x0b, 0x04 }, { 0x16, 0x24 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x2a }, { 0x1a, 0x0a }, { 0x1b, 0x0a }, { 0x1c, 0x00 }, { 0x1d, 0x11 }, { 0x52, 0x08 }, { 0x53, 0x02 }, { 0x54, 0x00 }, { 0x55, 0x00 }, { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x1a }, { 0x59, 0x51 }, { 0x5a, 0x00 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CIS_XP200 , 300, {1}, 300, 13000, 1, 1, { 0x050a, 0x0fa0, 0x1010 }, { { 0x08, 0x06 }, { 0x09, 0x07 }, { 0x0a, 0x0a }, { 0x0b, 0x04 }, { 0x16, 0x24 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x2a }, { 0x1a, 0x0a }, { 0x1b, 0x0a }, { 0x1c, 0x00 }, { 0x1d, 0x11 }, { 0x52, 0x08 }, { 0x53, 0x02 }, { 0x54, 0x00 }, { 0x55, 0x00 }, { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x1a }, { 0x59, 0x51 }, { 0x5a, 0x00 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CIS_XP200 , 600, {1}, 600, 24000, 1, 1, { 0x050a, 0x0fa0, 0x1010 }, { { 0x08, 0x06 }, { 0x09, 0x07 }, { 0x0a, 0x0a }, { 0x0b, 0x04 }, { 0x16, 0x24 }, { 0x17, 0x04 }, { 0x18, 0x00 }, { 0x19, 0x2a }, { 0x1a, 0x0a }, { 0x1b, 0x0a }, { 0x1c, 0x00 }, { 0x1d, 0x11 }, { 0x52, 0x08 }, { 0x53, 0x02 }, { 0x54, 0x00 }, { 0x55, 0x00 }, { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x1a }, { 0x59, 0x51 }, { 0x5a, 0x00 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
/* HP 2300 master settings */
{CCD_HP2300, 75, {1, 3}, 75, 4480, 1, 2, { 0, 0, 0 }, { { 0x08, 0x16 }, { 0x09, 0x00 }, { 0x0a, 0x01 }, { 0x0b, 0x03 }, { 0x16, 0xb7 }, { 0x17, 0x0a }, { 0x18, 0x20 }, { 0x19, 0x2a }, { 0x1a, 0x6a }, { 0x1b, 0x8a }, { 0x1c, 0x00 }, { 0x1d, 0x85 }, { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 }, { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 }, { 0x5b, 0x06 }, { 0x5c, 0x0b }, { 0x5d, 0x10 }, { 0x5e, 0x16 } } },
{CCD_HP2300, 150, {1, 3}, 150, 4350, 1, 2, { 0, 0, 0 }, { { 0x08, 0x16 }, { 0x09, 0x00 }, { 0x0a, 0x01 }, { 0x0b, 0x03 }, { 0x16, 0xb7 }, { 0x17, 0x0a }, { 0x18, 0x20 }, { 0x19, 0x2a }, { 0x1a, 0x6a }, { 0x1b, 0x8a }, { 0x1c, 0x00 }, { 0x1d, 0x85 }, { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 }, { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 }, { 0x5b, 0x06 }, { 0x5c, 0x0b }, { 0x5d, 0x10 }, { 0x5e, 0x16 } } },
{CCD_HP2300, 300, {1, 3}, 300, 4350, 1, 2, { 0, 0, 0 }, { { 0x08, 0x16 }, { 0x09, 0x00 }, { 0x0a, 0x01 }, { 0x0b, 0x03 }, { 0x16, 0xb7 }, { 0x17, 0x0a }, { 0x18, 0x20 }, { 0x19, 0x2a }, { 0x1a, 0x6a }, { 0x1b, 0x8a }, { 0x1c, 0x00 }, { 0x1d, 0x85 }, { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 }, { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 }, { 0x5b, 0x06 }, { 0x5c, 0x0b }, { 0x5d, 0x10 }, { 0x5e, 0x16 } } },
{CCD_HP2300, 600, {1, 3}, 600, 8700, 1, 1, { 0, 0, 0 }, { { 0x08, 0x01 }, { 0x09, 0x03 }, { 0x0a, 0x04 }, { 0x0b, 0x06 }, { 0x16, 0xb7 }, { 0x17, 0x0a }, { 0x18, 0x20 }, { 0x19, 0x2a }, { 0x1a, 0x6a }, { 0x1b, 0x8a }, { 0x1c, 0x00 }, { 0x1d, 0x05 }, { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 }, { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 }, { 0x5b, 0x06 }, { 0x5c, 0x0b }, { 0x5d, 0x10 }, { 0x5e, 0x16 } } },
{CCD_HP2300,1200, {1, 3}, 600, 8700, 1, 1, { 0, 0, 0 }, { { 0x08, 0x01 }, { 0x09, 0x03 }, { 0x0a, 0x04 }, { 0x0b, 0x06 }, { 0x16, 0xb7 }, { 0x17, 0x0a }, { 0x18, 0x20 }, { 0x19, 0x2a }, { 0x1a, 0x6a }, { 0x1b, 0x8a }, { 0x1c, 0x00 }, { 0x1d, 0x05 }, { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 }, { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 }, { 0x5b, 0x06 }, { 0x5c, 0x0b }, { 0x5d, 0x10 }, { 0x5e, 0x16 } } },
/* MD5345/6471 master settings */
{CCD_5345 , 50, {1, 3}, 50, 12000, 1, 2, { 0, 0, 0 }, { { 0x08, 0x00 }, { 0x09, 0x05 }, { 0x0a, 0x06 }, { 0x0b, 0x08 }, { 0x16, 0x0b }, { 0x17, 0x0a }, { 0x18, 0x28 }, { 0x19, 0x2a }, { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x03 }, { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 }, { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CCD_5345 , 75, {1, 3}, 75, 11000, 1, 2, { 0, 0, 0 }, { { 0x08, 0x00 }, { 0x09, 0x05 }, { 0x0a, 0x06 }, { 0x0b, 0x08 }, { 0x16, 0x0b }, { 0x17, 0x0a }, { 0x18, 0x28 }, { 0x19, 0x2a }, { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x03 }, { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 }, { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CCD_5345 , 100, {1, 3}, 100, 11000, 1, 2, { 0, 0, 0 }, { { 0x08, 0x00 }, { 0x09, 0x05 }, { 0x0a, 0x06 }, { 0x0b, 0x08 }, { 0x16, 0x0b }, { 0x17, 0x0a }, { 0x18, 0x28 }, { 0x19, 0x2a }, { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x03 }, { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 }, { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CCD_5345 , 150, {1, 3}, 150, 11000, 1, 2, { 0, 0, 0 }, { { 0x08, 0x00 }, { 0x09, 0x05 }, { 0x0a, 0x06 }, { 0x0b, 0x08 }, { 0x16, 0x0b }, { 0x17, 0x0a }, { 0x18, 0x28 }, { 0x19, 0x2a }, { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x03 }, { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 }, { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CCD_5345 , 200, {1, 3}, 200, 11000, 1, 2, { 0, 0, 0 }, { { 0x08, 0x00 }, { 0x09, 0x05 }, { 0x0a, 0x06 }, { 0x0b, 0x08 }, { 0x16, 0x0b }, { 0x17, 0x0a }, { 0x18, 0x28 }, { 0x19, 0x2a }, { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x03 }, { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 }, { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CCD_5345 , 300, {1, 3}, 300, 11000, 1, 2, { 0, 0, 0 }, { { 0x08, 0x00 }, { 0x09, 0x05 }, { 0x0a, 0x06 }, { 0x0b, 0x08 }, { 0x16, 0x0b }, { 0x17, 0x0a }, { 0x18, 0x28 }, { 0x19, 0x2a }, { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x03 }, { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 }, { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CCD_5345 , 400, {1, 3}, 400, 11000, 1, 2, { 0, 0, 0 }, { { 0x08, 0x00 }, { 0x09, 0x05 }, { 0x0a, 0x06 }, { 0x0b, 0x08 }, { 0x16, 0x0b }, { 0x17, 0x0a }, { 0x18, 0x28 }, { 0x19, 0x2a }, { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x03 }, { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 }, { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CCD_5345 , 600, {1, 3}, 600, 11000, 1, 2, { 0, 0, 0 }, { { 0x08, 0x00 }, { 0x09, 0x05 }, { 0x0a, 0x06 }, { 0x0b, 0x08 }, { 0x16, 0x0b }, { 0x17, 0x0a }, { 0x18, 0x28 }, { 0x19, 0x2a }, { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x03 }, { 0x52, 0x0f }, { 0x53, 0x13 }, { 0x54, 0x17 }, { 0x55, 0x03 }, { 0x56, 0x07 }, { 0x57, 0x0b }, { 0x58, 0x83 }, { 0x59, 0x00 }, { 0x5a, 0xc1 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CCD_5345 ,1200, {1, 3}, 1200, 11000, 1, 1, { 0, 0, 0 }, { { 0x08, 0x0d }, { 0x09, 0x0f }, { 0x0a, 0x11 }, { 0x0b, 0x13 }, { 0x16, 0x0b }, { 0x17, 0x0a }, { 0x18, 0x30 }, { 0x19, 0x2a }, { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x03 }, { 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x0b }, { 0x55, 0x0f }, { 0x56, 0x13 }, { 0x57, 0x17 }, { 0x58, 0x23 }, { 0x59, 0x00 }, { 0x5a, 0xc1 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
{CCD_5345 ,2400, {1, 3}, 1200, 11000, 1, 1, { 0, 0, 0 }, { { 0x08, 0x0d }, { 0x09, 0x0f }, { 0x0a, 0x11 }, { 0x0b, 0x13 }, { 0x16, 0x0b }, { 0x17, 0x0a }, { 0x18, 0x30 }, { 0x19, 0x2a }, { 0x1a, 0x00 }, { 0x1b, 0x00 }, { 0x1c, 0x00 }, { 0x1d, 0x03 }, { 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x0b }, { 0x55, 0x0f }, { 0x56, 0x13 }, { 0x57, 0x17 }, { 0x58, 0x23 }, { 0x59, 0x00 }, { 0x5a, 0xc1 }, { 0x5b, 0x00 }, { 0x5c, 0x00 }, { 0x5d, 0x00 }, { 0x5e, 0x00 } } },
};
/**
* master motor settings, for a given motor and dpi,
* it gives steps and speed informations

Wyświetl plik

@ -253,6 +253,10 @@ struct Genesys_Sensor {
// the resolution list that the sensor is usable at.
ResolutionFilter resolutions = ResolutionFilter::ANY;
// the actual resolution of the sensor. If 0, then it's equivalent to the requested resolution.
// gl646-only.
unsigned real_resolution = 0;
// the channel list that the sensor is usable at
std::vector<unsigned> channels = { 1, 3 };
@ -287,6 +291,7 @@ struct Genesys_Sensor {
int exposure_lperiod = -1;
GenesysRegisterSettingSet custom_base_regs; // gl646-specific
GenesysRegisterSettingSet custom_regs;
GenesysRegisterSettingSet custom_fe_regs;
@ -329,6 +334,7 @@ struct Genesys_Sensor {
return sensor_id == other.sensor_id &&
optical_res == other.optical_res &&
resolutions == other.resolutions &&
real_resolution == other.real_resolution &&
method == other.method &&
ccd_size_divisor == other.ccd_size_divisor &&
black_pixels == other.black_pixels &&
@ -339,6 +345,7 @@ struct Genesys_Sensor {
gain_white_ref == other.gain_white_ref &&
exposure == other.exposure &&
exposure_lperiod == other.exposure_lperiod &&
custom_base_regs == other.custom_base_regs &&
custom_regs == other.custom_regs &&
custom_fe_regs == other.custom_fe_regs &&
gamma == other.gamma &&
@ -352,6 +359,7 @@ void serialize(Stream& str, Genesys_Sensor& x)
serialize(str, x.sensor_id);
serialize(str, x.optical_res);
serialize(str, x.resolutions);
serialize(str, x.real_resolution);
serialize(str, x.method);
serialize(str, x.ccd_size_divisor);
serialize(str, x.black_pixels);
@ -366,6 +374,8 @@ void serialize(Stream& str, Genesys_Sensor& x)
serialize(str, x.exposure.red);
serialize(str, x.exposure_lperiod);
serialize_newline(str);
serialize(str, x.custom_base_regs);
serialize_newline(str);
serialize(str, x.custom_regs);
serialize_newline(str);
serialize(str, x.custom_fe_regs);