Эта линия:
// Clear pending interrupts.
mmio_write(UART0_ICR, 0x7FF);
будет записывать значение 0x7FF в регистр по адресу UART0_ICR
. Скорее всего, UART0_ICR
это значение определено некоторое другое, где в коде, который ссылается на адрес соответствующего регистра внутри BCM2835, может быть что-то похожее на это:
#define UART0_ICR (UART0_BASE + 0x44)
Почему это значение существенным, и как он очищает прерывания?
Чтобы понять это, вам нужно прочитать спецификацию устройства, которое BCM2835 в вашем случае (быстрый поиск дает мне эту link). Посмотрите раздел реестра UART, вы можете увидеть описание для регистра UART_ICR, который является регистром очистки Interupt.
В таблице бит описание этого регистра вполне очевидно: это 32-разрядный регистр, бит 31-11 не используется, а бит от 0 до 10 (11 бит) используется в качестве флагов для очистки различных видов прерывание. Запись значения 0x7FF в этот регистр буквально устанавливается на всех этих флагах, следовательно, он очистит все ожидающие прерывания UART.
Вам необходимо прочитать определение UART0_ICR. Вероятно, биты, которые вы пишете на него (0x7ff), используются для очистки отложенных флагов прерывания для каждого канала прерывания (в этом случае это будет 12 бит/12 каналов прерываний очищено) – PaulHK