网站管理员登陆不了,丰台网站制作,解决wordpress后台卡顿,群晖wordpress目录#x1f680;返回专栏总目录 文章目录 一、pinctrl函数介绍二、设备树案例三、驱动案例 沉淀、分享、成长#xff0c;让自己和他人都能有所收获#xff01;#x1f604; #x1f4e2;本篇将介绍pinctrl api及其使用案例 。
一、pinctrl函数介绍 ①获取设备对应的 pinctrl…返回专栏总目录 文章目录 一、pinctrl函数介绍二、设备树案例三、驱动案例 沉淀、分享、成长让自己和他人都能有所收获 本篇将介绍pinctrl api及其使用案例 。
一、pinctrl函数介绍 ①获取设备对应的 pinctrl 结构体指针函数 该函数的功能是根据给定的设备对象 dev 获取与其相关联的 pinctrl 实例。 pinctrl 是 Linux内核中用于管理和控制引脚的框架。 通过调用该函数 可以获得设备对象所使用的 pinctrl 实例 以便进行引脚配置和控制操作。
②释放 pinctrl 指针函数 该函数的功能是释放由 pinctrl_get() 函数获得的 pinctrl 实例 以释放相关资源。 在使用完pinctrl 实例后 调用该函数可以确保正确释放相关资源 避免内存泄漏。
③释放 pinctrl 指针函数 该函数的功能是在给定的 pinctrl 实例 p 中查找指定名称的 pinctrl 状态。 pinctrl 状态是与引脚相关的配置和控制状态 例如引脚模式、 电气属性等。
④释放 pinctrl 指针函数 该函数的功能是将指定的 pinctrl 状态 s 设置到硬件上。 pinctrl 状态是与引脚相关的配置和控制状态 例如引脚模式、 电气属性等。
二、设备树案例 my_gpio:gpio1_a0 {compatible mygpio;my-gpios gpio1 RK_PA0 GPIO_ACTIVE_HIGH;pinctrl-names myled1;pinctrl-0 mygpio_ctrl;
};三、驱动案例 #include linux/module.h
#include linux/platform_device.h
#include linux/mod_devicetable.h
#include linux/gpio/consumer.h
#include linux/gpio.hunsigned int count;
struct fwnode_handle *child_fw NULL;
struct gpio_desc *led[2];
int i 0;
int num 0;// 平台设备初始化函数
static int my_platform_probe(struct platform_device *dev)
{printk(This is my_platform_probe\n);// 获取父设备节点的子设备节点数量count device_get_child_node_count(dev-dev);printk(count is %d\n, count);for (i 0; i count; i) {// 获取下一个子设备节点child_fw device_get_next_child_node(dev-dev, child_fw);if (child_fw) {// 获取子设备节点中名为 my-gpios 的 GPIO 描述led[i] fwnode_get_named_gpiod(child_fw, my-gpios, 0, 0, LED);}// 将 GPIO 描述转换为 GPIO 号num desc_to_gpio(led[i]);printk(num is %d\n, num);}return 0;
}// 平台设备的移除函数
static int my_platform_remove(struct platform_device *pdev)
{printk(KERN_INFO my_platform_remove: Removing platform device\n);// 清理设备特定的操作// ...return 0;
}const struct of_device_id of_match_table_id[] {{.compatiblemygpio},
};// 定义平台驱动结构体
static struct platform_driver my_platform_driver {.probe my_platform_probe,.remove my_platform_remove,.driver {.name my_platform_device,.owner THIS_MODULE,.of_match_table of_match_table_id,},
};// 模块初始化函数
static int __init my_platform_driver_init(void)
{int ret;// 注册平台驱动ret platform_driver_register(my_platform_driver);if (ret) {printk(KERN_ERR Failed to register platform driver\n);return ret;}printk(KERN_INFO my_platform_driver: Platform driver initialized\n);return 0;
}// 模块退出函数
static void __exit my_platform_driver_exit(void)
{// 注销平台驱动platform_driver_unregister(my_platform_driver);printk(KERN_INFO my_platform_driver: Platform driver exited\n);
}module_init(my_platform_driver_init);
module_exit(my_platform_driver_exit);驱动加载后可以通过节点查看复用关系。
cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins | grep 32