[devel] Агат

Sergey Vlasov =?iso-8859-1?q?vsu_=CE=C1_mivlgu=2Emurom=2Eru?=
Пт Фев 22 19:33:51 MSK 2002


On Wed, 20 Feb 2002 04:03:38 +0300
hihin_rambler <hihin на rambler.ru> wrote:

> У нас на "Агате" накопилось к Вам несколько вопросов:
> 
> По разработке драйверов нестандартных устройств:
> 
> 1. Возможность работы с ПДП в Linux (МСВС).
>    Существует устройство, ведущее обмен информацией по прямому доступу.
> Для передачи / приема информации надо указать устройству 24х-разрядный
> адрес (ISA) из области памяти (для контроллера прямого доступа).
>    ВОПРОС: Как преобразовать 32х-разрядный адрес выделенной памяти  к
> необходимому виду  или как выделить память, находящуюся  в  границах
> 24 разрядов? Будет ли этот адрес постоянным в процессе работы?
> Как это сделать на уровне ядра и на уровне пользователя?

char *buffer = kmalloc (size, GFP_KERNEL | GFP_DMA)
unsigned long buffer_phys = virt_to_bus (buffer);

Физические адреса такого блока фиксируются в момент выделения и
в дальнейшем не меняются.

На пользовательском уровне это не делается - только через
написание драйвера для ядра.  

> 2.Обработка аппаратных прерываний.
>  Если прерывания обрабатываются на уровне ядра,как организовать 
> синхронную передачу информации в пользовательский процесс?

Что такое "синхронная передача" в Вашем понимании?  Если Вы
хотите обрабатывать прерывания в пользовательском процессе - это
невозможно.  Обработчик прерывания в ядре может активизировать
процесс, находящийся в состоянии ожидания, но это не означает,
что этот процесс начнет немедленно выполняться.  Поэтому в любом
случае необходима буферизация на уровне ядра.

Стандартный подход следующий: процесс выполняет системный вызов
(read или ioctl), запрашивая данные.  Если в этот момент есть
готовые данные, они копируются в буфер пользовательского
процесса, и выполнение системного вызова завершается.  Если
данные не готовы - в зависимости от состояния флага O_NONBLOCK
либо процессу немедленно возвращается ошибка EAGAIN, либо
процесс переводится в состояние ожидания до поступления данных
(либо прихода сигнала).  Кроме того, процесс может проверять
готовность с помощью системных вызовов select или poll.
Наконец, можно установить O_ASYNC и получать сигнал при
готовности устройства.  Разумеется, для всего этого должна быть
соответствующая поддержка в драйвере.




Подробная информация о списке рассылки Devel