Не удается запросить IRQ клавиатуры 1 на Raspberry Pi в драйвере Linux

#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 возвращается ошибка, по-видимому, существует несколько причин сбоя с -22

3. Здесь вы допускаете распространенную ошибку, т.е. 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. Спасибо за ответ.