Difference between revisions of "LPTIM Linux driver"

[quality revision] [quality revision]
m
 
m
 
Template:ArticleMainWriter Template:ReviewersList Template:ArticleApprovedVersion

1 Article purpose[edit]

This article introduces the LPTIM Linux® driver for the LPTIM internal peripheral[1]:

  • Which LPTIM features are supported by the driver
  • How to configure, use and debug the driver
  • What is the driver structure, and where the source code can be found.

2 Short description[edit]

The LPTIM[1] Linux driver (kernel space) is based on the PWM and IIO frameworks. It provides several functionalities:

MFD driver:

  • handles common resources (registers, clock)

PWM driver:

  • handles the PWM output channel (single channel)

IIO hardware trigger driver:

  • handles hardware trigger sources (synchronously with PWM) for other internal peripherals such as ADC[2], DAC[3], DFSDM[4]

IIO counter driver:

  • handles the quadrature encoder interface[5] as well as the external event counter.

3 Configuration[edit]

3.1 Kernel configuration[edit]

Activate the LPTIM[1] Linux driver in the kernel configuration using the Linux Menuconfig tool: Menuconfig or how to configure kernel.

Enable the following configurations (as well as their dependencies):

  • CONFIG_MFD_STM32_LPTIMER
  • CONFIG_PWM_STM32_LP
  • CONFIG_IIO_STM32_LPTIMER_TRIGGER
  • CONFIG_STM32_LPTIMER_CNT
Device Drivers  --->
   -> Multifunction device drivers  --->
      <*> Support for STM32 low-power timer
   -> Pulse-width modulation (PWM) support  --->
      <*> STMicroelectronics STM32 PWM LP
   -> Industrial I/O support  --->
      -> Triggers - standalone  --->
         <*> STM32 low-power timer trigger
      -> Counters  --->
         <*> STM32 low-power timer encoder counter driver

3.2 Device tree[edit]

Refer to the LPTIM device tree configuration article when configuring the LPTIM Linux kernel driver.

4 How to use[edit]

How to use PWM with sysfs interface

How to set up a TIM or LPTIM trigger using the sysfs interface

How to use the quadrature encoder with the sysfs interface

5 How to trace and debug[edit]

The LPTIM Linux driver can access LPTIM registers through REGMAP.

It comes with debugfs[6] entries, which allow dumping registers:

$ cd /sys/kernel/debug/regmap
$ ls
40004000.timer  40009000.timer

$ cd 40009000.timer
$ cat registers
000: 00000003
004: 00000000
008: 00000000
...

It also comes with tracepoints[7]:

$ cd /sys/kernel/debug/tracing
$ cat available_events | grep regmap
...
regmap:regmap_reg_read
regmap:regmap_reg_write

6 Source code location[edit]

The LPTIM Linux driver is composed of:

7 References[edit]


<noinclude>

{{ArticleBasedOnModel | [[Linux driver article model]]}}
{{ArticleMainWriter | FabriceG}}
{{ReviewersList|FabriceG, GeraldB, BenjaminG}}
{{ArticleApprovedVersion| FabriceG | BenjaminG | No previous approved version | AnneJ - 16Oct'18 - 9230 | 16Oct'18}}
[[Category:Timers|1]]
[[Category:IIO]]</noinclude>

== Article purpose ==
This article introduces the LPTIM Linux<sup>&reg;</sup> driver for the LPTIM internal peripheral<ref name="LPTIM internal peripheral">[[LPTIM internal peripheral]]</ref>:
* Which LPTIM features are supported by the driver
* How to configure, use and debug the driver
* What is the driver structure, and where the source code can be found.

== Short description ==
The ''LPTIM''<ref name="LPTIM internal peripheral"/> Linux driver (kernel space) is based on the [[PWM overview|PWM]] and [[IIO overview|IIO]] frameworks. It provides several functionalities:

'''MFD driver''': 
* handles common resources (registers, clock)
'''PWM driver''': 
* handles the '''PWM output''' channel (single channel)
'''IIO hardware trigger driver''': 
* handles hardware '''trigger sources''' (synchronously with PWM) for other internal peripherals such as ADC<ref name="adc_internal">[[ADC internal peripheral]]</ref>, DAC<ref name="dac_internal">[[DAC internal peripheral]]</ref>, DFSDM<ref name="dfsdm_internal">[[DFSDM internal peripheral]]</ref>

'''IIO counter driver''': 
* handles the '''quadrature encoder''' interface<ref name="quadrature_encoder">[https://en.wikipedia.org/wiki/Rotary_encoder#Incremental_encoder Incremental encoder overview]</ref> as well as the external event counter.

== Configuration ==
=== Kernel configuration ===
Activate the LPTIM<ref name="LPTIM internal peripheral"/> Linux driver in the kernel configuration using the Linux Menuconfig tool: [[Menuconfig or how to configure kernel]].

Enable the following configurations (as well as their dependencies):
* CONFIG_MFD_STM32_LPTIMER
* CONFIG_PWM_STM32_LP
* CONFIG_IIO_STM32_LPTIMER_TRIGGER
* CONFIG_STM32_LPTIMER_CNT<pre>

Device Drivers  --->
   -> Multifunction device drivers  ---><*> Support for STM32 low-power timer
   -> Pulse-width modulation (PWM) support  ---><*> STMicroelectronics STM32 PWM LP
   -> Industrial I/O support  --->
      -> Triggers - standalone  ---><*> STM32 low-power timer trigger
      -> Counters  ---><*> STM32 low-power timer encoder counter driver</pre>


=== Device tree ===
Refer to the [[LPTIM device tree configuration]] article when configuring the LPTIM Linux kernel driver.

== How to use ==
[[PWM_overview#How_to_use_PWM_with_sysfs_interface|How to use PWM with sysfs interface]]

[[How to use the IIO user space interface#How to set up a TIM or LPTIM trigger using the sysfs interface|How to set up a TIM or LPTIM trigger using the sysfs interface]]

[[How to use the IIO user space interface#How to use the quadrature encoder with the sysfs interface|How to use the quadrature encoder with the sysfs interface]]

==How to trace and debug==
The LPTIM Linux driver can access LPTIM registers through REGMAP.

It comes with debugfs<ref name="debugfs">[[Debugfs]]</ref> entries, which allow dumping registers:
 $ cd /sys/kernel/debug/regmap
 $ ls
 40004000.timer  40009000.timer

 $ cd 40009000.timer
 $ cat registers
 000: 00000003
 004: 00000000
 008: 00000000
 ...

It also comes with tracepoints<ref name="ftrace">[[Ftrace]]</ref>:
 $ cd /sys/kernel/debug/tracing
 $ cat available_events | grep regmap
 ...
 regmap:regmap_reg_read
 regmap:regmap_reg_write

== Source code location ==
The LPTIM Linux driver is composed of:
* {{CodeSource | Linux kernel | drivers/mfd/stm32-lptimer.c | stm32-lptimer.c driver}} to handle common resources, such as registers and clock.
* {{CodeSource | Linux kernel | drivers/pwm/pwm-stm32-lp.c | pwm-stm32-lp.c driver}} to handle PWM channel
* {{CodeSource | Linux kernel | drivers/iio/trigger/stm32-lptimer-trigger.c | stm32-lptimer-trigger.c driver}} to handle trigger sources for other internal peripherals
* {{CodeSource | Linux kernel | drivers/iio/counter/stm32-lptimer-cnt.c | stm32-lptimer-cnt.c driver}} to handle quadrature encoder and external event counter
* {{CodeSource | Linux kernel | include/linux/mfd/stm32-lptimer.h}} and {{CodeSource | Linux kernel | include/linux/iio/timer/stm32-lptim-trigger.h}} header files

==References==<references />

<noinclude>

[[Category:Timers|1]]
[[Category:IIO]]
{{PublicationRequestId | 9230 | 2018-10-16 | AnneJ}}
{{ArticleBasedOnModel | Linux driver article model}}</noinclude>
Line 1: Line 1:
<noinclude>
 
{{ArticleBasedOnModel | [[Linux driver article model]]}}
 
{{ArticleMainWriter | FabriceG}}
 
{{ReviewersList|FabriceG, GeraldB, BenjaminG}}
 
{{ArticleApprovedVersion| FabriceG | BenjaminG | No previous approved version | AnneJ - 16Oct'18 - 9230 | 16Oct'18}}
 
[[Category:Timers|1]]
 
[[Category:IIO]]
 
</noinclude>
 
 
 
== Article purpose ==
 
== Article purpose ==
 
This article introduces the LPTIM Linux<sup>&reg;</sup> driver for the LPTIM internal peripheral<ref name="LPTIM internal peripheral">[[LPTIM internal peripheral]]</ref>:
 
This article introduces the LPTIM Linux<sup>&reg;</sup> driver for the LPTIM internal peripheral<ref name="LPTIM internal peripheral">[[LPTIM internal peripheral]]</ref>:
Line 90: Line 81:
 
==References==
 
==References==
 
<references />
 
<references />
  +
  +
<noinclude>
  +
[[Category:Timers|1]]
  +
[[Category:IIO]]
  +
{{PublicationRequestId | 9230 | 2018-10-16 | AnneJ}}
  +
{{ArticleBasedOnModel | Linux driver article model}}
  +
</noinclude>