栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

编写虚拟GPIO控制器的驱动程序

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

编写虚拟GPIO控制器的驱动程序

一、硬件功能

假设这个虚拟的GPIO Controller有4个引脚:

二、编写设备树文件
gpio_virt: virtual_gpiocontroller {
	compatible = "100ask,virtual_gpio";
    gpio-controller;
    #gpio-cells = <2>;
    ngpios = <4>;
};
三、编写驱动程序
#include 
#include 
#include 
#include 
#include 
#include 
#include 

static struct gpio_chip *g_virt_gpio;
static int g_gpio_val = 0;

static const struct of_device_id virtual_gpio_of_match[] = {
        { .compatible = "100ask,virtual_gpio", },
        {  }
};

static int virt_gpio_direction_output(struct gpio_chip *gc,
                unsigned offset, int val)
{
        printk("%s %dn", __FUNCTION__, __LINE__);
        printk("set pin %d as output %sn", offset, val ? "high" : "low");
        return 0;
}

static int virt_gpio_direction_input(struct gpio_chip *gc,
                unsigned offset)
{
        printk("%s %dn", __FUNCTION__, __LINE__);
        printk("set pin %d as inputn", offset);
        return 0;
}

static int virt_gpio_get_value(struct gpio_chip *gc, unsigned offset)
{
        printk("%s %dn", __FUNCTION__, __LINE__);
        return (g_gpio_val & (1<dev, sizeof(*g_virt_gpio), GFP_KERNEL);

        g_virt_gpio->label = pdev->name;
        g_virt_gpio->direction_output = virt_gpio_direction_output;
        g_virt_gpio->direction_input = virt_gpio_direction_input;
        g_virt_gpio->get = virt_gpio_get_value;
        g_virt_gpio->set = virt_gpio_set_value;

        g_virt_gpio->parent = &pdev->dev;
        g_virt_gpio->owner = THIS_MODULE;

        g_virt_gpio->base = -1;
        ret = of_property_read_u32(pdev->dev.of_node, "ngpios", &val);
        g_virt_gpio->ngpio = val;

        ret = devm_gpiochip_add_data(&pdev->dev, g_virt_gpio, NULL);

        return 0;
}

static int virtual_gpio_remove(struct platform_device *pdev)
{
        printk("%s %dn", __FUNCTION__, __LINE__);
        return 0;
}

static struct platform_driver virtual_gpio_driver = {
        .driver = {
                .name = "vitual-gpio",
                .of_match_table = of_match_ptr(virtual_gpio_of_match),
        },
        .probe = virtual_gpio_probe,
        .remove = virtual_gpio_remove,
};

static int virtual_gpio_init(void)
{
        printk("%s %dn", __FUNCTION__, __LINE__);
        return platform_driver_register(&virtual_gpio_driver);
}

static void virtual_gpio_exit(void)
{
        printk("%s %dn", __FUNCTION__, __LINE__);
        platform_driver_unregister(&virtual_gpio_driver);
}

module_init(virtual_gpio_init);
module_exit(virtual_gpio_exit);
MODULE_LICENSE("GPL");
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/729719.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号