《原子Linux驱动开发》+实战篇pwm
<p>Linux PWM(脉冲宽度调制)驱动实验通常涉及编写一个Linux内核模块,用于控制硬件上的PWM功能。</p><p> </p>
<p></p>
<p> </p>
<p> </p>
<p> </p>
<p><code>pwm_chip</code> 结构体是PWM子系统的核心,它代表了一个PWM控制器。每个PWM控制器都会有一个与之对应的 <code>pwm_chip</code> 结构体实例。这个结构体包含了PWM控制器的各种信息,如操作的函数集合(<code>pwm_ops</code>)、PWM的数量(<code>npwm</code>)、PWM设备的列表(<code>pwms</code>)。</p>
<p> </p>
<p> </p>
<p>代码学习:</p>
<pre>
<code>// imx_pwm_probe 函数用于初始化 PWM 设备
static int imx_pwm_probe(struct platform_device *pdev)
{
// 尝试匹配设备树中的 PWM 设备 ID
const struct of_device_id *of_id =
of_match_device(imx_pwm_dt_ids, &pdev->dev);
const struct imx_pwm_data *data;
struct imxchip *imx;
struct resource *r;
int ret = 0;
// 如果没有匹配到设备 ID,则返回错误
if (!of_id)
return -ENODEV;
// 分配 imxchip 结构体内存并初始化为 0
imx = devm_kzalloc(&pdev->dev, sizeof(*imx), GFP_KERNEL);
if (imx == NULL)
return -ENOMEM;
// 设置 imxchip 结构体的 PWM 操作函数指针和其他相关属性
imx->chip.ops = &imx_pwm_ops;
imx->chip.dev = &pdev->dev;
imx->chip.base = -1;
imx->chip.npwm = 1;
imx->chip.can_sleep = true;
// 获取 PWM 设备的内存资源
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
// 将物理地址映射到虚拟地址
imx->mmio_base = devm_ioremap_resource(&pdev->dev, r);
if (IS_ERR(imx->mmio_base))
return PTR_ERR(imx->mmio_base);
// 获取与设备 ID 匹配的 PWM 数据
data = of_id->data;
// 设置 imxchip 结构体的 PWM 配置函数和使能函数
imx->config = data->config;
imx->set_enable = data->set_enable;
// 将 PWM 芯片添加到 PWM 系统中
ret = pwmchip_add(&imx->chip);
if (ret < 0)
return ret;
// 将 imxchip 结构体设置为该设备的私有数据
platform_set_drvdata(pdev, imx);
return 0; // 初始化成功
}</code></pre>
<p>实际防出波形:</p>
<p> </p>
<p>在编写PWM驱动时,首先需要定义并初始化<code>pwm_chip</code>结构体实例,然后实现<code>pwm_ops</code>结构体中的操作函数,这些函数通常包括请求PWM设备、释放PWM设备、配置PWM周期和占空比、设置PWM极性、使能PWM以及禁用PWM等。这些函数的实现通常依赖于具体的PWM控制器硬件平台。</p>
66666,大佬这次上了逻辑分析,看来学有所成了呀,恭喜恭喜! lugl4313820 发表于 2024-4-12 08:18
66666,大佬这次上了逻辑分析,看来学有所成了呀,恭喜恭喜!
<p>还在努力中。。。。。</p>
meiyao 发表于 2024-4-12 08:56
还在努力中。。。。。
<p>加油,看好你!</p>
lugl4313820 发表于 2024-4-12 11:52
加油,看好你!
<p><img height="48" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/handshake.gif" width="48" /></p>
页:
[1]