genesys: Sort the initial register map by register on GL843

merge-requests/94/head
Povilas Kanapickas 2019-07-06 21:02:25 +03:00
rodzic a6a09f5dc5
commit f84f1b9d42
1 zmienionych plików z 224 dodań i 166 usunięć

Wyświetl plik

@ -279,6 +279,16 @@ gl843_init_registers (Genesys_Device * dev)
SETREG (0x01, 0x00);
SETREG (0x02, 0x78);
SETREG (0x03, 0x1f);
if (dev->model->model_id == MODEL_HP_SCANJET_G4010 ||
dev->model->model_id == MODEL_HP_SCANJET_G4050 ||
dev->model->model_id == MODEL_HP_SCANJET_4850C)
{
SETREG(0x03, 0x1d);
}
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8400F) {
SETREG(0x03, 0x1c);
}
SETREG (0x04, 0x10);
// fine tune upon device description
@ -309,17 +319,48 @@ gl843_init_registers (Genesys_Device * dev)
// TODO: on 8600F the windows driver turns off GAIN4 which is recommended
SETREG (0x06, 0xd8); /* SCANMOD=110, PWRBIT and GAIN4 */
if (dev->model->model_id == MODEL_HP_SCANJET_G4010 ||
dev->model->model_id == MODEL_HP_SCANJET_G4050 ||
dev->model->model_id == MODEL_HP_SCANJET_4850C)
{
SETREG(0x06, 0xd8); /* SCANMOD=110, PWRBIT and GAIN4 */
}
if (dev->model->model_id == MODEL_CANON_CANOSCAN_4400F) {
SETREG(0x06, 0xf0); /* SCANMOD=111, PWRBIT and no GAIN4 */
}
SETREG (0x08, 0x00);
SETREG (0x09, 0x00);
SETREG (0x0a, 0x00);
if (dev->model->model_id == MODEL_HP_SCANJET_G4010 ||
dev->model->model_id == MODEL_HP_SCANJET_G4050 ||
dev->model->model_id == MODEL_HP_SCANJET_4850C)
{
SETREG(0x0a, 0x18);
}
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8400F) {
SETREG(0x0a, 0x10);
}
// This register controls clock and RAM settings and is further modified in
// gl843_boot
SETREG (0x0b, 0x6a);
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8600F)
if (dev->model->model_id == MODEL_CANON_CANOSCAN_4400F) {
SETREG(0x0b, 0x69); // 16M only
}
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8600F) {
SETREG(0x0b, 0x89);
}
if (dev->model->model_id == MODEL_HP_SCANJET_G4010 ||
dev->model->model_id == MODEL_HP_SCANJET_G4050 ||
dev->model->model_id == MODEL_HP_SCANJET_4850C)
{
SETREG(0x0b, 0x89);
SETREG(0x0b, 0x69);
}
if (dev->model->model_id != MODEL_CANON_CANOSCAN_8400F) {
SETREG (0x0c, 0x00);
}
// EXPR[0:15], EXPG[0:15], EXPB[0:15]: Exposure time settings.
@ -329,12 +370,22 @@ gl843_init_registers (Genesys_Device * dev)
SETREG(0x13, 0x00); // SENSOR_DEF
SETREG(0x14, 0x00); // SENSOR_DEF
SETREG(0x15, 0x00); // SENSOR_DEF
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8600F)
if (dev->model->model_id == MODEL_CANON_CANOSCAN_4400F ||
dev->model->model_id == MODEL_CANON_CANOSCAN_8600F)
{
dev->reg.set16(REG_EXPR, 0x9c40);
dev->reg.set16(REG_EXPG, 0x9c40);
dev->reg.set16(REG_EXPB, 0x9c40);
dev->reg.set16(REG_EXPR, 0x9c40);
dev->reg.set16(REG_EXPG, 0x9c40);
dev->reg.set16(REG_EXPB, 0x9c40);
}
if (dev->model->model_id == MODEL_HP_SCANJET_G4010 ||
dev->model->model_id == MODEL_HP_SCANJET_G4050 ||
dev->model->model_id == MODEL_HP_SCANJET_4850C)
{
dev->reg.set16(REG_EXPR, 0x2c09);
dev->reg.set16(REG_EXPG, 0x22b8);
dev->reg.set16(REG_EXPB, 0x10f0);
}
// CCD signal settings.
SETREG(0x16, 0x33); // SENSOR_DEF
SETREG(0x17, 0x1c); // SENSOR_DEF
@ -349,10 +400,14 @@ gl843_init_registers (Genesys_Device * dev)
SETREG(0x1c, 0x20); // SENSOR_DEF
SETREG(0x1d, 0x04); // SENSOR_DEF
SETREG (0x1e, 0x10);
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8600F)
SETREG(0x1e, 0x10);
if (dev->model->model_id == MODEL_CANON_CANOSCAN_4400F ||
dev->model->model_id == MODEL_CANON_CANOSCAN_8600F)
{
SETREG(0x1e, 0x20);
SETREG(0x1e, 0x20);
}
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8400F) {
SETREG(0x1e, 0xa0);
}
SETREG (0x1f, 0x01);
@ -363,16 +418,18 @@ gl843_init_registers (Genesys_Device * dev)
SETREG (0x20, 0x10);
SETREG (0x21, 0x04);
SETREG (0x22, 0x01);
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8600F)
{
SETREG(0x22, 0xc8);
}
SETREG (0x23, 0x01);
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8600F)
SETREG(0x22, 0x01);
SETREG(0x23, 0x01);
if (dev->model->model_id == MODEL_CANON_CANOSCAN_4400F ||
dev->model->model_id == MODEL_CANON_CANOSCAN_8600F)
{
SETREG(0x23, 0xc8);
SETREG(0x22, 0xc8);
SETREG(0x23, 0xc8);
}
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8400F) {
SETREG(0x22, 0x50);
SETREG(0x23, 0x50);
}
SETREG (0x24, 0x04);
@ -438,20 +495,27 @@ gl843_init_registers (Genesys_Device * dev)
// 0x5b-0x5c: GMMADDR[0:15] address for gamma or motor tables download
// SENSOR_DEF
// DECSEL[0:2]: The number of deceleratino steps after touching home sensor
// STOPTIM[0:4]: The stop duration between change of directions in
// backtracking
SETREG (0x5e, 0x23);
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8600F)
{
SETREG(0x5e, 0x1f);
// DECSEL[0:2]: The number of deceleratino steps after touching home sensor
// STOPTIM[0:4]: The stop duration between change of directions in
// backtracking
SETREG(0x5e, 0x23);
if (dev->model->model_id == MODEL_CANON_CANOSCAN_4400F) {
SETREG(0x5e, 0x3f);
}
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8400F) {
SETREG(0x5e, 0x85);
}
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8600F) {
SETREG(0x5e, 0x1f);
}
// FMOVDEC: The number of deceleration steps in table 5 for auto-go-home
SETREG (0x5f, 0x01);
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8600F)
{
SETREG(0x5f, 0xf0);
//FMOVDEC: The number of deceleration steps in table 5 for auto-go-home
SETREG(0x5f, 0x01);
if (dev->model->model_id == MODEL_CANON_CANOSCAN_4400F) {
SETREG(0x5f, 0xf0);
}
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8600F) {
SETREG(0x5f, 0xf0);
}
// Z1MOD[0:20]
@ -489,31 +553,61 @@ gl843_init_registers (Genesys_Device * dev)
SETREG(0x69, 64);
}
// GPIO-related register bits
SETREG (0x6b, 0x30);
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8600F)
// GPIO-related register bits
SETREG(0x6b, 0x30);
if (dev->model->model_id == MODEL_CANON_CANOSCAN_4400F ||
dev->model->model_id == MODEL_CANON_CANOSCAN_8600F)
{
SETREG(0x6b, 0x72);
SETREG(0x6b, 0x72);
}
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8400F) {
SETREG(0x6b, 0xb1);
}
if (dev->model->model_id == MODEL_HP_SCANJET_G4010 ||
dev->model->model_id == MODEL_HP_SCANJET_G4050 ||
dev->model->model_id == MODEL_HP_SCANJET_4850C)
{
SETREG(0x6b, 0xf4);
}
// 0x6c, 0x6d, 0x6e, 0x6f are set according to gpio tables. See
// gl843_init_gpio.
// RSH[0:4]: The position of rising edge of CCD RS signal in cycles
// RSL[0:4]: The position of falling edge of CCD RS signal in cycles
// CPH[0:4]: The position of rising edge of CCD CP signal in cycles.
// CPL[0:4]: The position of falling edge of CCD CP signal in cycles
SETREG(0x70, 0x01); // SENSOR_DEF
SETREG(0x71, 0x03); // SENSOR_DEF
SETREG (0x72, 0x04);
SETREG (0x73, 0x05);
// RSH[0:4]: The position of rising edge of CCD RS signal in cycles
// RSL[0:4]: The position of falling edge of CCD RS signal in cycles
// CPH[0:4]: The position of rising edge of CCD CP signal in cycles.
// CPL[0:4]: The position of falling edge of CCD CP signal in cycles
SETREG(0x70, 0x01); // SENSOR_DEF
SETREG(0x71, 0x03); // SENSOR_DEF
SETREG(0x72, 0x04);
SETREG(0x73, 0x05);
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8600F)
if (dev->model->model_id == MODEL_CANON_CANOSCAN_4400F) {
SETREG(0x70, 0x01);
SETREG(0x71, 0x03);
SETREG(0x72, 0x01);
SETREG(0x73, 0x03);
}
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8400F) {
SETREG(0x70, 0x01);
SETREG(0x71, 0x03);
SETREG(0x72, 0x03);
SETREG(0x73, 0x04);
}
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8600F) {
SETREG(0x70, 0x00);
SETREG(0x71, 0x02);
SETREG(0x72, 0x02);
SETREG(0x73, 0x04);
}
if (dev->model->model_id == MODEL_HP_SCANJET_G4010 ||
dev->model->model_id == MODEL_HP_SCANJET_G4050 ||
dev->model->model_id == MODEL_HP_SCANJET_4850C)
{
SETREG(0x70, 0x00);
SETREG(0x71, 0x02);
SETREG(0x72, 0x02);
SETREG(0x73, 0x04);
SETREG(0x70, 0x00);
SETREG(0x71, 0x02);
SETREG(0x72, 0x00);
SETREG(0x73, 0x00);
}
// CK1MAP[0:17], CK3MAP[0:17], CK4MAP[0:17]: CCD clock bit mapping setting.
@ -527,8 +621,11 @@ gl843_init_registers (Genesys_Device * dev)
SETREG(0x7b, 0x00); // SENSOR_DEF
SETREG(0x7c, 0x55); // SENSOR_DEF
// various AFE settings
SETREG(0x7d, 0x00);
// various AFE settings
SETREG(0x7d, 0x00);
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8400F) {
SETREG(0x7d, 0x20);
}
// GPOLED[x]: LED vs GPIO settings
SETREG(0x7e, 0x00);
@ -537,9 +634,21 @@ gl843_init_registers (Genesys_Device * dev)
// LEDCNT[0:1]: Controls led blinking and its period
SETREG (0x7f, 0x00);
// VRHOME, VRMOVE, VRBACK, VRSCAN: Vref settings of the motor driver IC for
// moving in various situations.
SETREG (0x80, 0x00);
// VRHOME, VRMOVE, VRBACK, VRSCAN: Vref settings of the motor driver IC for
// moving in various situations.
SETREG(0x80, 0x00);
if (dev->model->model_id == MODEL_CANON_CANOSCAN_4400F) {
SETREG(0x80, 0x0c);
}
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8400F) {
SETREG(0x80, 0x28);
}
if (dev->model->model_id == MODEL_HP_SCANJET_G4010 ||
dev->model->model_id == MODEL_HP_SCANJET_G4050 ||
dev->model->model_id == MODEL_HP_SCANJET_4850C)
{
SETREG(0x80, 0x50);
}
if (dev->model->model_id != MODEL_CANON_CANOSCAN_4400F)
{
@ -554,16 +663,17 @@ gl843_init_registers (Genesys_Device * dev)
SETREG (0x86, 0x00);
}
SETREG (0x87, 0x00);
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8600F)
SETREG(0x87, 0x00);
if (dev->model->model_id == MODEL_CANON_CANOSCAN_4400F ||
dev->model->model_id == MODEL_CANON_CANOSCAN_8400F ||
dev->model->model_id == MODEL_CANON_CANOSCAN_8600F)
{
SETREG(0x87, 0x02);
SETREG(0x87, 0x02);
}
// MTRPLS[0:7]: The width of the ADF motor trigger signal pulse.
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8600F)
{
SETREG(0x94, 0xff);
// MTRPLS[0:7]: The width of the ADF motor trigger signal pulse.
if (dev->model->model_id != MODEL_CANON_CANOSCAN_8400F) {
SETREG(0x94, 0xff);
}
// 0x95-0x97: SCANLEN[0:19]: Controls when paper jam bit is set in sheetfed
@ -579,128 +689,76 @@ gl843_init_registers (Genesys_Device * dev)
SETREG(0x9a, 0x00);
SETREG(0x9b, 0x00);
}
// RMADLY[0:1], MOTLAG, CMODE, STEPTIM, MULDMYLN, IFRS
SETREG(0x9d, 0x04);
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8600F)
if (dev->model->model_id == MODEL_HP_SCANJET_G4010 ||
dev->model->model_id == MODEL_HP_SCANJET_G4050 ||
dev->model->model_id == MODEL_HP_SCANJET_4850C)
{
SETREG(0x9d, 0x08); // additionally sets the multiplier for slope tables
// TODO: move to set for scan
SETREG(0x98, 0x03);
SETREG(0x99, 0x30);
SETREG(0x9a, 0x01);
SETREG(0x9b, 0x80);
}
// RMADLY[0:1], MOTLAG, CMODE, STEPTIM, MULDMYLN, IFRS
SETREG(0x9d, 0x04);
if (dev->model->model_id == MODEL_CANON_CANOSCAN_4400F ||
dev->model->model_id == MODEL_CANON_CANOSCAN_8400F ||
dev->model->model_id == MODEL_CANON_CANOSCAN_8600F ||
dev->model->model_id == MODEL_HP_SCANJET_G4010 ||
dev->model->model_id == MODEL_HP_SCANJET_G4050 ||
dev->model->model_id == MODEL_HP_SCANJET_4850C)
{
SETREG(0x9d, 0x08); // sets the multiplier for slope tables
}
// SEL3INV, TGSTIME[0:2], TGWTIME[0:2]
SETREG (0x9e, 0x00); // SENSOR_DEF
// RFHSET[0:4]: Refresh time of SDRAM in units of 2us
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8600F)
if (dev->model->model_id != MODEL_CANON_CANOSCAN_8400F)
{
SETREG(0xa2, 0x1f);
SETREG(0x9e, 0x00); // SENSOR_DEF
}
// 0xa6-0xa9: controls gpio, see gl843_gpio_init
// GPOM9, MULSTOP[0-2], NODECEL, TB3TB1, TB5TB2, FIX16CLK.
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8600F)
// RFHSET[0:4]: Refresh time of SDRAM in units of 2us
if (dev->model->model_id == MODEL_CANON_CANOSCAN_4400F ||
dev->model->model_id == MODEL_CANON_CANOSCAN_8600F)
{
SETREG(0xab, 0x00);
SETREG(0xa2, 0x1f);
}
// 0xa6-0xa9: controls gpio, see gl843_gpio_init
// not documented
if (dev->model->model_id != MODEL_CANON_CANOSCAN_4400F
&& dev->model->model_id != MODEL_CANON_CANOSCAN_8400F)
{
SETREG(0xaa, 0x00);
}
// GPOM9, MULSTOP[0-2], NODECEL, TB3TB1, TB5TB2, FIX16CLK.
if (dev->model->model_id != MODEL_CANON_CANOSCAN_8400F) {
SETREG(0xab, 0x50);
}
if (dev->model->model_id == MODEL_CANON_CANOSCAN_4400F) {
SETREG(0xab, 0x00);
}
if (dev->model->model_id == MODEL_HP_SCANJET_G4010 ||
dev->model->model_id == MODEL_HP_SCANJET_G4050 ||
dev->model->model_id == MODEL_HP_SCANJET_4850C)
{
// BUG: this should apply to MODEL_CANON_CANOSCAN_8600F too, but due to previous bug
// the 8400F case overwrote it
SETREG(0xab, 0x40);
}
// VRHOME[3:2], VRMOVE[3:2], VRBACK[3:2]: Vref setting of the motor driver IC
// for various situations.
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8600F)
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8600F ||
dev->model->model_id == MODEL_HP_SCANJET_G4010 ||
dev->model->model_id == MODEL_HP_SCANJET_G4050 ||
dev->model->model_id == MODEL_HP_SCANJET_4850C)
{
SETREG(0xac, 0x00);
}
if (dev->model->model_id != MODEL_CANON_CANOSCAN_8400F)
{
SETREG (0x0c, 0x00);
SETREG (0x94, 0xff);
SETREG (0xab, 0x50);
}
if (dev->model->model_id != MODEL_CANON_CANOSCAN_4400F
&& dev->model->model_id != MODEL_CANON_CANOSCAN_8400F)
{
SETREG (0xaa, 0x00);
}
/* G4050 values */
if (dev->model->model_id == MODEL_HP_SCANJET_G4010 ||
dev->model->model_id == MODEL_HP_SCANJET_G4050 ||
dev->model->model_id == MODEL_HP_SCANJET_4850C)
{
SETREG (0x03, 0x1d);
SETREG (0x06, 0xd0); /* SCANMOD=110, PWRBIT and no GAIN4 */
SETREG (0x06, 0xd8); /* SCANMOD=110, PWRBIT and GAIN4 */
SETREG (0x0a, 0x18);
SETREG (0x0b, 0x69);
/* CIS exposure is used for XPA lamp movement */
SETREG (0x10, 0x2c);
SETREG (0x11, 0x09);
SETREG (0x12, 0x22);
SETREG (0x13, 0xb8);
SETREG (0x14, 0x10);
SETREG (0x15, 0xf0);
SETREG (0x6b, 0xf4);
SETREG (0x70, 0x00);
SETREG (0x71, 0x02);
SETREG (0x72, 0x00);
SETREG (0x73, 0x00);
SETREG (0x80, 0x50);
SETREG (0x9d, 0x08);
SETREG (0xab, 0x40);
/* XXX STEF XXX TODO move to set for scan */
SETREG (0x98, 0x03);
SETREG (0x99, 0x30);
SETREG (0x9a, 0x01);
SETREG (0x9b, 0x80);
SETREG (0xac, 0x00);
}
if (dev->model->model_id == MODEL_CANON_CANOSCAN_4400F)
{
SETREG (0x06, 0xf0); /* SCANMOD=111, PWRBIT and no GAIN4 */
SETREG (0x0b, 0x69); /* 16M only */
SETREG (0x1e, 0x20);
SETREG (0x22, 0xc8);
SETREG (0x23, 0xc8);
SETREG (0x5e, 0x3f);
SETREG (0x5f, 0xf0);
SETREG (0x6b, 0x72);
SETREG (0x72, 0x01);
SETREG (0x73, 0x03);
SETREG (0x80, 0x0c);
SETREG (0x87, 0x02); /* MCLOCK -> CK4MAP */
SETREG (0x9d, 0x08); /* STEPTIM=2 */
SETREG (0xa2, 0x1f);
SETREG (0xab, 0x00);
sanei_genesys_set_double(&dev->reg,REG_EXPR,0x9c40);
sanei_genesys_set_double(&dev->reg,REG_EXPG,0x9c40);
sanei_genesys_set_double(&dev->reg,REG_EXPB,0x9c40);
}
if (dev->model->model_id == MODEL_CANON_CANOSCAN_8400F)
{
SETREG (0x03, 0x1c);
SETREG (0x06, 0xd0); /* SCANMOD=110, PWRBIT and no GAIN4 */
SETREG (0x0a, 0x10);
SETREG (0x22, 0x50);
SETREG (0x23, 0x50);
SETREG (0x5e, 0x85);
SETREG (0x6b, 0xb1);
SETREG (0x1e, 0xa0);
SETREG (0x72, 0x03);
SETREG (0x73, 0x04);
SETREG (0x7d, 0x20);
SETREG (0x80, 0x28);
SETREG (0x87, 0x02); /* MCLOCK -> CK4MAP */
SETREG (0x9d, 0x08); /* STEPTIM=2 */
SETREG(0xac, 0x00);
}
dev->calib_reg = dev->reg;