0
点赞
收藏
分享

微信扫一扫

第3部分 原理篇3可验证凭证(VC)(2)

朱小落 2024-03-07 阅读 7
linux

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成功注册到内核 

举报

相关推荐

0 条评论