lunes, 5 de febrero de 2007

Instalando el lector de tarjetas inteligentes LTC31 en Ubuntu linux

Quiero instalar un lector de tarjetas inteligentes LTC31 en cuya caja se afirma que es compatible con Linux (sin más). Existen dos versiones de éste lector, yo tengo la más antigua (se supone que con la nueva no hay que hacer todo lo que cuento a continuación).

Siguiendo las instrucciones de instalación para linux me encuentro que sólo funciona para kernels 2.4; si tienes un 2.6 tienes que aplicar un parche al código del kernel y recompilarlo. Ya empezamos.

El parche hay que solicitárselo al departamento técnico. Yo ya lo he solicitado, pero no se han puesto en contacto conmigo ni para decirme que habían recibido mi solicitud. Buscando por ahí me he encontrado el parche para la versión 2.6.11 pero yo tengo la 2.6.17 (y subiendo). Al intentar aplicar el parche, cómo no, me sale un error.

El siguiente paso fué intentar aplicar el parche manualmente. El fichero a editar era drivers/usb/host/uhci-hcd.c y tras mucho buscar no encontré dónde aplicar el parche. Al final lo encontré, en otro fichero: drivers/usb/host/uhci-q.c. Supongo que el fichero uhci-hcd.c ha sido divido dos o más partes, y éste trozo de código ha acabado en éste fichero.

El código que hay que cambiar es éste:
/* Can't have low-speed bulk transfers */
if (urb->dev->speed == USB_SPEED_LOW)
return -EINVAL;

por éste otro:
ret = uhci_submit_common(uhci, urb, eurb, uhci->skel_bulk_qh);
if (ret == -EINPROGRESS)
uhci_inc_fsbr(uhci, urb);
Por supuesto, ésto lo he visto en el parche para la 2.6.11. Ahora toca recompilar el kernel y probar... ERROR. No podía ser tan fácil. Tras toquetear un poco la función la dejé así:
int ret;

/* Inicio parche LTC31 */
qh->skel = uhci->skel_bulk_qh;
ret = uhci_submit_common(uhci, urb, qh);
if (ret == -EINPROGRESS)
uhci_inc_fsbr(uhci, urb);
/* Fin parche LTC31 */

//qh->skel = uhci->skel_bulk_qh;
// ret = uhci_submit_common(uhci, urb, qh);
if (ret == 0)
uhci_inc_fsbr(uhci, urb);
return ret;
y... ¡me ha compilado! Ahora a ver si funciona.

Pues va a ser que si. Al elegir en el Grub arrancar con el kernel recién generado ha funcionado el lector de tarjetas.

No hay comentarios: