#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年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新!!