Archive for October 16th, 2006

instalar lector SD/MMC flash reader usando el modulo sdhci

Monday, October 16th, 2006

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=0×22

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: 0×00000000 | Version:  0×00008400
sdhci: Blk size: 0×00000000 | Blk cnt:  0×00000000
sdhci: Argument: 0×00000000 | Trn mode: 0×00000000
sdhci: Present:  0×00020000 | Host ctl: 0×00000000
sdhci: Power:    0×00000000 | Blk gap:  0×00000000
sdhci: Wake-up:  0×00000000 | Clock:    0×00000002
sdhci: Timeout:  0×00000000 | Int stat: 0×00000000
sdhci: Int enab: 0×00ff00fb | Sig enab: 0×00ff00fb
sdhci: AC12 err: 0×00000000 | Slot int: 0×00000000
sdhci: Caps:     0×01821090 | Max curr: 0×00000000
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: 0×00000000 | Version:  0×00008400
sdhci: Blk size: 0×00000000 | Blk cnt:  0×00000000
sdhci: Argument: 0×00000000 | Trn mode: 0×00000000
sdhci: Present:  0×00020000 | Host ctl: 0×00000000
sdhci: Power:    0×00000000 | Blk gap:  0×00000000
sdhci: Wake-up:  0×00000000 | Clock:    0×00000002
sdhci: Timeout:  0×00000000 | Int stat: 0×00000000
sdhci: Int enab: 0×00ff00fb | Sig enab: 0×00ff00fb
sdhci: AC12 err: 0×00000000 | Slot int: 0×00000000
sdhci: Caps:     0×01821090 | Max curr: 0×00000000
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: 0×00000000 | Version:  0×00008400
sdhci: Blk size: 0×00000000 | Blk cnt:  0×00000000
sdhci: Argument: 0×00000000 | Trn mode: 0×00000000
sdhci: Present:  0×000a0000 | Host ctl: 0×00000000
sdhci: Power:    0×00000000 | Blk gap:  0×00000000
sdhci: Wake-up:  0×00000000 | Clock:    0×00000002
sdhci: Timeout:  0×00000000 | Int stat: 0×00000000
sdhci: Int enab: 0×00ff00fb | Sig enab: 0×00ff00fb
sdhci: AC12 err: 0×00000000 | Slot int: 0×00000000
sdhci: Caps:     0×01821898 | Max curr: 0×00000000
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.