#linux-kernel #raspberry-pi #linux-device-driver #raspberry-pi3
#linux-ядро #raspberry-pi #linux-device-driver #raspberry-pi3
Вопрос:
Вот некоторая часть исходного кода моего драйвера:
#define KEYBOARD_IRQ 1
err = request_irq(KEYBOARD_IRQ, (irq_handler_t) st7735_keyboard_interrupt,
IRQF_SHARED, "st7735_keyboard_interrupt",
(void *)(st7735_keyboard_interrupt));
if(err) {
printk(KERN_ERR "ST7735 : ERROR : Failed to request keyboard interruptn");
return err;
}
Возвращаемое значение равно -22 — EINVAL. Я подозреваю, что проблема в номере IRQ клавиатуры. Клавиатура подключена к RPi.
cat / proc / шина / ввод / устройства:
I: Bus=0003 Vendor=1c4f Product=0026 Version=0110
N: Name="SIGMACHIP USB Keyboard"
P: Phys=usb-3f980000.usb-1.4/input0
S: Sysfs=/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.4/1-1.4:1.0/0003:1C4F:0026.0001/input/input0
U: Uniq=
H: Handlers=sysrq kbd leds event0
B: PROP=0
B: EV=120013
B: KEY=10000 7 ff800000 7ff febeffdf f3cfffff ffffffff fffffffe
B: MSC=10
B: LED=7
I: Bus=0003 Vendor=1c4f Product=0026 Version=0110
N: Name="SIGMACHIP USB Keyboard"
P: Phys=usb-3f980000.usb-1.4/input1
S: Sysfs=/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.4/1-1.4:1.1/0003:1C4F:0026.0002/input/input1
U: Uniq=
H: Handlers=kbd event1
B: PROP=0
B: EV=1f
B: KEY=3007f 0 0 0 0 483ffff 17aff32d bf544446 0 0 1 130c13 b17c000 267bfa d941dfed 9e1680 4400 0 10000002
B: REL=40
B: ABS=1 0
B: MSC=10
cat / proc / прерывания:
CPU0 CPU1 CPU2 CPU3
16: 0 0 0 0 bcm2836-timer 0 Edge arch_timer
17: 11098 13199 12423 3164 bcm2836-timer 1 Edge arch_timer
21: 0 0 0 0 bcm2836-pmu 9 Edge arm-pmu
23: 929 0 0 0 ARMCTRL-level 1 Edge 3f00b880.mailbox
24: 2 0 0 0 ARMCTRL-level 2 Edge VCHIQ doorbell
46: 0 0 0 0 ARMCTRL-level 48 Edge bcm2708_fb dma
48: 0 0 0 0 ARMCTRL-level 50 Edge DMA IRQ
50: 0 0 0 0 ARMCTRL-level 52 Edge DMA IRQ
51: 355 0 0 0 ARMCTRL-level 53 Edge DMA IRQ
54: 1995 0 0 0 ARMCTRL-level 56 Edge DMA IRQ
55: 0 0 0 0 ARMCTRL-level 57 Edge DMA IRQ
56: 0 0 0 0 ARMCTRL-level 58 Edge DMA IRQ
59: 0 0 0 0 ARMCTRL-level 61 Edge bcm2835-auxirq
62: 1348363 0 0 0 ARMCTRL-level 64 Edge dwc_otg, dwc_otg_pcd, dwc_otg_hcd:usb1
83: 0 0 0 0 ARMCTRL-level 85 Edge 3f804000.i2c
84: 102410 0 0 0 ARMCTRL-level 86 Edge 3f204000.spi
86: 285 0 0 0 ARMCTRL-level 88 Edge mmc0
87: 4819 0 0 0 ARMCTRL-level 89 Edge uart-pl011
92: 30543 0 0 0 ARMCTRL-level 94 Edge mmc1
FIQ: usb_fiq
IPI0: 0 0 0 0 CPU wakeup interrupts
IPI1: 0 0 0 0 Timer broadcast interrupts
IPI2: 3946 26730 81970 29799 Rescheduling interrupts
IPI3: 17 4 7 7 Function call interrupts
IPI4: 0 0 0 0 CPU stop interrupts
IPI5: 1854 1806 5681 314 IRQ work interrupts
IPI6: 0 0 0 0 completion interrupts
Помогите мне, пожалуйста, понять, как я должен запрашивать клавиатурный IRQ в моей системе.
Комментарии:
1. Что вы пытаетесь здесь сделать? ST7735 — это маленький TFT-контроллер, вы пытаетесь передать некоторые аппаратные кнопки на дисплейном модуле в качестве клавиатуры? Если да, то как они подключены — если у них разные контакты, можете ли вы использовать прерывания GPIO, возможно, даже в пользовательском пространстве? Если вам нужно опросить их через SPI или I2C, то вы, вероятно, вообще не стали бы использовать прерывание.
2. Можете ли вы выполнить отладку с помощью
dumpstack()
или путем размещения отпечатков, почему именноrequest_irq
возвращается ошибка, по-видимому, существует несколько причин сбоя с -223. Здесь вы допускаете распространенную ошибку, т.е. request_irq () принимает номер IRQ в Linux , когда вы указываете номер IRQ на оборудовании .
4. @yashC, не нужно отлаживать, чтобы понять, что в RB-дереве нет записи с ключом 1. Смотрите мой комментарий выше.
5. @ChrisStratton да, это TFT-контроллер, но это не имеет к нему никакого отношения. Я хочу перехватить некоторые сигналы клавиатуры (клавиши) и отобразить их на TFT. Я немного обеспокоен тем, что многие здесь не отвечают на мой вопрос, а отвлекаются на отдельную строку кода. Таким образом, вы не получаете большого рейтинга и никому не помогаете.
Ответ №1:
Вы не можете определить номера IRQ по своему выбору просто так. IRQ1, вероятно, является прерыванием ядра системы очень низкого уровня. Кажется, это USB-клавиатура, которая в идеале должна работать из коробки или это какой-то пользовательский чип?. Пожалуйста, взгляните на то, как писать драйверы, которые взаимодействуют через USB. Например, смотрите здесь. Смотрите главу 13.
Комментарии:
1. О чем вы говорите? Смотрите мои комментарии к вопросу.
2. Я говорю о двух вещах. 1. Номер IRQ для request_irq должен был поступить из вызова platform_get_irq, который возвращает номера IRQ Linux, в то время как в OP он был указан как 1, что, вероятно, будет основным системным прерыванием. Также это . 2. Основываясь на общем выходе, я предполагаю, что это USB-устройство, поэтому я говорил о USB, однако из других комментариев кажется, что это TFT-контроллер.?
3. @SanchayanMaity да, это TFT-контроллер, но это не имеет к нему никакого отношения. Я хочу перехватить некоторые сигналы клавиатуры (клавиши) и отобразить их на TFT. Спасибо за ответ.