genesys: Add support for half-ccd and quarter-ccd modes on the same chip

Previously we hardcoded half-ccd mode to be actually quarter-ccd mode on
GL843.
merge-requests/81/head
Povilas Kanapickas 2019-06-02 11:47:53 +03:00
rodzic 8a9a4e3f71
commit 36872e5751
9 zmienionych plików z 54 dodań i 60 usunięć

Wyświetl plik

@ -2340,7 +2340,8 @@ compute_averaged_planar (Genesys_Device * dev, const Genesys_Sensor& sensor,
*/
res = dev->settings.xres;
if (sensor.half_ccd_mode && dev->settings.xres <= sensor.optical_res / 2) {
if (sensor.get_ccd_size_divisor_for_dpi(dev->settings.xres) > 1)
{
res *= 2;
}
@ -2634,8 +2635,7 @@ compute_shifted_coefficients (Genesys_Device * dev,
unsigned int patch_cnt = offset * 3; /* at start, offset of first patch */
x = dev->settings.xres;
if ((sensor.half_ccd_mode) &&
(dev->settings.xres <= sensor.optical_res / 2))
if (sensor.get_ccd_size_divisor_for_dpi(dev->settings.xres) > 1)
x *= 2; /* scanner is using half-ccd mode */
basepixels = sensor.optical_res / x; /*this should be evenly dividable */

Wyświetl plik

@ -388,7 +388,7 @@ void genesys_init_sensor_tables()
sensor = Genesys_Sensor();
sensor.sensor_id = CCD_5345;
sensor.optical_res = 1200;
sensor.half_ccd_mode = true;
sensor.ccd_size_divisor = 2;
sensor.black_pixels = 48;
sensor.dummy_pixel = 16;
sensor.CCD_start_xoffset = 0;
@ -471,7 +471,7 @@ void genesys_init_sensor_tables()
sensor = Genesys_Sensor();
sensor.sensor_id = CCD_HP2300;
sensor.optical_res = 600;
sensor.half_ccd_mode = true;
sensor.ccd_size_divisor = 2;
sensor.black_pixels = 48;
sensor.dummy_pixel = 20;
sensor.CCD_start_xoffset = 0;
@ -513,7 +513,7 @@ void genesys_init_sensor_tables()
sensor = Genesys_Sensor();
sensor.sensor_id = CCD_CANONLIDE35;
sensor.optical_res = 1200;
sensor.half_ccd_mode = true;
sensor.ccd_size_divisor = 2;
sensor.black_pixels = 87;
sensor.dummy_pixel = 87;
sensor.CCD_start_xoffset = 0;
@ -1188,7 +1188,7 @@ void genesys_init_sensor_tables()
sensor = Genesys_Sensor();
sensor.sensor_id = CCD_CS4400F;
sensor.optical_res = 4800;
sensor.half_ccd_mode = true; // FIXME: actually quarter CCD mode
sensor.ccd_size_divisor = 4;
sensor.black_pixels = 50*8;
// 31 at 600 dpi, 58 at 1200 dpi
sensor.dummy_pixel = 20;
@ -1277,7 +1277,7 @@ void genesys_init_sensor_tables()
sensor = Genesys_Sensor();
sensor.sensor_id = CCD_CS8600F;
sensor.optical_res = 4800;
sensor.half_ccd_mode = true; // FIXME: actually quarter CCD mode
sensor.ccd_size_divisor = 4;
sensor.black_pixels = 31;
sensor.dummy_pixel = 20;
sensor.CCD_start_xoffset = 0; // not used at the moment
@ -1375,7 +1375,7 @@ void genesys_init_sensor_tables()
sensor = Genesys_Sensor();
sensor.sensor_id = CCD_HP_N6310;
sensor.optical_res = 2400;
// sensor.half_ccd_mode = true; Possibly half CCD, needs checking
// sensor.ccd_size_divisor = 2; Possibly half CCD, needs checking
sensor.black_pixels = 96;
sensor.dummy_pixel = 26;
sensor.CCD_start_xoffset = 128;
@ -1417,7 +1417,7 @@ void genesys_init_sensor_tables()
sensor = Genesys_Sensor();
sensor.sensor_id = CIS_CANONLIDE110;
sensor.optical_res = 2400;
sensor.half_ccd_mode = true;
sensor.ccd_size_divisor = 2;
sensor.black_pixels = 87;
sensor.dummy_pixel = 16;
sensor.CCD_start_xoffset = 303;
@ -1459,7 +1459,7 @@ void genesys_init_sensor_tables()
sensor = Genesys_Sensor();
sensor.sensor_id = CIS_CANONLIDE120;
sensor.optical_res = 2400;
sensor.half_ccd_mode = true;
sensor.ccd_size_divisor = 2;
sensor.black_pixels = 87;
sensor.dummy_pixel = 16;
sensor.CCD_start_xoffset = 303;
@ -1502,7 +1502,7 @@ void genesys_init_sensor_tables()
sensor = Genesys_Sensor();
sensor.sensor_id = CIS_CANONLIDE210;
sensor.optical_res = 2400;
sensor.half_ccd_mode = true;
sensor.ccd_size_divisor = 2;
sensor.black_pixels = 87;
sensor.dummy_pixel = 16;
sensor.CCD_start_xoffset = 303;
@ -1544,7 +1544,7 @@ void genesys_init_sensor_tables()
sensor = Genesys_Sensor();
sensor.sensor_id = CIS_CANONLIDE220;
sensor.optical_res = 2400;
sensor.half_ccd_mode = true;
sensor.ccd_size_divisor = 2;
sensor.black_pixels = 87;
sensor.dummy_pixel = 16;
sensor.CCD_start_xoffset = 303;
@ -1586,7 +1586,7 @@ void genesys_init_sensor_tables()
sensor = Genesys_Sensor();
sensor.sensor_id = CCD_PLUSTEK_3600;
sensor.optical_res = 1200;
sensor.half_ccd_mode = true;
sensor.ccd_size_divisor = 2;
sensor.black_pixels = 87;
sensor.dummy_pixel = 87;
sensor.CCD_start_xoffset = 0;
@ -1710,7 +1710,7 @@ void genesys_init_sensor_tables()
sensor = Genesys_Sensor();
sensor.sensor_id = CIS_CANONLIDE80,
sensor.optical_res = 1200; // real hardware limit is 2400
sensor.half_ccd_mode = true;
sensor.ccd_size_divisor = 2;
sensor.black_pixels = 20;
sensor.dummy_pixel = 6;
// tuned to give 3*8 multiple startx coordinate during shading calibration

Wyświetl plik

@ -171,7 +171,7 @@ SANE_Status status=SANE_STATUS_GOOD;
static SANE_Bool compute_half_ccd(const Genesys_Sensor& sensor, int xres)
{
/* we have 2 domains for ccd: xres below or above half ccd max dpi */
if (xres<=300 && sensor.half_ccd_mode)
if (xres<=300 && sensor.ccd_size_divisor > 1)
{
return SANE_TRUE;
}

Wyświetl plik

@ -2742,7 +2742,7 @@ gl646_init_regs_for_shading (Genesys_Device * dev, const Genesys_Sensor& sensor)
DBG(DBG_proc, "%s: start\n", __func__);
/* when shading all (full width) line, we must adapt to half_ccd case */
if (sensor.half_ccd_mode)
if (sensor.ccd_size_divisor > 1)
{
/* walk the master mode list to find if half_ccd */
if (is_half_ccd (dev->model->ccd_type, dev->settings.xres, SANE_TRUE) ==
@ -4880,7 +4880,7 @@ gl646_search_strip(Genesys_Device * dev, const Genesys_Sensor& sensor, SANE_Bool
DBG(DBG_proc, "%s: start\n", __func__);
/* adapt to half_ccd case */
if (sensor.half_ccd_mode)
if (sensor.ccd_size_divisor > 1)
{
/* walk the master mode list to find if half_ccd */
if (is_half_ccd (dev->model->ccd_type, res, SANE_TRUE) == SANE_TRUE)

Wyświetl plik

@ -2238,11 +2238,10 @@ independent of our calculated values:
/* half_ccd */
/* we have 2 domains for ccd: xres below or above half ccd max dpi */
if (sensor.optical_res < 2 * xres ||
!(sensor.half_ccd_mode)) {
half_ccd = SANE_FALSE;
} else {
if (sensor.get_ccd_size_divisor_for_dpi(xres) > 1) {
half_ccd = SANE_TRUE;
} else {
half_ccd = SANE_FALSE;
}
/* optical_res */
@ -2604,11 +2603,10 @@ static SANE_Status gl841_calculate_current_setup(Genesys_Device * dev, const Gen
/* half_ccd */
/* we have 2 domains for ccd: xres below or above half ccd max dpi */
if ((sensor.optical_res < 2 * xres) ||
!(sensor.half_ccd_mode)) {
half_ccd = SANE_FALSE;
} else {
if (sensor.get_ccd_size_divisor_for_dpi(xres) > 1) {
half_ccd = SANE_TRUE;
} else {
half_ccd = SANE_FALSE;
}
/* optical_res */

Wyświetl plik

@ -1375,12 +1375,11 @@ static void gl843_compute_session(Genesys_Device* dev, ScanSession& s,
const Genesys_Sensor& sensor)
{
s.params.assert_valid();
if (sensor.optical_res < 4 * s.params.xres ||
!(sensor.half_ccd_mode))
if (sensor.get_ccd_size_divisor_for_dpi(s.params.xres) > 1)
{
s.half_ccd = SANE_FALSE;
} else {
s.half_ccd = SANE_TRUE;
} else {
s.half_ccd = SANE_FALSE;
}
s.optical_resolution = sensor.optical_res;
@ -1680,14 +1679,13 @@ gl843_calculate_current_setup(Genesys_Device * dev, const Genesys_Sensor& sensor
yres = dev->settings.yres;
/* we have 2 domains for ccd: xres below or above half ccd max dpi */
if ((sensor.optical_res < 4 * xres) ||
!(sensor.half_ccd_mode))
if (sensor.get_ccd_size_divisor_for_dpi(xres) > 1)
{
half_ccd = SANE_FALSE;
half_ccd = SANE_TRUE;
}
else
{
half_ccd = SANE_TRUE;
half_ccd = SANE_FALSE;
}
/* channels */

Wyświetl plik

@ -1148,14 +1148,13 @@ gl846_init_scan_regs (Genesys_Device * dev, const Genesys_Sensor& sensor,
__func__, xres, yres, lines, pixels, startx, starty, depth, channels, flags);
/* we may have 2 domains for ccd: xres below or above half ccd max dpi */
if (sensor.optical_res < 2 * xres ||
!(sensor.half_ccd_mode))
if (sensor.get_ccd_size_divisor_for_dpi(xres) > 1)
{
half_ccd = SANE_FALSE;
half_ccd = SANE_TRUE;
}
else
{
half_ccd = SANE_TRUE;
half_ccd = SANE_FALSE;
}
/* optical_res */
@ -1429,14 +1428,10 @@ gl846_calculate_current_setup(Genesys_Device * dev, const Genesys_Sensor& sensor
/* half_ccd */
/* we have 2 domains for ccd: xres below or above half ccd max dpi */
if ((sensor.optical_res < 2 * xres) ||
!(sensor.half_ccd_mode))
{
half_ccd = SANE_FALSE;
}
else
{
half_ccd = SANE_TRUE;
if (sensor.get_ccd_size_divisor_for_dpi(xres) > 1) {
half_ccd = SANE_TRUE;
} else {
half_ccd = SANE_FALSE;
}
/* optical_res */

Wyświetl plik

@ -1163,14 +1163,13 @@ gl847_init_scan_regs (Genesys_Device * dev,
__func__, xres, yres, lines, pixels, startx, starty, depth, channels, flags);
/* we may have 2 domains for ccd: xres below or above half ccd max dpi */
if (sensor.optical_res < 2 * xres ||
!(sensor.half_ccd_mode))
if (sensor.get_ccd_size_divisor_for_dpi(xres) > 1)
{
half_ccd = SANE_FALSE;
half_ccd = SANE_TRUE;
}
else
{
half_ccd = SANE_TRUE;
half_ccd = SANE_FALSE;
}
/* optical_res */
@ -1444,14 +1443,10 @@ gl847_calculate_current_setup(Genesys_Device * dev, const Genesys_Sensor& sensor
/* half_ccd */
/* we have 2 domains for ccd: xres below or above half ccd max dpi */
if ((sensor.optical_res < 2 * xres) ||
!(sensor.half_ccd_mode))
{
half_ccd = SANE_FALSE;
}
else
{
half_ccd = SANE_TRUE;
if (sensor.get_ccd_size_divisor_for_dpi(xres) > 1) {
half_ccd = SANE_TRUE;
} else {
half_ccd = SANE_FALSE;
}
/* optical_res */

Wyświetl plik

@ -529,8 +529,8 @@ struct Genesys_Sensor {
// whether the sensor is transparency sensor.
bool is_transparency = false;
// half or quarter CCD mode
bool half_ccd_mode = false;
// CCD may present itself as half or quarter-size CCD on certain resolutions
int ccd_size_divisor = 1;
int black_pixels = 0;
// value of the dummy register
@ -599,6 +599,14 @@ struct Genesys_Sensor {
::fwrite(&custom_regs[i].mask, sizeof(custom_regs[i].mask), 1, fp);
}
}
int get_ccd_size_divisor_for_dpi(int xres) const
{
if (ccd_size_divisor > 1 && xres * ccd_size_divisor <= optical_res) {
return ccd_size_divisor;
}
return 1;
}
};
struct Genesys_Gpo