Настройка прерываний с использованием Справочного руководства по аппаратному обеспечению и Настройка регистров - PullRequest
0 голосов
/ 04 марта 2019

Кто-нибудь знает, как соотнести источник прерывания с обработчиком, не импортируя библиотеки, предполагая, что у вас есть адреса для всех ваших регистров?Пример для любого процессора ARM мог бы помочь, но в моем случае я использую BCM2837 от Pi3.Моя интерпретация этого поста о спецификации заключается в том, что руководство BCM2835 эквивалентно.

На странице 90 я вижу адрес, который позволяет обнаруживать нарастающий фронт, поэтому я вставил этот код в свою программу:

//-v- I think this allows me to enable detection on GPIO pins 0-31
#define RisingInterruptEnable (*(int *) 0x7E2004C)
//-^- e.g. "RisingInterruptEnable = 0x1" enables GPIO 0 rising detect

На странице 112-117 руководства я нашелрегистр, который включает InterruptReQues [0x7E00B214], но я, честно говоря, не понимаю, как его использовать.Я вижу, как включить gpio_int [0], но я не смог найти, что имел в виду gpio_int после поиска в pdf.

Из этого поста об указателях функций Я знаю, как "указывать" на что угодноФункция, которую я использую для обработчика.Однако я все еще не понимаю:

Как соотнести источник прерывания с функцией [без импорта библиотек, при условии, что я знаю адреса для всех моих регистров]?

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Здесь есть несколько уровней косвенного обращения, даже только в аппаратном обеспечении.

Начиная с вывода GPIO, его можно настроить для генерации прерывания в периферийном устройстве GPIO (как вы видели).Однако все, что это делает, это управляет выходом от этого периферийного устройства (и идентифицирует триггер в одном из других регистров GPIO).Этот сигнал на кристалле равен gpio_int[0].

. Согласно спецификации, этот сигнал от GPIO_0 подключается к IRQ [49] кластера A53 (это очень специфический аспект реализации).

Чтобы включить IRQ [49], вам нужно использовать регистры в контроллере прерываний для включения и обработки (поскольку направление к правому обработчику прерываний обрабатывается аппаратно).

Оказавшись в обработчике прерываний, вам нужно будет вернуться к регистрам GPIO, чтобы определить, какое (из того, что вы там включили) фактически вызвало прерывание (и это будет зависеть от вашего варианта использования - возможно, вынужно только включить его, и вам не понадобится дополнительная проверка).

0 голосов
/ 04 марта 2019

Не уверен, что примеры для любого процессора ARM помогут, так как BCM2837, похоже, не использует стандартный ARM GIC в соответствии с bcm2837.dtsi .

Я бы тогда предложилпосмотрите на отличные примеры с Raspberry-Pi, предоставленные Дэвидом Уэлчем здесь : вы найдете примеры, относящиеся к прерываниям и непосредственному доступу к регистрам - я предполагаю, что вы пишете какой-то неформатированный код.

...