CD001UTF8 9CD HH )*"((k ;9VOLUMESET 9PUBLISHER DUMP9660 DUMP9660 2007091800285900200709180028590000000000000000000000000000000000CD00122222xxx"xt"x"xt x"xt x"x"x"yKIF!T4I\n !'-39>CHMRVZ^bfjmqtwz}yx q@.W|):JYgt #'*.259E:zqQ|ulcXL?/ |P9">7110/-)$e1>RwgVF6%|vqmigedc|ziXF3 rS3vJZ(qK) ~{xurokWB+{U+[+buopjB.(}zwspmifbL4uJikF|yvrolhd`\N4b0s P(bk25mmcccbbaaa``__^^]\[[ZYXWVTSRPOMKJHFCA?<:741.+'#  seWG6$rN&G%Ku`G)iEy''&$ TLoy|p]CZaMO Op#NpI*? QpPpISpRpIIxt xoBj05 u;u?"K%tKJ5sJ0e"x4pKuJoxPuKuJPxvpKoJPuKuJP0x$x"0eRI%aIH5`Hx4I%aIH5`Hx4I%tIH5sHx4pIuHoxPAuIuHPxv5I%aIH5`HI%aIH5`HI%tIH5sHpIoHPuIuHP0w$w"0eRK%aKJ5`Jx4K%tKJ5sJx4pKuJoxP uKuJPxvK%aKJ5`Jx45K%aKJ5`JK%tKJ5sJpKoJPuKuJPK%aKJ5`J0x$x"0eRM%tML5sLx4pMuLoxP uMuLPxvM%aML5`Lx4M%aML5`Lx45M%tML5sLpMoLPuMuLPM%aML5`LM%aML5`L0y$y"bТllҴ0 ER0 ? < 0$ 0)  0)SЂЃx  x7 0  0$ 0)  0)SЂЃxs H0 0xx! 0xx! u  55r0ss  0"+h(hp#"䓣ʅЂЃtt20"+h(hp#"䓣ʅЂЃ n  Gtt2ÔP0 Вl2 J70o470,xxt xE77o077xJtZt2Вl2uu 0M! H GВl2 !Y0[xц[0u x͆xΆ +#0L K0C0BEL P0OPtt2tt2Вl" Q'0[xцxφ[0u x͆xΆtWt2uux߆x"# S R4UTRxԆx҆xӆlkuЂЃ 0GZMSRG0J:dpj%EEi5DDEnDm@*DE& dp j%CCi5BBCnBm@BC "xކ033N 0.xІG[Вl" -J ,!"+[u RRR ) u Nuu ) NЂЃ  GRRx݆xۆx܆ЂЃ 0KMG- K C %+POf+0,0LEf0, +,PO[f!,xxzt Ntt0)t x&x& ) N.ЂЃfzxxt2 Nt&t0)tx&x&t0)t03x&x60(OPВl"'OYNXQYPXSYRXE^0E MK K? C<000 0% OYwNXr: QYhPXc SY\RXWHM,0%CWu0)u0u0N-x K CxvRx׆xՆxֆЂЃ R!+u )0L K P04> OpNp? QpPp׀SpRp B0 ! %M).0 .0% )xv=L-t Nt 0)t 0(@u(uØx؆xنЂЃ@0B=xÔ@50 OYNX@):QYPX@)SYRXP~=9<6;30  ‘u=iu OOpN? QQpPSSpRx! 000I B0 4Ixt xo0 > X1OcNb@&X"? YQcPb@Y ScRb@Z00X0Z0YCВl"04>H?4?_4)9΅>4fpepdpBD0% )x  9$90 L(9 QPO%QN5P%S5Rxx@3 L00Y%YX5X%Y5XXYÚ@( I xt xoВlJ"OONfafe`ePdxxt xaxt x`xQpPpI"QQPfafe`ePdxxt xtxt xsxSpRpI"SSRftfesePdxxt xaxt x`xOpNpI"QQPftfesePdxxt xtxt xsxQpPpI"xxtx8xtxxtxxxtxxxtxxxtxx8Ô @>xtxxxtxxxt xE77077xtxxxtxxtx xtxx"0' 0ex##T D##EoxxIxH?:0ex##T D##EoxxKxJ0ex##T D##EoxxMxL"  u 7HD" 2^: u 30ju 20` u 30@u 30@u 6 ` @  xu 70:H:j%EED5iDEnDm@DE@aA u 60ju 40` u 70@u 50@u 5 ` @  xu 7 AHAj%GGi5FFGnFm@dFG\ u 50ju 10` u 10@u 30@u 3 ` @  xu 70* H j%CCi5BBCnBm@BC"0 xv= =xÔ@ (xv=Xx $$ux椬Ô@ xÔP3x@ 3NN" NExǹ("xІxux( xІxux(ØPØ" xx! xx!  5t)t2xff 0  0$ 0)  0)SЂЃxs0 e` xx! xx! 0ss _!0"+h(hp#"䓣ʅЂЃu  5tt20 G D 0$ 0)  0)SЂЃx  _ !0"+h(hp#"䓣ʅЂЃ - J70o470,xxt xE77o077xJtZt2Вl20FFuuE!SQВl20!2 _ ,u  0_0Qx߆x"#Q^ *UT!^Вl2tt2 R` &8x0UT xDTU )ȀdP&uU0)uUURuU0)uUx0)ЂЃU0j!"z |*_^Вl""lҴx{k0ex{kx"l´xz- zxzj zlҴ" xDlҴxl´tulҴl´t ulҴxl´uu eelҴЃЂ"zZ "  yx yx yx yx`  "lҴҐ "lҴ ""­: 0)uuGukZulZ 'uu0Buuuklull03uuukHulHuu0uuuklull0 uuuklullͅu 7uҭ"x͆xΆ"”•񒕲򒕲󒕲••••璕撕咕䒕㒕⒕ᒕҔ"”•񒕲򒕲󒕲••••ᒕ⒕㒕䒕咕撕璕Ҕ"”󒕲򒕲񒕲𒕲璕撕咕䒕㒕⒕ᒕҔ"x"xtCxtxtCxtxtDxtxtCxt "xtCxtxtCxtxtDxtxtCxt "xtCxtxtCxtxtDxt8" ;   :0j m 8 *t ttt:xxtCxt "5 u=iuxt xE77077xtxl´lҴxtx xtx"?p56l´lҴxxtCxt "j"xu56pj"ql´?w?i?xഀ:@  :AlҴY" xu56pj"g{p|?} 䓣𣬃ЂЃ?i?w?xY"xu56`?pql´?plҴxj"l´@qlҴj0k"xu56pj"ql´??j??i??k?:; /&u0  ?llҴEl´?0T???g?u ?L0?糒泒0峒%lҴ j j-0Url´t?f?elҴ u=u< u;+ (il´t?f?elҴ u=u< u;jkn`l´?  ?xxxxlҴaFӹU֯l´?glҴT upuoup0euuuououpuo1Y|x¦xæ0 n0 ܔl´?glҴ0ܔ?A"l´?p|@{6𣬃ЂЃ?xxlҴ"l´?zghijlҴ"l´?%1W0]8V0j t%WWt5VV?Z[?\]?^_lҴ"xu56pj"@|?{p6l´𣬃ЂЃlҴY"xˆ5x6x洇¯xy0 uu8xT)x|H{|D{ |H{|L{ƀ(>l´PxPxlҴ Y"P56&``2xt xE77077|xtxl´lҴ`>xt xE77077xtxl´lҴxtx xtx""l´x P|}A!P|}AP@|}BP|}CP|}AK#P|}AK|}BK|}CKlҴ""l´~ccccЂЃ$lҴ"l´xT#Pz𣬃ЂЃPzy𣬃ЂЃlҴ":0u Puu:P0cuu wuu*W%V5Õ10]\]` {zl´𣅃ЂЃlҴ0""xu56pj"Y"l´?pu ?rt?stx?tx?vx?wx?xt?y?z?{lҴ"x00{j"8fS8<S;<"09xx` :mxx9j"09 xxp99j"j0*9u9)|!0?+?0 0jnܔ4 *4 k0nܔ u9:)|! ( ?k0nܔ4 *4:‘"/ 8n 8<;<0;qj"   % , ;   ; l´@rxxxx8Ô @xxxlҴ2"8Ô @x698(xxdxexfx6"~P`z zzڊ"xu566pj" ;0< ;miG 0j40m1\i6pRxx6Rx0 0j0mDmx6G08 u9~iq0 PKi6pm 0 :;<= u~`:@ tx6~tx6x6t x66`x6xtCxt"ЂЃ8j"~䓣x6""IAGFA SNAPSCAN 1212U_2x6px䓣0;t;x66`n~䓣x66``~䓣66`Ot x66`)~x66`0`x66` ax66`(|a`33x66`x66`0-au`u,x66`x66``x66`ax66`xx66`xx66`}tx66`rtXx66`gx66`]xx66`Qt t0t0 t t0tx66`-t t0t0 t t0tx66` 9~ $Њx66`x66`~x66`~ x66`~䓣x66`x6xtCxt"jЂЃ"—uSuuuuuu ulҴe .02ri q-"! {6: xx/54#u <@>u98 KL+,-EFBCJ*7Q)(]u`uaxvu u:uAu: 2:@xvZxvTxvZxvTxvZxvTuguhXxftXxgtxhtXxit0c u1OuVuWO u1RuVuWRx"Wx#Vu]uau\u`W%]V5\x$ukHkuP09;1?A%GRUVWXYZTHIDMNOPS&z jknmhx?tu 'uu=u< u; uzu{u|^_uu|xxvx¦xæʐ?Ltl´lҴu7o"lҴxtxx tx!x"tBx#tx$tx%txt0dxx'txtx5tx90ct' 0dt'tx6tx7t x8tx:tlx;tx0ctl 0dtltxtDtx`xdtxetxgtxftXxt0extxtxtPxtxtxtxtPxtxtxtxtxtxtxtxt*xjt xktxtxtDxtxtHxtxtLxtxtxtxtxtx@txAtxtxt,xt,y0cUxBt3Ҕuut2ut)u tu tu tututut"0dexBt3Ҕuut'zutzutzutzu tzu tzu tzutzutzu tzutz"xBtA3Ҕuu tututut}~|"0{HxʆdefpfT?ppdp epfpcpbpx0 0HBCLKDIXYZ07IPOQuOuNuQuPuSuR0XYuۤXY0% YYXxu ) uuwuxuy:0u juuЊ AuGuF njGmiFM0e7p$u4o4Tt##HxxxxtxtPHBxtxtPxp$xo4UVW *uKuJP0exvl´?glҴ0|K%tKJ5sJnuIuHP0exvI%aKH5`J0ex4xK%aMJ5`L0ex4xl´?glҴ0$M%tIL5sHI%aKH5`JK%aMJ5`L t_sRal`pa_`Ral`p>4>4xt֊TU 7uu0)uu 0uu"0(#(ukdu0)/ukZuFukut0)ukZuxx(=3xvxvxvuV07uVuWMR-,.[F0S07B7 K90B0D&p xtCxt YD05 u;ux x߆a xaH0{Yj"xxzڊ|}X`az ڊccxxxv˭cc |ŋňqxx߆}xp0"xxv~zdڊxކۤl´?glҴ  nkÔd@e 0P^'0j%PPM7PG b(P> P5$x†cxÆcڊ|}d@xcxcxv}{x$c4udۤňxކ`Z ~ T0 u!uÔ`p=u0t%t4xކ  ~ ~~Ý`qxxÖ}xpcx܆`W ~ Q0uÔ`p=u!0t%t7xކ  ~ ~~Ý`qxxpeqxކ`W ~ Q0u!Ô`p=u!0t%t7xކ  ~ ~~Ý`q@|x݆xކxx߆xÝ$|xۆx܆ Ý@Ô @u 0uux椬 %xxxІt$0tHx0)xvxvFxt xvxvxv@rN0)xÔ@%xvxv@xvxІt 0tx xvxvxvxvxvxvxvxvxvxvxvxvxvxvN0)%Q 'xvxv6xvxvxvDxvxvxvxvxvxv6xvxvxvDxvxvxvxvQ 'xvxvxv xvxvxv xvxvjxvxvxvxv xvxvxv xvxvjxvQ 'xvxvxv xvxvxv xvxvxvxvxvxv xvxvxv xvxvxv 'xvxvxvxvxvnxv xvxvxvxvxvxvxvxvnxv xvxvxv"xvxvxtxvxvxtxv*xvxvxtxvxvxtxvxvxt *xvxv&xtxvxvxtxvxvxt*xvxvxtxvxvuz,0}xxu}xuuzTx`zTzTzT:dxtxtx0y ttttH0cxuxu N0dxu zxT>uz,0~xxu~xuu{Tx`{T{T{Txtxt*x0y ttttL0cxuxu N0dxu zxT>uz,0xxuxuu|Tx`|T|T|T" a`au`u,0%04def@0 zڊxݦxަxͽxfxexd@xxxx xXxY  ypy#yptyܗ@ywxuÕx"BCfÕafe`ePd0A'ccb0fØfeePdcpbpCfp epdpB"lҴxTDxtxtB ;x! sRt_xt xo0{x! xx 70xt xE7777o C% B(xtHp xtCxt Y"xtHp xtCxt YccbcpbpC"u6u5 ?*NxɆO?ґ80)CN)yO! _J 0 0: !!0Aޅ ޅ:fp epdpOOs !p xtCxt DOpJy? j4YD! _uux!0xA !!!uuNT`SN)N0DYDJA"lҴB6_5Rxtxt xo0{x! xx 70xt xE7777oxtf6fe5ePd" juut 0t@O! u 0u$"dp epfp"f6e5"  yzuEuD"x  )e0ZQ ) M0Et0t03z~ѝBCt0t03z~ѝȎDEÚіt0t03z~ѝBCt0t03z~ѝȎDEÚіt0t03z~ѝBCt0t03z~ѝȎDEÚі"uxϺß/xu`"ijڊznmP ccp  pp"xu0)u N$ $$˛P  ) HPXP(xxxxxx0(" l´?glҴ0l´P0%a5`%a5`xxxxxx1]z{|ЊBCDEFGxxxxxxtFz{|lҴ"l´?lt?jt?kt?it?mt?ntuwuxuy>xvxvxvXq(= u u:uAu: 2:@0extxtxtPxtxtxtxtPxtxtlҴ"]\ghڟ|}X@ y}`a  {a`}~Xڟgh@\]" j0 H0D0H0L00Gl´?itlҴ A|H{Ԑ"A|D{ԐB|H{ԐC|L{Ԑ"l´z}~%5ÙPp` %5傝僞傛僜pttЂЃڄlҴЂЃK"l´zydlҴ"xftXxgtxhhxigjÔYi@uu0տu00jei@uտ~Xij  `u@ Puu   tjtiPt2jtiP )uu|~X0~mnx"l´?LlҴcub^_ijڟ`{|}X@%cc5bbij}~l0j}~h[Z ڟ|}X@cbPbc0 ЊP%ccb4bcpbpucxbxc"u00a0uT`d0"0@0  )x30+ )(x u u:uAu: 2:@:>A? _u u:uAu:A2 @A> ?:_@"a%0t`4s0`azڊ%04st0e^puPo@XYXYst0ڟ$p4Pu4o0 XYzڊXYppuuooKpoPXYXYst0ڟ$p4Po0 XYzڊXYppoo"stXY0`azڊ%04XYڟxxx"lҴ0A :# juu))x$x4uۤ`TUuuu_!  !uU uT!  ! 0p33В)0jB% ? "U0u"lҴx " u=iubx>cx>d0b}~?NlҴ"~zu0b|u%40b0|z0b|΀P"|0cP%P(囸$ Ü0b@10||À)F@B!0,0b@ ||À#@`0b |T`Td`"0b`` xD@0b|u x0b|}: x0b|~ x0b|"pÔP"ÔP uÕ""pdzxlҴl´?glҴ00l´?glҴ0uix0ھ 0j d xDM"txxx|@0u{P xxy: xxy xxyBß`P,Ü0 ~`v0u{ xx񆃀: xx󆃀xxBÔ@@0"xD"0jm0c 0d܂܅ttÕ@tÕ@|tۤ"xftXxgtxhtXxit0cx"tOx#tx$ttx"tRx#tx$ttxtD"xftXxgtxhtXxitx"tx#t0cx$tPtx$tStxtD"xftXxgtxhtXxit0] x"1x#t x"1x#tt%1t40]x$xtDxl´?glҴ tt"xftXxgtxhtKxit0cx"tOx#tx$ttx"tRx#tx$ttxtD"0extxtxtPHxtxtPxt x! xt"0extxtxtfHxtxtfxt x! xt"l´z xy(P zlҴ"l´z xy(P zlҴ"l´zxy}~(P -P@zlҴ"l´zxy(P zlҴ"xy` Pfl´ЂЃ*ЂЃxPWVP tWtV)WvVP tvWtV?tWtVqxy` ÚPdÔ@*ЂЃxy` PdÔ@ *ÚPdÔPЂЃx2y` Ú@@*ЂЃߐPxy` *PtDT% *lҴ"Pfl´` ЂЃ*ЂЃlҴ"txxxxo  xxA xx: xxp"xy牐P0jPz7{0jz{` ß@t%t5P333333$4P"p:xt" 0b}|хA0b|х:0b~|"~zu0b|u%4""l´ x>b>x!:x>c>xx>d>xlҴ"0j P"0{u0"l´>bx>cx>dx0b?N}~lҴ"od xv!u xv xx:xv xxxv xx0 pl´  ?f` ?e`lҴ"#BВ|В""0n 0cl´>blҴ0dx}|x0c uzzA0cl´>dlҴ0dx|x0c u||:0cl´>clҴ0dx~|x0c u{{u :"{u0j @ @u0j@C@[@/@G0b0||u0du۰!0b ||0d`uۍ0j @* @0b0||u0d"xyzlҴ0cP%P(l´{ (P zlҴ" j{| {|:{ | {| @@V PKp Հ63%P`%P%!u "0cP%P("0cP%P(Pt"xx"#Qh"$"$"lҴxt "lҴx0)uЂЃ"zZ "!!))((**""&&$$%%||llLLXXHHhhr0 |ґ4 y8~xP,‘yZ ґyZ yzZ x߸"#p:0cu1u1­td$xtd4xҭx   c50cu1Ou1Rx0cP@vP0dP@ vPp@vptx`xbstx`xb0cx$ttx$ttxtDuuuuuuTuU_!0#yz` xxQ,Bt0ØPx xxpd$d4{|@yzpxxx0b~$ P 0b ~~t`0b~xxd uU uT  ! _|­0 uzuPҭ *­0 uH}uPҭ"x$ttxyxyPl´` ÔpP 傴 b$D$8$11@u10ctOtR%11]lҴ"lҴp0 x0$dÔUdT0kU$T4u0)uۤTU`Tu0)u! uu0)u&R#ukt`ukt0)ukZu*_Q!"uuu#_­0 uzuPҭuTuUR!U`T x  !RRuTuU ! ­0 uH}uPҭx xDuTuUX uTuU~­0 uzuPҭ!U`T x0 !R!uUuT  !!uUuT  ! ­0 uH}uPҭlҴ!_|" xDʅk`u=<`ڊp`=<"ʅk=<|` p`=<"uuu#_uTuU!U`T  !uTuU!U`T  !  ᐁuTuU!U`T  !uTuU!U`T  ! "07xtxtmxtxtxtxtxtCxtxtCxtxtxtxtxtxtxtxtxtxt xtxt xtxt xtxt xtxtxt "xt xE77"xtxDT"yz xtCx  xtCxtxtCxt"yz xtCx  xtCxtxtCxt"­w"5r77"05 o37 xt xE77 xt xE77  J "77xt x 2rґ­0jxt x ҭi‘ u=u< u;j"775xtx kxtxDEx{'(x{ {"{w|{xx@&;xtxTЂЃ5"xy8yyyyyyy"T|p""y`%|䓣8 77 77`䓣xtxt"H"a 2 '@2 @  AGFA" Snapscan1212u_2Mon Jul 12 1999 19:001.32 uunulҴґuuupxvu9bHү0ҭZ# wrґ  wu=u< u; i‘uZi4-!l´t0t?f?elҴ ik­0 ulzuPҭ#B Gܔ­0 uH}uPҭ||:0 j0jr4uP0Kw|*}l` n$~ ~ ~09 rґn   /60 =90 xxxxxxn 1 %0 0jriuP ґu=u< u; u=iu 6 x 0 02 < fb 03 > 1276 04 < f9 05 < info 06 < info 07 < fb 08 > 6 x 0 90 < fb 10 > 1276 11 < f9 12 < info 13 < info 14 < fb 15 > 1276 16 < f9 17 < info 18 < info 19 < fb 20 > 17 21 < fb 22 > 6 x 0 23 < fb 24 > 1276 25 < f9 26 < info 27 < info 28 < fb 29 > 6 x 0 30 < fb 31 > 16 32 < fb 33 > 6 x 0 34 < fb 35 > 2436 36 < f8 37 > 0x36 38 < fb 39 > 6 x 0 40 < fb 41 > sa03#define TEST_UNIT_READY 0x00 #define INQUIRY 0x12 #define SEND 0x2A #define SET_WINDOW 0x24 #define SCAN 0x1B #define READ 0x28 #define REQUEST_SENSE 0x03 #define RESERVE_UNIT 0x16 #define RELEASE_UNIT 0x17 #define SEND_DIAGNOSTIC 0x1D #define GET_DATA_BUFFER_STATUS 0x34 #define SCAN_LEN 6 #define READ_LEN 10 // bla = sane_init (&blubb, auth_callback); // status = add_scsi_device (DEFAULT_DEVICE); /* compute the dither matrices */ mkDn (D4, D2, 4); mkDn (D8, D4, 8); mkDn (D16, D8, 16); /* scale the D8 matrix from 0..63 to 0..255 */ { u_char i; for (i = 0; i < 64; i++) D8[i] = (u_char) (4 * D8[i] + 2); } // bla = sane_open (dev_name, &hand); usb_sense_handler=sense_handler; usb_pss = pss; int test_unit_ready (scanner *pss) { static const char *me = "test_unit_ready"; char cmd[] = {TEST_UNIT_READY, 0, 0, 0, 0, 0}; int status; status = snapscani_usb_cmd (pss->fd, cmd, sizeof (cmd), NULL, NULL); return status; } int wait_scanner_ready (scanner *pss) { int retries; for (retries = 20; retries; retries--) { status = test_unit_ready (pss); switch (status) { case SANE_STATUS_GOOD: return status; case SANE_STATUS_DEVICE_BUSY: /* first additional sense byte contains time to wait */ int delay = pss->asi1 + 1; DBG (0, "Scanner warming up - waiting %ld seconds.\n",(long) delay); sleep (delay); break; case SANE_STATUS_IO_ERROR: /* hardware error; bail */ DBG (DL_MAJOR_ERROR, "%s: hardware error detected.\n", me); return status; case SANE_STATUS_JAMMED: case SANE_STATUS_NO_DOCS: return status; default: DBG (DL_MAJOR_ERROR,"%s: unhandled request_sense result; trying again.\n",me); break; } } return status; } status = send_diagnostic (pss); /* Download Firmware for USB scanners */ if ( (pss->pdev->bus == USB) && (pss->hwst & 0x02) ) close_scanner(pss); status = init_gamma (pss); init_options (pss); return SANE_STATUS_GOOD; bla = sane_set_io_mode (hand, 0); for (hlp = 0; hlp < 9999; hlp++) { sod = sane_get_option_descriptor (hand, hlp); if (sod == NULL) break; print out options } bla = sane_get_parameters (hand, &pars); fprintf (stderr, "Parm : stat=%s form=%d,lf=%d,bpl=%d,pixpl=%d,lin=%d,dep=%d\n", sane_strstatus (bla), pars.format, pars.last_frame, pars.bytes_per_line, pars.pixels_per_line, pars.lines, pars.depth); bla = sane_start (hand); do { bla = sane_read (hand, buffer, sizeof (buffer), &blubb); /*printf("Read : stat=%s len=%d\n",sane_strstatus (bla),blubb); */ if (bla != SANE_STATUS_GOOD) { if (bla == SANE_STATUS_EOF) break; return; } fwrite (buffer, 1, blubb, stdout); } while (1); sane_cancel (hand); fprintf (stderr, "Cancel.\n"); sane_close (hand); fprintf (stderr, "Close\n"); for (hlp = 0; hlp < 20; hlp++) fprintf (stderr, "STRS %d=%s\n", hlp, sane_strstatus (hlp)); fprintf (stderr, "Exit.\n"); }#include #include // usbfun -c `{basename `{usb/usbd; ls /dev/usb0 | grep '[0-9]$' | sort -r | sed 1q}} // 8c usbfun.c && 8l usbfun.8 && mv 8.out /usr/matt/bin/386/usbfun // Put enum { ERROR = -1, EOT = -2, WRITE_PLEASE = -3, }; long keep_reading(void); long readusb(void); uchar *buff; long buffsize = 0x10000; int fdin; int fdout; void quit (char *msg) { fprint(2, "%s\n", msg); exits(msg); } int writeusb(int i, uchar *msg) { int n; n = write(fdout, (char*)msg, i); if(n != i) quit("write error"); return n; } int sending_firmware(void) { uchar *msg; int n; msg = (uchar*)calloc(10, 1); msg[0] = 0x2A; msg[2] = 0x87; msg[7] = 0x80; msg[8] = 0x00; n = writeusb(10, msg); free(msg); return n; } int download_firmware(void) { int firmfd, firmsize, n; uchar *firmware; firmsize = 32768; firmware = (uchar*)malloc(firmsize); firmfd = open("/usr/matt/bin/usbfun/SnapScan_1212U_2.bin", OREAD); n = read(firmfd, firmware, firmsize); close(firmfd); if(n == firmsize) { print("downloading firmware\n"); n = writeusb(firmsize, firmware); free(firmware); } else { free(firmware); quit("firmware file wrong size"); } print("n %d fs %d\n", n, firmsize); if (n != firmsize || keep_reading() != EOT) quit("firmware download failed"); return n; } int test_unit_ready(void) { uchar *msg; int n; print("testing unit ready\n"); msg = (uchar*)calloc(6, 1); n = writeusb(6, msg); free(msg); if (n != 6 || keep_reading() != EOT) quit("not ready"); return n; } int inquiry(void) { uchar *msg; int n; msg = (uchar*)calloc(6, 1); msg[0] = 0x12; msg[4] = 0x76; print("inquiring\n"); n = writeusb(6, msg); free(msg); readusb(); n = (buff[0x19] == 0x31 && buff[0x1a] == 0x32); if (keep_reading() != EOT) quit("inquiry failed"); return n; } int set_window(void) { uchar *msg; int n; msg = (uchar*)calloc(0x36, 1); msg[7] = 0x2e; msg[11] = 0x4b; msg[13] = 0x4b; msg[24] = 0x13; msg[25] = 0xec; msg[28] = 0x1b; msg[29] = 0x6c; msg[30] = 0x80; msg[31] = 0x80; msg[32] = 0x80; msg[33] = 0x05; msg[34] = 0x08; msg[48] = 0x02; msg[49] = 0x01; msg[50] = 0xc0; print("setting window\n"); n = writeusb(0x36, msg); free(msg); if (n != 0x36 || keep_reading() != EOT) quit("setting window failed"); return n; } int reserve_unit(void) { uchar *msg; int n; msg = (uchar*)calloc(6, 1); msg[0] = 0x16; print("reserving unit\n"); n = writeusb(6, msg); free(msg); if (n != 6 || keep_reading() != EOT) quit("reserving unit failed"); return n; } int release_unit(void) { uchar *msg; int n; msg = (uchar*)calloc(6, 1); msg[0] = 0x17; print("releasing unit\n"); n = writeusb(6, msg); free(msg); if (n != 6 || keep_reading() != EOT) quit("releasing unit failed"); return n; } int set_window_coming(void) { uchar *msg; int n; msg = (uchar*)calloc(10, 1); msg[0] = 0x24; msg[8] = 0x36; print("set window coming\n"); n = writeusb(10, msg); free(msg); if (n != 6 || keep_reading() != EOT) quit("set window coming failed"); return n; } long readusb(void) { int n, i; memset(buff, 0, buffsize); n = read(fdin, buff, buffsize); if (n == 8) { switch (buff[0]) { case 0xfb : for(i=2; i<8; i++) if(buff[i] != 0 && i != 1) break; if (i == 8) { if(buff[1] > 0) { sleep(buff[1]); return readusb(); } return 0; } break; case 0xf9 : case 0xf8 : for(i=1; i<8; i++) if(buff[i] != 0) break; if (i == 8) return 0; break; } } return n; } void print_buff(int n) { int i, k, x, r; k = 0; while(k < n) { r = k; for(i = 0; i<16 && k < n; i++) print("%02ux ", buff[k++]); for(x = i; x < 16; x++) print(".. "); k = r; for(i = 0; i<16 && k < n; i++) { if (buff[k] >= ' ' && buff[k] <= 'z') print("%c ", buff[k]); else print(". "); k++; } r = k; print("\n"); } } long keep_reading(void) { int n; n = readusb(); if(n > 0) { // do something with the data print_buff(n); } else { switch (buff[0]) { case 0xfb : return EOT; case 0xf8 : return WRITE_PLEASE; case 0xf9 : break; default : case 0xff : return ERROR; } } return keep_reading(); } int firmware_uploaded(void) { test_unit_ready(); return inquiry(); } int do_upload(void) { sending_firmware(); download_firmware(); inquiry(); release_unit(); test_unit_ready(); } int main(int argc, char *argv[]) { int n, i; char *datafile1, *datafile2; int usbport = 0; int usbchannel = 1; ARGBEGIN { case 'u' : usbport = ARGC(); break; case 'c' : usbchannel = ARGC(); break; default : print(" badflag('%c')", ARGC()); } ARGEND; print("/dev/usb%d/%d/ep1data\n", usbport, usbchannel); sprint(datafile1, "/dev/usb%d/%d/ep1data", usbport, usbchannel); sprint(datafile2, "/dev/usb%d/%d/ep2data", usbport, usbchannel); buff = malloc(buffsize); fdin = open(datafile1, OREAD); fdout = open(datafile2, OWRITE); print("huh\m"); free(datafile1); free(datafile2); if(!firmware_uploaded()) do_upload(); test_unit_ready(); inquiry(); test_unit_ready(); reserve_unit(); test_unit_ready(); n = set_window_coming(); if (n == WRITE_PLEASE) { print("set_window\n"); set_window(); } test_unit_ready(); release_unit(); test_unit_ready(); } "((k ;"((k ;6k SnapScan_1212U_2.bin.""k  conversation,##, ,k  snapscan.c*%%k usbfun.c((