Tarjeta Startech PCIe (PCI Express) con chip MSC9901

Con la compra de selene, me he llevado una pequeña sorpresa (aunque era bastante lógico, por otra parte): el ordenador no trae disquetera (eso es hoy bastante común), pero tampoco puertos paralelo ni puertos serie. Solo trae cuatro puertos USB y uno Firewire, todos en la parte trasera. Un poco escasito, la verdad.

Bien, el caso es que yo necesito muchos más puertos USB traseros, y alguno delantero para enchufar los lápices USB. Además, también necesito al menos dos puertos serie: uno para establecer comunicación con el SAI Trust y otro para mi modem/fax de MultiTech System. Mmmmh... no, el ordenador se conecta a Internet mediante una conexión de banda ancha a través de un puerto ethernet. Pero un anticuado modem/fax puede usarse también para enviar y recibir faxes con el escaner y la impresora, ¿no lo habías pensado?. :-D

Vale. Todos esos problemas pueden solucionarse fácilmente. En Ebay solo se necesita buscar un poquito y se encuentrar montones de soluciones baratas. Por ejemplo, en una tienda alemana (Sotel.de) se encuentra una tarjeta PCI Express USB DeLOCK que abre cuatro puertos USB traseros y un puerto USB interno. Funciona "out of the box" con linux. Vamos, que la instalas y no necesitas hacer nada más en Ubuntu. ;-)

En una tienda francesa (Konektikpc) se encuentra también un panel frontal USB de 3,5 pulgadas, que se conecta al puerto interno de la tarjeta DeLOCK y te abre cuatro puertos frontales USB adicionales. También funciona "out of the box", así que es conectar y listo.

Y en otra tienda francesa (Kalea Informatique), se encuentra una tarjeta PCI Express de marca Startech, con chip Moschip 9901, que proclama funcionar con linux. Es cierto, pero aquí te espera una desagradable sorpresa: no funciona "out of the box", sino que hay que instalar un driver aparte que probablemente no funcionará con tu kernel linux porque hace mucho que se ha quedado anticuado. Vamos, que el cacareado soporte linux es bastante nefasto. Ojo, no es culpa del vendedor que es bastante competente, sino del fabricante del chipset (Moschip), son cosas distintas. Así que tendrás que hackear el driver (bueno, modificar el código fuente a mano), compilarlo y instalarlo por tí mismo.

Afortunadamente, como suele ocurrir con Linux, ese camino ya ha sido recorrido por alguien y nuestro amigo eldiabolosk nos lo cuenta detalladamente. Lo que yo te explico aquí no es más que una traducción de lo que él dice, con alguna puntualización adicional y poco más. Así que las gracias dáselas a él, no a mi, ¿de acuerdo?.

Atención: Este truco solo funciona hasta cierto punto. Concretamente hasta el kernel 2.6.31. Por encima de ahí, más concretamente, con Ubuntu 10.04, NO HE CONSEGUIDO compilar los drivers, con lo que mi bonita tarjeta PCI Express se ha convertido en un bonito pisapapeles. Gracias, Moschip!!!!!!.  :-(((

Bien, abre una ventana de terminal y teclea el comando "lspci". Debería salir un listado en el que se hace alguna referencia a la tajeta PCI Express (PCIe) con chipset 9901. En mi caso, por ejemplo, sale esto:

[lacofi@selene ~]$lspci
(bla,bla,bla)
00:1f.3 SMBus: Intel Corporation 82801JI (ICH10 Family) SMBus Controller
02:00.0 FireWire (IEEE 1394): VIA Technologies, Inc. Device 3403
03:00.0 Serial controller: NetMos Technology PCIe 9901 Multi-I/O Controller
03:00.1 Serial controller: NetMos Technology PCIe 9901 Multi-I/O Controller
03:00.2 Serial controller: NetMos Technology PCIe 9901 Multi-I/O Controller
03:00.3 Serial controller: NetMos Technology PCIe 9901 Multi-I/O Controller
(y sigue con bla,bla,bla)

Vale, esto es solo para asegurarnos y no equivocarnos de chipset.

Ahora, toma el disco de drivers que te venía con la tarjeta y busca en la carpeta de Linux, chipset 9901. Encontrarás un PDF con instrucciones (que puedes tirar) y un fichero starex.tar.gz que contiene los drivers. Si no lo encuentras, también puedes ir a la página del fabricante del chipset y bajarte el driver.

En cualquier caso, ahora cambia a un directorio (o crea uno especial para trabajar) y desempaqueta el fichero starex.tar.gz. Puedes hacerlo desde línea de comandos o a golpe de ratón, eso no importa, porque no necesitas hacerte root para desempaquetar ni para hackear el driver. Pero sí tendrás que volverte root para compilar e instalar el driver.:

[lacofi@selene ~]$ sudo mkdir /opt/starex
password:
[lacofi@selene ~]$ cd /opt/starex
[lacofi@selene /opt/starex]$ tar -xzvf /media/cdrom/MSC9901/MSC9901_Linux/starex.tar.gz
[lacofi@selene /opt/starex]$ ls
total 104K
-rwxr--r-- 1 root root  65K 2007-10-29 06:16 9900.c*
-rwxr--r-- 1 root root 5,0K 2007-11-08 12:40 9900.h*
-rwxr--r-- 1 root root 4,1K 2007-10-29 06:16 9900-isa.c*
-rwxr--r-- 1 root root 1,1K 2007-10-29 06:16 9900-isa.h*
-rwxr--r-- 1 root root  742 2007-10-29 06:16 Makefile*
-rwxr--r-- 1 root root   32 2007-10-29 06:16 mcs9900*
-rwxr--r-- 1 root root 2,3K 2008-02-11 15:58 readme*
[lacofi@selene /opt/starex]$ _

Correcto, esos son los ficheros del código fuente del driver. Ahora hay que modificarlos. El problema es que exigen un kernel muy antiguo, porque los drivers no se actualizan desde Fedora Core 7. Prueba a ver, solo por curiosidad, e intenta compilar:

[lacofi@selene /opt/starex]$ make

Si usas Ubuntu, por ejemplo, usarás un kernel mucho más nuevo de lo que el driver admite y no estará soportado. En ese caso, con el comando anterior te saldrán unos cuantos errores que dicen algo acerca de que "struct uart_info" no tiene ningún miembro llamado "tty". Habitualmente, ese error sale en las líneas 622, 852 y 957. Pero vamos a arreglar eso en un pis pas (ventajas del código abierto):

Edita el fichero 9900.c (por ejemplo con vim pero puedes usar el editor de texto que prefieras). Vale, pues ahora tienes que buscar y reemplazar. En todos los sitios en que aparezca esto:

port.info->tty

debe quedar así:

port.info->port.tty

No tiene pérdida, porque seguramente será en las líneas 622, 852 y 957, las mismas en las que salían los mensajes de error al compilar.

Ahora, en el mismo fichero 9900.c tienes que hacer otra búsqueda para reemplazar. En todos los sitios en los que aparezca esto:

SA_SHIRQ

con esto otro:

IRQF_SHARED

Ahora solo queda arreglar un poco el instalador, porque el driver está diseñado para Fedora y Ubuntu usa un sistema un poco distinto. Así que si usas Ubuntu edita el fichero Makefile. Vete al apartado "install:" y donde pone:

ln -s /etc/init.d/mcs9900 /etc/rc.d/rc3.d/Smcs9900 || true
ln -s /etc/init.d/mcs9900 /etc/rc.d/rc5.d/Smcs9900 || true

debe poner:

ln -s /etc/init.d/mcs9900 /etc/rc3.d/Smcs9900 || true
ln -s /etc/init.d/mcs9900 /etc/rc5.d/Smcs9900 || true

Por último vete al apartado "uninstall:" y donde pone:

rm -f /etc/rc.d/rc3.d/Smcs9900
rm -f /etc/rc.d/rc5.d/Smcs9900

debe poner:

rm -f /etc/rc3.d/Smcs9900
rm -f /etc/rc5.d/Smcs9900

Bien, ahora vuelve a compilar y después instala los drivers:

[lacofi@selene /opt/starex]$ sudo su
passwd:
[root]@selene /opt/starex]# make
rm -f *.mod.c *.o *.ko .*.cmd *.symvers
make -C /lib/modules/2.6.28-15-generic/build/
SUBDIRS=/opt/MCS9901_Linux/version1.6/starex modules
make[1]: se ingresa al directorio `/usr/src/linux-headers-2.6.28-15-generic'
  CC [M]  /opt/MCS9901_Linux/version1.6/starex/9900.o
/opt/MCS9901_Linux/version1.6/starex/9900.c:752:
aviso: se definió ¿transmit_chars_dma_stop_done¿ pero no se usa
  CC [M]  /opt/MCS9901_Linux/version1.6/starex/9900-isa.o
  Building modules, stage 2.
  MODPOST 2 modules
  CC      /opt/MCS9901_Linux/version1.6/starex/9900-isa.mod.o
  LD [M]  /opt/MCS9901_Linux/version1.6/starex/9900-isa.ko
  CC      /opt/MCS9901_Linux/version1.6/starex/9900.mod.o
  LD [M]  /opt/MCS9901_Linux/version1.6/starex/9900.ko
make[1]: se sale del directorio `/usr/src/linux-headers-2.6.28-15-generic'
(observa que no hay ningún mensaje de error)
[root]@selene /opt/starex]# make install
cp 9900.ko 9900-isa.ko /lib/modules/2.6.28-15-generic/kernel/drivers/serial/
depmod -A
chmod +x mcs9900
cp mcs9900 /etc/init.d/
ln -s /etc/init.d/mcs9900 /etc/rc3.d/Smcs9900 || true
ln -s /etc/init.d/mcs9900 /etc/rc5.d/Smcs9900 || true
modprobe 9900
modprobe 9900-isa
root@selene /opt/starex]# _

Vale, ahora ejecuta un comando dmesg y deberías ver que el listado termina con algo así:

starex-serial 0000:03:00.0: PCI INT A -> GSI 17 (level, low) -> IRQ 17
starex-serial 0000:03:00.0: setting latency timer to 64
0000:03:00.0: ttyD0 at I/O 0xd480 (irq = 17) is a starex-serial
starex-serial 0000:03:00.1: PCI INT B -> GSI 18 (level, low) -> IRQ 18
starex-serial 0000:03:00.1: setting latency timer to 64
0000:03:00.1: ttyD1 at I/O 0xd800 (irq = 18) is a starex-serial
43.650254] starex-serial 0000:03:00.2: PCI INT C -> GSI 19 (level, low) -> IRQ 19
starex-serial 0000:03:00.2: setting latency timer to 64
0000:03:00.2: ttyD2 at I/O 0xd880 (irq = 19) is a starex-serial
starex-serial 0000:03:00.3: PCI INT D -> GSI 16 (level, low) -> IRQ 16
starex-serial 0000:03:00.3: setting latency timer to 64
0000:03:00.3: ttyD3 at I/O 0xdc00 (irq = 16) is a starex-serial

Lo que viene a significar que se han abierto cuatro nuevos puertos serie desde /dev/ttyD0 hasta /dev/ttyD3, aunque como la tarjeta solo trae dos puertos reales, únicamente estarán operativos /dev/ttyD0 y /dev/ttyD1. Comprueba que han sido creados de verdad:

[root]@selene /opt/starex]# ls /dev/ttyD*
crw-rw---- 1 root dialout 200, 0 2009-10-05 02:18 /dev/ttyD0
crw-rw---- 1 root dialout 200, 1 2009-10-05 02:18 /dev/ttyD1
crw-rw---- 1 root dialout 200, 2 2009-10-05 02:18 /dev/ttyD2
crw-rw---- 1 root dialout 200, 3 2009-10-05 02:18 /dev/ttyD3

Los drivers deberían cargarse automáticamente en el arranque del sistema, pero si quieres asegurarte solo tienes que añadir una entrada al fichero /etc/rc.local que ponga esto:

/etc/init.d/mcs9900 start

Y solo un detalle más: Si actualizas tu Ubuntu a la versión 9.10, verás que lleva un kernel 2.6.31 y eso afecta a cómo son detectados los puertos serie: en este caso los puertos /dev/ttySx no se crean si no existen, y en su lugar los de la tarjeta se crean como /dev/ttySx en lugar de /dev/ttyDx. No tiene importancia, pero puede despistarte y tendrás que cambiar la configuración de los programas que utilicen el puerto serie.

Que lo disfrutes. Y te recuerdo que las gracias debes dárselas a eldiabolosk, no a mi. Con gente así, da gusto, la verdad. :-)

Be Sociable, Share!

Puedes seguir cualquier respuesta a esta entrada mediante el canal RSS 2.0. Puedes dejar un comentario o enviar un trackback desde tu propio sitio.

4 comentarios »

 
  • avatar avatarRodolfo dice:

    No sé si todavía te servirá de algo, pero por si acaso, te comento que yo tengo una tarjeta PCI con chip MCS9865 y he conseguido hacer que funcionen los puertos serie haciendo los cambios que tú indicas, y además, “port.info” por “port.state”. El fichero fuente tiene otro nombre pero debe ser parecido.

    Un saludo.

  • avatar avatarlacofi dice:

    A mi ya no me sirve porque me he comprado un fax USB, con lo que ya no necesito el puerto serie. Pero lo he probado a ver qué pasa y por si le sirve a otros…

    Pues no, no consigo que me compile. El error que me da es este:

    [lacofi@selene /opt/starex]# make
    rm -f *.mod.c *.o *.ko .*.cmd *.symvers
    make -C /lib/modules/2.6.32-24-generic/build/ SUBDIRS=/opt/starex/compilado modules
    make[1]: se ingresa al directorio `/usr/src/linux-headers-2.6.32-24-generic’
    CC [M] /opt/starex/compilado/9900.o
    /opt/starex/compilado/9900.c: In function ‘check_modem_status’:
    /opt/starex/compilado/9900.c:611: error: ‘struct uart_state’ has no member named ‘delta_msr_wait’
    make[2]: *** [/opt/starex/compilado/9900.o] Error 1
    make[1]: *** [_module_/opt/starex/compilado] Error 2
    make[1]: se sale del directorio `/usr/src/linux-headers-2.6.32-24-generic’
    make: *** [default] Error 2

    ¿Alguna idea alguien?

  • avatar avatarMatias dice:

    Funcionó perfecto! Muchas gracias!

  • avatar avatarlacofi dice:

    Vaya, enhorabuena, porque esta entrada era ya un poco vieja… :-D

 

Deja un comentario

Disculpa, debes iniciar sesión para escribir un comentario.