c-request_irq中的dev_id参数是什么?
作者:互联网
在函数声明中
int request_irq(unsigned int irq,
irqreturn_t (*handler)(int, void *, struct pt_regs *),
unsigned long irqflags,
const char *devname,
void *dev_id);
dev_id是“ in”参数还是“ out”参数?
我们从哪里得到这个号码?
解决方法:
Dev_id是输入参数,并且必须是全局唯一的.通常,设备数据结构的地址用作Dev_id.
如果不共享中断线,则其值为NULL.仅当共享中断线时,它才有意义.共享时,此参数唯一地标识共享IRQ上的中断处理程序.
但是最近为了更快地处理中断,Linux内核已移至request_threaded_irq.
例如,在Linux内核中,用于wm8903音频编解码器的i2c驱动程序以以下方式使用此API-使用request_threaded_irq()但使用dev_id相同.
设备结构为:
117 struct wm8903_priv {
118 struct wm8903_platform_data *pdata;
119 struct device *dev;
120 struct snd_soc_codec *codec;
121 struct regmap *regmap;
122
123 int sysclk;
124 int irq;
125
126 int fs;
127 int deemph;
128
129 int dcs_pending;
130 int dcs_cache[4];
131
132 /* Reference count */
133 int class_w_users;
134
135 struct snd_soc_jack *mic_jack;
136 int mic_det;
137 int mic_short;
138 int mic_last_report;
139 int mic_delay;
140
141 #ifdef CONFIG_GPIOLIB
142 struct gpio_chip gpio_chip;
143 #endif
144 };
处理程序定义一个指向该结构的指针:
2029 struct wm8903_priv *wm8903; //this is the dev_id parameter
然后调用request_threaded_irq(),
ret = request_threaded_irq(i2c->irq, NULL, wm8903_irq,
2156 trigger | IRQF_ONESHOT,
2157 "wm8903", wm8903);
标签:interrupt,embedded-linux,linux-device-driver,c-3,linux 来源: https://codeday.me/bug/20191122/2055957.html