This is a multi-part message in MIME format. --------------010201010504090102010302 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit
Hello, Stef, I think you are absolutely right with your diagnostic that the genesys driver (written for gl646) fails with gl841 because the registers of the gl841 are different to the regs from gl646. So I've shortly compared the gl841 with the gl646. The result is in the attached file. As far as I am concerned, I think we mainly have to adapt the functions handling the scanner controler registers (e.g. genesys_init_registers). I think we can use the whole file genesys.c and the register/memory write/read functions for a gl841 driver, but I don't have the overview to decide this. As I don't know the best way to support the gl841 controller without the development of parts, that are equal to gl646, I'd be glad to get some suggestions on this subject. Thanks for your suggestions Philipp --------------010201010504090102010302 Content-Type: text/plain; name="comparison_GL841_GL646.txt" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="comparison_GL841_GL646.txt" This is a comparison of between the scanner controllers GL841 and GL646. The bases of this comparision are the datasheets of this controllers. (http://www.genesyslogic.com/econtents/product02.asp?SN=47&minicidx=3&lastcidx=18 and http://www.genesyslogic.com/econtents/product02.asp?SN=48&minicidx=3&lastcidx=18) Attention: This comparison isn't complete at all ! analogue frontend: GL646 has a built-in 16-bit AFE. GL841 needs an external AFE. In lide50, it is reported to be WM8199CDS (see http://www.wolfsonmicro.com/products/digital_imaging/WM8199/) PC interface: GL646 has a built-in USB 1.1 interface. Optional there is an extern USB 2.0 or IEEE 1394 interface controller. The only interface in the GL841 is the built-in USB 2.0 controller. registers: view of GL 841: 0x01 Bit 4: nothing instead of FASTMOD Bit 3: M16DRAM instead of COMPENB 0x02 Bit 2: HOMENEG Bit 1: LONGCURV instead of STEPSEL[1:0] 0x03 Bit 7: LAMPDOG instead of TG3 Bit 4-0: LAMPTIM[3:0] instead of LAMPDOG, LAMPTIM[2:0] 0x04 Bit 5-4: AFEMOD[1:0] instead of ADTYPE[1:0] 0x05 Bit 5-4: MTLLAMP[1:0] instead of GMMITYPE[1:0] Bit 2: nothing instead of LEDADD Bit 1-0: MTLBASE[1:0] instead of BASESEL[1:0] 0x06 Bit 7-5: SCANMOD[2:0] instead of nothing 0x07 Bit 3: SRAMSEL instead of nothing Bit 2: FASTDMA instead of nothing 0x08 Bit 6: DECFLAG instead of nothing Bit 5: GMMFFR instead of nothing Bit 4: GMMFFG Bit 3: GMMFFB Bit 2: GMMZR Bit 1: GMMZG Bit 0: GMMZB instead of RSH[4:0] 0x09 Bit 7-6: MCNTSET[1:0] instead of nothing Bit 5-4: CLKSET[1:0] Bit 3: BACKSCAN Bit 2: ENHANCE Bit 1: SHORTTG Bit 0: NWAIT instead of RSL[4:0] 0x0A Bit 0: SRAMBUG instead of CPH[4:0] (Bit 4-0) 0x0B nothing instead of CPL[4:0] (Bit 4-0) 0x0C equal (nothing) 0x0D Bit 7: CLRLNCNT instead of nothing 0x0E equal (nothing) 0x0F equal (nothing) 0x10 equal (nothing) 0x11 equal (nothing) 0x12 equal (nothing) 0x13 equal (nothing) 0x14 equal (nothing) 0x15 equal (nothing) 0x16 Bit 6: TOSHIBA instead of SELINV 0x17 equal 0x18 equal 0x19 equal 0x1A Bit 5: MANUAL3 Bit 4: MANUAL1 Bit 3: CK4INV Bit 2: CK3INV Bit 1: LINECLP instead of CKH[4:0] (Bit 4-0) 0x1B nothing instead of CKL[4:0] (Bit 4-0) 0x1C Bit 7: CK3MTGL instead of CK3SEL Bit 6: CK3MTGL instead of CK3INV Bit 5: CK1MTGL Bit 4: CKAREA Bit 3: MTLWD Bit 2-0: GGTIME[2:0] instead of TGSEL[5:0] 0x1D Bit 7: CK4LOW instead of CKMANUAL Bit 6: CK3LOW instead of TCDFAST Bit 5: CK1LOW instead of DMYPIY 0x1E equal 0x1F equal 0x20 equal 0x21 equal 0x22 equal 0x23 equal 0x24 equal 0x25 Bit 3-0: LINCNT[19:16] instead of LINCNT[17:16] (Bit 1-0) 0x26 equal 0x27 equal 0x28 Bit 7-0 "GMMWRDATA" instead of LAMPPWM[8] (Bit 0) 0x29 equal 0x2A/B RAMADDR[15:0] instead of RAMA[14:0] (This registers have different names, but I think, the meaning is the same exept for missing Bit 15 in gl646) 0x2C equal 0x2D equal 0x2E equal 0x2F equal 0x30 equal 0x31 equal 0x32 equal 0x33 equal 0x34 equal 0x35 MAXWD[19:16] instead of MAXWD[18:16] 0x36 equal 0x37 equal 0x38 equal 0x39 equal 0x3A FEWRDATA[8] instead of FEWDATA[9:8] 0x3B equal 0x3C equal 0x3D FEEDL[19:16] instead of FEEDL[17:16] 0x3E equal 0x3F equal 0x40 Bit 2: HISPDFLG Bit 1: MOTMFGL Bit 0: DATAENB instead of empty register 0x41 Bit 0: MOTORENB instead of MOTMFLG 0x42 equal 0x43 equal 0x44 equal 0x45 equal 0x46 equal 0x47 FERDATA[8] instead of FERDATA[9:8] 0x48 FEDCNT[19:16] instead of FEDCNT[17:16] 0x49 equal 0x4A equal 0x4B SCANCNT[19:16] instead of SCANCNT[17:16] 0x4C equal 0x4D equal 0x4E "GMMRDDATA" instead of LPERIODRD[15:8] 0x4F empty register instead of LPERIODRD[7:0] 0x50 equal 0x51 equal 0x52 equal 0x53 equal 0x54 equal 0x55 equal 0x56 equal 0x57 equal 0x58 equal 0x59 equal 0x5A Bit 1: ADCLKINV instead of WMSEL 0x5B GMMADDR[9:8] instead of CKFH[4:0] 0x5C GMMADDR[7:0] instead of CKFL[4:0] 0x5D HISPD[7:0] instead of CKSH[4:0] 0x5E Bit 7-5: DECSEL[2:0] Bit 4-0: STOPTIM[4:0] instead of CKSL[4:0] 0x5F FMOVDEC[7:0] instead of empty register Z1MOD and Z2MOD are 21 bit big instead of 18 bit on the gl646. In the gl841, the Z1MOD[20:16] and ZIMOD[20:16] bits are next to the other Z1MOD and Z2MOD bits. In the gl646 Z1MOD[18:16] and Z2MOD[18:16] bits are behind the GPO bits in register 0x6C. So the differences after 0x5F are enourmous. gl841 has 0x87 registers wheras gl646 has only 0x71 registers. Please read the datasheets to get the detailed differences. --------------010201010504090102010302--