[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