Mostrando entradas con la etiqueta drivers. Mostrar todas las entradas
Mostrando entradas con la etiqueta drivers. Mostrar todas las entradas

26 de noviembre de 2011

Peleando con Gentoo y con el DNI-E (1/3)


conjuntoEntradas() {
  Peleando con Gentoo y con el DNI-E (1/3)
  Peleando con Gentoo y con el DNI-E (2/3)
  Peleando con Gentoo y con el DNI-E (3/3)
}

Introducción

Hace un par de seman...., mmm mejor casi un par de meses, motivado porque me iba a tocar emplear una parte de mi tiempo a realizar unos cuantos tramites para la pu.. AEAT, me decidí a pasarme el fin de semana mirando de conseguir hacer funcionar el DNI-E sobre mi equipo de casa, el que tengo instalado un Gentoo, y sobre el cual he escrito, en varias ocasiones, entradas en este blog.

Era algo que tenía pendiente desde que hace poco más de un año, pasé del DNI “analógico” a el nuevo DNI-E, el “digital”; no obstante son de esas cosas que se van dejando pasar hasta que un día te se antoja meterte con el tema o simplemente llega el día que te toca meterte porque lo vas a tener que utilizar.

Desde hace algún tiempo, que ya se dio soporte para usar el DNI-E sobre el sistema operativo Linux, no obstante, todos sabemos que distribuciones de Linux hay unas cuantas, aunque muchas de ellas están basadas sobre una de las populares. En el caso de Gentoo, que es con la que yo lidié, no es tan es simple como tener una paquete en el portage para instalar de manera sencilla mediante emerge, ni tampoco te puedes descargar desde la web oficial un paquete de instalación como si que encuentras para las distribuciones Ubuntu, Debian, Fedora y OpenSuSE, bueno es lo que se tiene que sufrir por haberse liado la manta a la cabeza y haber decido utilizar un Gentoo.

Finalmente la cosa me llevo un rato de un sábado y otro de un domingo, entre directos, crochetes y uppercuts.

El lector de tarjetas

Lo primero, que uno tiene que hacer es comprarse un lector, algo que ya hice bastante tiempo, enchufarlo y hacer que funcione; esto, en mi caso, tenía que ser la parte fácil, ya que el fabricante del lector que compré (C3PO) indicaba que funciona sobre Linux, no obstante como antes, se indica que lo puedes instalar directamente desde el repositorio de las clásicas distribuciones, de las que no se encuentra Gentoo, y para el resto te deja del enlace al middleware necesario para que el SO hable con la smart card a través del lector; aunque finalmente, a los de Gentoo no nos hace falta descargarlo, para luego configurarlo, compilarlo, etc..., sino que lo emergimos del portage y así nos simplificamos la vida.
Buscamos los paquetes de PCSC disponibles:

bash$ emerge -s pcsc
* sys-apps/pcsc-lite
Latest version available: 1.6.6
Latest version installed: 1.6.6
Size of files: 468 kB
Homepage: http://pcsclite.alioth.debian.org/
Description: PC/SC Architecture smartcard middleware library
License: as-is

* sys-apps/pcsc-tools
Latest version available: 1.4.17-r2
Latest version installed: 1.4.17-r2
Size of files: 110 kB
Homepage: http://ludovic.rousseau.free.fr/softwares/pcsc-tools/
Description: PC/SC Architecture smartcard tools
License: GPL-2


Vemos que hay dos paquetes, uno que es propio middle ware PCSC y otro que son herramientas para operar con este; aunque parece que las herramientas no son estrictamente necesarias, por el espacio en disco que ocupan, yo preferí instalar los dos paquetes.

Una vez hecho esto, había que probar si el sistema ya reconoce y puede interactuar con el lector, así que vamos a arrancar el servicio:

$ /etc/init.d/pcscd start
* Caching service dependencies ... [ ok ]
* Starting pcscd ...
* WARNING: -c/--chuid is deprecated and will be removed in the future, please use -u/--user instead


Arrancar, arrancó pero ya hay algo que no mola: WARNING.
Vamos a mirar un poco más en detall a que se puede deber aunque parece que así que consulté el /var/log/messages:

Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 6 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 6 in /etc/etc-update.conf: mode 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 10 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 10 in /etc/etc-update.conf: clear_term 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 13 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 13 in /etc/etc-update.conf: eu_automerg 
e 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 16 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 16 in /etc/etc-update.conf: rm_opts 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 19 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 19 in /etc/etc-update.conf: mv_opts 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 22 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 22 in /etc/etc-update.conf: cp_opts 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 25 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 25 in /etc/etc-update.conf: pager 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 38 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 38 in /etc/etc-update.conf: diff_comman 
d 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 39 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 39 in /etc/etc-update.conf: using_editor 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 43 in /etc/etc-update.conf: = 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 43 in /etc/etc-update.conf: merge_command 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 2 in /etc/shells: /bin/bash 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 3 in /etc/shells: /bin/csh 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 4 in /etc/shells: /bin/esh 
ct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 5 in /etc/shells: /bin/fish 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 6 in /etc/shells: /bin/ksh 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 7 in /etc/shells: /bin/sash 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 8 in /etc/shells: /bin/sh 
Oct  8 21:39:37 IVAN pcscd: configfile.l:225:tok_error() tok_error: invalid value line 9 in /etc/shells: /bin/tcsh 
Oct  8 21:39:37 IVAN input in flex scanner failed 
Oct  8 21:39:37 IVAN pcscd: pcscdaemon.c:655:clean_temp_files() Cannot remove /var/run/pcscd/pcscd.comm: No such file or directory

Primera impresión: “Joder, ¿que pasa?, parece que hay errores en el fichero de configuración etc-update.conf, pero que coño tiene que ver ahora este fichero; bien calma vamos a analizar un poco con más detalle los mensajes del log”.

Después de leer con más tranquilidad la salida me di cuenta que cada mensaje, viniese lo que viniese luego (/etc/etc-update.conf, /etc/shells:/bin/bash, …), todo estaba introducido por “pcsc”, así que llegué a la tanta simple conclusión, que todo el problema debía venir del fichero de configuración, por lo tanto lo abrí y encontré esto:

#!/sbin/runscript
# Copyright 1999-2010 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/sys-apps/pcsc-lite/files/pcscd-init.3,v 1.1 2010/12/04 02:08:39 flameeyes Exp $

depend() {
 need localmount
}

start() {
 if ! [ -d /var/run/pcscd ]; then
  mkdir -p /var/run/pcscd
 fi

 chgrp pcscd /var/run/pcscd
 chmod 0775 /var/run/pcscd

 ebegin "Starting pcscd"
 start-stop-daemon --start \
        --exec /usr/sbin/pcscd \
        --pidfile /var/run/pcscd/pcscd.pid \
  --chuid nobody:pcscd \
  -- ${EXTRA_OPTS}
 eend $?
}

stop() {
 ebegin "Stopping pcscd"
 start-stop-daemon --stop \
        --exec /usr/sbin/pcscd \
        --pidfile /var/run/pcscd/pcscd.pid
 eend $?
}

Primera impresión: “Y aquí que cojones debe estar mal”.
Bueno, como antes, me puse a analizar de nuevo todo la información del problema; empezando por el principio, vemos que el WARNING, ya nos decía: -c/--chuid is deprecated and will be removed in the future, please use -u/--user instead
Así que parece que la opción -c/--chuid que está para la jubilación y que hay que sustituirlo por la opción -u/--user; así que con todo esto si nos revisamos de nuevo el fichero /etc/init.d/pcscd y en el buscamos --chuid, vemos que aparece en la función start(), es decir en el arranque del servicio; dada la situación lo primero era seguir la recomendación del WARNING, por lo tanto sustituí la opción, guardé los cambios y volví a ejecutar el servicio y solo con esto el servicio se ejecutó sin queja alguna.

Ahora ya tenemos el lector funcionando en el sistema, en la siguiente entrada comentaré el asalto con la instalación de lo que es el propio driver del DNI-E.

Hasta la próxima enfermos.

6 de marzo de 2010

Instalando Marvell Yukon Ethernet Controller en Ubuntu

Después de un tiempo sin poder dedicarme a dejar bien configurado mi Netbook el cual ya compré hace algún tiempo, finalmente me he decidido dedicarle un rato, hoy mismo, para dejar funcionando la tarjeta ethernet integrada en el sistema operativo que le puse desde el primer momento que lo tuve, que es concretamente un Ubuntu 9.10 Netbook remix. Si ya sé que alguno podéis llegar a pensar que como es que no lo hice desde un primer momento, pues esto se reduce a básicamente 3 aspectos:
  1. Falta de preferencia de mi tiempo libre para dedicarle a esto.
  2. El aspecto 1 se debe a que la tarjeta Wireless Broadcom si que fue detectada en la instalación base.
  3. El aspecto 2 queda justificado por los 2 objetivos por el cual lo compré, que fueron tener menos pereza en cargar un ordenador a cuestas y para que en los momentos de mayor pasividad no me diera tanta pereza estar delante de un ordenador; este último objetivo implícitamente requiere el uso de la wireless, ya que en esos momentos es cuando necesito estar en el sofa o en la cama, por lo que los cables me sobran, además debido a esto inicialmente no me día cuenta que el sistema operativo no la había detectado.
Bueno ya no me enrollo más y paso a explicar la aventurita de instalar el driver, que me ha llevado un rato algo largo, pero como siempre a parte de ahora tener la tarjeta ethenet funcionando me ha llevado a aprender, como siempre, alguna cosa más.

Buscando el dispositivo
He empezado buscando el fabricante del dispositivo que lleva el Netbook porque aunque alguno de vosotros penséis que como es que no podía saberlo, pues básicamente se debe a que cuando compré el Netbook no miré concretamente que tarjeta ethernet llevaba.
Esto fue fácil de solucionar buscando en la Web de HP el modelo y viendo con que hardware se comercializaba; esta vez ha sido fácil ya que en el caso de la ethernet solo habían utilizado un fabricante y modelo, concretamente se trata de una Marvell Yukon Gigabit Ethernet.

Buscando el driver
Aunque parezca una parida, resulta que encontrar el driver apropiado para linux no lo ha sido tanto, por tres motivos:
  1. En los repositorios de paquestes de Ubuntu no hay o no he encontrado un driver; por lo que se jodió la instalación más fácil y rápida a la que podía optar.
  2. HP no ofrece drivers para linux para este Netbook.
  3. Resulta que los drivers te los puedes descargar de dos lugares, de SysKonnect y de Marvell, siendo distintos.
Bueno, así que me descargo los dos el SysKonnect y el de Marvell.

Analizando los drivers
Una vez descargados, que en el caso de Marvell he descagado el que indica para kernels de la versión 2.6 pero con una coletilla que pone "Fedora", les he echado un vistazo rápido y ya he visto que el de Marvell es de una versión superior, concretamente la 10.84.3.3 frente a la 10.70.1.3 de SysKonnect.

Después he leído detalladamente el README del driver de Marvell y ver que cumplía con todos los requisitos de instalación, he visto que hay dos modos de instalación, uno llamado "Modo de Instalación" y otro "Modo de Generación de Parche"; por lo que he leído más adelante en mi caso lo que quiero es instalarlo no parchear un kernel para que luego el driver quede integrado en las fuentes de este y pueda ser distribuido con este driver añadido.

Una vez ya he tenido claro el proceso de instalación he decidido echarle un ojo al README del drivers de SysKonnect y con un simple vistazo vemos que son iguales; así que dando se esta divergencia, claro está que he optado primero por probar con el de Marvell que es de versión superior.

Instalando los drivers
La primera prueba
Lo primero que he probado es lo más sencillo que uno puede hacer, que es ejecutar las instrucciones y ver si todo funciona y no se genera ningún problema.

Como el resultado no ha sido satisfactorio, he hecho lo mismo con de SysKonnect y el resultado ha sido el mismo, así que va a tocar mirar los errores generados.

Chequeando los errores
En ese momento he empezado a mirar si los errores eran parecidos en un driver y en el otro y efectivamente lo eran así que me quedo con el Marvell definitivamente, ya que es de versión superior como ya he comentado anteriormente.

El primer error que me ha aparecido al lanzar la instalación

$ sudo ./install.sh

parecía que era un problema del código del script de instalación, pero después de buscar un poco google, he encontrado en un post, que se soluciona fácilmente cambiando el intérprete de comandos indicado en el script de "#!bin/sh" a "#!bin/bash" y el error que daba de que la sintaxis era incorrecta para un "(" después de la declaración de la primera función del fichero "functions", incluido con los ficheros de instalación, se solucionaba.

Una vez solucionado este pequeño mal entendido he vuelto a ejecutar la instalación y me he encontrado con un error que indicaba que no encontraba las fuentes del kernel, ya que lo que va a hacer es recompilar el driver para el kernel que se esté usando. He empezado mirando el synaptics y he visto que si tenía instalado las fuentes del kernel (los headers) así que algo pasa que no los encuentra.
A raíz de eso, he mirado un poco más específicamente y he visto que lo que necesita es generar un link en /usr/src llamado linux que apunté a los headers del kernel que estas corriendo, por lo que manos a la obra:

$ sudo ln -s /usr/src/linux-headers-2.6.31.19 /usr/src/linux

Después de esto, volvemos a probar y el resultado es que nada que continua fallando, indicando que o que las fuentes están corruptas o que no coinciden con la versión del kernel que se está ejecutando, así que ejecuto el siguiente comando para ver que versión estoy ejecutando y poder comparar a que versión de las fuentes he creado el link

$ uname -r
2.6.31-19-generic

Así que la he cagado de dos posibilidades que habían (ya sabía que estaba utilizando la 2.6.31-19, por lo que los headers de versiones anteriores los había descartado), he linkado con la que no era ,así que he cambiado el link

$ sudo rm /usr/src/linux
$ sudo ln -s /usr/src/linux-headers-2.6.31.19-generic /usr/src/linux

De nuevo he vuelto a ejecutar y otro vez ha fallado, viendo que estaba sucediendo he visto que ahora lo que no ecuentra es las fuentes del kernel pero esta vez accediendo desde "/lib/modules/2.6.31-19-generic/source", así que viendo que hay en ese directorio, veo que "source" no existe y ¿porque no?, pues no lo sabía pero después de ver que haya en ese directorio he visto que había un link llamado "build" que apuntaba a "/usr/src/linux-headers-2.6.31-19-generic", así que he decidido probar de linkar "source" al mismo lugar

$ sudo ln -s /usr/src/linux-headers-2.6.31.19-generic /lib/modules/2.6.31-19-generic/source

Y de nuevo he vuelto a probar y esta vez sí, se ha compilado, instalado y cargado el módulo en el kernel.

Conclusiones
Con todo esto he aprendido a que tampoco están difícil compilar e instalar un dirver para linux si el script esta bien hecho, solo tienes que tener un compilador (lo más habitual es el gcc), las fuentes del kernel que estas ejecutando y los links correctos a los directorios donde se encuentran las fuentes.
Por cierto el módulo se llama sk98lin, por si alguien en algún momento se necesita descargarlo o cargarlo manualmente.

Hasta la próxima enfermos.