This article will provide an in-depth introduction to the PWM (Pulse-Width Modulation) driver framework of Linux, including its implementation principles, driver addition methods, and debugging methods to help developers better understand and use this function.
The example Linux kernel version shown in this article is 6.2.8.
PWM technology, as a commonly used modulation technology, can change the duty cycle of the effective signal by adjusting the high-level time width of the periodic waveform, thereby achieving power supply control for the device. Common PWM application areas include screen backlight brightness adjustment, motor speed control, and fan speed control. The Linux kernel supports the PWM driver framework and provides the PWM driver framework core code and sysfs interface code by abstracting the structure data types of the PWM controller and PWM signals. Developers can use this driver framework to easily add their own specific PWM controller drivers and use the sysfs interface for functional debugging.
Driver developers can design a dedicated PWM controller structure as needed, using the struct pwm_chip structure as a member variable. The following is an example, in the ./drivers/pwm/pwm-ab8500.c driver definition.
(2) struct pwm_ops structure, including the operation function of the PWM controller. The two basic functions that should be implemented by driver developers are the apply function and the get_state function; the apply function is used to configure the PWM controller, including configuring the enable state, period, duty cycle, polarity, etc. of the PWM signal; the get_state function is used Obtain the initial status of the specified PWM channel signal when registering the PWM controller, including enable status, period, duty cycle, polarity, etc.
(3) struct pwm_device structure, representing the PWM signal output by the PWM controller.
3.3 Driver Framework Core Function
(1) pwmchip_add function. Used to register a new PWM controller device. Defined in ./drivers/pwm/core.c.
(2) pwmchip_remove function. Used to remove a PWM controller device. Defined in ./drivers/pwm/core.c.
3.4 Driver typical implementation method
(1) Summary
The PWM driver source file is located in the ./drivers/pwm path. The driver developer needs to add the corresponding source file. The source file design can refer to the driver code of other manufacturers. Referring to the naming style of the original code, you can name the newly added driver source file pwm-xx.c, name the probe and remove functions as xx_pwm_probe and xx_pwm_remove respectively, and define the PWM controller structure as struct xx_pwm_chip. The files in the ./drivers/pwm path are as follows.
(2) apply function and get_state function definition
According to the PWM controller manual, the apply function and get_state function are defined by the driver developer.
(3)xx_pwm_probe function definition
The implementation method of the xx_pwm_probe function is: first initialize the PWM controller structure struct xx_pwm_chip variable, and then call the PWM driver framework core function pwmchip_add to register a new PWM controller device.
(4)xx_pwm_remove function definition
xx_pwm_remove function is implemented by calling the PWM driver framework core function pwmchip_remove to remove a PWM controller device.
4. Driver addition method
4.1 Add driver source file
Follow the method described in Section 3.4, write the driver source file pwm-xx.c, and add it to the ./drivers/pwm path.
4.2 Add compilation support
(1) Modify the Kconfig file under the ./drivers/pwm path and add the added PWM driver configuration options.
(2) Modify the Makefile file in the ./drivers/pwm path and add the compilation option of pwm-xx.c.
(3) In the memuconfig interface, enable the added PWM driver. The configuration interface is as follows.
4.3 Add PWM controller device tree node
Add the PWM controller device tree node in the device tree. The basic properties of this node include compatibility, registers and number of #pwm-cells. Add interrupts, clocks, resets and other properties as needed.
PWM controller device tree design method can refer to ./Documentation/devicetree/bindings/pwm.
The following is an example of a PWM controller device tree node. The reference documents are as follows:
./Documentation/devicetree/bindings/pwm/nvidia,tegra20-pwm.yaml.
5.Debugging method
Use the sysfs interface to perform functional debugging of the PWM driver. Examples of the main debugging commands are as follows.
(1) View PWM controller node
ls /sys/class/pwm/pwmchip0
(2) Open the specified PWM channel signal
echo n > /sys/class/pwm/pwmchip0/export
//n is the channel number
(3)Set the PWM signal period
echo pvalue > /sys/class/pwm/pwmchip0/pwm0/period
//pvalue is the period value
(4)Set the PWM signal duty cycle
echo dvalue > /sys/class/pwm/pwmchip0/pwm0/duty_cycle
//dvalue is the effective level width value
(5) Enable a certain PWM channel signal
echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable
(6) Disable a certain PWM channel signal
echo 0 > /sys/class/pwm/pwmchip0/pwm0/enable
The above is the detailed content of Linux PWM driver. For more information, please follow other related articles on the PHP Chinese website!