10_pinctrlLinux内核模块

01_basicLinux内核模块-CSDN博客文章浏览阅读319次,点赞3次,收藏3次。环境ID=ubuntuMakefilemodules:clean:basic.creturn 0;运行效果。https://blog.csdn.net/m0_37132481/article/details/136157384

my_pinctrl.c

#include <linux/kernel.h>
#include <linux/module.h>#include <linux/device.h>
#include <linux/slab.h>#include <linux/pinctrl/machine.h>
#include <linux/pinctrl/pinctrl.h>
#include <linux/pinctrl/pinmux.h>
#include <linux/pinctrl/pinconf.h>#define TAG "HELLO# "static int my_set_mux(struct pinctrl_dev *pctrldev, unsigned int function, unsigned int group)
{printk(TAG "%s called\n", __func__);return 0;
}static int my_get_func_groups(struct pinctrl_dev *pctrldev, unsigned int function, const char * const **groups, unsigned int * const num_groups)
{printk(TAG "%s called\n", __func__);return 1;
}
static const char *my_get_func_name(struct pinctrl_dev *pctrldev, unsigned int function)
{printk(TAG "%s called\n", __func__);return __func__;
}
static int my_get_funcs_count(struct pinctrl_dev *pctrldev)
{printk(TAG "%s called\n", __func__);return 2;
}
static int my_group_config_set(struct pinctrl_dev *pctrldev, unsigned int group, unsigned long *configs, unsigned int num_configs)
{printk(TAG "%s called\n", __func__);return 0;
}
static int my_group_config_get(struct pinctrl_dev *pctrldev, unsigned int group, unsigned long *config)
{printk(TAG "%s called\n", __func__);return 0;
}static void my_pin_dbg_show(struct pinctrl_dev *pctrldev, struct seq_file *s, unsigned int offset)
{printk(TAG "%s called\n", __func__);
}
static int my_get_group_pins(struct pinctrl_dev *pctrldev, unsigned int group, const unsigned int **pins, unsigned int *num_pins)
{printk(TAG "%s called\n", __func__);return 0;
}
static const char *my_get_group_name(struct pinctrl_dev *pctrldev, unsigned int group)
{printk(TAG "%s called\n", __func__);return __func__;
}
static int my_get_groups_count(struct pinctrl_dev *pctrldev)
{printk(TAG "%s called\n", __func__);return 1;
}static void my_pinctrl_free_map(struct pinctrl_dev *pctldev, struct pinctrl_map *map, unsigned num_maps)
{printk(TAG "%s called\n", __func__);
}
static int my_pin_config_get(struct pinctrl_dev *pctrldev, unsigned int pin, unsigned long *config)
{printk(TAG "%s called\n", __func__);return 0;
}
static int my_pin_config_set(struct pinctrl_dev *pctrldev, unsigned int pin, unsigned long *configs, unsigned int num_configs)
{printk(TAG "%s called\n", __func__);return 0;
}
static int my_pinconf_dt_node_to_map(struct pinctrl_dev *pctldev, struct device_node *np_config, struct pinctrl_map **map, unsigned *num_maps, enum pinctrl_map_type type)
{printk(TAG "%s called\n", __func__);return 0;
}
static inline int my_pinconf_dt_node_to_map_all(struct pinctrl_dev *pctldev, struct device_node *np_config, struct pinctrl_map **map, unsigned *num_maps)
{printk(TAG "%s called\n", __func__);return 0;
}static struct pinctrl_pin_desc my_pin_desc[] = {{0, "my_soc_pin1", NULL},{1, "my_soc_pin2", NULL},
};/* pinctrl_ops */
static const struct pinctrl_ops my_pinctrl_ops = {.get_groups_count = my_get_groups_count,.get_group_name = my_get_group_name,.get_group_pins = my_get_group_pins,.pin_dbg_show = my_pin_dbg_show,.dt_node_to_map = my_pinconf_dt_node_to_map_all,.dt_free_map = my_pinctrl_free_map,
};/* pinconf_ops */
static const struct pinconf_ops my_pinconf_ops = {.is_generic = true,.pin_config_get = my_pin_config_get,.pin_config_set = my_pin_config_set,.pin_config_group_get = my_group_config_get,.pin_config_group_set = my_group_config_set,
};/* pinmux_ops */
static const struct pinmux_ops my_pinmux_ops = {.get_functions_count = my_get_funcs_count,.get_function_name = my_get_func_name,.get_function_groups = my_get_func_groups,.set_mux = my_set_mux,
};/* pinctrl_desc */
static struct pinctrl_desc my_pinctrl_desc = {.owner = THIS_MODULE,.name = "my_pinctrl_desc",.pctlops = &my_pinctrl_ops,.pmxops = &my_pinmux_ops,.confops = &my_pinconf_ops,.pins = &my_pin_desc[0],.npins = sizeof(my_pin_desc) / sizeof(my_pin_desc[0]),
};static struct device *my_pinctrl_dev = NULL;static int my_pinctrl_init(void)
{int ret = 0;struct pinctrl_dev *pctldev = NULL;printk(TAG "%s called\n", __func__);/* my_pinctrl_dev */my_pinctrl_dev = kzalloc(sizeof(*my_pinctrl_dev), GFP_KERNEL);my_pinctrl_dev->init_name = "my_pinctrl_device";ret = device_register(my_pinctrl_dev);my_pinctrl_dev = get_device(my_pinctrl_dev);pctldev = devm_pinctrl_register(my_pinctrl_dev, &my_pinctrl_desc, NULL);if(IS_ERR(pctldev)){printk(TAG "fail\n");}else{printk(TAG "ok\n");}return 0;
}
static void my_pinctrl_exit(void)
{device_unregister(my_pinctrl_dev);kfree(my_pinctrl_dev);printk(TAG "%s called\n", __func__);
}module_init(my_pinctrl_init);
module_exit(my_pinctrl_exit);
MODULE_LICENSE("GPL");

效果

可以看到添加的2个pin成功注册到内核 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/518681.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

成都正信:亲戚借了钱一直不还怎么委婉的说

在中国传统文化中&#xff0c;亲情关系往往被视为最为重要和敏感的部分。当亲戚间发生借贷时&#xff0c;若出现拖欠不还的情形&#xff0c;处理起来尤为棘手。面对这样的尴尬局面&#xff0c;采取委婉而有效的沟通方式至关重要。 张华最近就遇到了这样的困扰。他的表弟去年因急…

Chapter20-Ideal gases-CIE课本要点摘录、总结(编辑中)

20.1 Particles of a gas Brownian motion Fast modules 速率的数值大概了解下&#xff1a; average speed of the molecules:400m/s speed of sound:approximately 330m/s at STP&#xff08;standard temperature and pressure&#xff09; Standard Temperature and Pres…

DiffuRec扩散推荐模型笔记

1 Title DiffuRec: A Diffusion Model for Sequential Recommendation&#xff08;ZIHAO LI、CHENLIANG L、AIXIN SUN&#xff09;【2023 ACM Transactions on Information Systems】 2 Conclusion This paper is the first attempt to apply the diffusion model to SR, and…

【JDBC】Java连接数据库

目录 JDBC的工作原理JDBC API&#xff1a;JDBC开发步骤加载并注册JDBC驱动&#xff1a;建立数据库连接&#xff1a;创建Statement对象&#xff1a;执行SQL语句&#xff1a;处理结果&#xff1a;Connection接口的常用方法Statement接口的常用方法ResultSet接口的常用方法 SQL注入…

LeetCode.2917. 找出数组中的 K-or 值

题目 2917. 找出数组中的 K-or 值 分析 这道题其实是要我们求第i位二进制为1的元素个数至少为k&#xff0c;把符合条件的2^i全部加到一起。 因此&#xff0c;我们的思路就是枚举数组的每一位&#xff0c;并且进行以下两个步骤&#xff1a; 统计所有元素第i位1的个数cnt。…

20240306-1-大数据的几个面试题目

面试题目 1. 相同URL 题目: 给定a、b两个文件&#xff0c;各存放50亿个url&#xff0c;每个url各占64字节&#xff0c;内存限制是4G&#xff0c;让你找出a、b文件共同的url&#xff1f; 方案1&#xff1a;估计每个文件的大小为50G64320G&#xff0c;远远大于内存限制的4G。所以…

【系统学习】2-Java进阶知识总结-3-集合-1-补充【泛型、树、数据结构】

文章目录 泛型什么是泛型&#xff1f;常见的泛型标识符泛型类泛型方法泛型接口通配符 树树的基本概念什么是二叉树&#xff1f;二叉树--普通二叉树二叉树--二叉查找树定义规则优缺点 二叉树--平衡二叉树定义规则旋转机制 二叉树--红黑树定义规则红黑规则 常见数据结构总体特点结…

实时渲染技术流化方案在ilab评审中有哪些作用?

先说两个在日常沟通中一线用户反馈的&#xff0c;高校虚拟仿真课程在使用中遇到的场景。 场景1&#xff1a;虚拟仿真课程开发比较早&#xff0c;当时使用的引擎是 web player&#xff0c;学生使用的机器也好几年了&#xff0c;原来的课程在使用的过程中加载很慢&#xff0c;无…

数据结构—KMP 算法:

算法思想&#xff1a; KMP算法实现寻找主串中子串的位置时&#xff0c;主串指针地址不回退&#xff0c;在比对过程中串仅仅遍历一次&#xff0c;子串的回退可以是与当前主串可重新最多匹配的地址位置。 BF与KMP算法比对&#xff1a; KMP BF 主串不用回退 主串回退&#xf…

OracleXE112、plsqldev1207的安装和基本配置

OracleXE112、plsqldev1207的安装和基本配置 OracleXE112、plsqldev1207的安装和基本配置Oracle安装oracle是什么Oracle两个版本下载安装包 安装OracleXE112_Win64注意&#xff1a;安装到空目录下&#xff1b;输入口令&#xff08;记住啊&#xff01;&#xff09;安装成功&…

线性表试题(二)——顺序表应用

二、综合应用题 01&#xff0e;从顺序表中删除具有最小值的元素&#xff08;假设唯一&#xff09;并由函数返回被删元素的值。空出的位置由最后一个元素填补&#xff0c;若顺序表为空&#xff0c;则显示出错信息并退出运行。 02&#xff0e;设计一个高效算法&#xff0c;将顺序…

Leetcoder Day39| 动态规划part06 完全背包问题

完全背包理论 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 示例&#xff1a; 背包最大…