Я настраиваю обработчик прерываний ядра с помощью:
irq_result = request_irq(53, gpeds_hdlr, 0, "gpeds_hdlr", NULL);
Затем я определяю свой обработчик прерываний с помощью:
irq_handler_t gpeds_hdlr(int irq, void *dev_id)
Компилятор жалуется на:
/home/pi/module/mod_gpio.c: In function ‘init_function’:
/home/pi/module/mod_gpio.c:86:31: error: passing argument 2 of ‘request_irq’ from incompatible pointer type [-Werror=incompatible-pointer-types]
irq_result = request_irq(53, gpeds_hdlr, 0, "gpeds_hdlr", NULL);
^~~~~~~~~~
In file included from /home/pi/module/mod_gpio.c:1:
./include/linux/interrupt.h:157:45: note: expected ‘irq_handler_t’ {aka ‘enum irqreturn (*)(int, void *)’} but argument is of type ‘irqreturn_t (* (*)(int, void *))(int, void *)’ {aka ‘enum irqreturn (* (*)(int, void *))(int, void *)’}
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
~~~~~~~~~~~~~~^~~~~~~
Если я определяю свой обработчик прерываний таким образом, как это предлагается в некоторых интернет-ресурсах:
irqreturn_t gpeds_hdlr(int irq, void *dev_id, struct pt_regs *regs) {
Затем я получаю очень похожую ошибку компиляции:
/home/pi/module/mod_gpio.c: In function ‘init_function’:
/home/pi/module/mod_gpio.c:85:31: error: passing argument 2 of ‘request_irq’ from incompatible pointer type [-Werror=incompatible-pointer-types]
irq_result = request_irq(53, gpeds_hdlr, 0, "gpeds_hdlr", NULL);
^~~~~~~~~~
In file included from /home/pi/module/mod_gpio.c:1:
./include/linux/interrupt.h:157:45: note: expected ‘irq_handler_t’ {aka ‘enum irqreturn (*)(int, void *)’} but argument is of type ‘irqreturn_t (*)(int, void *, struct pt_regs *)’ {aka ‘enum irqreturn (*)(int, void *, struct pt_regs *)’}
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
~~~~~~~~~~~~~~^~~~~~~
Как это обойти?
Примечание: linux/interrupt.h
содержит:
typedef irqreturn_t (*irq_handler_t)(int, void *);
и linux/irqreturn.h
, включенные из linux/interrupt.h
, содержат:
typedef enum irqreturn irqreturn_t;
Спасибо!
Третий параметр обработчика (
struct pt_regs *regs
) был удален в версии ядра 2.6.19 более 14 лет назад.Примечание: 53 — это не то, что вы думаете.
Да, номер отключен. (Ортогонально запросу, но да.)