Перейти на главную   
  helloworld.ru - документация и книги по программированию  
helloworld.ru - документация и книги по программированию
    главная     хостинг    
Поиск по сайту:  
Смотрите также
Языки программирования
C#
MS Visual C++
Borland C++
C++ Builder
Visual Basic
Quick Basic
Turbo Pascal
Delphi
JavaScript
Java
PHP
Perl
Assembler
AutoLisp
Fortran
Python
1C

Интернет-технологии
HTML
VRML
HTTP
CGI
FTP
Proxy
DNS
протоколы TCP/IP
Apache

Web-дизайн
HTML
Дизайн
VRML
PhotoShop
Cookie
CGI
SSI
CSS
ASP
PHP
Perl

Программирование игр
DirectDraw
DirectSound
Direct3D
OpenGL
3D-графика
Графика под DOS

Алгоритмы
Численные методы
Обработка данных

Сис. программирование
Драйверы

Базы данных
MySQL
SQL

Другое

Хостинг


Друзья
demaker.ru
Реклама

Лучший хостинг. Аренда серверов




helloworld.ru

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 успешно поставлен в соответствие определенному обработчику прерываний. Ненулевые возвращаемые значения могут быть следующими:

  • EINVAL Запрошенный IRQ больше 15, или обработчику прерываний был подан указатель на NULL.
  • EBUSY Запрошенный IRQ уже занят другим обработчиком прерываний. Эта ситуация не возникает в случае использования panic().

Ядро использует Intel "распределение" для установки IRQ, запрашиваемых функцией irqaction().

2.7.7.2.2. Запрос канала DMA

Некоторые адаптеры SCSI используют DMA лдя помещения больших информационных блоков в памяти. Так как процессор не управляет передачей информации в блоки DMA, передача осуществляется быстрее передачи, контролируемой процессором и позволяет последнему работать в это время над другой задачей.

Адаптеры используют определенные каналы DMA. Эти каналы определяются функцией detect() и запрашиваются ядром с помощью request_dma(). Эта функция получает номер канала DMA как свой единственный параметр и возвращает нуль, если канал DMA успешно подключен. Другие возможные возвращаемые значения:

  • EINVAL Запрошенный канал DMA имеет номер больше 7.
  • EBUSY Запрошенный канал DMA уже используется. Этой ситуация может привести к неудовлетворения запроса SCSI. В этом случае также можно использовать panic().

[ Назад | Оглавление | Далее ]









helloworld.ru © 2001-2021
Все права защищены