Linux y programación
Noticias, dudas y soluciones de Linux y programación

El tiempo en Badajoz

Sugerencias:

Esta bitácora fue creada por linuxcpp el día 24-09-06. Se han publicado 101 historias y 136 comentarios.


Foto del creador
Nombre: linuxcpp
Descripción: José Ramón Rubio
Localidad: Caceres
E-mail

Llamame con Gizmo

¿Qué le parece la nueva distribución gnuLinex 2006?
Excelente
Muy buena
Buena
Normal
Mala
Pésima

Ver resultados
Ver comentarios

    <<  Septiembre 2008  >>
    DomLunMarMieJueVieSab
     123456
    78910111213
    14151617181920
    21222324252627
    282930    

Powered by eXtreblog  Use OpenOffice.org Add to Technorati Favorites  Bitacoras.com


Free Software Top
gnuLinEx 2006: de SARGE A ETCH: Última actualización: 12/01/2008

Lector tarjetas Linux
Autor: linuxcpp _ URL _ Tb () _ Categorias: LINUX- Driver

LECTOR DE TARJETAS SD/MMC/...
EN LINUX



  Voy a comentaros alguno de los problemas que pueden apareceros al intentar usar los lectores de tarjetas SD/MMC...
 
  En particular me he centrado en pruebas con lectores internos en portátiles, y las pruebas las he realizado sobre un sistema operativo gnuLinEx 2006; pero no con ello quiero decir que mis explicaciones no vayan a funcionar en otros sistemas operativos, ya que me he documentado en numerosos foros donde se tratan otros sistemas operativos tales como Ubuntu o Suse.

  En primer lugar debemos conocer que tipo de chip usa nuestro lector de tarjetas integrado. Ello se puede ver con el comando:
lspci | grep CardBus
 
  En principio os mostrará una única línea indicando el tipo de chip que usa. Yo voy a centrarme especialmente en la el chip "Texas Instruments", pero pueden aparecer otros tipos de chip como "ENE Technology Inc"... En mi caso el comando muestra:

0a:09.0 CardBus bridge: Texas Instruments PCIxx12 Cardbus Controller

  El resto de comentarios los realizaré sobre el chip "Texas Instruments" que es el que más he investigado. No obstante para aquellos que tengais un chip "ENE Technology Inc" os remito al siguiente enlace donde podreis encontrar información que os será de utilidad:
Configurar lector de tarjetas ENE Technology Inc


Lector de tarjetas chip "Texas Instruments":

  Hacer funcionar un lector de tarjetas con este chip es muy sencillo, bastaría con ejecutar 3 comandos y listo. Sin embargo, hay versiones del driver que tiene un bug, y que trataré más adelante para aquellos a los que le surga el problema.


Cargando el driver:

  Basta con cargar 3 módulos del kernel. En concreto los módulos: tifm_7xx1, tifm_core y tifm_sd. Para hacerlo desde una consola como root ejecutad los comandos:
modprobe tifm_7xx1
modprobe tifm_core
modprobe tifm_sd

  Con ello ya os debería funcionar el lector de tarjetas (a no ser que el bug no esté arreglado en vuestro kernel), y simplemente con introducir una tarjeta compatible en el lector ya debería ser detectada sin problemas.
  Tanto si funciona bien ahora, como si tenemos que arreglar el bug, es conveniente añadir al fichero /etc/modules las líneas:
tifm_7xx1
tifm_core
tifm_sd

  El motivo es muy sencillo. El comando modprobe carga los módulos en la sesión actual; sin embargo la próxima vez que reiniciemos el ordenador ya no estarán cargados y tendríamos que ejecutar los comandos de nuevo. Añadiendo estas lineas en este fichero conseguimos que estos módulos se carguen por defecto en el arranque del sistema, consiguiendo tener siempre operativo el lector de tarjetas.


BUG chip Texas Instruments:

  Este bug está relacionado con el kernel usado. No estoy muy enterado en que versiones de kernel puede aparecer el bug pero me parece que sucede en versiones 2.6.20 en adelante. El problema del bug es que al introducir una tarjeta en el lector, a pesar de que es detectada, entra como en un bucle detectando la tarjeta una y otra vez, y es que en verdad se están produciendo conflictos. Estos conflictos pueden verse fácilmente ejecutando el comando dmesg desde un terminal, y donde aparecerá algo como:

...
mmcblk0: error 1 sending read/write command
end_request: I/O error, dev mmcblk0, sector 249
mmcblk0: error 1 sending read/write command
end_request: I/O error, dev mmcblk0, sector 250
...


  La solución es actualizar el driver tifm a una versión superior donde ya esté solucionado el bug. Sin embargo la actualización del driver requiere compilarlo con el kernel en cuestión; es decir, igual que he explicado en otros post, tenemos que tener instalado el paquete linux-headers de nuestro kernel usado. La versión del kernel podemos conocerla usando el comando uname -r. No obstante aseguraos que teneis todo correctamente instalado ejecutando como root el comando:
  apt-get install build-essential linux-headers-`uname -r`

  Para mis pruebas he usado el fichero tifm que os podeis descargar desde aquí, y que está explicado con menos detalle y en inglés en esta noticia.
  El fichero descargado es un .tar.gz y por tanto debemos descomprimirlo usando el comando:
  tar -xvzf tifm_install.tar.gz

  La compilación es sencilla, aunque me temo que dependiendo de vuestra distribución os puede aparecer algún que otro error, porque no parece estar demasiado depurado el código fuente. Y por ello voy a intentar comentaros los posibles errores que os podrían surgir.
  Entraremos en primer lugar en el directorio descomprimido con el comando:
  cd tifm_install

  A continuación ejecutaremos el comando:
  ./install.sh

  La ejecución la realizaremos como root en un sistema como gnuLinEx aunque si usais Ubuntu donde ya tengais configurado el comando sudo, ya os pedirá la clave cuando sea necesario.
 
  •   Si al ejecutar el comando apareciera algo como:
  bash: ./install.sh: Permiso denegado
 
  Entonces debeis ejecutar previamente el comando:
  chmod +x install.sh

  •   Un posible error que os puede aparecer al ejecutar el comando./install.sh es que salga algo como:
cp: no se puede efectuar `stat" sobre «/lib/modules/2.6.21.5-1-686/kernel/drivers/misc/XXX.ko»: No existe el fichero o el directorio

  De ser así os recomiendo abrir el fichero install.sh con un editor de texto como puede ser gedit, y realizar los siguientes cambios:

  Cambiar la parte de código:


sudo mv /lib/modules/`uname -r`/kernel/drivers/misc/tifm_core.ko /lib/modules/`uname -r`/kernel/drivers/misc/tifm_core.ko-old
&&
    sudo mv /lib/modules/`uname -r`/kernel/drivers/misc/tifm_7xx1.ko /lib/modules/`uname -r`/kernel/drivers/misc/tifm_7xx1.ko-old
&&
    sudo mv /lib/modules/`uname -r`/kernel/drivers/mmc/host/tifm_sd.ko /lib/modules/`uname -r`/kernel/drivers/mmc/host/tifm_sd.ko-old
&&
sudo make &&
sudo make install &&
sudo make clean


  Por:
if [ -e /lib/modules/`uname -r`/kernel/drivers/misc/tifm_core.ko ]; then
    sudo mv /lib/modules/`uname -r`/kernel/drivers/misc/tifm_core.ko /lib/modules/`uname -r`/kernel/drivers/misc/tifm_core.ko-old
fi

if [ -e /lib/modules/`uname -r`/kernel/drivers/misc/tifm_7xx1.ko ]; then
    sudo mv /lib/modules/`uname -r`/kernel/drivers/misc/tifm_7xx1.ko /lib/modules/`uname -r`/kernel/drivers/misc/tifm_7xx1.ko-old
fi

if [ -e /lib/modules/`uname -r`/kernel/drivers/mmc/host/tifm_sd.ko ]; then
    sudo mv /lib/modules/`uname -r`/kernel/drivers/mmc/host/tifm_sd.ko /lib/modules/`uname -r`/kernel/drivers/mmc/host/tifm_sd.ko-old
fi

sudo make &&
sudo make install &&
sudo make clean
 


  •   Otro de los errores que puede aparecer mientras se ejecuta el comando ./install.sh es un listado de errores muy numerosos mientras se está ejecutando el comando make. Por lo general si os vais a la primera-segunda línea ddonde se producen los errores aparecerá algo como:
include/linux/mmc/host.h:13:28: error:
linux/mmc/core.h: No existe el fichero o el directorio

  Para solucionar este error tan sólo debemos editar el fichero ./mmc/host.h y cambiar la línea que pone:
  #include <linux/mmc/core.h>

  Por:
  #include <linux/mmc/mmc.h>

 
  •   Como último posible error que puede surgir es algo parecido a que no puede crear o no existe el directorio /lib/modules/`uname -r`/kernel/drivers/mmc/host; de ser así simplemente deberemos ejecutar el comando:
  mkdir /lib/modules/`uname -r`/kernel/drivers/mmc/host


  Supongo que ya no os aparecerán más errores, y por consiguiente que la instalación se ha realizado correctamente. Para verificar que funciona correctamente debemos ejecutar el comando modprobe de los 3 módulos que os expliqué anteriormente. Sin embargo, debemos en primer lugar descargarlos si ya los habíamos cargado. Ejecutaremos los comandos:
  rmmod tifm_sd
  rmmod tifm_7xx1
  rmmod tifm_core
  modprobe tifm_core
  modprobe tifm_7xx1
  modprobe tifm_sd

MONTAJE:
  Una vez tenemos configurado correctamente el lector de tarjetas con el chip Texas Instruments, queda una cuestión que debemos considerar, y es que puede que el montaje de la tarjeta no sea automático y debamos realizarlo a mano, ejecutando el comando:
  mount /dev/mmcblk0p1 DIRECTORIO_ELEGIDO
  Siendo DIRECTORIO_ELEGIDO cualquier directorio que nos guste, creado por ejemplo en /mnt o en /media, con el comando mkdir.


  Para cualquer duda, problema o sugerencia deja un comentario.



Comentarios (0)
MeneameMenéame Barrapunto Barrapunto Technorati Technorati Google Google Bookmarks Fresqui Fresqui Delicious del.icio.us
VOTACIÓN: Votos(Núm. votos: 3)


Escribe tu comentario


Usuario de eXtreblog (sí/no)

Nombre:

Contraseña:
?


Comentario:

Escribe el resultado de la suma:






"Linux y programación"
I would love to change the world, but they won't give me the source code