我写了一个(工作)内核模块,它使用返回一个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
驱动程序用于类似的目的。