|
2.7.7.2.1.1. Запрос IRQПосле определения detect() должен запросить канал DMA и пириоритет прерывания. Всего существует 16 приоритетов, называемых IRQ - от 0 до 15. Ядро поддерживает два метода установки обработчика IRQ: irqaction() и request_irq(). Функция request_irq() запрашивает два аргумента: номер IRQ и указатель на подпрограмму-обработчика. Часто устанавливаются параметры структуры sigaction с использованием irqaction(). Текст request_irq() показан на рисунке 1.3. Определение функции irqaction(): int irqaction( unsigned int irq, struct sigaction *new) где первый параметр, irq, номер запрошенного IRQ, второй, new, структура, определение которой показано на рис. 1.4. int request_irq( unsigned int irq, void (*handler)( int )) { struct sigaction sa; sa.sa_handler = handler; sa.sa_flags = 0; sa.sa_mask = 0; sa.sa_restorer = NULL; return irqaction( lrq, &sa ); } Рис. 1.3: Функция request-irq(). struct sigaction { __sighandler_t sa_handler; sigset_t sa_mask; int sa_flags; void (*sa_restorer) (void); }; Рис. 1.4: Структура sigaction sa_handler в этой структуре указывает на подпрограмму обработчика прерываний, определяемую void fdomain_16x0_intr( int irq ) где irq - номер IRQ, указывающий обработчику на пробуждение. Переменная sa_mask используется как глобальный флаг подпрограммы irqaction(). Переменная sa_flags может быть установлена либо в 0, либо в SA_INTERRUPT. Если выбран 0, обработчик прерываний запускается при разрешенных посторонних прерываниях и возвращает значение через сигнальные функции обработчика. Эта установка используется для низких IRQ, таких, как таймер и клавиатура. SA_INTEERUPT используется при больших ("быстрых") IRQ, например, при использовании упраляемых прерываниями драйверов жестких дисков. В последнем случае обработчик вызывается с запрещенными прерываниями. Переменная sa_restorer в данный момент не задействована и традиционно установлена в NULL. Функции request_irq() и irqaction() будут возвращать нуль, если IRQ успешно поставлен в соответствие определенному обработчику прерываний. Ненулевые возвращаемые значения могут быть следующими:
Ядро использует Intel "распределение" для установки IRQ, запрашиваемых функцией irqaction(). 2.7.7.2.2. Запрос канала DMAНекоторые адаптеры SCSI используют DMA лдя помещения больших информационных блоков в памяти. Так как процессор не управляет передачей информации в блоки DMA, передача осуществляется быстрее передачи, контролируемой процессором и позволяет последнему работать в это время над другой задачей. Адаптеры используют определенные каналы DMA. Эти каналы определяются функцией detect() и запрашиваются ядром с помощью request_dma(). Эта функция получает номер канала DMA как свой единственный параметр и возвращает нуль, если канал DMA успешно подключен. Другие возможные возвращаемые значения:
|
helloworld.ru © 2001-2021 Все права защищены |
|
|