There are some different ways to generate PWM signals on CORE9G25 module. This article illustrates how to use the Generic PWM framework driver for Atmel Timer Counter Block available inside the Kernel 3.11.
To include this driver in your Kernel select this item during the Linux Kernel configuration (make menuconfig).
Device Drivers ---> [*] Pulse-Width Modulation (PWM) Support ---> <*> Atmel TC Block PWM support
A Timer Counter Block provides 6 PWM devices grouped by 2. Devices in the same group must have the same period.
The GPIO pin used for PWM signals are:
Aria pin | Atmel name | pwm# | Group | Timer Signal | at91sam9x5.dtsi def |
---|---|---|---|---|---|
N4 | PC2 | pwm0 | 0 | TIOA3 | pinctrl_tcb1_tioa0 |
N5 | PC3 | pwm1 | 0 | TIOB3 | pinctrl_tcb1_tiob0 |
N7 | PC5 | pwm2 | 1 | TIOA4 | pinctrl_tcb1_tioa1 |
N8 | PC6 | pwm3 | 1 | TIOB4 | pinctrl_tcb1_tiob1 |
N14 | PC12 | pwm4 | 2 | TIOA5 | pinctrl_tcb1_tioa2 |
N15 | PC13 | pwm5 | 2 | TIOB5 | pinctrl_tcb1_tiob2 |
The node to add inside the at91-CORE9G25.dts file is:
pwm { compatible = "atmel,tcb-pwm"; #pwm-cells = <3>; tc-block = <1>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_tcb1_tioa0 &pinctrl_tcb1_tioa1 &pinctrl_tcb1_tioa2 &pinctrl_tcb1_tiob0 &pinctrl_tcb1_tiob1 &pinctrl_tcb1_tiob2>; status = "okay"; };
The pinctrl configuration is responsible for setting up the GPIO output which definition is in arch/arm/boot/dts/at91sam9x5.dtsi.
If don't need to use all the 6 PWM signals remove the pinctrl_tcb1_tioXX simbols from pinctrl-0 definitions related to the GPIO line to set free.
User space sysfs interface
Up to 6 pmw channels can be exported before using them:
~# echo 0 > /sys/class/pwm/pwmchip0/export ~# echo 1 > /sys/class/pwm/pwmchip0/export ~# echo 2 > /sys/class/pwm/pwmchip0/export ~# echo 3 > /sys/class/pwm/pwmchip0/export ~# echo 4 > /sys/class/pwm/pwmchip0/export ~# echo 5 > /sys/class/pwm/pwmchip0/export
To unexport:
~# echo 0 > /sys/class/pwm/pwmchip0/unexport ~# echo 1 > /sys/class/pwm/pwmchip0/unexport ~# echo 2 > /sys/class/pwm/pwmchip0/unexport ~# echo 3 > /sys/class/pwm/pwmchip0/unexport ~# echo 4 > /sys/class/pwm/pwmchip0/unexport ~# echo 5 > /sys/class/pwm/pwmchip0/unexport
For any exported channel a directory called pwmX wil be created with the following structure:
/sys/class/pwm/pwmchip0/pwmX/ |-- duty_cycle (r/w) duty cycle (in nanoseconds) |-- enable (r/w) enable/disable PWM |-- period (r/w) period (in nanoseconds) |-- polarity (r/w) polarity of PWM |-- power `-- uevent
The follow example illustrate how enable a PWM signale with a period of 1mS with a 0.5mS of duty cycle:
~# echo 1000000 > /sys/class/pwm/pwmchip0/export/pwm0/period ~# echo 500000 > /sys/class/pwm/pwmchip0/export/pwm0/duty_cycle ~# echo 1 > /sys/class/pwm/pwmchip0/export/pwm0/enable
Related links
Documentation Terms of Use
The Acme Systems srl provides this Debian system development and user manual.
The origin of these doc came from the website: http://www.acmesystems.it
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License.