Михаил Гук - Аппаратные интерфейсы ПК. Энциклопедия
12.4.1. Контроллер прямого доступа 8237A
Микросхема 8237A, применявшаяся в PC вплоть до первых моделей AT, представляет собой четырехканальный контроллер прямого доступа к памяти, допускающий каскадирование. Вторичный контроллер (8237#2) каскадно соединен с первичным, при этом теряется возможность использования одного канала вторичного контроллера. Контроллер 8237А имеет 16-разрядные регистры адреса и счетчики, что обеспечивает возможность программирования передачи блока данных размером до 64 Кбайт или слов. Назначение регистров контроллеров DMA, применительно к их адресам в пространстве ввода-вывода компьютера, приведено в табл. 12.4. Контроллер допускает довольно гибкое конфигурирование. Корректное оперативное управление отдельными каналами не затрагивает общих настроек. Общее конфигурирование контроллеров (запись в регистры 008 и 0D0) выполняет BIOS при инициализации во время теста POST; в XT тогда же программируется и канал 0, применяемый для регенерации памяти. Для использования каналов устройствами шины ISA запись в регистры 008 и 0D0 не рекомендуется. Обмен с регистрами контроллера выполняется только однобайтными операциями ввода-вывода. Для загрузки 16-битных значений задействуется триггер младшего/старшего байта. По сбросу контроллера или записи любого байта по адресу 00Ch (0D8h для второго контроллера) этот триггер сбрасывается, и контроллер готовится к приему младшего байта. После приема этого байта триггер меняет состояние, и контроллер воспринимает старший байт, после которого триггер опять переключается.
Таблица 12.4. Регистры контроллера DMA 8237A
8237#1 8237#2 R/W, Назначение регистров 000, 002, 004, 006 0C0, 0C4, 0C8, 0CC W — регистры начального адреса для каналов 0–3 (8237#1) и 4–7 (8237#2). R — регистры текущего адреса тех же каналов 001, 003, 005, 007 0С2, 0C6, 0CA, 0СЕ W — начальное значение счетчика передач для каналов 0–3 (8237#1) и 4–7 (8237#2). R — текущее значение счетчика передач тех же каналов 008 0D0 W, Command Register — конфигуратор контроллера. Бит 7: 1 — активный уровень (DACK# — высокий, 0 — низкий); бит 6: 1 — активный уровень (DRQ — низкий, 0 — высокий); бит 5: 1 — режим расширенной записи (должен быть 0); бит 4: 0 — фиксированный приоритет, 1 — циклический; бит 3: 1 — укороченный цикл обмена (должен быть 0); бит 2: 1 — запрет работы контроллера; бит 1: 1 — фиксация адреса 0 канала (должен быть 0); бит 0: 1 — передача память-память (в PC не используется, должен быть 0) 008 0D0 R, Status Register — состояние каналов. Биты 4–7: запросы каналов 0–3; биты 0–3: завершение цикла каналов 0-3 009 0D2 W, Request Register — регистр программных запросов. Биты 7–3 не используются; бит 2: 1 — установка, 0 — сброс бита запроса; биты 1–0: выбор канала (00 — 0; 01 — 1; 10 — 2; 11 — 3) 00А 0D4 W, Single Mask Bit Register — управление масками. Биты 7–3 не используются; бит 2:1 — установка, 0 — сброс бита маски; биты 1–0: выбор канала (00 — 0; 01 — 1; 10 — 2; 11 — 3) 00B 0D6 W, Mode Register — режимы работы каналов. Биты 7–6: режим передачи (00 — по запросу, 01 — одиночный, 10 — блочный, 11 — каскадирование); бит 5: 0 — инкремент, 1 — декремент адреса; бит 4: 1 — разрешение автоматической реинициализации 00B 0D6 Биты 3–2; тип передачи (00 — холостой, проверка канала, 01 — запись в память, 10 — чтение памяти, 11 — недопустимо); биты 1–0: выбор канала (00 — 0; 01 — 1; 10 — 2; 11 — 3) 00C 0D8 W, Clear Byte Pointer Flip/Flop — сброс триггера младшего/старшего байта 00D 0DA W, Master Clear — общий сброс 8237 (вывод любого байта в регистр вызывает сброс) 00E 0DC W, Clear Mask Register — общий сброс масок всех каналов (вывод любого байта в регистр вызывает сброс) 00F 0DE W, All Mask Register Bits — регистр масок всех каналов. Биты 0–3: маски каналов 0–3 (0 — канал разрешен, 1 — замаскирован); биты 4–7 не используютсяПрограммирование контроллера для каждого канала определяет начальный адрес, направление его модификации (инкремент/декремент), количество пересылаемых байт (слов), режим работы канала. Регистры адреса контроллеров 8237A — 16-разрядные, и для расширения разрядности адреса для каждого канала имеются специальные регистры страниц (DMA page register), внешние по отношению к контроллерам 8237A. В отличие от адресных регистров контроллера 8237A регистры страниц при выполнении циклов DMA не модифицируются — в них по команде процессора до начала обмена по каналу загружается требуемое значение. В PC/AT регистры страниц хранят биты A[23:16] для 8-битных каналов и A[23:17] — для 16-битных. В PC/XT регистры страниц хранили только 4 бита A[19:16]. Контроллер 16-битных каналов подключен к шине адреса со смещением на 1 бит, так что линией А0 он не управляет. При передаче по 16-битным каналам всегда А0=0 (передачи слов по четным адресам). Счетчики циклов каналов — 16-разрядные, что позволяет передавать блоки до 64 К байт (для 8-битных каналов) или слов (для 16-битных каналов). При инициализации в счетчик загружается число, на единицу меньшее требуемого числа циклов, так что FFFF соответствует 65 534 передачам (216). В последнем цикле передачи (когда счетчик отсчитает требуемое количество циклов) контроллер вырабатывает сигнал завершения TC, общий для всех каналов. Этот сигнал устройство может использовать для выработки сигнала прерывания, а программа может определить, какой канал «отстрелялся», прочитав регистр состояния каналов в контроллере DMA. В зависимости от выбранного режима по окончании счета контроллер либо остановит работу данного канала, либо выполнит автоматическую реинициализацию (автозагрузку) — восстановит прежде записанные значения регистра адреса и счетчика циклов и будет снова готов к пересылке такого же блока данных.
ВНИМАНИЕПри достижении регистром-счетчиком адреса значения FFFFh следующее его значение будет 0000h, а внешний регистр адреса страницы, естественно, останется неизменным. Таким образом, если блок начинается не с границы 64 Кбайт страницы памяти, возможно его «сворачивание» в кольцо. Но если для процессоров 80x86 в реальном режиме сегменты, также «сворачиваемые» в кольца, могут начинаться с адреса любого 16-байтного параграфа (границы кратны 10h), то при прямом доступе эти границы кратны 10000h. Этот эффект обязательно необходимо учитывать при программировании прямого доступа — блок, пересекающий данную границу, должен пересылаться за два сеанса циклов DMA, между которыми канал (включая и регистр страниц) должен быть реинициализирован. Эффект «сворачивания» сегментов в 16-битных каналах аналогичен, только для каналов. 5–7 эти «кольца» имеют размер 64 Кбайт слов и границы, кратные 20000h.
Разрядность передаваемых данных по каналу DMA должна соответствовать типу канала — 16-битный канал всегда пересылает данные словами, и расщепление их на одиночные байты невозможно.
Каждый канал может работать в одном из трех логических режимов.
♦ Режим одиночной передачи (single transfer mode) — получив подтверждение DACKx#, устройство сразу снимает сигнал запроса DRQx, а контроллер DMA организует один цикл передачи. Счетчик адреса в контроллере модифицируется, счетчик циклов декрементируется.
♦ Режим блочной передачи (block transfer mode) — получив подтверждение DACKx#, устройство сразу снимает сигнал запроса DRQx, а контроллер DMA организует последовательность циклов передачи до обнуления счетчика циклов. Если разрешена автозагрузка канала, то для пересылки следующего блока требуется повторная подача DRQx. На время передачи всего блока контроллер монопольно захватывает шину, при этом не выполняется регенерация памяти.
♦ Режим передачи по запросу (demand transfer mode) — получив подтверждение DACKx#, устройство не снимает сигнал запроса DRQx до тех пор, пока у него есть потребность в передаче. При наличии этого сигнала контроллер DMA организует последовательность циклов передачи вплоть до обнуления счетчика циклов. Если сигнал запроса снят до обнуления счетчика, контроллер DMA отдает управление шине, а при последующем появлении этого запроса продолжит обмен с того места, на котором остановился.