如何从内核模块提供中断生成gpio



我写了一个(工作)内核模块,它使用返回一个struct gpio_chip实例来指定应该如何处理读取和写入(使用模块提供的gpio)。

static struct gpio_chip template_chip = {
.label                  = "my_module",
.owner                  = THIS_MODULE,
.get_direction          = my_module_gpio_get_direction,
.direction_input        = my_module_gpio_direction_in,
.get                    = my_module_gpio_get,
.direction_output       = my_module_gpio_direction_out,
.set                    = my_module_gpio_set,
.to_irq                 = my_module_gpio_to_irq,
.can_sleep              = true,
};
static int my_module_gpio_probe(struct platform_device *pdev)
{
struct my_module *my_module = dev_get_drvdata(pdev->dev.parent);
struct my_module_platform_data *pdata = dev_get_platdata(my_module->dev);
struct my_module_gpio_data *my_module_gpio;
int ret;
printk(KERN_INFO "my_module_gpio_proben");
my_module_gpio = devm_kzalloc(&pdev->dev, sizeof(*my_module_gpio), GFP_KERNEL);
if (my_module_gpio == NULL)
return -ENOMEM;
my_module_gpio->my_module = my_module;
my_module_gpio->gpio_chip = template_chip;
my_module_gpio->gpio_chip.ngpio = NUM_GPIOS;
my_module_gpio->gpio_chip.parent = &pdev->dev;
...

我现在希望我的(软件生成的)gpio能够生成当我的模块改变GPIO值时中断。

我想同时支持旧的/sys/class/gpio接口和新的chardev接口。

在谷歌中,我发现了很多关于如何使用的例子。内核模块中的中断。

我需要做什么来产生中断我的模块的gpio ?

为了测试内核中的GPIO库,gpio-sim模块已经创建,它模拟了常规GPIO芯片可以做的事情,包括中断生成。

负责的代码位于gpio_sim_apply_pull()中。不要看函数名,因为它只是应用了人工行的完整状态。

请注意,在较旧的内核中,gpio-mockup驱动程序用于类似的目的。

相关内容

  • 没有找到相关文章

最新更新