26 febrero 2007

Configurando el lector de tarjetas MMC

Ya va para dos años que tengo el portátil, y aún tenía algo pendiente de hacer: configurar el multilector de tarjetas. Lo intenté una vez con Sarge, pero no lo conseguí y tampoco le dí demasiada importancia. Tampoco es que lo necesite, así que lo dejé aparcado. Pero ayer (tarde de domingo y sin nada interesante que probar) me dí el "de hoy no pasa". Ahora sé (antes no había investigado mucho el tema) que cuando probé con Sarge no tenía ninguna posibilidad de conseguirlo: el módulo no se incluyó en el kernel hasta la versión 2.6.17.

Lo primero es identificar el dispositivo. Para ello tiramos de lspci:

06:06.3 Mass storage controller: Texas Instruments PCIxx21 Integrated FlashMedia Controller
06:06.4 Generic system peripheral [0805]: Texas Instruments PCI6411, PCI6421, PCI6611, PCI6621, PCI7411, PCI7421, PCI7611, PCI7621 Secure Digital (SD) Controller


Mi multilector es un Texas Instruments de un modelo que, por lo que he visto en Google, es bastante habitual encontrar. Como vemos, el kernel reconoce dos dispositivos: es lector de MMC y el de SD. Del segundo no voy a hablar, ya que para ello es necesario el módulo tifm, que no viene incluído en los kernels oficiales. Quizá algún día escriba sobre el tema.

El módulo necesario, el sdhci, está disponible a partir de la versión 2.6.17 del kernel Linux, así que un Sarge con kernel oficial de Debian no puede manejarlo (Sarge tiene un 2.6.8, si no recuerdo mal), pero en Etch ya contamos con un 2.6.18 en los repositorios, así que no hay problema. La alternativa es compilar el kernel uno mismo, recordando incluir los módulos necesarios.

Fijémonos en el identificador de dispositivo. En mi caso es 06:06.3, pero en el vuestro puede ser cualquier otro. Ejecutamos (como root) lspci -xxx | grep -A 5 06:06.3 (recordad sustituir el identificador de dispositivo por el vuestro):

06:06.3 Mass storage controller: Texas Instruments PCIxx21 Integrated FlashMedia Controller
00: 4c 10 33 80 06 01 10 02 00 00 80 01 08 80 80 00
10: 00 40 10 b0 00 00 00 00 00 00 00 00 00 00 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 3c 10 81 30
30: 00 00 00 00 44 00 00 00 00 00 00 00 0a 01 07 04
40: 00 00 00 00 01 00 02 7e 00 00 00 00 00 00 00 00


Ese es el resultado que obtengo yo. Fijaos en la línea que empieza por "40:" (la última), en el valor de casilla que hay bajo el "0a". En mi caso es 00, pero, por lo que he visto por ahí, puede tener un valor de 40 o de 60 también. En cualquier caso, tenemos que cambiar el segundo 0 por un 2 (si es 40, debe quedar como 42, si 60, 62; en mi caso debe quedar como 02). Si alguien quiere saber por qué, que lo investigue y luego me lo cuente, porque no tengo ni idea. El caso es que funciona. Para conseguirlo ejecutamos el siguiente comando:

setpci -s 06:06.3 4c.b=02

De nuevo recordaros sustituir el 06:06.3 por el identificador del dispositivo en vuestro caso particular, y el 02 por lo que corresponda. Si volvemos a ejecutar el lspci -xxx | grep -A 5 06:06.3 veremos que ahora devuelve lo correcto:

06:06.3 Mass storage controller: Texas Instruments PCIxx21 Integrated FlashMedia Controller
00: 4c 10 33 80 06 01 10 02 00 00 80 01 08 80 80 00
10: 00 40 10 b0 00 00 00 00 00 00 00 00 00 00 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 3c 10 81 30
30: 00 00 00 00 44 00 00 00 00 00 00 00 0a 01 07 04
40: 00 00 00 00 01 00 02 7e 00 00 00 00 02 00 00 00


Bien, pues ya está todo listo: cargamos los módulos necesarios con modprobe (hay que cargar los módulos sg, sd_mod, mmc_core, mmc_block y sdhci), y veremos algo así:

sdhci: Secure Digital Host Controller Interface driver, 0.12
sdhci: Copyright(c) Pierre Ossman
sdhci: SDHCI controller found at 0000:06:06.4 [104c:8034] (rev 0)
ACPI: PCI Interrupt 0000:06:06.4[A] -> GSI 22 (level, low) -> IRQ 177
mmc0: SDHCI at 0xb0109000 irq 177 DMA
mmc1: SDHCI at 0xb0108c00 irq 177 DMA
mmc2: SDHCI at 0xb0108800 irq 177 DMA


Ya podemos insertar la tarjeta MMC. El led parpadea y (si teneis bien configurado el automount) Konqueror nos abre una instancia con el contenido de la tarjeta. Podeis también acceder a su contenido a través del directorio /media/MMC. Me encanta :D

Una cosa más. Debemos asegurarnos de que en arranques sucesivos todo esté como lo hemos dejado. Para ello editamos el archivo /etc/modules para incluir los módulos que hemos cargado, de forma que se vuelvan a cargar en cada arranque del sistema. Por último, editamos el /etc/rc.local y añadimos, antes de exit 0, el comando setpci -s 06:06.3 4c.b=02. Y listo. Por fin puedo usar el lector de MMC que tengo de adorno desde hace casi dos años :D

Una última recomendación: una tarjeta MMC es un dispositivo de almacenamiento como cualquier otro. Cuando hagais un intercambio de datos con el dispositivo recordad hacer un sync y desmontarlo antes de sacarla del lector, si no quereis perder datos. Que aproveche.

No hay comentarios: