Skip to content

KernelPwmModule

rlrosa edited this page Feb 18, 2012 · 12 revisions

Como agregar el módulo para PWM

En esta página se explica el procedimiento a seguir para generar un kernel que soporte el módulo de PWM:

omap3-pwm

Las secciones sobre como instalar OpenEmbedded & Bitbake y como compilar el kernel se pueden reemplazar por descargar este archivo:

Kernel Para Beagleboard con PWM

  • A la partición /boot deben ir (cambiar nombres de archivos para matchear los siguientes):

  • MLO

  • u-boot.bin

  • uImage

  • A la otra partición va el root file system.

    sudo tar -C /media/Narcissus-rootfs/ -xvf ~/Angstrom-console-image-beagleboard.rootfs.tar.bz2

Kernel

Una vez que tenemos todo el software listo, hay que editar la configuración del kernel que vamos a compilar para que soporte el módulo PWM.

  1. Editar ${OE_BASE}/sources/openembedded/recipes/linux/linux-omap-psp-2.6.32/beagleboard/defconfig para que verifique:
# CONFIG_OMAP_RESET_CLOCKS is not set
CONFIG_OMAP_MCBSP=y
CONFIG_OMAP_MBOX_FWK=m

NOTA: Yo no tuve que cambiar el MCBSP, ya estaba como lo necesitaba.

  1. Generar uImage, u-boot.bin, MLO y el root filesystem:
cd ${OE_BASE}/build
bitbake console-image

Los archivos de interés deberían estar en ${OE_BASE}/build/tmp/deploy/glibc/images/beagleboard/.

  1. Proceder como en BeagleSDBoot pero usando los nuevos uImage, u-boot.bin y MLO. (En realidad no tiene sentido hacer esto ahora, mejor después de completar la próxima etapa).

Módulo para PWM

A esta altura ya se dispone de un kernel capaz de correr el módulo para PWM. Falta tener el módulo. Los archivos necesarios para compilar el módulo deberían haber sido generados al ejecutar bitbake console-image y deberían encontrarse en ${OE_BASE}/build/tmp/sysroots/beagleboard-angstrom-linux-gnueabi/kernel

  1. Descargar el repositorio con el PWM:

    $ git clone git://github.com/scottellis/omap3-pwm
    $ cd omap3-pwm
    
  2. El branch que tiene la versión para 4 canales:

    $ git checkout -b four-channel origin/four-channel
    
  3. Editar el archivo que le indica al Makefile donde debe buscar las cosas. Yo solamente tuve que setear OETMP:

 OETMP=${OE_BASE}/build/tmp-angstrom_2008_1 

En el oe nuevo sería ${OE_BASE}/build/tmp-angstrom_2010_x-eglibc, creo.

  1. Incorporar los cambios a beagleboard-source-me.txt:

    $ source beagleboard-source-me.txt
  2. Compilar el módulo:

    $ make
  3. Copiar el módulo al beagleboard. Dos métodos:

  • Conectar la tarjeta SD a la pc y copiar el archivo a /home/root/ (o a cualquier otro lugar dentro de la partición ext3 (la que no es boot)).
  • Conectar mediante ssh al beagleboard y ejecutar:
scp tu_usuario_en_tu_pc@192.168.0.200:~/\/pwm.ko .

NOTA: El '.' al final va, es para indicar que querés copiar el archivo a la carpeta actual.

  1. Asumiendo que el módulo se encuentra en /home/root/pwm.ko, levantar el módulo:

     insmod /home/root/pwm.ko 
  2. Usar el módulo:

    root@beagleboard:# cat /dev/pwm11
    PWM11 Frequency 50 Hz Duty Cycle 99%
    root@beagleboard:# echo 1500 > /dev/pwm11
    root@beagleboard:# cat /dev/pwm10
    PWM10 Frequency 50 Hz Duty Cycle 7%
    root@beagleboard:# echo 320001 > /dev/pwm11
    root@beagleboard:# cat /dev/pwm11
    PWM10 Frequency 50 Hz Duty Cycle 11%
    
    NOTA: Un pulso de 1500us se genera escribiendo 15000, uno pulso de 1500.1us escribiendo 15001 (super trivial...). Para cambiar la frecuencia hay que sacar el módulo y ponerlo de nuevo:
    root@beagleboard:# rmmod /home/root/pwm.ko
    root@beagleboard:# insmod /home/root/pwm.ko frequency=2048
    root@beagleboard:# cat /dev/pwm10
    PWM10 Frequency 2048 Hz Stopped
    
    NOTA: Es probable que haya que iniciar en una frecuencia mayor a la que usa por defecto, ya que al escribir valores muy grandes creo que hay un problema de overflow, entonces no es posible generar ciclos de trabajo de más de 20% a 50Hz (la frecuencia por defecto).

Hardware

Para verificar que el pwm está funcionando se puede usar un osciloscopio.

Se escribe a /dev/pwm# el valor en micro segundos que se desea para la parte activa del ciclo.

El mapeo es el siguiente:

  • pwm8 - falta implementar el mux (si se puede...)
  • pwm9 - pin 4
  • pwm10 - pin 10
  • pwm11 - pin 6