1. Article purpose[edit | edit source]
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 | edit source]
The LPTIM[1] Linux driver (kernel space) is based on the PWM, IIO and counter 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]
Counter driver:
- handles the quadrature encoder interface[5] as well as the external event counter.
Clocksource driver:
3. Configuration[edit | edit source]
3.1. Kernel configuration[edit | edit source]
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
- CONFIG_CLKSRC_STM32_LP
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 -> Counter support ---> <*> STM32 LP Timer encoder counter driver -> Clock Source drivers ---> <*> Low power clocksource for STM32 SoCs
3.2. Device tree[edit | edit source]
Refer to the LPTIM device tree configuration article when configuring the LPTIM Linux kernel driver.
4. How to use[edit | edit source]
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
LPTIM clocksource driver can be used as the Linux scheduling-clock during the low power modes, see timer documentation for details.
5. How to trace and debug[edit | edit source]
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 | edit source]
The LPTIM Linux driver is composed of:
- MFD driver: stm32-lptimer.c to handle common resources, such as registers and clock.
- PWM driver: pwm-stm32-lp.c to handle PWM channel
- IIO hardware trigger driver: stm32-lptimer-trigger.c to handle trigger sources for other internal peripherals
- Counter driver: stm32-lptimer-cnt.c to handle quadrature encoder and external event counter
- Clock Source driver: timer-stm32-lp.c to schedule events
7. References[edit | edit source]