meiyao 发表于 2024-4-11 19:35

《原子Linux驱动开发》+实战篇pwm

<p>Linux PWM(脉冲宽度调制)驱动实验通常涉及编写一个Linux内核模块,用于控制硬件上的PWM功能。</p>

<p>&nbsp;</p>

<p></p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p> &nbsp;</p>

<p><code>pwm_chip</code>&nbsp;结构体是PWM子系统的核心,它代表了一个PWM控制器。每个PWM控制器都会有一个与之对应的&nbsp;<code>pwm_chip</code>&nbsp;结构体实例。这个结构体包含了PWM控制器的各种信息,如操作的函数集合(<code>pwm_ops</code>)、PWM的数量(<code>npwm</code>)、PWM设备的列表(<code>pwms</code>)。</p>

<p> &nbsp;</p>

<p>&nbsp;</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, &amp;pdev-&gt;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(&amp;pdev-&gt;dev, sizeof(*imx), GFP_KERNEL);
    if (imx == NULL)
      return -ENOMEM;

    // 设置 imxchip 结构体的 PWM 操作函数指针和其他相关属性
    imx-&gt;chip.ops = &amp;imx_pwm_ops;
    imx-&gt;chip.dev = &amp;pdev-&gt;dev;
    imx-&gt;chip.base = -1;
    imx-&gt;chip.npwm = 1;
    imx-&gt;chip.can_sleep = true;

    // 获取 PWM 设备的内存资源
    r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    // 将物理地址映射到虚拟地址
    imx-&gt;mmio_base = devm_ioremap_resource(&amp;pdev-&gt;dev, r);
    if (IS_ERR(imx-&gt;mmio_base))
      return PTR_ERR(imx-&gt;mmio_base);

    // 获取与设备 ID 匹配的 PWM 数据
    data = of_id-&gt;data;

    // 设置 imxchip 结构体的 PWM 配置函数和使能函数
    imx-&gt;config = data-&gt;config;
    imx-&gt;set_enable = data-&gt;set_enable;

    // 将 PWM 芯片添加到 PWM 系统中
    ret = pwmchip_add(&amp;imx-&gt;chip);
    if (ret &lt; 0)
      return ret;

    // 将 imxchip 结构体设置为该设备的私有数据
    platform_set_drvdata(pdev, imx);

    return 0; // 初始化成功
}</code></pre>

<p>实际防出波形:</p>

<p> &nbsp;</p>

<p>在编写PWM驱动时,首先需要定义并初始化<code>pwm_chip</code>结构体实例,然后实现<code>pwm_ops</code>结构体中的操作函数,这些函数通常包括请求PWM设备、释放PWM设备、配置PWM周期和占空比、设置PWM极性、使能PWM以及禁用PWM等。这些函数的实现通常依赖于具体的PWM控制器硬件平台。</p>

lugl4313820 发表于 2024-4-12 08:18

66666,大佬这次上了逻辑分析,看来学有所成了呀,恭喜恭喜!

meiyao 发表于 2024-4-12 08:56

lugl4313820 发表于 2024-4-12 08:18
66666,大佬这次上了逻辑分析,看来学有所成了呀,恭喜恭喜!

<p>还在努力中。。。。。</p>

lugl4313820 发表于 2024-4-12 11:52

meiyao 发表于 2024-4-12 08:56
还在努力中。。。。。

<p>加油,看好你!</p>

meiyao 发表于 2024-4-13 16:16

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]
查看完整版本: 《原子Linux驱动开发》+实战篇pwm