From 2812e1f81ae9e4e6e837317281af38dc8b3b3ca9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Voltz?= Date: Tue, 2 Jul 2013 19:17:28 +0200 Subject: [PATCH 1/4] add missing cases for CCD_PLUSTEK3800 --- backend/genesys.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backend/genesys.c b/backend/genesys.c index bbb2dce3a..a0add59b5 100644 --- a/backend/genesys.c +++ b/backend/genesys.c @@ -927,6 +927,7 @@ genesys_send_offset_and_shading (Genesys_Device * dev, uint8_t * data, * tested instead of adding all the others */ /* many scanners send coefficient for lineart/gray like in color mode */ if (dev->settings.scan_mode < 2 + && dev->model->ccd_type != CCD_PLUSTEK3800 && dev->model->ccd_type != CCD_KVSS080 && dev->model->ccd_type != CCD_G4050 && dev->model->ccd_type != CCD_CS4400F @@ -2996,6 +2997,7 @@ genesys_send_shading_coefficient (Genesys_Device * dev) target_code); break; case CCD_KVSS080: + case CCD_PLUSTEK3800: case CCD_G4050: case CCD_CS4400F: case CCD_CS8400F: @@ -5215,7 +5217,7 @@ calc_parameters (Genesys_Scanner * s) ((br_x - tl_x) * resolution) / MM_PER_INCH; /* we need an even pixels number - * TODO invert test logic or generalize behaviour acroos all ASICs */ + * TODO invert test logic or generalize behaviour across all ASICs */ if ((s->dev->model->flags & GENESYS_FLAG_SIS_SENSOR) || s->dev->model->asic_type == GENESYS_GL847 || s->dev->model->asic_type == GENESYS_GL124 @@ -6904,6 +6906,8 @@ sane_close (SANE_Handle handle) /* we need this to avoid ASIC getting stuck * in bulk writes */ if(s->dev->model->asic_type==GENESYS_GL847 + ||s->dev->model->asic_type==GENESYS_GL845 + ||s->dev->model->asic_type==GENESYS_GL845 ||s->dev->model->asic_type==GENESYS_GL843) sanei_usb_reset (s->dev->dn); From 730a2ba4e512470bd04e1ca4238d7322768c6e0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Voltz?= Date: Thu, 4 Jul 2013 04:28:09 +0200 Subject: [PATCH 2/4] define specific LIDE210 sensor and motor instead of using LIDE110 ones --- backend/genesys.c | 17 ++++++++++------- backend/genesys_devices.c | 38 ++++++++++++++++++++++++++++++++++++-- backend/genesys_gl124.h | 28 ++++++++++++++++------------ backend/genesys_low.h | 2 ++ 4 files changed, 64 insertions(+), 21 deletions(-) diff --git a/backend/genesys.c b/backend/genesys.c index a0add59b5..b771dfc22 100644 --- a/backend/genesys.c +++ b/backend/genesys.c @@ -58,7 +58,7 @@ * SANE backend for Genesys Logic GL646/GL841/GL842/GL843/GL846/GL847/GL124 based scanners */ -#define BUILD 2408 +#define BUILD 2410 #define BACKEND_NAME genesys #include "genesys.h" @@ -2897,7 +2897,7 @@ genesys_send_shading_coefficient (Genesys_Device * dev) * sets REG01_FASTMOD. */ - /* at some point me may thought of a setup struct in genesys_devices that + /* TODO setup a struct in genesys_devices that * will handle these settings instead of having this switch growing up */ cmat[0] = 0; cmat[1] = 1; @@ -3016,7 +3016,11 @@ genesys_send_shading_coefficient (Genesys_Device * dev) case CIS_CANONLIDE100: case CIS_CANONLIDE200: case CIS_CANONLIDE110: - if(dev->model->ccd_type!=CIS_CANONLIDE110) + case CIS_CANONLIDE210: + /* TODO store this in a data struct so we avoid + * growing this switch */ + if(dev->model->ccd_type!=CIS_CANONLIDE110 + && dev->model->ccd_type!=CIS_CANONLIDE210) target_code=0xdc00; else target_code=0xf000; @@ -6106,6 +6110,8 @@ attach_one_device (SANE_String_Const devname) { /* Keep track of newly attached devices so we can set options as necessary. */ + tmp_dev=NULL; + /* increase device list capacity if needed */ if (new_dev_len >= new_dev_alloced) { new_dev_alloced += 4; @@ -6120,10 +6126,7 @@ attach_one_device (SANE_String_Const devname) } if (!new_dev) { - if(tmp_dev) - { - free(tmp_dev); - } + FREE_IFNOT_NULL(tmp_dev) DBG (DBG_error, "attach_one_device: out of memory\n"); return SANE_STATUS_NO_MEM; } diff --git a/backend/genesys_devices.c b/backend/genesys_devices.c index aa12432ce..d7960ff10 100644 --- a/backend/genesys_devices.c +++ b/backend/genesys_devices.c @@ -648,6 +648,29 @@ static Genesys_Sensor Sensor[] = { {2.1, 2.1, 2.1}, {NULL, NULL, NULL}} , + /* CANON LIDE 210 sensor */ + {CIS_CANONLIDE210, + 2400, /* optical resolution */ + 87, /* black pixels */ + 16, /* dummy pixels 16 */ + 303, /* 303 */ + 5168*4, /* total pixels */ + 210, + 200, + {0x00, 0x00, 0x00, 0x00}, + /* reg 0x10 - 0x15 : EXPR, EXPG and EXPB */ + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + /* reg 0x16 - 0x1d */ + 0x10, 0x04, 0x00, 0x01, 0x30, 0x00, 0x02, 0x01 }, + /* reg 0x52 - 0x5e */ + { + 0x00, 0x02, 0x04, 0x06, 0x04, 0x04, 0x04, 0x04, + 0x1a, 0x00, 0xc0, 0x00, 0x00 + } + , + {2.1, 2.1, 2.1}, + {NULL, NULL, NULL}} + , {CCD_PLUSTEK_3600, 1200, 87, /*(black) */ @@ -1196,6 +1219,17 @@ static Genesys_Motor Motor[] = { }, }, }, + {MOTOR_CANONLIDE210, /* Canon LiDE 210 */ + 4800, + 9600, + 1, /* maximum step type count */ + 1, /* maximum power modes count */ + { /* motor slopes */ + { /* power mode 0 */ + { 3000, 1000, 256, 0.50}, /* full step */ + }, + }, + }, {MOTOR_PLUSTEK_3600, /* PLUSTEK 3600 */ 1200, 2400, @@ -1817,10 +1851,10 @@ static Genesys_Model canon_lide_210_model = { SANE_TRUE, /* Is this a CIS scanner? */ SANE_FALSE, /* Is this a sheetfed scanner? */ - CIS_CANONLIDE110, + CIS_CANONLIDE210, DAC_CANONLIDE110, GPO_CANONLIDE210, - MOTOR_CANONLIDE110, + MOTOR_CANONLIDE210, GENESYS_FLAG_SKIP_WARMUP | GENESYS_FLAG_OFFSET_CALIBRATION | GENESYS_FLAG_DARK_CALIBRATION diff --git a/backend/genesys_gl124.h b/backend/genesys_gl124.h index 7b018fbc4..e1bbf4817 100644 --- a/backend/genesys_gl124.h +++ b/backend/genesys_gl124.h @@ -590,6 +590,8 @@ typedef struct { static size_t order_01[]={0,1}; static size_t order_0213[]={0,2,1,3}; +/* *INDENT-OFF* */ + /** * database of sensor profiles */ @@ -598,32 +600,29 @@ static Sensor_Profile sensors[]={ {CIS_CANONLIDE110, 600, 5360, 0x1e, 0x9f, 0x55, 5168, 163, 101, 388, 574, 393, NULL , 0x00, 0x0a, 0x20, 0x21}, {CIS_CANONLIDE110, 1200, 10528, 0x1e, 0x9f, 0x55, 5168, 163, 101, 388, 574, 393, order_01 , 0x00, 0x08, 0x20, 0x22}, {CIS_CANONLIDE110, 2400, 20864, 0x1e, 0x9f, 0x55, 5168, 163, 4679, 6839, 8401, 6859, order_0213, 0x00, 0x06, 0x20, 0x24}, - /* {CIS_CANONLIDE110, 200, 2304, 0x1e, 0x9f, 0x55, 5168, 154, 101, 388, 574, 393, 0x00, 0x0a, 0x20, 0x21}, */ + {CIS_CANONLIDE210, 300, 5359, 0x1e, 0x9f, 0x55, 5168, 154, 101, 388, 574, 393, NULL , 0x00, 0x0a, 0x20, 0x21}, + {CIS_CANONLIDE210, 600, 5360, 0x1e, 0x9f, 0x55, 5168, 163, 101, 388, 574, 393, NULL , 0x00, 0x0a, 0x20, 0x21}, + {CIS_CANONLIDE210, 1200, 10528, 0x1e, 0x9f, 0x55, 5168, 163, 101, 388, 574, 393, order_01 , 0x00, 0x08, 0x20, 0x22}, + {CIS_CANONLIDE210, 2400, 20864, 0x1e, 0x9f, 0x55, 5168, 163, 4679, 6839, 8401, 6859, order_0213, 0x00, 0x06, 0x20, 0x24}, }; #define MOVE_DPI 200 #define MOVE_EXPOSURE 2304 -/* -static uint16_t lide110_ok[] = { 62496, 2343, 2343, 2343, 2343, 2343, 2343,2343,2343,2051,1961,1901,1852,1809,1775,1745,1717,1692,1671,1650,1630,1613,1597,1580,1565,1549,1536,1524,1512,1500,1488,1478,1467,1458,1446,1437,1429,1420,1411,1403,1395,1386,1378,1372,1364,1358,1350,1345,1337,1331,1324,1318,1313,1307,1302,1294,1289,1284,1278,1273,1268,1263,1260,1255,1250,1245,1240,1236,1231,1227,1222,1219,1214,1211,1206,1201,1198,1194,1191,1186,1183,1179,1176,1173,1168,1166,1161,1158,1155,1151,1148,1146,1143,1139,1136,1133,1130,1128,1124,1121,1118,1116,1113,1110,1108,1105,1101,1099,1096,1093,1091,1088,1086,1083,1081,1078,1076,1073,1071,1068,1067,1065,1062,1060,1058,1055,1053,1051,1048,1047,1045,1042,1040,1038,1035,1034,1032,1030,1027,1026,1024,1022,1020,1019,1016,1014,1012,1011,1009,1006,1005,1003,1001,999,998,996,994,993,991,989,987,985,984,982,980,979,977,976,974,973,971,969,968,966,965,963,962,960,959,957,956,954,952,951,949,948,946,946,944,943,942,940,939,937,936,934,933,931,930,929,928,927,925,924,922,921,920,919,918,916,915,914,912,911,910,909,908,906,905,904,903,902,900,899,898,897,896,895,893,892,892,890,889,888,887,886,885,884,882,881,881,879,878,877,876,875,874,873,872,871,870,869,868,867,864,864, 0}; -static uint16_t lide110_max[] = { 62496, 31296,31296,31296,31296,31296,31296,31296,31296,31296,31296,31296,31296,31296,31296,31296,31296,31296,31296,31296,31296,31296,31296,31296,31296,31296,31296,31296,31296,31296,31296,31296,0}; -static uint16_t lide110_slow[] = { 62496, 7896,7896,7896,7896,7896,7896,7896,7896,7896,7896,7896,7896,7896,7896,7896,7896,7896,7896,7896,7896,7896,7896,7896,7896,7896,7896,7896,7896,7896,7896,7896,0}; -*/ static uint32_t lide110_max[] = { 62496, 31296,0}; static uint32_t lide110_slow[] = { 62496, 7896,0}; -static uint32_t lide110_alt[] = { 62496, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2051, 1432, 1372, 1323, 1280, 1246, 1216, 1188, 1163, 1142, 1121, 1101, 1084, 1068, 1051, 1036, 1020, 1007, 995, 983, 971, 959, 949, 938, 929, 917, 908, 900, 891, 882, 874, 866, 857, 849, 843, 835, 829, 821, 816, 808, 802, 795, 789, 784, 778, 773, 765, 760, 755, 749, 744, 739, 734, 731, 726, 721, 716, 711, 707, 702, 698, 693, 690, 685, 682, 677, 672, 669, 665, 662, 657, 654, 650, 647, 644, 639, 637, 632, 629, 626, 622, 619, 617, 614, 610, 607, 604, 601, 599, 595, 592, 589, 587, 584, 581, 579, 576, 572, 570, 567, 564, 562, 559, 557, 554, 552, 549, 547, 544, 542, 539, 538, 536, 533, 531, 529, 526, 524, 522, 519, 518, 516, 513, 511, 509, 506, 505, 503, 501, 498, 497, 495, 493, 491, 490, 487, 485, 483, 482, 480, 477, 476, 474, 472, 470, 469, 467, 465, 464, 462, 460, 458, 456, 455, 453, 451, 450, 448, 447, 445, 444, 442, 440, 439, 437, 436, 434, 433, 431, 430, 428, 427, 425, 423, 422, 420, 419, 417, 417, 415, 414, 413, 411, 410, 408, 407, 405, 404, 402, 401, 400, 399, 398, 396, 395, 393, 392, 391, 390, 389, 387, 386, 385, 383, 382, 381, 380, 379, 377, 376, 375, 374, 373, 371, 370, 369, 368, 367, 366, 364, 363, 363, 361, 360, 359, 358, 357, 356, 355, 353, 352, 352, 350, 349, 348, 347, 346, 345, 344, 343, 342, 341, 340, 339, 338, 335, 335, 0}; +static uint32_t lide110_alt[] = { 62496, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2051, 1432, 1372, 1323, 1280, 1246, 1216, 1188, 1163, 1142, 1121, 1101, 1084, 1068, 1051, 1036, 1020, 1007, 995, 983, 971, 959, 949, 938, 929, 917, 908, 900, 891, 882, 874, 866, 857, 849, 843, 835, 829, 821, 816, 808, 802, 795, 789, 784, 778, 773, 765, 760, 755, 749, 744, 739, 734, 731, 726, 721, 716, 711, 707, 702, 698, 693, 690, 685, 682, 677, 672, 669, 665, 662, 657, 654, 650, 647, 644, 639, 637, 632, 629, 626, 622, 619, 617, 614, 610, 607, 604, 601, 599, 595, 592, 589, 587, 584, 581, 579, 576, 572, 570, 567, 564, 562, 559, 557, 554, 552, 549, 547, 544, 542, 539, 538, 536, 533, 531, 529, 526, 524, 522, 519, 518, 516, 513, 511, 509, 506, 505, 503, 501, 498, 497, 495, 493, 491, 490, 487, 485, 483, 482, 480, 477, 476, 474, 472, 470, 469, 467, 465, 464, 462, 460, 458, 456, 455, 453, 451, 450, 448, 447, 445, 444, 442, 440, 439, 437, 436, 434, 433, 431, 430, 428, 427, 425, 423, 422, 420, 419, 417, 417, 415, 414, 413, 411, 410, 408, 407, 405, 404, 402, 401, 400, 399, 398, 396, 395, 393, 392, 391, 390, 389, 387, 386, 385, 383, 382, 381, 380, 379, 377, 376, 375, 374, 373, 371, 370, 369, 368, 367, 366, 364, 363, 363, 361, 360, 359, 358, 357, 356, 355, 353, 352, 352, 350, 349, 348, 347, 346, 345, 344, 343, 342, 341, 340, 339, 338, 335, 335, 0}; static uint32_t lide110_ok[] = { 62496, 2343, 2343, 2343, 2343, 2343, 2343,2343,2343,2051,1961,1901,1852,1809,1775,1745,1717,1692,1671,1650,1630,1613,1597,1580,1565,1549,1536,1524,1512,1500,1488,1478,1467,1458,1446,1437,1429,1420,1411,1403,1395,1386,1378,1372,1364,1358,1350,1345,1337,1331,1324,1318,1313,1307,1302,1294,1289,1284,1278,1273,1268,1263,1260,1255,1250,1245,1240,1236,1231,1227,1222,1219,1214,1211,1206,1201,1198,1194,1191,1186,1183,1179,1176,1173,1168,1166,1161,1158,1155,1151,1148,1146,1143,1139,1136,1133,1130,1128,1124,1121,1118,1116,1113,1110,1108,1105,1101,1099,1096,1093,1091,1088,1086,1083,1081,1078,1076,1073,1071,1068,1067,1065,1062,1060,1058,1055,1053,1051,1048,1047,1045,1042,1040,1038,1035,1034,1032,1030,1027,1026,1024,1022,1020,1019,1016,1014,1012,1011,1009,1006,1005,1003,1001,999,998,996,994,993,991,989,987,985,984,982,980,979,977,976,974,973,971,969,968,966,965,963,962,960,959,957,956,954,952,951,949,948,946,946,944,943,942,940,939,937,936,934,933,931,930,929,928,927,925,924,922,921,920,919,918,916,915,914,912,911,910,909,908,906,905,904,903,902,900,899,898,897,896,895,893,892,892,890,889,888,887,886,885,884,882,881,881,879,878,877,876,875,874,873,872,871,870,869,868,867,864,864, 0}; -/* -static uint16_t lide110_x2[] = { 62496, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2051, 1948, 1877, 1817, 1764, 1720, 1680, 1643, 1609, 1580, 1550, 1522, 1498, 1474, 1450, 1427, 1405, 1385, 1366, 1348, 1329, 1311, 1295, 1278, 1263, 1246, 1231, 1218, 1204, 1189, 1176, 1163, 1150, 1137, 1126, 1114, 1103, 1091, 1081, 1069, 1059, 1048, 1038, 1029, 1019, 1010, 999, 990, 981, 972, 964, 955, 947, 940, 932, 924, 916, 908, 901, 893, 886, 878, 872, 864, 858, 851, 843, 838, 831, 825, 818, 812, 806, 801, 795, 788, 784, 777, 771, 766, 760, 755, 751, 746, 740, 735, 730, 725, 721, 715, 710, 706, 701, 697, 692, 688, 684, 678, 674, 670, 666, 662, 657, 654, 649, 646, 641, 638, 634, 630, 626, 623, 619, 615, 612, 609, 605, 601, 598, 594, 591, 588, 584, 581, 578, 574, 572, 568, 565, 562, 559, 556, 553, 550, 548, 544, 541, 538, 536, 533, 530, 527, 525, 522, 519, 517, 514, 511, 509, 506, 504, 501, 498, 496, 494, 491, 489, 486, 484, 482, 480, 477, 475, 473, 470, 469, 466, 464, 462, 460, 457, 456, 453, 451, 449, 447, 445, 443, 441, 439, 437, 436, 433, 432, 429, 428, 426, 424, 422, 420, 418, 417, 415, 413, 411, 409, 408, 406, 405, 403, 401, 399, 398, 396, 394, 393, 391, 390, 388, 386, 385, 383, 382, 380, 379, 377, 376, 374, 373, 371, 370, 369, 367, 366, 364, 363, 361, 360, 359, 357, 356, 355, 353, 352, 350, 349, 348, 347, 345, 344, 343, 341, 340, 339, 338, 336, 335, 0}; -static uint16_t lide110_new[] = { 62496, 2343, 2343, 2343, 2343, 2343, 2343, 2343,2343, 2051, 1961, 1901, 1852, 1809, 1775, 1745, 1717, 1692, 1671, 1650, 1634, 1544, 1484, 1435, 1392, 1358, 1328, 1300, 1275, 1254, 1233, 1213, 1196, 1180, 1163, 1148, 1132, 1119, 1107, 1095, 1083, 1071, 1061, 1050, 1041, 1029, 1020, 1012, 1003, 994, 986, 978, 969, 961, 955, 947, 941, 933, 928, 920, 914, 907, 901, 896, 890, 885, 877, 872, 867, 861, 856, 851, 846, 843, 838, 833, 828, 823, 819, 814, 810, 805, 802, 797, 794, 789, 784, 781, 777, 774, 769, 766, 762, 759, 756, 751, 749, 744, 741, 738, 734, 731, 729, 726, 722, 719, 716, 713, 711, 707, 704, 701, 699, 696, 693, 691, 688, 684, 682, 679, 676, 674, 671, 669, 666, 664, 661, 659, 656, 654, 651, 650, 648, 645, 643, 641, 638, 636, 634, 631, 630, 628, 625, 623, 621, 618, 617, 615, 613, 610, 609, 607, 605, 603, 602, 599, 597, 595, 594, 592, 589, 588, 586, 584, 582, 581, 579, 577, 576, 574, 572, 570, 568, 567, 565, 563, 562, 560, 559, 557, 556, 554, 552, 551, 549, 548, 546, 545, 543, 542, 540, 539, 537, 535, 534, 532, 531, 529, 529, 527, 526, 525, 523, 522, 520, 519, 517, 516, 514, 513, 512, 511, 510, 508, 507, 505, 504, 503, 502, 501, 499, 498, 497, 495, 494, 493, 492, 491, 489, 488, 487, 486, 485, 483, 482, 481, 480, 479, 478, 476, 475, 475, 473, 472, 471, 470, 469, 468, 467, 465, 464, 464, 462, 461, 460, 459, 458, 457, 456, 455, 454, 453, 452, 451, 450, 447, 447, 0 }; -*/ +static uint32_t lide210_max[] = { 62496, 31296,0}; +static uint32_t lide210_slow[] = { 62496, 7896,0}; +static uint32_t lide210_alt[] = { 62496, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2051, 1432, 1372, 1323, 1280, 1246, 1216, 1188, 1163, 1142, 1121, 1101, 1084, 1068, 1051, 1036, 1020, 1007, 995, 983, 971, 959, 949, 938, 929, 917, 908, 900, 891, 882, 874, 866, 857, 849, 843, 835, 829, 821, 816, 808, 802, 795, 789, 784, 778, 773, 765, 760, 755, 749, 744, 739, 734, 731, 726, 721, 716, 711, 707, 702, 698, 693, 690, 685, 682, 677, 672, 669, 665, 662, 657, 654, 650, 647, 644, 639, 637, 632, 629, 626, 622, 619, 617, 614, 610, 607, 604, 601, 599, 595, 592, 589, 587, 584, 581, 579, 576, 572, 570, 567, 564, 562, 559, 557, 554, 552, 549, 547, 544, 542, 539, 538, 536, 533, 531, 529, 526, 524, 522, 519, 518, 516, 513, 511, 509, 506, 505, 503, 501, 498, 497, 495, 493, 491, 490, 487, 485, 483, 482, 480, 477, 476, 474, 472, 470, 469, 467, 465, 464, 462, 460, 458, 456, 455, 453, 451, 450, 448, 447, 445, 444, 442, 440, 439, 437, 436, 434, 433, 431, 430, 428, 427, 425, 423, 422, 420, 419, 417, 417, 415, 414, 413, 411, 410, 408, 407, 405, 404, 402, 401, 400, 399, 398, 396, 395, 393, 392, 391, 390, 389, 387, 386, 385, 383, 382, 381, 380, 379, 377, 376, 375, 374, 373, 371, 370, 369, 368, 367, 366, 364, 363, 363, 361, 360, 359, 358, 357, 356, 355, 353, 352, 352, 350, 349, 348, 347, 346, 345, 344, 343, 342, 341, 340, 339, 338, 335, 335, 0}; +static uint32_t lide210_ok[] = { 62496, 2343, 2343, 2343, 2343, 2343, 2343,2343,2343,2051,1961,1901,1852,1809,1775,1745,1717,1692,1671,1650,1630,1613,1597,1580,1565,1549,1536,1524,1512,1500,1488,1478,1467,1458,1446,1437,1429,1420,1411,1403,1395,1386,1378,1372,1364,1358,1350,1345,1337,1331,1324,1318,1313,1307,1302,1294,1289,1284,1278,1273,1268,1263,1260,1255,1250,1245,1240,1236,1231,1227,1222,1219,1214,1211,1206,1201,1198,1194,1191,1186,1183,1179,1176,1173,1168,1166,1161,1158,1155,1151,1148,1146,1143,1139,1136,1133,1130,1128,1124,1121,1118,1116,1113,1110,1108,1105,1101,1099,1096,1093,1091,1088,1086,1083,1081,1078,1076,1073,1071,1068,1067,1065,1062,1060,1058,1055,1053,1051,1048,1047,1045,1042,1040,1038,1035,1034,1032,1030,1027,1026,1024,1022,1020,1019,1016,1014,1012,1011,1009,1006,1005,1003,1001,999,998,996,994,993,991,989,987,985,984,982,980,979,977,976,974,973,971,969,968,966,965,963,962,960,959,957,956,954,952,951,949,948,946,946,944,943,942,940,939,937,936,934,933,931,930,929,928,927,925,924,922,921,920,919,918,916,915,914,912,911,910,909,908,906,905,904,903,902,900,899,898,897,896,895,893,892,892,890,889,888,887,886,885,884,882,881,881,879,878,877,876,875,874,873,872,871,870,869,868,867,864,864, 0}; /** * database of motor profiles */ -/* *INDENT-OFF* */ /* NEXT LPERIOD=PREVIOUS*2-192 */ static Motor_Profile motors[]={ @@ -632,6 +631,11 @@ static Motor_Profile motors[]={ {MOTOR_CANONLIDE110, 5360, 1, lide110_alt}, {MOTOR_CANONLIDE110, 10528, 1, lide110_slow}, {MOTOR_CANONLIDE110, 20864, 2, lide110_max}, + {MOTOR_CANONLIDE210, 2304, 0, lide110_ok}, + {MOTOR_CANONLIDE210, 5359, 0, lide110_alt}, + {MOTOR_CANONLIDE210, 5360, 1, lide110_alt}, + {MOTOR_CANONLIDE210, 10528, 1, lide110_slow}, + {MOTOR_CANONLIDE210, 20864, 2, lide110_max}, {0, 0, 0, NULL}, }; /* *INDENT-ON* */ diff --git a/backend/genesys_low.h b/backend/genesys_low.h index ef21f310b..a3417e6a4 100644 --- a/backend/genesys_low.h +++ b/backend/genesys_low.h @@ -374,6 +374,7 @@ Genesys_Color_Order; #define CCD_CS8400F 24 #define CCD_IMG101 25 #define CCD_PLUSTEK3800 26 +#define CIS_CANONLIDE210 27 #define GPO_UMAX 0 #define GPO_ST12 1 @@ -422,6 +423,7 @@ Genesys_Color_Order; #define MOTOR_CS8400F 20 #define MOTOR_IMG101 21 #define MOTOR_PLUSTEK3800 22 +#define MOTOR_CANONLIDE210 23 /* Forward typedefs */ From 5408c8cd27e81255d9f0c052393f302e6f87356a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Voltz?= Date: Tue, 9 Jul 2013 06:59:56 +0200 Subject: [PATCH 3/4] use LINESEL in all cases fro GL124 --- backend/genesys_gl124.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/backend/genesys_gl124.c b/backend/genesys_gl124.c index 323b1db52..a80c1490e 100644 --- a/backend/genesys_gl124.c +++ b/backend/genesys_gl124.c @@ -950,13 +950,14 @@ gl124_init_motor_regs_scan (Genesys_Device * dev, if(dev->line_interp>0) { - lincnt=scan_lines*dev->line_interp; + lincnt=scan_lines*(dev->line_interp+1); } else { lincnt=scan_lines; } - + + /* enforce motor minimal scan speed */ yres=scan_yres; if ((scan_mode == SCAN_MODE_COLOR) && (yres<900)) { @@ -964,10 +965,10 @@ gl124_init_motor_regs_scan (Genesys_Device * dev, } if ((scan_mode != SCAN_MODE_COLOR) && (yres<300)) { - scan_dummy=dev->line_interp-1; - dev->line_interp=0; yres=300; } + scan_dummy=dev->line_interp; + dev->line_interp=0; sanei_genesys_set_triple(reg,REG_LINCNT,lincnt); DBG (DBG_io, "%s: lincnt=%d\n", __FUNCTION__, lincnt); @@ -1390,15 +1391,16 @@ gl124_init_optical_regs_scan (Genesys_Device * dev, * motor dpi then discard lines to match taget * resolution, so lincnt has to be updated */ - dev->line_interp = 300/dpiset; + dev->line_interp = 300/dpiset-1; } - DBG (DBG_io2, "%s: used_pixels=%d\n", __FUNCTION__, used_pixels); - DBG (DBG_io2, "%s: pixels =%d\n", __FUNCTION__, pixels); - DBG (DBG_io2, "%s: depth =%d\n", __FUNCTION__, depth); - DBG (DBG_io2, "%s: dev->bpl =%lu\n", __FUNCTION__, (unsigned long)dev->bpl); - DBG (DBG_io2, "%s: dev->len =%lu\n", __FUNCTION__, (unsigned long)dev->len); - DBG (DBG_io2, "%s: dev->dist =%lu\n", __FUNCTION__, (unsigned long)dev->dist); + DBG (DBG_io2, "%s: used_pixels =%d\n", __FUNCTION__, used_pixels); + DBG (DBG_io2, "%s: pixels =%d\n", __FUNCTION__, pixels); + DBG (DBG_io2, "%s: depth =%d\n", __FUNCTION__, depth); + DBG (DBG_io2, "%s: dev->bpl =%lu\n", __FUNCTION__, (unsigned long)dev->bpl); + DBG (DBG_io2, "%s: dev->len =%lu\n", __FUNCTION__, (unsigned long)dev->len); + DBG (DBG_io2, "%s: dev->dist =%lu\n", __FUNCTION__, (unsigned long)dev->dist); + DBG (DBG_io2, "%s: dev->line_interp=%lu\n", __FUNCTION__, (unsigned long)dev->dist); words_per_line *= channels; dev->wpl = words_per_line; From ca08a8ba2ba67669941f3603fd34fcfed5dce346 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Voltz?= Date: Mon, 15 Jul 2013 07:53:37 +0200 Subject: [PATCH 4/4] switch genesys register address to 16 bits --- backend/genesys_gl124.c | 14 ++++---- backend/genesys_gl124.h | 2 +- backend/genesys_low.c | 71 +++++++++++++++++++++++++---------------- backend/genesys_low.h | 35 ++++++++------------ 4 files changed, 66 insertions(+), 56 deletions(-) diff --git a/backend/genesys_gl124.c b/backend/genesys_gl124.c index a80c1490e..566ed187e 100644 --- a/backend/genesys_gl124.c +++ b/backend/genesys_gl124.c @@ -1280,8 +1280,8 @@ gl124_init_optical_regs_scan (Genesys_Device * dev, r->value |= REG03_LAMPPWR; /* BW threshold */ - RIE (sanei_genesys_write_hregister (dev, REG114, dev->settings.threshold)); - RIE (sanei_genesys_write_hregister (dev, REG115, dev->settings.threshold)); + RIE (sanei_genesys_write_register (dev, REG114, dev->settings.threshold)); + RIE (sanei_genesys_write_register (dev, REG115, dev->settings.threshold)); /* monochrome / color scan */ r = sanei_genesys_get_address (reg, REG04); @@ -1943,7 +1943,7 @@ gl124_stop_action (Genesys_Device * dev) sanei_genesys_print_status (val); } - status = sanei_genesys_read_hregister (dev, REG100, &val40); + status = sanei_genesys_read_register (dev, REG100, &val40); if (status != SANE_STATUS_GOOD) { DBG (DBG_error, @@ -1983,7 +1983,7 @@ gl124_stop_action (Genesys_Device * dev) { sanei_genesys_print_status (val); } - status = sanei_genesys_read_hregister (dev, REG100, &val40); + status = sanei_genesys_read_register (dev, REG100, &val40); if (status != SANE_STATUS_GOOD) { DBG (DBG_error, @@ -2625,7 +2625,7 @@ gl124_init_regs_for_scan (Genesys_Device * dev) DBGCOMPLETED; return status; } - status = sanei_genesys_read_hregister (dev, REG100, &val40); + status = sanei_genesys_read_register (dev, REG100, &val40); if (status != SANE_STATUS_GOOD) { DBG (DBG_error, "%s: failed to read reg100: %s\n", __FUNCTION__, sane_strstatus (status)); @@ -2644,7 +2644,7 @@ gl124_init_regs_for_scan (Genesys_Device * dev) DBGCOMPLETED; return status; } - status = sanei_genesys_read_hregister (dev, REG100, &val40); + status = sanei_genesys_read_register (dev, REG100, &val40); if (status != SANE_STATUS_GOOD) { DBG (DBG_error, "%s: failed to read reg100: %s\n", __FUNCTION__, sane_strstatus (status)); @@ -3650,7 +3650,7 @@ gl124_boot (Genesys_Device * dev, SANE_Bool cold) RIE (sanei_genesys_write_register (dev, 0x33, val)); /* test CHKVER */ - RIE (sanei_genesys_read_hregister (dev, REG100, &val)); + RIE (sanei_genesys_read_register (dev, REG100, &val)); if (val & REG100_CHKVER) { RIE (sanei_genesys_read_register (dev, 0x00, &val)); diff --git a/backend/genesys_gl124.h b/backend/genesys_gl124.h index e1bbf4817..8541b0338 100644 --- a/backend/genesys_gl124.h +++ b/backend/genesys_gl124.h @@ -246,7 +246,7 @@ #define REGB7 0xb7 #define REGB7_Z2MOD 0xff -#define REG100 0 +#define REG100 0x100 #define REG100_DOCSNR 0x80 #define REG100_ADFSNR 0x40 #define REG100_COVERSNR 0x20 diff --git a/backend/genesys_low.c b/backend/genesys_low.c index ae8af0561..8b762605c 100644 --- a/backend/genesys_low.c +++ b/backend/genesys_low.c @@ -159,7 +159,7 @@ sanei_genesys_write_pnm_file (char *filename, uint8_t * data, int depth, /* Reads a register from a register set */ SANE_Byte sanei_genesys_read_reg_from_set (Genesys_Register_Set * reg, - SANE_Byte address) + uint16_t address) { SANE_Int i; @@ -175,7 +175,7 @@ sanei_genesys_read_reg_from_set (Genesys_Register_Set * reg, /* Reads a register from a register set */ void -sanei_genesys_set_reg_from_set (Genesys_Register_Set * reg, SANE_Byte address, +sanei_genesys_set_reg_from_set (Genesys_Register_Set * reg, uint16_t address, SANE_Byte value) { SANE_Int i; @@ -202,12 +202,12 @@ sanei_genesys_set_reg_from_set (Genesys_Register_Set * reg, SANE_Byte address, * @param val value to write */ SANE_Status -sanei_genesys_write_hregister (Genesys_Device * dev, uint8_t reg, uint8_t val) +sanei_genesys_write_hregister (Genesys_Device * dev, uint16_t reg, uint8_t val) { SANE_Status status; uint8_t buffer[2]; - buffer[0]=reg; + buffer[0]=reg & 0xff; buffer[1]=val; status = sanei_usb_control_msg (dev->dn, REQUEST_TYPE_OUT, REQUEST_BUFFER, @@ -232,14 +232,14 @@ sanei_genesys_write_hregister (Genesys_Device * dev, uint8_t reg, uint8_t val) * @param val value to write */ SANE_Status -sanei_genesys_read_hregister (Genesys_Device * dev, uint8_t reg, uint8_t * val) +sanei_genesys_read_hregister (Genesys_Device * dev, uint16_t reg, uint8_t * val) { SANE_Status status; SANE_Byte value[2]; status = sanei_usb_control_msg (dev->dn, REQUEST_TYPE_IN, REQUEST_BUFFER, - 0x100 | VALUE_GET_REGISTER, 0x22+(reg<<8), 2, value); + 0x100 | VALUE_GET_REGISTER, 0x22+((reg & 0xff)<<8), 2, value); if (status != SANE_STATUS_GOOD) { DBG (DBG_error, @@ -290,9 +290,10 @@ sanei_genesys_write_gl847_register (Genesys_Device * dev, uint8_t reg, uint8_t v * Write to one ASIC register */ SANE_Status -sanei_genesys_write_register (Genesys_Device * dev, uint8_t reg, uint8_t val) +sanei_genesys_write_register (Genesys_Device * dev, uint16_t reg, uint8_t val) { SANE_Status status; + SANE_Byte reg8; #ifdef UNIT_TESTING if(dev->usb_mode<0) @@ -301,6 +302,12 @@ sanei_genesys_write_register (Genesys_Device * dev, uint8_t reg, uint8_t val) } #endif + /* 16 bit register address space */ + if(reg>255) + { + return sanei_genesys_write_hregister(dev, reg, val); + } + /* route to gl847 function if needed */ if(dev->model->asic_type==GENESYS_GL847 || dev->model->asic_type==GENESYS_GL845 @@ -310,9 +317,10 @@ sanei_genesys_write_register (Genesys_Device * dev, uint8_t reg, uint8_t val) return sanei_genesys_write_gl847_register(dev, reg, val); } + reg8=reg & 0xff; status = sanei_usb_control_msg (dev->dn, REQUEST_TYPE_OUT, REQUEST_REGISTER, - VALUE_SET_REGISTER, INDEX, 1, ®); + VALUE_SET_REGISTER, INDEX, 1, ®8); if (status != SANE_STATUS_GOOD) { DBG (DBG_error, @@ -375,7 +383,7 @@ sanei_genesys_write_0x8c (Genesys_Device * dev, uint8_t index, uint8_t val) * URB 164 control 0xc0 0x04 0x8e 0x4122 len 2 read 0xfc 0x55 */ static SANE_Status -sanei_genesys_read_gl847_register (Genesys_Device * dev, uint8_t reg, uint8_t * val) +sanei_genesys_read_gl847_register (Genesys_Device * dev, uint16_t reg, uint8_t * val) { SANE_Status status; SANE_Byte value[2]; @@ -404,9 +412,10 @@ sanei_genesys_read_gl847_register (Genesys_Device * dev, uint8_t reg, uint8_t * /* Read from one register */ SANE_Status -sanei_genesys_read_register (Genesys_Device * dev, uint8_t reg, uint8_t * val) +sanei_genesys_read_register (Genesys_Device * dev, uint16_t reg, uint8_t * val) { SANE_Status status; + SANE_Byte reg8; #ifdef UNIT_TESTING if(dev->usb_mode<0) @@ -416,6 +425,12 @@ sanei_genesys_read_register (Genesys_Device * dev, uint8_t reg, uint8_t * val) } #endif + /* 16 bit register address space */ + if(reg>255) + { + return sanei_genesys_read_hregister(dev, reg, val); + } + /* route to gl847 function if needed */ if(dev->model->asic_type==GENESYS_GL847 || dev->model->asic_type==GENESYS_GL845 @@ -423,9 +438,11 @@ sanei_genesys_read_register (Genesys_Device * dev, uint8_t reg, uint8_t * val) || dev->model->asic_type==GENESYS_GL124) return sanei_genesys_read_gl847_register(dev, reg, val); + /* 8 bit register address space */ + reg8=(SANE_Byte)(reg& 0Xff); status = sanei_usb_control_msg (dev->dn, REQUEST_TYPE_OUT, REQUEST_REGISTER, - VALUE_SET_REGISTER, INDEX, 1, ®); + VALUE_SET_REGISTER, INDEX, 1, ®8); if (status != SANE_STATUS_GOOD) { DBG (DBG_error, @@ -594,7 +611,7 @@ SANE_Status sanei_genesys_get_status (Genesys_Device * dev, uint8_t * status) { if(dev->model->asic_type==GENESYS_GL124) - return sanei_genesys_read_hregister(dev, 0x01, status); + return sanei_genesys_read_hregister(dev, 0x101, status); return sanei_genesys_read_register (dev, 0x41, status); } @@ -667,13 +684,13 @@ sanei_genesys_read_valid_words (Genesys_Device * dev, unsigned int *words) switch (dev->model->asic_type) { case GENESYS_GL124: - RIE (sanei_genesys_read_hregister (dev, 0x02, &value)); + RIE (sanei_genesys_read_hregister (dev, 0x102, &value)); *words = (value & 0x03); - RIE (sanei_genesys_read_hregister (dev, 0x03, &value)); + RIE (sanei_genesys_read_hregister (dev, 0x103, &value)); *words = *words * 256 + value; - RIE (sanei_genesys_read_hregister (dev, 0x04, &value)); + RIE (sanei_genesys_read_hregister (dev, 0x104, &value)); *words = *words * 256 + value; - RIE (sanei_genesys_read_hregister (dev, 0x05, &value)); + RIE (sanei_genesys_read_hregister (dev, 0x105, &value)); *words = *words * 256 + value; break; @@ -730,11 +747,11 @@ sanei_genesys_read_scancnt (Genesys_Device * dev, unsigned int *words) if (dev->model->asic_type == GENESYS_GL124) { - RIE (sanei_genesys_read_hregister (dev, 0x0b, &value)); + RIE (sanei_genesys_read_hregister (dev, 0x10b, &value)); *words = (value & 0x0f) << 16; - RIE (sanei_genesys_read_hregister (dev, 0x0c, &value)); + RIE (sanei_genesys_read_hregister (dev, 0x10c, &value)); *words += (value << 8); - RIE (sanei_genesys_read_hregister (dev, 0x0d, &value)); + RIE (sanei_genesys_read_hregister (dev, 0x10d, &value)); *words += value; } else @@ -762,7 +779,7 @@ sanei_genesys_read_scancnt (Genesys_Device * dev, unsigned int *words) * address in ASIC space. Or NULL if not found. */ Genesys_Register_Set * -sanei_genesys_get_address (Genesys_Register_Set * regs, SANE_Byte addr) +sanei_genesys_get_address (Genesys_Register_Set * regs, uint16_t addr) { int i; for (i = 0; i < GENESYS_MAX_REGS; i++) @@ -782,7 +799,7 @@ sanei_genesys_get_address (Genesys_Register_Set * regs, SANE_Byte addr) * @return SANE_STATUS_INVAL if the index doesn't exist in register set */ SANE_Status -sanei_genesys_set_double(Genesys_Register_Set *regs, SANE_Byte addr, uint16_t value) +sanei_genesys_set_double(Genesys_Register_Set *regs, uint16_t addr, uint16_t value) { Genesys_Register_Set *r; @@ -813,7 +830,7 @@ sanei_genesys_set_double(Genesys_Register_Set *regs, SANE_Byte addr, uint16_t va * @return SANE_STATUS_INVAL if the index doesn't exist in register set */ SANE_Status -sanei_genesys_set_triple(Genesys_Register_Set *regs, SANE_Byte addr, uint32_t value) +sanei_genesys_set_triple(Genesys_Register_Set *regs, uint16_t addr, uint32_t value) { Genesys_Register_Set *r; @@ -852,7 +869,7 @@ sanei_genesys_set_triple(Genesys_Register_Set *regs, SANE_Byte addr, uint32_t va * @return SANE_STATUS_INVAL if the index doesn't exist in register set */ SANE_Status -sanei_genesys_get_double(Genesys_Register_Set *regs, SANE_Byte addr, uint16_t *value) +sanei_genesys_get_double(Genesys_Register_Set *regs, uint16_t addr, uint16_t *value) { Genesys_Register_Set *r; uint16_t result=0; @@ -885,7 +902,7 @@ sanei_genesys_get_double(Genesys_Register_Set *regs, SANE_Byte addr, uint16_t *v * @return SANE_STATUS_INVAL if the index doesn't exist in register set */ SANE_Status -sanei_genesys_get_triple(Genesys_Register_Set *regs, SANE_Byte addr, uint32_t *value) +sanei_genesys_get_triple(Genesys_Register_Set *regs, uint16_t addr, uint32_t *value) { Genesys_Register_Set *r; uint32_t result=0; @@ -1012,11 +1029,11 @@ sanei_genesys_read_feed_steps (Genesys_Device * dev, unsigned int *steps) if (dev->model->asic_type == GENESYS_GL124) { - RIE (sanei_genesys_read_hregister (dev, 0x08, &value)); + RIE (sanei_genesys_read_hregister (dev, 0x108, &value)); *steps = (value & 0x1f) << 16; - RIE (sanei_genesys_read_hregister (dev, 0x09, &value)); + RIE (sanei_genesys_read_hregister (dev, 0x109, &value)); *steps += (value << 8); - RIE (sanei_genesys_read_hregister (dev, 0x0a, &value)); + RIE (sanei_genesys_read_hregister (dev, 0x10a, &value)); *steps += value; } else diff --git a/backend/genesys_low.h b/backend/genesys_low.h index a3417e6a4..6b02a85d8 100644 --- a/backend/genesys_low.h +++ b/backend/genesys_low.h @@ -230,10 +230,10 @@ #define FEBUSY 0x02 #define MOTORENB 0x01 -typedef struct +typedef struct Genesys_Register_Set { - SANE_Byte address; - SANE_Byte value; + uint16_t address; + uint8_t value; } Genesys_Register_Set; /** @brief Data structure to set up analog frontend. @@ -867,34 +867,27 @@ typedef struct { /* common functions needed by low level specific functions */ /*--------------------------------------------------------------------------*/ -extern Genesys_Register_Set *sanei_genesys_get_address (Genesys_Register_Set * - regs, SANE_Byte addr); +extern Genesys_Register_Set *sanei_genesys_get_address (Genesys_Register_Set * regs, uint16_t addr); extern SANE_Byte -sanei_genesys_read_reg_from_set (Genesys_Register_Set * regs, - SANE_Byte address); +sanei_genesys_read_reg_from_set (Genesys_Register_Set * regs, uint16_t address); extern void -sanei_genesys_set_reg_from_set (Genesys_Register_Set * regs, - SANE_Byte address, SANE_Byte value); +sanei_genesys_set_reg_from_set (Genesys_Register_Set * regs, uint16_t address, SANE_Byte value); extern SANE_Status sanei_genesys_init_cmd_set (Genesys_Device * dev); extern SANE_Status -sanei_genesys_read_register (Genesys_Device * dev, uint8_t reg, - uint8_t * val); +sanei_genesys_read_register (Genesys_Device * dev, uint16_t reg, uint8_t * val); extern SANE_Status -sanei_genesys_write_register (Genesys_Device * dev, uint8_t reg, - uint8_t val); +sanei_genesys_write_register (Genesys_Device * dev, uint16_t reg, uint8_t val); extern SANE_Status -sanei_genesys_read_hregister (Genesys_Device * dev, uint8_t reg, - uint8_t * val); +sanei_genesys_read_hregister (Genesys_Device * dev, uint16_t reg, uint8_t * val); extern SANE_Status -sanei_genesys_write_hregister (Genesys_Device * dev, uint8_t reg, - uint8_t val); +sanei_genesys_write_hregister (Genesys_Device * dev, uint16_t reg, uint8_t val); extern SANE_Status sanei_genesys_bulk_write_register (Genesys_Device * dev, @@ -1038,16 +1031,16 @@ extern SANE_Status sanei_genesys_buffer_consume(Genesys_Buffer * buf, size_t size); extern SANE_Status -sanei_genesys_set_double(Genesys_Register_Set *regs, SANE_Byte addr, uint16_t value); +sanei_genesys_set_double(Genesys_Register_Set *regs, uint16_t addr, uint16_t value); extern SANE_Status -sanei_genesys_set_triple(Genesys_Register_Set *regs, SANE_Byte addr, uint32_t value); +sanei_genesys_set_triple(Genesys_Register_Set *regs, uint16_t addr, uint32_t value); extern SANE_Status -sanei_genesys_get_double(Genesys_Register_Set *regs, SANE_Byte addr, uint16_t *value); +sanei_genesys_get_double(Genesys_Register_Set *regs, uint16_t addr, uint16_t *value); extern SANE_Status -sanei_genesys_get_triple(Genesys_Register_Set *regs, SANE_Byte addr, uint32_t *value); +sanei_genesys_get_triple(Genesys_Register_Set *regs, uint16_t addr, uint32_t *value); extern SANE_Status sanei_genesys_wait_for_home(Genesys_Device *dev);