pinctrl 子系统_pinctrl子系统

#include <linux/module.h>
#include <linux/platform\_device.h>
#include <linux/pinctrl/pinmux.h>
#include <linux/pinctrl/pinconf.h>
#include <linux/gpio.h>

static struct pinctrl \*pinctrl;
static struct pinctrl\_state \*pinctrl_state;

static int gpio_pin = 4;

static int pinctrl\_gpio\_probe(struct platform\_device \*pdev)
{
    int ret;

    // 获取 pinctrl 设备
    pinctrl = devm\_pinctrl\_get(&pdev->dev);
    if (IS\_ERR(pinctrl)) {
        dev\_err(&pdev->dev, "failed to get pinctrl\n");
        return PTR\_ERR(pinctrl);
    }

    // 配置引脚用于控制 GPIO
    pinctrl_state = pinctrl\_lookup\_state(pinctrl, "gpio");
    if (IS\_ERR(pinctrl_state)) {
        dev\_err(&pdev->dev, "failed to lookup gpio state\n");
        return PTR\_ERR(pinctrl_state);
    }

    // 配置 GPIO 引脚
    ret = gpio\_request(gpio_pin, "example");
    if (ret < 0) {
        dev\_err(&pdev->dev, "failed to request gpio pin\n");
        return ret;
    }

    // 应用 pinctrl 配置
    ret = pinctrl\_select\_state(pinctrl, pinctrl_state);
    if (ret < 0) {
        dev\_err(&pdev->dev, "failed to select pinctrl state\n");
        return ret;
    }

    return 0;
}

static int pinctrl\_gpio\_remove(struct platform\_device \*pdev)
{
    // 释放 GPIO 引脚
    gpio\_free(gpio_pin);

    return 0;
}

static const struct of\_device\_id pinctrl_gpio_match[] = {
    { .compatible = "example,pinctrl-gpio" },
    {},
};
MODULE\_DEVICE\_TABLE(of, pinctrl_gpio_match);

static struct platform\_driver pinctrl_gpio_driver = {
    .probe = pinctrl_gpio_probe,
    .remove = pinctrl_gpio_remove,
    .driver = {
        .name = "pinctrl-gpio",
        .owner = THIS_MODULE,
        .of_match_table = of\_match\_ptr(pinctrl_gpio_match),
    },
};

module\_platform\_driver(pinctrl_gpio_driver);

MODULE\_LICENSE("GPL");
MODULE\_AUTHOR("Example");
MODULE\_DESCRIPTION("Example pinctrl gpio driver");


以下是该 pinctrl 子系统的设备树代码示例:

pinctrl-gpio {
    compatible = "example,pinctrl-gpio";
    gpio = <&gpio4 0>;
    pinctrl-0 = <&gpio_pinmux>;
};

gpio_pinmux: gpio_pinmux {
    pinctrl-single,pins = <
        0x10 0x7   /\* GPIO4\_IO00 \*/
    >;
};


在设备树中,pinctrl-gpio 节点定义了 pinctrl 子系统,并指定了 GPIO 引脚的配置状态(在 pinctrl-0 属性中引用)。gpio_pinmux 节点定义了引脚的映射(在 pinctrl-single,pins 属性中定义),此处指定了 GPIO4_IO00 引脚。

需要注意的是,设备树中的 pinctrl 配置状态和 pinctrl 驱动程序中的 pinctrl 配置状态必须匹配。在这个例子中,pinctrl-gpio 节点中指定的配置状态名称为 “gpio”,而在 pinctrl_gpio_probe() 函数中查找并应用的状态也是 “gpio”。

以下是该 pinctrl 子系统的 Makefile 示例:

obj-m += pinctrl-gpio.o

KDIR ?= /lib/modules/$(shell uname -r)/build

all:
    make -C $(KDIR) M=$(PWD) modules

clean:
    make -C $(KDIR) M=$(PWD) clean


在 Makefile 中,我们定义了要编译的内核模块 pinctrl-gpio.o,并定义了内核源码的位置。在 all 目标中,我们使用 make 命令编译模块。在 clean 目标中,我们使用 make 命令清除编译生成的文件。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值