Difference between revisions of "PWM"
(→Hardware) |
(→PWM Mode) |
||
Line 29: | Line 29: | ||
After driver loading, you have access to ''/sys/class/pwm/...'' functionalities: | After driver loading, you have access to ''/sys/class/pwm/...'' functionalities: | ||
+ | <pre class="apf"> | ||
+ | export PWM=pwm0 (on APF9328/APF27/APF51) | ||
+ | export PWM=pwm4 (on APF28Dev) | ||
+ | </pre> | ||
* to change frequency (for example 500 Hz): | * to change frequency (for example 500 Hz): | ||
<pre class="apf"> | <pre class="apf"> | ||
− | # echo 500 > /sys/class/pwm/ | + | # echo 500 > /sys/class/pwm/$PWM/frequency |
</pre> | </pre> | ||
* if you prefer working with periods (for example 100us): | * if you prefer working with periods (for example 100us): | ||
<pre class="apf"> | <pre class="apf"> | ||
− | # echo 100 > /sys/class/pwm/ | + | # echo 100 > /sys/class/pwm/$PWM/period |
</pre> | </pre> | ||
* to change duty cycle (for example 50.0%) | * to change duty cycle (for example 50.0%) | ||
<pre class="apf"> | <pre class="apf"> | ||
− | # echo 500 > /sys/class/pwm/ | + | # echo 500 > /sys/class/pwm/$PWM/duty |
</pre> | </pre> | ||
* to activate PWM: | * to activate PWM: | ||
<pre class="apf"> | <pre class="apf"> | ||
− | # echo 1 > /sys/class/pwm/ | + | # echo 1 > /sys/class/pwm/$PWM/active |
</pre> | </pre> | ||
* to de-activate PWM: | * to de-activate PWM: | ||
<pre class="apf"> | <pre class="apf"> | ||
− | # echo 0 > /sys/class/pwm/ | + | # echo 0 > /sys/class/pwm/$PWM/active |
</pre> | </pre> | ||
Line 91: | Line 95: | ||
</source> | </source> | ||
− | |||
− | |||
=== Audio Mode === | === Audio Mode === |
Revision as of 14:13, 17 February 2015
On this page, you will find usefull informations to configure and use the Pulse Width Modulation (PWM) capabilities of your APF boards.
The i.MX processor is capable of driving 2 PWM signals:
- one is linked to the LCD controller and allows controling the LCD backlight (fixed frequency)
- the other can be used to generate a PWM signal in several mode:
- audio playback
- real PWM
Contents
Hardware
PWM pin detail for each APF boards can be found here (under 'BaseBoards' section).
Linux driver installation
i.MX PWM driver is installed by default in standard Armadeus rootfs.
Note: On APF51Dev, as PWM outputs are multiplexed and used as user LED and button by default, you may have to define APF51DEV_USE_LED_AS_PWM or APF51DEV_USE_SWITCH_AS_PWM in Linux sources (arch/arm/mach-mx5/apf51dev-baseboard.c), rebuild and reflash the Linux kernel. |
Usage
# modprobe imx-pwm i.MX PWM driver v0.81 imx-pwm imx-pwm.0: initialized
- On APF28 with 2.6.35 kernel, the PWM driver is builtin so no need to load it before use.
- For the one who plan to use sound, /dev/pwm0 device file should be automatically created.
PWM Mode
After driver loading, you have access to /sys/class/pwm/... functionalities:
export PWM=pwm0 (on APF9328/APF27/APF51) export PWM=pwm4 (on APF28Dev)
- to change frequency (for example 500 Hz):
# echo 500 > /sys/class/pwm/$PWM/frequency
- if you prefer working with periods (for example 100us):
# echo 100 > /sys/class/pwm/$PWM/period
- to change duty cycle (for example 50.0%)
# echo 500 > /sys/class/pwm/$PWM/duty
- to activate PWM:
# echo 1 > /sys/class/pwm/$PWM/active
- to de-activate PWM:
# echo 0 > /sys/class/pwm/$PWM/active
Bash test script
- A Bash test script is available given below. Just enter the desired frequency and duty cycle.
#!/bin/sh
#
# script to command imx pwm
# usage : pwm_imx frequency duty
#
if [ $# -lt 2 ]
then
echo "Provide two arguments to this script !"
echo "pwm_imx frequency dutycycle"
exit 1
fi
SYS_DIR="/sys/class/pwm/pwm0/"
FREQUENCY=$1
DUTY=$2
DUTY=`(echo $DUTY | awk '{ print $1*10}')`
if [ ! -d "$SYS_DIR" ]; then
echo "Can't find /sys/ interface for PWM"
exit 1
fi
echo "Starting PWM"
echo 1 > $SYS_DIR/active
#SET FREQUENCY
echo $FREQUENCY > $SYS_DIR/frequency
echo "Setting PWM to $FREQUENCY Hz"
#SET DUTY CYCLE
echo $DUTY > $SYS_DIR/duty
echo "Setting DUTY to $2 %"
exit 0
Audio Mode
Audio playback mode is working since v0.5 of PWM driver (thanks to SebastienR). You can play 8, 16 & 32 KHz 8bit linear RAW sound. It's recommended to play 8kHz one, as they are using less CPU resources. To convert a sound to the right format we recommend to use SoX (on Linux). For example:
[host]$ sox /usr/share/sounds/KDE_Chimes_1.ogg -r 8192 -b -u -c 1 Chimes.raw -r -> sampling rate -b -> byte/8bit signal -u -> linear /not compressed -c 1 -> Mono / 1 channel
Then you can test it using target/linux/modules/pwm/test/testplaymode, which can be compiled that way:
$ make shell_env $ . armadeus_env.sh $ export PATH=$PATH:$ARMADEUS_TOOLCHAIN_PATH $ make -C target/linux/modules/pwm/test/ $ cp target/linux/modules/pwm/test/testplaymode /tftpboot/ $ cp target/linux/modules/pwm/test/KDE_Startup_2.raw /tftpboot/
on target do:
# testplaymode
or
# testplaymode KDE_Startup_2.raw
Going further
If you need more than one PWM at a time, you can use the APF's FPGA with the following project.