Profesional

Pues. ya entrados, con la falta de monitor, en tarjetitas empotradas el uso de la consola serial es un pan de todos los dias. Por lo menos en la maquina en la que trabajo, con el kernel que tengo compilado de no hace mucho,

LaPoWeRoSa ~ # uname -a
Linux LaPoWeRoSa 2.6.25-tuxonice-r5 #4 SMP PREEMPT Wed Aug 20 23:35:59 CDT 2008 i686 Genuine Intel(R) CPU T2050 @ 1.60GHz GenuineIntel GNU/Linux

existe un driver para los cables USB -> Serial que venden en las tiendas STEREN del tipo CH341, sin embargo, al parecer, el developer del dispositivo, solo tenia un modelo del integrado que se reconoce con un lsusb -v

...
Bus 003 Device 005: ID 1a86:7523
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 1.10
bDeviceClass 255 Vendor Specific Class
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 8
idVendor 0x1a86
idProduct 0x7523
bcdDevice 2.54
iManufacturer 0
iProduct 2 USB2.0-Ser!
iSerial 0
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2

...

(Bus Powered)

donde , al conectarse, al parecer el modulo no carga, puesto que no tiene incluido el device en la tabla de dispositivos utilizables; basta con editar el driver ( usb/drivers/341.c ) y agregar los identificadores del dispositivo, idVendor 0x1a86, idProduct 0x7523 al driver y listo! , recompilar el modulo y volver a conectar :)

static struct usb_device_id id_table [] = {
       { USB_DEVICE(0x4348, 0x5523) },
       { USB_DEVICE(0x1a86, 0x7523)},
       { },
};

 

Bueno, asi que si compran su steren y no les jala, no salgan con que "lo fui a devolver"! :P

Saludos!

rommel | LIDSOL, Software Libre, Profesional | 26 August, 11:18pm | Comment on this

En estos ultimos dos dias laborales ( viernes/lunes) tuve que realizar un driver para una tarjeta de entrada y salida digital: la OMG-PCI-DIO24 .

A pesar de que existe un modulo de kernel para esta tarjeta, no cumple con las especificaciones requeridas. Unicamente genera un conjunt de archivos en el /proc que leen/escriben directamente en los registros de la tarjeta. Esto podria ser "suficiente" si no se tratara de una tarea verdaderamente critica.

Es decir, necesitaba habilitar la interrupcion ( segun el manual de Usuario de la tarjeta, pin 47 ). Esto podria parecer sencillo/trivial. Pero resulto un poquitin mas engorroso de lo que pense.

Basicamente, el codigo existente unicamente sirvio para una cosa: Saber en que registro base ( BAR's ) se encuentra la direccion local asignada por el fabricanete para el inicio de la region de entrada y salida. Ya que en ningun manual se encuentra este dato.

Para entender un poco mejor el funcionamente del Bus PCI pueden leer : The PCI Interface del Linux Device Drivers, 2nd Edition By Alessandro Rubini & Jonathan Corbet El cual funciono perfecto para lo que estba tratando de entender. Tambien revise el buen: The Linux Kernel Development By Robert Love y por su puesto las hojas requeridas por Wikipedia, junto con los manuales de usuario presentados por Omega.

El codigo estoy depurandolo y agregando algunos #defines , para que quede lindo el modulo, mandarlo a la lista.. y pues esperar algun "feedback", mientras me quedan un par de comentarios:

En la Documentacion de Linux ( directo en el tarball ) , se encuentra el archivo pci.txt, El cual trata de dar una muy buena explicacion de como usar los recursos provistos por Linux. Sin embargo es un tanto ambiguo - o el par de horas que trabaje en esto no fueron suficientes -.

En cuanto al manejo de interrupcion, ya sea con pci_register_driver(), o bien con pci_get_device(), esta gobernado por Linux APCI. Lo cual en teoria deberia ser majestuoso, pero causa algunos conflictos al tratar de manejarlo. ( me gustaria en verdad aprender a hacerlo ) . Basicamente, como se vera en el codigo, obligue a ulizar el IRQ asignado fisicamente por la maquina, leyendo la linea de interrupcion asignada por BIOS pci_read_config_byte ( dev, PCI_INTERRUPT_LINE, &local_irq), y haciendo de este el irq pedido,

ret_status = request_irq (      local_irq,
                                         FTio_irq_handler,
                                         SA_INTERRUPT | SA_SHIRQ,
                                         DRV_NAME,
                                         &device  );
 

Las Interrucpiones compartidas, son un poco dolorosas y se necesita un control externo ( logica ) que pueda discernir entre las petciones por interrupcion. Esto tambien quiero depurarlo. Ya que a ciencia cierta, solo confio en la documentacion. ( falta por leer pci.c tal vez ) .

De ahi en fuera. Solo resta seguir aprendiendo en como manejar limpiamente estas entradas. En breve posteo el codigo. Algunos detalles tecnicos de como genrar el modulo ( es decir toda la platica de PCI ) , estara tambien en esta semana en el sitio de bitacora de LIDSOL.

Saludos!

rommel | Software Libre, Personal, Profesional | 26 August, 10:33pm | Comment on this