在Linux中,GPIO是一种通用的输入输出接口,可以用来连接各种外设,如LED灯、按键、传感器等等,而IRQ中断线则是用来处理硬件中断的。因此,将GPIO引脚映射成IRQ中断线,可以使Linux内核更加高效地处理外设的输入输出。 在本文中,我们将详细介绍gpio_to_irq函数的原理、实现方法以及使用场景。 一、gpio_to_irq函数的原理 ...
之前在调试传感器模块的时候发现,在结构体声明的时候irq成员使用gpio_to_irq会报错,而动态使用的话就没有问题。就对gpio_to_irq为什么不能静态使用产生了疑问。恰巧最近又有朋友遇到了同样的问题,也就提醒了我,去找出原因。 开始测试 我写了一个简单的linux执行程序进行测试,因为在内核源码中发现不同平台对gpi...
intsamsung_gpiolib_to_irq(structgpio_chip *chip, unsignedintoffset) { //获得gpio_chip结构体所在的父结构体s3c_gpio_chip的指针 structs3c_gpio_chip *s3c_chip =container_of(chip,structs3c_gpio_chip, chip); //获取虚拟映射机制中定义的终端号returns3c_chip->irq_base +offset; IRQ_EINT(16) } ...
回到开始的问题gpio_to_irq为什么不能静态使用?就是因为很多平台代码都将gpio_to_irq实现成为了函数,而非宏定义,这样就只能进行动态引用。但是,这在驱动编写中也不是什么问题,在上面已经说过,只要在设备资源生效前(设备注册前)将其irq动态赋值好就可以了,现有的很多成熟平台也是这样做的,并没有问题。这里我探究这个...
/* irq_gpio:gpio ABCDE controller irq number */ /* * call gpio_mask_irq * chip and chip data is registerd at gic_init */ irq_set_chained_handler(irq_gpio, gpio_handler); /* set gpio ABCDE irq desc->handle_irq:gpio_handler() */ struct irq_desc *desc = irq_to_desc(irq_gpio...
int (*to_irq)(struct gpio_chip *chip, unsigned offset); void (*dbg_show)(struct seq_file *s, struct gpio_chip *chip); //GPIO控制器中引脚的号码基值 int base; //GPIO控制器中引脚的个数 u16 ngpio; //每个引脚的名字 const char *const *names; ...
retval = gpiochip_irqchip_add(&priv->chip, &mrfld_irqchip, irq_base, handle_bad_irq, IRQ_TYPE_NONE); if (retval) { dev_err(&pdev->dev, "could not connect irqchip to gpiochip\n"); return retval; } For the kernels in the range v5.5..v5.19 For the above mentioned driver ...
[ 5.542593] pps-gpio pps@0: failed to map GPIO to IRQ: -22 [ 5.542626] pps-gpio: probe of pps@0 failed with error -22 If I 'rmmod/modprobe' the pps-gpio/pps-ldisc modules I see pps0 created: [ 54.983158] pps pps0: new PPS source serial1 [ 54.983284] pps pps0: source "/de...
{free_irq(gpio_info->firefly_irq,gpio_info);dev_err(&pdev->dev,"Failed to request IRQ:%d\n",ret);}}printk("Firefly irq gpio finish\n");return0;}staticirqreturn_tfirefly_gpio_irq(intirq,void*dev_id)//interruptfunction{printk("Enter firefly gpio irq test program!\n");returnIRQ_...
.irq = PXA_GPIO_TO_IRQ(GPIO_ACCEL_IRQ), \ } @@ -700,7 +714,6 @@ static struct lis3lv02d_platform_data lis3_pdata = { .max_speed_hz = 1000000, \ .bus_num = 0, \ .chip_select = 2, \ .controller_data = (void *) GPIO_MCLK_DAC_CS, \ } static struct spi_board_info...