instalar lector SD/MMC flash reader usando el modulo sdhci

Para instalar dispositivos sd y mmc, sobre todo ricoh y texas instruments, hace falta el modulo sdhci que podemos encontrar en el kernel 2.6.17 en adelante; dicho modulo desarrollado por pierre hosman (http://mmc.drzeus.cx/wiki/Linux/Drivers/sdhci) permite trabajar con lectores ricoh y texas instruments aunque algunos dan mas problemas que otros:

para obtenerlo basta con tener el kernel 2.6.17 o 18 o en su defecto bajar el parche para el kernel desde la pagina web del proyecto, en el momento de compilar el kernel activamos estas opciones:

Compilar el kernel con las opciones:
mmc core (modulo)
mmc block (modulo)
mmc sdhci (modulo)

Iniciamos verificando que la controladora esta activa y funcionando:
buscamos el dispositivo:
$lspci -xxx
y buscamos nuestra controladora SD:
04:09.3 Mass storage controller: Texas Instruments PCIxx21 Integrated FlashMedia Controller
00: 4c 10 33 80 06 01 10 02 00 00 80 01 08 39 80 00
10: 00 40 00 b4 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 25 10 6a 00
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 60 00 00 00
50: 25 10 6a 00 05 01 00 00 00 00 00 00 00 00 00 00
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

tomamos el valor de device: 04:09.3

Modificamos el offset de la siguiente manera:
$setpci -s 04:09.3 4c=0x22

verificamos que ejecuto el cambio del offset (debe quedar 22 en la fila 40, columna 12):
$lspci -xxx
04:09.3 Mass storage controller: Texas Instruments PCIxx21 Integrated FlashMedia Controller
00: 4c 10 33 80 06 01 10 02 00 00 80 01 08 39 80 00
10: 00 40 00 b4 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 25 10 6a 00
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 ->22<- 00 00 00
50: 25 10 6a 00 05 01 00 00 00 00 00 00 00 00 00 00
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Hay un 22 en el lugar, todo esta correcto.
(esto es solo en mi caso, estas lectoras TI dan algunos problemas en las portatiles donde son incorporadas).

luego ejecutamos la instalacion de los modulos:

$modprobe mmc_core
$modprobe sdhci (viene en el kernel 2.6.17)

si la opcion debug esta activa en el kernel, deberiamos ver algo como esto:
$dmesg | grep sdhci
sdhci [sdhci_probe_slot()]: slot 0 at 0xb4009400, irq 185
sdhci: ============== REGISTER DUMP ==============
sdhci: Sys addr: 0x00000000 | Version:  0x00008400
sdhci: Blk size: 0x00000000 | Blk cnt:  0x00000000
sdhci: Argument: 0x00000000 | Trn mode: 0x00000000
sdhci: Present:  0x00020000 | Host ctl: 0x00000000
sdhci: Power:    0x00000000 | Blk gap:  0x00000000
sdhci: Wake-up:  0x00000000 | Clock:    0x00000002
sdhci: Timeout:  0x00000000 | Int stat: 0x00000000
sdhci: Int enab: 0x00ff00fb | Sig enab: 0x00ff00fb
sdhci: AC12 err: 0x00000000 | Slot int: 0x00000000
sdhci: Caps:     0x01821090 | Max curr: 0x00000000
sdhci: ===========================================
mmc0: clock 0Hz busmode 1 powermode 0 cs 0 Vdd 0 width 0
mmc0: clock 0Hz busmode 1 powermode 1 cs 0 Vdd 21 width 0
mmc0: SDHCI at 0xb4009400 irq 185 DMA
sdhci [sdhci_probe_slot()]: slot 1 at 0xb4009000, irq 185
sdhci: ============== REGISTER DUMP ==============
sdhci: Sys addr: 0x00000000 | Version:  0x00008400
sdhci: Blk size: 0x00000000 | Blk cnt:  0x00000000
sdhci: Argument: 0x00000000 | Trn mode: 0x00000000
sdhci: Present:  0x00020000 | Host ctl: 0x00000000
sdhci: Power:    0x00000000 | Blk gap:  0x00000000
sdhci: Wake-up:  0x00000000 | Clock:    0x00000002
sdhci: Timeout:  0x00000000 | Int stat: 0x00000000
sdhci: Int enab: 0x00ff00fb | Sig enab: 0x00ff00fb
sdhci: AC12 err: 0x00000000 | Slot int: 0x00000000
sdhci: Caps:     0x01821090 | Max curr: 0x00000000
sdhci: ===========================================
mmc1: clock 0Hz busmode 1 powermode 0 cs 0 Vdd 0 width 0
mmc1: SDHCI at 0xb4009000 irq 185 DMA
sdhci [sdhci_probe_slot()]: slot 2 at 0xb4007400, irq 185
sdhci: ============== REGISTER DUMP ==============
sdhci: Sys addr: 0x00000000 | Version:  0x00008400
sdhci: Blk size: 0x00000000 | Blk cnt:  0x00000000
sdhci: Argument: 0x00000000 | Trn mode: 0x00000000
sdhci: Present:  0x000a0000 | Host ctl: 0x00000000
sdhci: Power:    0x00000000 | Blk gap:  0x00000000
sdhci: Wake-up:  0x00000000 | Clock:    0x00000002
sdhci: Timeout:  0x00000000 | Int stat: 0x00000000
sdhci: Int enab: 0x00ff00fb | Sig enab: 0x00ff00fb
sdhci: AC12 err: 0x00000000 | Slot int: 0x00000000
sdhci: Caps:     0x01821898 | Max curr: 0x00000000
sdhci: ===========================================

e insertamos el modulo mmc_block forzando el numero mayor (bloque de dispositivo, 254)
insmod /lib/modules/2.6.18/kernel/drivers/mmc/mmc_block.ko major=254
modprobe mmc_block

si tenemos udevmonitor –env ejecutandose veremos al insertar una tarjeta SD lo siguiente:
UEVENT[1160725793.504909] add@/block/mmcblk0/mmcblk0p1
ACTION=add
DEVPATH=/block/mmcblk0/mmcblk0p1
SUBSYSTEM=block
SEQNUM=1911
MINOR=1
MAJOR=254
PHYSDEVPATH=/devices/pci0000:00/0000:00:1e.0/0000:04:09.4/mmc2:b368
PHYSDEVBUS=mmc
PHYSDEVDRIVER=mmcblk
que es la creacion del dispositivo de bloque.

si tu distro no crea los dispositivos entonces debes hacer lo siguiente (usando la info de arriba):
(de la forma, ruta dispositivo dev, tipo b (bloque), 254 (major number), 1 (minor number)
$mknod /dev/mmcblk0p1 b 254 1

ya puedes hacer un:
$mount -t vfat /dev/mmcblk0p1 /media/sd
(quedara algo como esto:

$mount
/dev/mmcblk0p1 on /media/LARA2GB type vfat (rw,noexec,nosuid,nodev,shortname=winnt,uid=500)).

si tienes una distro con haldaemon el montaje, la extracción y la inserción segura del dispositivo será automática.

Acerca de phenobarbital

http://about.me/phenobarbital

Publicado el 16 octubre 2006 en Ni idea de donde ponerlo. Añade a favoritos el enlace permanente. Deja un comentario.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: