jueves, 5 de enero de 2006

Epson CX-1500 bajo Linux.

En esta misma pagina escribí que habia un asunto que estaba por tomar en mis propias manos: El scanner de la multifuncional Epson CX-1500.

Al final no he tocado una linea de codigo C. (Y sigo manteniendo mi promesa lalalala!!!! XD (Sorry xspyder...).

Sin embargo, con "un poco de ayuda" de Oliver Schwartz (mas adelante sabrán por qué lo dejo entre comillas) el scanner esta comenzando a producir algo como esto:



Desde luego no es optimo aún, pero agregar soporte a un scanner no es precisamente un juego de niños, claro que tampoco es taaaaannnnn complicado.

Desde luego tenía toda la intención de hacer el driver (y lo hubiera hecho), sin embargo para hacerlo, me baje el codigo fuente de las backends de SANE, y con un USB sniffer me puse a analizar los comandos envíados por el driver al scanner, y me puse a buzear en los drivers, para ver si había alguno que tuviera los comandos que, al menos me permitiera averiguar para que cosa sirve el comando X... Por ejemplo, un comando enviado al scanner, es reportado por el Sniffer como:

URB Header (length: 72)
SequenceNumber: 5
Function: 0009 (BULK_OR_INTERRUPT_TRANSFER)
TransferFlags: 0x00000002
TransferBuffer: 0x00000006 (6) length
0000: 12 00 00 00 78 00

En un principio ocupe un sniffer que solo me daba raws... de ahí obtuve 4.1 Gb de datos... posteriormente limpiando un poco obtive unos comandos, pero mucho esfuerzo para lo que se necesitaba. Finalmente tras encontar el software adecuado, se obtenía lo que aparece arriba...

Perfecto, pero ... ¿¿Que es lo que realmente sirve ahi??

12 00 00 00 78 00

Corresponde a un comando envíado al scanner (en hexadecimal) , particularmente el comando INQUIRY, que consulta al scanner su estado. ¿¿Como f***ing supe eso??

Bueno... hay que partir buscando valores hexadecimales en los backends de SANE... tugar tugar salir a buscar... Como uso una maquina dual, decidí configurar un entorno de programacion/compilación en ambos sistemas... bajo Linux no es ningún drama... hay mucho donde elegir... Bajo windows la cosa cambia... Sin embargo Dev-C++ no es malo para lo que se necesita... aunque aun esta en beta y depende de MinGW... no es lo más óptimo, pero es razonablemente cómodo para mi XD.

Unos cuantos dias después, me tope con esto:

/* SCSI commands */

#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

En uno de los archivos del driver snapscan.... aqui solo dí un ejemplo de comando... buscando varios comandos vi que eran los mismos, asi que, BINGO. Encontre un driver armado y listo. Aparte tenia cierta identificación de los comandos... Genial. (Para los que no sepan que demonios es eso, es una serie de definiciones de variables estáticas (contraproducente, pero asi se denominan), que se usan para definir un valor fijo que no cambiara en el transcurso del programa. De mas esta decir que el lenguaje usado es C.

Pero como se trata de Epson y de Linux, la cosa no iba a resultar tan sencillo.

Como buen pseudo científico que me creo (mas tirando a maestro chasquilla, pero bueee.. al menos mi educación computacional formal sirve para algo), me las arregle para hacer que el driver snapscan aceptara el scanner como un "snapscan genérico" y el escaneo en color funciono y me dio una linda imagen... en verde. (Kodak cambiooooo eeel veeerrrrdeeeeeee... )

Con esto a la mano me inscribí en el mailing list de SANE y pregunté si habia alguien desarrollando algún driver para la multifuncional en cuestión, y tambien hice presente que si no lo había, al menos iba a hacer el intento de programar un driver... mal que mal , tenía un buen esqueleto con el cual partír, la documentación de SANE, y aún tengo mi base de C... Desde luego, como el que avisa no traiciona, indique que las instrucciones obtenidas por el USB sniffer, eran las mismas que las que obtenía en el driver snapscan y que en todo caso, solo obtenía una imagen verde... 256 tonos de verde...

Como respuesta me pidieron que hiciera unas pruebas, y que hiciera el intento de obtener el chipset del scanner... Considerando que aún esta en garantía y el lindo sticker que tiene es bastante gay para dejar que lo despegue de la forma antigua, no lo hice... sin embargo se confirmo que el driver snapscan podría ser compatible, y apareció en escena el Sr Schwartz, actual desarrollador y mantenedor del backend snapscan.

Unos cuantos logs, y modificaciones para agregar "como corresponde" el soporte al scanner y tenemos los primeros resultados mostrados. Gracias a la intervencion del Sr. Schwartz, que en realidad hizo el trabajo.

Personalmente habría sido dificil para mi al final agregar correctamente el soporte para el scanner, puesto que lo que realmente hubiese hecho, es intentar imitar el comportamiento del driver de windows en un backend SANE, para obtener lo que se necesita. Sin embargo, esto es considerado "feo" (ugly) para los desarrolladores de SANE, y francamente, despues que el Sr. Schwartz me facilitara la documentación provista por AGFA para los desarrolladores de los comandos internos de los modelos snapscan y las especificaciones SCSI II, les encuentro toda la razón...

Es mejor hacer las cosas bien hechas. Y en este caso en particular resulté bastante beneficiado con el resultado, aunque aún estamos lejos de terminar con el tema (para tener soporte completo, se deben tener los modos color, B/N, lineal, y halftone totalmente controlados), esto me tiene bastante entusiasmado... que quieren que les diga.

Y después de todo... Sigo manteniendo mi promesa XD.

Ojala no tengan muchas pesadillas esta noche muahahahahahahahahaha

J.
Y a la final el Dev-C++ me sirvió para puro Buscar/pegar... Es como dicen... Un software que cumple con la medida de su creación... ciertamente!

4 comentarios:

Anónimo dijo...

¡Notable!
Conocimiento compartido involucra avances y este es un ejemplo. Sin embargo, la iniciativa es la que más tiempo toma configurarse, por que de uno u otro modo, si no nos afecta no hay un paso inicial, por lo general.

Felicitaciones y suerte en el soporte completo del scanner.

Soul Lost dijo...

Excelente amigo!

Animo, que es todo lo que te puedo ofrecer en estos momento (buscando por google me topé con esto xD).

Ahora es cuando más ganas me dan por seguir leyendo ese libro de programación en unix :$

Saludos!!

J. dijo...

De hecho el driver esta completo, la ultima version CVS de SANE cuenta con soporte para la CX-1500... Sin embargo es necesario deshabilitar el modulo usblp, ya que por ahora produce problemas con las multifuncionales (y según se ve, eso no lo van a arreglar por ahora...)

Saludos

J.

Soul Lost dijo...

Hola!

Hice un minihowto a partir de que encontre esto en tu blog..

url: http://foros.hackerss.com/index.php?showtopic=2152