jueves, 9 de diciembre de 2010

Parche, Compilar e Instalar Módulo slamr del Módem PCI TP-LINK Motorola SM56 Data Fax para Kernel Linux 2.6.36

En el artículo Configurar, Compilar e Instalar Kernel de Linux y drivers para Modems PCI en Debian GNU/Linux 5.0 "Lenny" vimos como se realizaba este proceso para los kernel de linux anteriores al 2.6.36.

Al realizar la actualización del kernel a la versión 2.6.36 y compilar el módulo slamr (slmodem-2.9.11-20100718) recibimos un error de compilación. Para solucionar el error la comunidad de linmodems.org dispone de un parche para este driver. Para su instalación realizamos los siguientes pasos:

# El slmodem-2.6.36.patch tiene el siguiete contenido:

--- slmodem-2.9.11-20100718/drivers/amrmo_init.c.orig 2010-10-10 00:33:03.000000000 -0400
+++ slmodem-2.9.11-20100718/drivers/amrmo_init.c 2010-10-10 00:37:36.000000000 -0400
@@ -436,8 +436,11 @@
}


-
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)
+static long amrmo_ioctl(struct file *file, unsigned int cmd, unsigned long parg)
+#else
static int amrmo_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long parg)
+#endif
{
struct amrmo_struct *amrmo = (struct amrmo_struct *)file->private_data;
unsigned long flags;
@@ -514,7 +517,11 @@
.read = amrmo_read,
.write = amrmo_write,
.poll = amrmo_poll,
- .ioctl = amrmo_ioctl,
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,36)
+ .unlocked_ioctl = amrmo_ioctl,
+ #else
+ .ioctl = amrmo_ioctl,
+ #endif
.open = amrmo_open,
.release = amrmo_release,
};


# Para aplicar el parche, ejecutamos lo siguiente:
cp slmodem-2.6.36.patch slmodem-2.9.11-20100718
cd slmodem-2.9.11-20100718
patch -p1 < slmodem-2.6.36.patch

y nos debe mostrar la salida:
patching file drivers/amrmo_init.c

# Compilamos slamr para kernel 2.6.36
make
make install

Con esto configuramos, compilamos e instalamos el módulo para el kernel linux 2.6.36. Gracias a todos los usuarios de la comunidad y puedes encontrar otros recursos en http://linmodems.technion.ac.il

Configurar, Compilar e Instalar Kernel de Linux y drivers para Modems PCI en Debian GNU/Linux 5.0 "Lenny"

INTRODUCCION

El siguiente proceso es sobre la configuración, compilación e instalación del kernel y de los módulos ungrab-winmodem y slamr para un Módem interno TPLINK (TMIP5600/TMIA5629V) Motorola SM56 Data Fax Módem. Luego se instalarán las herramientas básicas para establecer una conexión mediante acceso telefónico.

AUTOR
Oleksis Fraga Menéndez
Universidad de Matanzas “Camilo Cienfuegos” – Facultad de Ingeniería Informática
emails: oleksis.fraga@umcc.cu, oleksis.fraga@gmail.com
fecha: sábado, 16 de octubre de 2010

DESARROLLO

Primeramente necesitamos las siguientes herramientas para la compliación del kernel y módulos asociados.

#REQUISITOS
GCC (GNU compiler)
make (GNU Make)
ncurses
libncurses5-dev
bin86
libc6
libc6-dev
binutils
kernel-package
module-init-tools
initrd-tools
initramfs-tools

Para la compilación de los fuentes del kernel tenemos dos variantes. Manera Clásica y la manera Debian. En este artículo abordaremos la forma clásica, pues existe documentación en el soporte para Debian que trata la segunda forma.
Descargamos de la página oficial las fuentes del kernel de Linux.

http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.26.2.tar.gz

# Extraer fuentes del kernel
cd /usr/src/
tar -xvf linux-2.6.26.2.tar.gz
cd linux-2.6.26.2

Preparamos y compilamos el kernel
# Limpiar el kernel
make clean
make mrproper

Como consejo y para avanzar en el proceso de configuración de los módulos que queremos instalar o cargar en el kernel, podemos copiar la configuración de nuestro kernel actual y copiarla al direcrorio.

cp /boot/config-2.6.26-2-686 /usr/src/linux-2.6.26.2/.config

Chequeamos la configuración mediante menuconfig para revisar o añadir nuevas configuraciones. Si añades nuevas configuraciones debes salvarla nuevamente al .config

# Configurar el kernel
make menuconfig

# Compilar el kernel
make bzImage

Cuando termine el proceso de compilación seguiremos con la compilación e instalación de los módulos que configuramos o selecionamos anteriormente

# Compilar los módulos e instalación en /lib/modules/2.6.26.2/
make modules
make modules_install

El RAM disk contiene los módulos necesarios para iniciar el sistema y montar la partición raíz, y cargar el resto de módulos sólo necesario si los controladores de disco se han compilado como módulos

# Crear el initrd.img-2.6.26.2
update-initramfs -u -t -k 2.6.26.2

#Instalar el nuevo kernel


Copiar los ficheros bzImage, System.map y .config al directorio de arranque del kernel (/boot)
Renombrar bzImage a vmlinuz- , System.map a System.map- y .config a config-

cp /usr/src/linux-2.6.26.2/arch/i386/boot/bzImage /boot/vmlinuz-2.6.26.2
cp System.map /boot/System.map-2.6.26.2
cp .config /boot/config-2.6.26.2

Configurar GRUB o LILO para poder cargar la nueva imagen. Para la configuración del GRUB abrimos un editor de texto y editamos /boot/grub/menu.lst, luego añadimos el nuevo kernel al archivo de configuración despues de la linea que dice ## ## End Default Options ##, por ejemplo:

# Configurar el GRUB para arrancar el nuevo kernel
title Debian GNU/Linux, kernel 2.6.26.2
root (hd0,1)
kernel /boot/vmlinuz-2.6.26.2 root=/dev/hda2 ro quiet
initrd /boot/initrd.img-2.6.26.2
savedefault

En title adicionamos un nombre al nuevo kernel, este aparecerá en el menú del GRUB al iniciar el computador. En la etiqueta root donde dice “(hd0,1)” se coloca la ubicación donde esta el directorio boot en nuestro caso se encuentra en el hd0 es decir disco duro cero, partición 1, lo que en otra nomenclatura seria hda2, en la nomenclatura del GRUB el numero de discos y de particiones comienzan a partir de 0, es decir si tienes el directorio boot en el disco duro 1 partición 2 la sintaxis en el GRUB seria (hd0,1). Guardas los cambios y listo reinicias el sistema y eliges el nuevo kernel.

Para la comprobación una vez que reiniciemos abrimos una terminal y ejecutamos:

#Comprobando
uname -r

y nos debe mostrar la versión de nuestro nuevo kernel 2.6.26.2

*** NOTA ***
Este proceso de compilación esta probado con la fuente del kernel linux-2.6.26.2, con resultados satisfactorios.
Para la fuente del último kernel (linux-2.6.35.7) hasta el momento y la compilación del driver slamr tuve que crear el siguiente fichero cabecera o de inclusión para su correcta compilación. Los restantes pasos se realizaron con éxito.

touch /lib/modules/2.6.35.7/build/include/linux/utsrelease.h
echo "#define UTS_RELEASE \"2.6.35.7\"" > /lib/modules/2.6.35.7/build/include/linux/utsrelease.h

#Configuración e instalación de los módulos (drivers) para el módem
Descargamos desde linmodems (http://linmodems.technion.ac.il/packages/smartlink/) los drivers ungrab-winmodem-20090716 y slmodem-2.9.11-20100613

# Instalando ungrab-winmodem (ungrab-winmodem-20090716)
cd ungrab-winmodem-20090716
make
make install
modprobe ungrab-winmodem

# Instalando slamr (slmodem-2.9.11-20100613)
cd slmodem-2.9.11-20100613
make
make install

# Cargar módulos en el Kernel
modprobe ungrab-winmodem
modprobe slamr

# Comprobación de módulos cargados
lsmod | grep ungrab
ungrab_winmodem 1952 0
lsmod | grep slamr
slamr 428776 0

# Crear nodo para dispositivo
mknod -m 600 /dev/slamr0 c 242 0
/usr/sbin/slmodemd --country=USA /dev/slamr0
Abrimos otra terminal y continuamos:

# Instalar wvdial y configurar el acceso telefónico

apt-get install wvdial ppp pppconfig
wvdialconf /etc/wvdial.conf
...
Found a modem on /dev/ttySL0.
Modem configuration written to /etc/wvdial.conf.
ttySL0: Speed 460800; init "ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0"

#Configuración de wvdial en /etc/wvdial.conf
[Dialer Defaults]
Modem = /dev/ttySL0
Baud = 460800
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Modem Type = Analog Modem
PPPD Path = /usr/sbin/pppd
Carrier Check = no
Phone = 123456
Username = usuario
Password = contraseña
Ask Password = 0
ISDN = 0
Dial Command = ATDT
Stupid Mode = 1
Compuserve = 0
Auto DNS = 1

En los valores de Phone establecemos el número de teléfono al cual nos queremos conectar, en Username el nombre de usuario y en Password la contraseña, todo esto necesario para conectarnos mediante acceso telefónico

# Levantar la conexión
wvdial
Opcionalmente podemos hacer los siguiente pasos:

# Interfaz gráfica para conexión mediante modem (/dev/ttySL0)
aptitude install gnome-ppp

# Para algunas aplicaciones se necesita crear el enlace simbólico
# por ejemplo para kppp

ln -s /dev/ttySL0 /dev/modem

# Utilizar un script (modem.sh) en bash para cargar los módulos, crear los dispositivos y levantar el demonio slmodemd

#!/bin/bash
#Cargamos los módulos al kernel
modprobe ungrab-winmodem
modprobe slamr
#Creamos el nodo para el dispositivo
mknod -m 600 /dev/slamr0 c 242 0
mknod -m 600 /dev/slamr1 c 242 1
mknod -m 600 /dev/slamr2 c 242 2
mknod -m 600 /dev/slamr3 c 242 3
# Crear el enlace simbólico para aplicaciones como kppp
ln -s /dev/ttySL0 /dev/modem
#Levantamos el demonio para el módem
slmodemd --country=USA /dev/slamr0
## ## FIN modem.sh ##

CONCLUSIONES

En este artículo vimos como configurar, compilar e instalar el kernel de Linux a la manera clásica. También compilamos e instalamos los módulos ungrab-winmodem y slamr para el funcionamiento del Módem interno TP¬LINK (TM¬IP5600/TM¬IA5629V) Motorola SM56 Data Fax Módem. Configuramos e instalamos wvdial, ppp y pppconfig para la conexión mediante acceso telefónico.

Puedes visitar otro artículo relacionado con la configuración del Modem TP LINK para el sistema NOVA 1.1.2 BAIRE en el siguiente enlace:

http://www.nova.uci.cu/documentacion/comos/Configuracion-Modem-TP-LINK.pdf
http://www.nova.cu/foros/viewtopic.php?f=18&t=162

En posterior artículo veremos como empaquetar nuestro kernel y sus módulos en un paquete de Debian (.deb) para próximas reinstalaciones de nuestro sistema y asi ganar tiempo al realizar este proceso.

Otras referencias de interés:

http://www.pri.jovenclub.cu/jc/linux/revista_linvix/
http://www.pri.jovenclub.cu/jc/linux/revista_linvix/8/ : Instalando un módem PCI en entornos GNU/Linux
http://www.pri.jovenclub.cu/jc/linux/revista_linvix/9/ : Instalando módem PCI Motorola SM56