Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
МИНИСТЕРСТВО ОБРАЗОВАНИЯ РФ
ВЯТСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ
УНИВЕРСИТЕТ
Факультет автоматики и вычислительной техники
Кафедра автоматики и телемеханики
Разработка аппаратно-программных модулей системной шины ISA
Методические указания по выполнению
курсовой работы
Дисц. “ Организация ЭВМ и систем ”
Для специальности 071900 - Информационные системы (управление и телекоммуникация), 3 курс д/о
Киров 2000
УДК 681.326.34
С о с т а в и т е л ь |
к.т.н., доцент Л.А. Шабалин кафедра АТ |
Р е ц е н з е н т |
к.т.н., доцент А.В. Частиков кафедра РЭС |
Редактор А.Н.Корсаков
ЛР №
Подписано в печать Усл.печ.л.1.9
Бумага типографская Печать матричная
Заказ № Тираж 20 Бесплатно
Текст напечатан с оригинал-макета, представленного автором.
610 000, г.Киров, ул. Московская,36
Оформление обложки, изготовление - ПРИП
Вятский государственный технический университет, 2000
Права на данное издание принадлежат Вятскому
государственному техническому университет
Содержание
Стр.
[0.0.0.1] Киров 2000
[1]
[2] [3] 3 Проектирование устройств ввода/вывода для системной шины ISA [4] 4 Особенности использования прерываний [5] 5 Применение прямого доступа [6] 6 Принципы построения модулей системной шины ISA [7] 7 Особенности программирования модулей [8] 8 Содержание пояснительной записки
[9]
[10]
[11] |
При проектировании студенту предлагается одно из типовых заданий. Номер варианта курсовой работы задает руководитель курсовой работы. По разрешению руководителя курсовой работы студент может выполнять работу по:
В последнем случае выбор темы может быть весьма широким: от проектирования разнообразной аппаратуры на базе микропроцессорной техники до разработки программных продуктов (модулей).
Задание на курсовую работу состоит из трех частей.
Варианты заданий приведены в таблице 1.1.
Требования к оформлению пояснительной записки курсовой работы:
Студент, не выполнявший выше перечисленных требований, к защите курсовой работы не допускается.
Таблица 1 Варианты заданий курсовой работы
Вариант |
Устройство |
Характеристики устройства |
1 |
Адаптер интерфейса связи |
2 порта ИРПР-М (LPT), обмен в режиме прерываний |
2 |
Адаптер интерфейса связи |
1 порт ИРПР-М (LPT), обмен в режиме ПДП |
3 |
Адаптер интерфейса связи |
2 порта RS-232C (COM), обмен в режиме прерываний |
4 |
Адаптер интерфейса связи |
1 порт RS-232C (COM), обмен в режиме ПДП |
5 |
Адаптер интерфейса связи |
1 порт RS-485, обмен в режиме прерываний |
6 |
Адаптер интерфейса связи |
1 порт КОП (канал общего пользования), обмен в режиме прерываний |
7 |
Контроллер клавиатуры |
32 кнопки, обмен в режиме прерываний |
8 |
Контроллер индикации |
16 семисегментных индикаторов |
9 |
Плата дискретного ввода |
22 изолированных входа, обмен в режиме прерываний |
10 |
Плата дискретного вывода |
16 изолированных выхода, обмен в режиме ПДП |
11 |
Плата аналогового входа |
1 вход от термодатчика, обмен в режиме прерываний |
12 |
Плата аналогового входа |
1 вход от термодатчика, обмен в режиме ПДП |
13 |
Плата аналогового вывода |
1 выход, 5В, обмен в режиме прерываний |
14 |
Плата аналогового вывода |
1 выход, 10В, обмен в режиме прерываний |
15 |
Программируемый генератор цифровых сигналов |
1 выход, максимальная выходная частота 2 МГц |
16 |
Программируемый счетчик дискретных импульсов |
1 вход, максимальная входная частота 2 МГц |
17 |
Контроллер интерфейса связи |
Внешнее устройство НГМД |
18 |
Модуль температурной защиты системного блока |
Температурный диапазон - программный |
19 |
Препроцессор на базе PIC-контроллера |
Обмен в режиме прерываний |
20 |
Препроцессор на базе DSP |
Обмен в режиме прерываний |
Шина ISA (Industrial Standart Architecture) является самой распространенной в промышленных компьютерах по следующим причинам:
Описание сигналов шин, назначение выводов, типы источников и их электрические характеристики приведены в приложении А.
Временные диаграммы циклов обмена для устройств ввода/вывода (УВВ) приведены на рисунке 2.1 (все временные параметры приведены для частоты SYSCLK, равной 8 МГц). Циклы начинаются с выставления задатчиком (управляющим устройством шины) адреса на линиях SAO...SA15 и сигнала -SBHE. Отметим, что несмотря на потенциальную возможность адресации по 16 линиям адреса, чаще всего используются только 10 младших линий SAO...SA9, так как большинство разработанных ранее плат расширения используют только их, и, следовательно, за исключением особых случаев нет смысла обрабатывать старшие разряды SA10...SA15.
В ответ на получение адреса исполнитель (подчиненное устройство шины), распознавший свой адрес, должен сформировать сигнал -I/O CS16 в случае, если обмен должен быть 16-разрядным.
Далее следует собственно команда чтения или записи. При цикле чтения задатчик выставляет сигнал -IOR, в ответ на который исполнитель должен выдать данные на шину данных. Эти данные должны быть сняты исполнителем после окончания сигнала -IOR. В цикле записи задатчик выставляет записываемые данные и сопровождает их стробом записи -IOW. Здесь надо отметить, что хотя в соответствии со стандартом установка записываемых данных предшествует выставлению -IOW, в некоторых компьютерах реализуется обратный порядок: сначала выставляется -IOW, а затем появляются данные. Поэтому при проектировании УВВ надо рассматривать как момент действительности данных только задний (положительный) фронт сигнала -IOW.
В случае, когда УВВ не успевает выполнить требуемую от него команду в темпе системной шины, оно может приостановить на целое число периодов сигнала SYSCLK завершение цикла чтения или записи с помощью снятия (перевода в низкий уровень) сигнала I/O CH RDY (так называемый удлиненный цикл). Это производится в ответ на получение сигнала -IOR или -IOW. Сигнал I/O CH RDY может удерживаться низким не более 15,6 мкс, в противном случае процессор переходит в режим обработки немаскируемого прерывания. Отметим, что некоторые изготовители персональных компьютеров указывают в сопроводительной документации другие допустимые величины этого временного интервала (например, 2,5 мкс), так что не следует ориентироваться на максимальную величину, указанную в стандарте, иначе нет гарантии работы УС во всех компьютерах.
Рисунок 2.1- Временные диаграммы циклов чтения и записи ( Т период сигнала SYSCLK; все временные интервалы в наносекундах) |
Помимо циклов программного обмена на системной шине ISA могут выполняться также циклы прямого доступа к памяти (ПДП). Временная диаграмма для этого случая показана на рисунке 2.2. Так как системная шина ISA имеет раздельные стробы чтения и записи для УВВ и для памяти, пересылка данных в режиме ПДП производится за один машинный цикл. То есть если данные надо переслать из УВВ в память, то одновременно производится чтение данных из УВВ (по сигналу -IOR) и их запись в память (по сигналу -МEMW). Аналогично производится пересылка данных из памяти в УВВ (по сигналам -MEMR и -IOW).
Цикл ПДП начинается с запроса ПДП от исполнителя (УВВ), желающего произвести обмен, с помощью одного из сигналов DRQ. После освобождения системной шины текущим задатчиком (например, процессором) контроллер ПДП формирует соответствующий сигнал -DACK, говорящий о предоставлении ПДП запросившему его устройству. Затем контроллер ПДП вырабатывает адрес ячейки памяти, с которой будет производиться обмен в текущем цикле, и сигнал AEN, который говорит УВВ о том, что к нему идет обращение в режиме ПДП. После этого выставляется строб чтения ( -IOR или -MEMR), в ответ на который источник передаваемых данных выставляет свою информацию на шину данных, и строб записи (-MEMW или -IOW), по которому данные записываются в приемник данных. Здесь так же, как и в обычном цикле возможен асинхронный обмен (удлиненный цикл) с использованием сигнала I/O CH RDY.
Рисунок 2.2 - Временные диаграммы циклов ПДП (t время предоставления ПДП, Т период сигнала SYSCLK; все временные интервалы в наносекундах) |
При проектировании УВВ помимо протоколов обмена по системной шине надо учитывать также электрические характеристики сигналов. Стандарт шины ISA определяет требования к входным и выходным токам приемников и источников сигнала каждой из плат расширения. Несоблюдение этих требований может нарушить функционирование всего компьютера и даже вывести его из строя.
Выходные каскады системных передатчиков сигналов УВВ должны выдавать ток низкого уровня не меньше 24 мА (это относится ко всем типам выходных каскадов), а ток высокого уровняне меньше 3 мА (для выходов с тремя состояниями и ТТЛ).
Входные каскады системных приемников сигналов должны потреблять входной ток низкого уровня не больше 0,8 мА, а входной ток высокого уровня не больше 0,04 мА.
Кроме этого необходимо учитывать, что максимальная длина печатного проводника от контакта магистрального разъема до вывода микросхемы не должна превышать 65 миллиметров, а максимальная емкость относительно земли по каждому контакту магистрального разъема не должна быть больше 20 пФ.
К некоторым линиям магистрали подключены нагрузочные резисторы, идущие на шину питания +5 В. К линиям -IOR, -IOW, -MEMR, -MEMW, -SMEMR, -SMEMW, -I/O CH СК подключены резисторы 4,7 кОм, к линиям -I/O CS 16, -MEM CS 16, -REFRESH, -MASTER, -OWS - 300 Ом, а к линии I/O CH RDY 1 кОм. Кроме того к некоторым линиям магистрали подключены последовательные резисторы: к линиям -IOR, -IOW, -MEMR, -MEMW, -SMEMR, -SMEMW и OSC - резисторы номиналом 22 Ом, а к линии SYSCLK 27 Ом.
При проектировании узлов УВВ, входящих в интерфейсную часть УВВ, необходимо учитывать временные диаграммы системной шины ISA (рисунок 2.1, 2.2). Наиболее важными при проектировании УВВ являются следующие временные интервалы:
Обобщенная структурная схема интерфейсной части УВВ, включает в себя все следующие узлы (рисунок 3.1):
Рисунок 3.1 - Обобщенная структурная схема интерфейсной части УВВ |
Буферирование системных сигналов применяется для электрической развязки с цель обеспечение требуемых входных и выходных токов (уровни напряжения на ISA ТТЛ). Для буферирования микросхемы магистральных приемников, передатчиков, приемопередатчиков, называемые также буферами или драйверами.
Приемники магистральных сигналов должны удовлетворять двум основным требованиям: малые входные токи и высокое быстродействие (они должны успевать отрабатывать в течение отведенных им временных интервалов циклов обмена).
Требованиям, предъявляемым к приемникам, удовлетворяют следующие серии микросхем: КР1533 (SN74ALS), К555 (SN74LS) и КР1554 (74АС). Величины входных токов логического нуля для них составляют соответственно 0,2 мА, 0,4 мА и 0,2 мА, а величины временных задержек не превышают соответственно 15 нс, 20 нс и 10 нс. Требованиям, предъявляемым к приемникам, удовлетворяют также микросхемы электрически программируемых ППЗУ и ПЛМ серии КР556 (136, N82S, DM87S, НМ76). Это тоже немаловажно, так как их очень удобно использовать в схемах селекторов адреса УВВ. Отметим, что малые входные токи микросхем серий КР1533 и КР1554 позволяют подключать к линии магистрали даже два входа таких микросхем.
Требования, предъявляемые к передатчикам: большой выходной ток и высокое быстродействие. Часто они должны иметь также отключаемый выход (например, для шины данных), то есть иметь выход с открытым коллектором или с тремя состояниями. Это связано с необходимостью перехода УВВ в пассивное состояние в случае отсутствия обращения к нему. Выбор микросхем передатчиков гораздо больше, такие микросхемы есть практически в каждой серии (К155, К555, КР1533, К559 и т.д.).
Требования к приемопередатчиков включают в себя требования к приемникам и передатчикам, то есть малый входной ток, большой выходной ток, высокое быстродействие и обязательное отключение выходов. Надо отметить, что в простейшем случае (когда разрядов немного) приемопередатчики могут быть построены на микросхемах приемников и передатчиков.
Требования, предъявляемые к селекторам адреса:
Рисунок 3.2 - Схема построения селектора адреса, реагирующая на единственный адрес 3CFh |
Самое простое решение при построении селектора адреса использование только микросхем логических элементов. Например, на рисунке 3.2 показана схема, реагирующая на единственный адрес 3CFh. Основным достоинством такого подхода является высокое быстродействие (задержка не превышает 30 нс). При использовании микросхем с малыми входными токами можно обойтись без буферов. Но есть и недостатки:
Если надо иметь возможность изменять выбираемый адрес, то можно предусмотреть использование отключаемых инверторов для всех линий адреса. Тогда, подключая или отключая нужные инверторы с помощью перемычек или переключателей, получаем возможность перестраивать в некоторых пределах селектор адреса. Другой путь применение элементов "Исключающее ИЛИ", работающих как управляемые инверторы. На рисунке 3.3 показан тот же, что и на рисунке 3.2 селектор адреса, но выбирающий в зависимости от кода на шине AS, задаваемого перемычками, адреса 3CF, 2CF, 1CF, OCF и т.д. (всего 8 возможных адресов).
Рисунок 3.3 - Схема построения селектора адреса, реагирующая на адрес, задаваемый перемычками |
Селекторы адреса могут быть реализованы также на микросхемах дешифраторов. Вообще говоря, можно построить селектор адреса только на этих микросхемах, но объем аппаратуры получается при этом очень большим. Поэтому более правильным решением будет обработка старших адресных разрядов какой-то другой схемой (например, одним или несколькими логическими элементами), а младшие с помощью одной микросхемы дешифратора.
Следующий метод реализации селектора адреса использование микросхем компараторов кодов, на одну входную шину которых подается адрес из системной шины, а на другую входную шину код AS, соответствующий селектируемому адресу. Очевидно, что каскадируя эти микросхемы, можно построить селектор адреса исключительно на них, но это приведет к неоправданным аппаратурным затратам. Гораздо эффективнее применять компараторы кодов для изменения селектируемых адресов.
Наконец наиболее универсальными являются селекторы адреса на базе ППЗУ и ПЛМ. В данном случае селектируемый адрес (или селектируемые адреса) зависит не от схемотехнических решений и не от кода, задаваемого переключателями, а от прошивки ППЗУ или ПЛМ.
Таблица 3.1 - Карта адресов УВВ архитектуры IBM PC |
|
Зона адресов |
Устройство ввода/вывода |
000-01F |
Контроллер ПДП (DMA- master) |
020-021 |
Контроллер прерываний (Мaster) |
022-023 |
Регистры управления аппаратурой. Порты ввода/вывода |
040-05F |
Регистры управления таймером |
060-06F |
Контроллер интерфейса клавиатуры (8042) |
070-07F |
Порты RTC и порты ввода/вывода CMOS |
080-09F |
Регистры ПДП |
0A0-0BF |
Контроллер прерываний (Slave) |
0C0-0DF |
Контроллер ПДП (DMA slave) |
0F0-0FF |
Математический сопроцессор |
1F0-1FB |
Контроллер жесткого диска |
278-27F |
Параллельный порт #2 |
2B0-2DF |
Контроллер графического адаптера |
2F8-2FF |
Последовательный порт #2 |
360-36F |
Сетевые порты |
378-37F |
Параллельный порт #1 |
3B0-3BF |
Адаптер параллельного порта и монохромного режима |
3C0-3CF |
EGA-адаптер |
3D0-3FD |
CGA-адаптер |
3F0-3F7 |
Контроллер дисковода на гибких дисках |
3F8-3FF |
Последовательный порт #1 |
При выборе зоны адресов проектируемого модуля необходимо учитывать распределение адресов ввода/вывода стандартных и используемых УВВ микропроцессорной системы и выбирать адреса из свободных зон. В таблице 3.1 приведена карта адресов УВВ архитектуры IBM PC.
Следующая важная функция интерфейсной части УВВ выработка внутренних стробирующих сигналов синхронно с управляющими сигналами (-IOR, -IOW, -MEMR, -MEMW) в случае обращения по адресам УВВ.
Самый простейший подход использование логических элементов удобен в случае малого числа внутренних стробов STR.
В случае необходимости выработки большого числа внутренних стробирующих сигналов более эффективно использовать микросхемы дешифраторов. Пример такого решения представлен на рисунке 3.4. Здесь два младших разряда адреса подаются не на селектор адреса, а непосредственно на дешифратор, верхняя половина которого управляется сигналом с селектора адреса и сигналом -IOR, а нижняя сигналом с селектора адреса и -IOW. Таким образом, выходы STRO ... STR3 соответствуют циклам чтения из четырех последовательных адресов, a STR4 ... STR7 записи в эти адреса. Отметим, что не обязательно использовать все выходы дешифратора. Достоинства этого подхода однотипность схемы рассматриваемого узла для всех УВВ и малые аппаратурные затраты при необходимости получения большого количества внутренних стробов обмена.
Рисунок 3.4 - Схема формирования внутренних стробирующих сигналов |
В некоторых случаях удобно не разделять интерфейсную часть УВВ на селектор адреса и формирователь внутренних стробов.
Пусть, например, УВВ должно работать только в циклах записи по его адресам (или только в циклах чтения). При этом оба рассмотренных узла могут быть выполнены на одной микросхеме ППЗУ. В случае подачи управляющих стробов системной шины (-IOR и -IOW) на входы разрешения работы ППЗУ, внутренние стробы обмена будут задержаны относительно управляющих стробов только на время выбора ППЗУ. Такой недостаток всех микросхем ППЗУ, как неопределенность выходных сигналов в течение некоторого времени после любого изменения адреса, в данном случае не сказывается на работе схемы. Однако схема будет работать также нормально. При подаче одного или обоих управляющих стробов обмена (-IOR и -IOW) на адресные входы ППЗУ, требуются дополнительные аппаратные затраты для устранения выше приведенного недостатка ППЗУ.
Особо следует остановиться на организации 16-разрядного обмена и разделении пересылок старшего и младшего байтов. В данном случае участвуют два сигнала системной шины, которые не используются при 8-битном обмене: -SBHE и -I/O CS 16 (или -MEM CS 16). При этом сигнал -SBHE должен обрабатываться УВВ только в случае необходимости как 16, так и 8-разрядного обмена (данный сигнал совместно с сигналом SAO определяет тип цикла обмена). На рис 3.5 в качестве примера приведена схема формирователя внутренних стробов для 16-разрядного УВВ, работающего только в цикле записи 16-разрядного слова, старшего байта или младшего байта. Выходной строб формирователя STRO соответствует записи старшего байта или слова, а выходной строб STR1 записи младшего байта или слова. Сигнал -I/O CS 16 вырабатывается при любом обращении к УВВ, детектируемым селектором адреса. Отметим, что этот сигнал может формироваться и элементом с тремя состояниями, но в этом случае надо обеспечить активный нулевой уровень при селектировании адреса и высокоимпедансное состояние в противном случае (рисунок 3.6). Это предотвратит конфликт на линии -I/O CS 16 сигналов от разных плат расширения.
Рисунок 3.5 - Схема формирователя внутренних стробов для 16-разрядного УВВ |
Рисунок 3.6 - Схема формирования сигнала I/O CS 16 |
Основным типом обмена по шине ISA является синхронный обмен, то есть обмен в темпе задатчика без учета быстродействия исполнителя. Однако возможен и асинхронный обмен, при котором "медленный" исполнитель приостанавливает работу задатчика на время выполнения им требуемой команды. В этом случае надо использовать сигнал I/O CH RDY, снятие которого (установка в состояние логического нуля) говорит о неготовности исполнителя к окончанию цикла обмена. Приостановка производится на целое число периодов SYSCLK и не может быть дольше системного времени ожидания 15,6 мкс (для некоторых компьютеров 2,5 мкс).
Рассмотрим некоторые аппаратурные решения для асинхронного обмена. Прежде всего здесь можно выделить две ситуации: когда существует внутренний сигнал УВВ, говорящий об окончании выполнения функции записи или чтения, и когда такого сигнала нет. В качестве этого сигнала (обозначим его DK) может выступать, например, сигнал окончания преобразования (готовности данных) АЦП, входящего в состав УВВ. DK может быть потенциальным (то есть сниматься после окончания стробов обмена) или импульсным (то есть окончанию выполнения функции соответствует фронт сигнала DK). Временная диаграмма и схема для потенциального DK показана на рисунке 3.7 (для упрощения считаем, что строб обмена единственный).
Рисунок 3.7 - Схема формирования сигнала I/O CH RDY при потенциальном сигнале DK |
Если сигнал DK отсутствует в явном виде, но известно время выполнения функции или его верхний предел, то необходимо сформировать задержку в самой интерфейсной части. В схеме на рисунке 3.8 слева эта задержка определяется временем выдержки одновибратора. Надо отметить, что при проектировании УВВ одним из показателей мастерства разработчика является количество использованных им одновибраторов или RC-цепочек (естественно, эти величины обратно пропорциональны друг другу). Это связано с тем, что любые аналоговые цепи подвержены действию помех и требуют настройки. Поэтому, если есть возможность, то надо формировать задержки, временные сдвиги, интервалы с помощью системных тактовых сигналов SYSCLK и OSC или внутренних тактов УВВ. На рисунке 3.8 справа приведена схема с использованием линии задержки на сдвиговом регистре, задержка которой определяется номером замкнутого переключателя и задается с точностью до периода сигнала SYSCLK. Но, в принципе, в данном случае требования к точности времени задержки невысоки, и использование одновибратора и даже простой RC-цепочки вполне допустимо. |
Рисунок 3.8 - Схемы формирования сигнала I/O CH RDY при отсутствии сигнала DK |
И в завершение рассматриваемой темы отметим, что асинхронный режим обмена по ISA можно реализовать и на более высоком уровне: путем опроса задатчиком флага готовности исполнителя и путем использования прерываний. Эти решения удобны в случае очень медленных УВВ, то есть тех, время исполнения функции которыми превышает предельное системное время задержки.
Организация внутренней шины данных возможна двумя способами:
Формирование входной и выходной внутренних шин. Для данной реализации требуются соответствующие магистральные мультиплексоры.
Формирование единой двунаправленной внутренней шины данных. Для данной реализации используются двунаправленные буфера, например, К555АП6.
Необходимо отметить, если разрабатываемое устройство содержит только порты ввода или только порты вывода, то внутренняя шина данных всегда однонаправленная. Поэтому для буферирования сигналов шины используются однонаправленные буферные элементы, например, К555АП5.
На рисунке 3.9 приведены схемы реализации 8-ми и 16-ти разрядных внутренних шин.
Рисунок 3.9 - Схемы реализации 8-ми и 16-ти разрядных внутренних шин |
Аппаратные прерывания, как известно, применяются для информирования исполнителем задатчика о готовности к обмену в случае, когда нежелательно организовывать программный опрос флага готовности.
Все прерывания системной шины ISA радиальные, то есть для перевода процессора в режим обработки прерывания достаточно послать запрос, в качестве которого выступает положительный фронт сигнала на одной из линий IRQ. Однако из этого совсем не следует, что на эту линию можно подать сколь угодно короткий импульс положительной полярности, так как никакой гарантии, что этот импульс дойдет до контроллера прерываний, будет им обработан и вызовет нужную реакцию, при этом не существует.
Самым оптимальным решением является перевод сигнала IRQ в логическую единицу при возникновении необходимости обмена (то есть аппаратно), а сброс в исходное состояние логического нуля по команде процессора, которую он исполняет в ходе программы обработки прерывания (то есть программно). При этом будет полная уверенность, что запрос действительно принят и обработан.
Рисунок 4.1 - Схема формирования запроса прерывания |
Пусть, например, УВВ принимает данные от внешнего устройства и после их приема необходимо сформировать прерывание, обработка которого сводится только к чтению данных из УВВ. Схема для данного случая показана на рисунке 4.1. Здесь READY сигнал поступления данных и готовности к выдаче их процессору. По этому сигналу триггер устанавливается в единицу, и его выход используется как сигнал запроса прерывания. Номер используемой линии IRQ выбирается одним из четырех переключателей (такой выбор в том или ином виде необходим, так как свободных линий IRQ в стандартной конфигурации не так уж много). В исходное состояние триггер сбрасывается стробом чтения данных, вырабатываемым при выполнении программы обработки прерывания. Инверсный выход триггера используется как флаг готовности, который программно опрашивается процессором с помощью сигнала -STR2.
Иногда имеет смысл предусмотреть в схеме УВВ возможность запрещения прерывания от него, хотя это можно сделать и путем маскирования данного прерывания в контроллере прерываний (программным путем).
В заключение отметим, что тип выходного каскада линии IRQ это обычный ТТЛ, поэтому необходимо тщательно контролировать, чтобы на каждую из линий IRQ поступал сигнал только от одной платы расширения, иначе может выйти из строя выходной каскад одной из конфликтующих плат.
При выборе номера прерывания IRQ проектируемого модуля необходимо учитывать задействованные номера прерываний IRQ микропроцессорной системы. В таблице 4.1. приведена карта прерываний архитектуры IBM PC.
Таблица 4.1 - Карта прерываний архитектуры IBM PC |
|
Номер IRQ |
Устройство ввода/вывода |
0 |
Прерывание системного таймера из канала таймера 0 |
1 |
Переполнение буфера вывода клавиатуры |
2 |
Каскад для IRQ8-15 |
3 |
Последовательный порт #2 |
4 |
Последовательный порт #1 |
5 |
Параллельный порт #2 |
6 |
Дисковод на гибких дисках (микросхема SMC) |
7 |
Параллельный порт #1 |
8 |
Таймер RTC |
9 |
Свободный |
10 |
Свободный |
11 |
Свободный |
12 |
Мышь PS/2 |
13 |
Математический сопроцессор |
14 |
Встроенный канал жесткого диска (IDE 1) |
15 |
Встроенный канал жесткого диска (IDE 2) |
Прямой доступ осуществляется по системной шине ISA, и, следовательно, его скорость ограничена, в первую очередь, принятым для ISA протоколом обмена.
В отличие от прерываний, где требуется только один сигнал IRQ, в диалоге режима ПДП "запрос прямого доступа предоставление прямого доступа" участвуют два сигнала: DRQ и DACK. Кроме того, в обмене участвует сигнал AEN. Временная диаграмма циклов обмена в режиме ПДП приведена на рисунке 2.2. Пример схемы запроса прямого доступа показан на рисунке 5.1.
Сигнал READY это готовность УВВ к обмену данными в режиме прямого доступа. Он перебрасывает триггер, выход которого сигнал DRQ. В исходное состояние триггер сбрасывается сигналом DACK. Если прямой доступ предоставлен УВВ, то сигнал AEN должен интерпретироваться как наш адрес, поэтому его необходимо объединить с сигналом с выхода селектора адреса (считаем, что возможен также режим программно-управляемого обмена с УВВ). Точно так же, как в случае прерываний, требуется следить, чтобы на каждую линию DRQ поступал только один сигнал, а также, чтобы совпадали номера используемых УВВ сигналов DRQ и DACK.
Рисунок 5.1 - Схема формирования запроса ПДП |
Таблица 5.1 - Карта каналов ПДП архитектуры IBM PC |
|
Номер канала |
Устройство ввода/вывода |
0 |
Свободный |
1 |
Встроенный в плату ECP (обязателен) |
2 |
Дисковод гибких дисков (микросхема SMC) |
3 |
Встроенный в плату ECP (по умолчанию) |
4 |
Каскад для контроллера ПДП 1 (DMA 1- master) |
5 |
Свободный |
6 |
Свободный |
7 |
Свободный |
При выборе канала ПДП проектируемого модуля необходимо учитывать задействованные каналы ПДП микропроцессорной системы. В таблице 5.1. приведена карта прерываний архитектуры IBM PC.
В качестве примера рассмотрим принципы построения адаптеров интерфейсов связи. При проектирование других модулей используются те же принципы и подходы с учетом особенностей входных и выходных сигналов, связывающих модуль с внешними устройствами.
Основу любого адаптера интерфейса связи составляет программируемая БИС. Обобщенная структурная схема адаптера интерфейса связи приведена на рисунке 6.1. В зависимости от интерфейса связи, используемой БИС, способа программного доступа к ней, сопряжения с линией связи и схемы формирования сигнала запроса прерывания представленная структурная схема детализируется и принимает окончательный вид.
БД |
|
|
БО |
|
|
БI |
|
|
СА |
|
|
СБИС |
|
|
СФЗП |
|
|
РИС |
|
|
Рисунок 6.1 - Обобщенная схема адаптера интерфейса связи |
||
Таблица 6.1 - Программируемые БИС интерфейсов связи |
||
Интерфейс связи |
БИС |
|
Параллельный порт (ИРПР-М) |
82С11 |
|
Последовательный порт (RS-232C) |
8250, 16450,16550, 16550А |
|
Канал общего пользования (КОП, IEEE-488) |
8091A, К580ВК91А |
В таблице 6.1 приведены программируемые БИС интерфейсов связи. Необходимо отметить, что существуют другие способы построения адаптеров интерфейсов связи, например, на базе программируемых логических схем (ПЛИС) или на простейших микросхемах. Однако наилучшим решением является использование специализированных, программируемых БИС, в которых размещены все функциональные узлы адаптера интерфейса связи.
Интерфейсная часть адаптера (буфер данных, селектор адреса) проектируется по правилам изложенных в п. 2, 3 и с учетом интерфейсной части используемой БИС.
Буфера ввода и буфера вывода зависят от электрических характеристик интерфейса связи и выходных/входных каскадов используемой БИС. В качестве буферов ввода/вывода для интерфейсов ИРПР-М, в случае не достаточной нагрузочной способности выходных/входных каскадов БИС 82С11, используют D-регистры типа К555ИР23 и однонаправленные буфера типа К555АП3, К555АП5. Для подавления выбросов при переключении сигналов шины данных используют параллельное (сигнал, земля) включение емкостей номиналом 2200 пФ. В качестве буферных элементов КОП используют специализированные БИС К580ВА93 со стандартной схемой подключения к БИС К580ВК91А. Буферные схемы интерфейса RS-232C проектируются на базе схем К170АП2 (МС1488), К170УП2 (МС1489)с амплитудой сигналов RS-232C 12В. Схема входного и выходного буфера для интерфейса RS-232C приведена на рисунке 6.2.
Схема формирования запроса прерывания зависит от типа интерфейса и используемой БИС и проектируется с учетом требований изложенных в п.4. Условием формирования запроса прерывания для интерфейса ИРПР-М является установление сигнала подтверждения (-ACKNLG) при разрешенном бите прерывания порта управления. Аналогичные условия формируются и для других интерфейсов. Как правило, схема формирования запроса прерывания проектируется на базе простейших логических схем. Кроме того, некоторые БИС содержат внутренние схемы формирования запроса прерывания. В этом случае, требуется проверить нагрузочную способность выхода INT и, при необходимости, усилить сигнал с помощью простейшего буфера.
Рисунок 6.2 - Схема входного и выходного буфера для интерфейса RS-232C |
Алгоритм программирования модулей зависит от типа используемой программируемой СБИС и режима обмена между СБИС и процессором компьютера через системную шину ISA.
Инициализация аппаратных модулей проводится в несколько этапов. На первом этапе выполняется инициализация СБИС модуля. На последующих этапах производится инициализация системы прерываний или ПДП, в зависимости от используемых режимов обмена данными между модулем и процессором системы.
В общем виде инициализация СБИС и модуля в целом заключается в выполнении следующей последовательности действий:
Формирование сброса СБИС. Сброс СБИС в исходное состояние производится двумя способами: аппаратным или программным. Для использования аппаратного способа требуется на принципиальной схеме соединить сигнал «сброс» (RESET DRV) системной шины с входом «сброс» СБИС (SR или RESET). Необходимо помнить, что аппаратный сброс на системной шине формируется только при включении питания и в процессе работы сигнал «сброс» находится в пассивном состоянии. Тем не менее, если СБИС имеет вход «сброс», то соединение его с линией «сброс» системной шины обязательно. Программный способ более универсален и позволяет инициализировать СБИС в процессе работы модуля. Для формирования программного сброса требуется в СБИС по адресу регистра режима или сброса подать соответствующий двоичный код. Значение кода сброса определено спецификацией СБИС. Значение адреса регистра режима или сброса определяется разработчиком модуля, то есть в процессе программирования значение адреса фиксировано.
Блокирование системы прерываний. Блокирование прерываний необходимо для модулей, которые работают в режиме прерываний. Прерывания должны быть запрещены на все время инициализации СБИС и модуля в целом. Блокирование прерываний производится одним из двух способов. Первый способ заключается в подаче команды «запретить прерывания». В результате выполнения этой команды вход процессора «прерывание» будет аппаратно закрыт. Второй способ заключается в программной подаче соответствующей маски (двоичного кода = 00 или FFh) по адресу регистра маски запросов прерываний контроллера прерываний. В результате выполнения входы «запрос прерывания» контроллера прерываний будут аппаратно закрыты. На практике в основном используют первый способ, так как он более простой. Необходимо добавить, что блокирование системы прерываний рекомендуется проводить при инициализации всех модулей, независимо от режима обмена.
Задание режима работы СБИС. Задание режима работы СБИС является основным этапом при инициализации. Последовательность действий при задании режима работы строго регламентирована спецификацией СБИС. В программном модуле требуется только выдержать эту последовательность действий, которая заключается в последовательной подаче двоичных кодов (управляющих слов) по адресам регистров режима СБИС. Таким образом, для задания режима требуется сформировать двоичные коды управляющих слов (форматы управляющих слов определены спецификацией СБИС), определить адреса регистров режима (задаются разработчиком аппаратуры модуля) и подать последовательность заданных двоичных кодов по известным адресам портов ввода-вывода.
Инициализация выходных линий СБИС канала связи с внешними устройствами. Данное действие выполняется для тех СБИС, которые осуществляют непосредственную связь с внешними устройствами, например, СБИС интерфейса связи. Инициализация выходных линий СБИС заключается в подаче двоичных кодов (управляющих слов) по адресам регистров управления СБИС. Адреса регистров управления задаются разработчиками аппаратуры модуля. Формат управляющих слов определен спецификацией СБИС. Требуется сформировать такие двоичные коды управляющих слов, которые соответствуют пассивному состоянию канала связи. Пассивное состояние определяется используемым стандартом или интерфейсом связи модуля.
Разблокирование системы прерываний. Разблокирование системы прерываний производится в зависимости от использованного способа блокирования системы прерываний (п.2). Первый способ заключается в подаче команды «разрешить прерывания». В результате выполнения этой команды вход процессора «прерывание» будет аппаратно открыт. Второй способ заключается в программной подаче соответствующей маски (двоичного кода) по адресу регистра маски запросов прерываний контроллера прерываний. В результате выполнения соответствующие входы «запрос прерывания» контроллера прерываний будут аппаратно открыты.
В общем виде инициализация системы прерываний заключается в выполнении следующей последовательности действий:
Размещение подпрограммы обслуживания прерывания. В оперативной памяти компьютера размещается подпрограмма обслуживания прерывания. Определяется физический адрес, по которому расположена первая команда подпрограммы.
Определение места в таблице прерываний. В таблице прерываний определяется место используемого вектора. Место в таблице прерываний фиксировано и зависит от используемого вектора прерываний (номера запроса прерывания).
Заполнение таблицы прерываний. Старое значение таблицы прерываний запоминается в основной программе. Значение физического адреса (сегмент, смещение) подпрограммы заносится в таблицу прерываний по определенному месту. По окончанию работы основной программы требуется старое значение таблицы прерываний вернуть на свое место.
Программирование контроллера прерываний. В регистр маски контроллера прерываний занести двоичный код, который открывает вход «запрос прерывания» используемого запроса прерывания. Адрес регистра маски контроллера прерывания фиксирован и определен архитектурой компьютера.
В общем виде инициализация системы ПДП заключается в выполнении следующей последовательности действий:
В оперативной памяти динамически выделяется блок для буфера ПДП, размер блока определяется прикладной задачей. При выделении блока требуется следить за тем, чтобы весь буфер ПДП размещался в одной странице размером 64 кБайт. Это ограничение вызвано архитектурой IBM XT/AT. Определить начальный физический адрес буфера ПДП.
Программирование канала контроллера ПДП. Для выбранного канала ПДП задается начальный адрес буфера ПДП, размер буфера ПДП, направление обмена. Программирование заключается в записи известных значений (двоичных кодов) по адресам регистров ПДП. Значение адресов регистров ПДП фиксировано и определено конкретной архитектурой компьютера.
Задание режима работы канала ПДП. Формируется управляющее слово, в котором задаются номер канала, тип передачи (одиночная, пакетная), автоинициализация по окончанию передачи всего буфера ПДП и другие параметры. Формат управляющего слова определен спецификацией контроллера ПДП. Код управляющего слова записывается в регистр режима, адрес которого известен.
Запуск канала ПДП. В регистр маски записывается двоичный код, который разрешает работы выбранного канала ПДП. Формат маски определен спецификацией контроллера ПДП. Значение адреса регистра маски контроллера ПДП фиксировано и определено архитектурой компьютера.
Листинги процедур инициализации системы ПДП приведены в приложении Б.
Контроль модуля выполняется по средствам программного чтения слов состояния СБИС с последующим анализом двоичного кода. Формат слов состояния фиксирован и определен спецификацией СБИС. Каждый бит слова состояния несет определенную смысловую нагрузку, а значения всех битов однозначно определяют текущее состояние. Адреса регистров слов состояний задает разработчик аппаратуры модуля. Для определения текущего состояния СБИС требуется выполнить программное чтение по адресу слова состояния, сравнить результат чтения с возможными масками (двоичные комбинации) состояний СБИС и по результатам сравнения принять решение о текущем состоянии СБИС. В некоторых случаях, необходимо выполнить анализ отдельного бита прочитанного слова состояния, например, выполнить анализ уровня входного управляющего сигнала интерфейса связи. В таких ситуациях рекомендуется результат чтения слова состояния логически сравнить с соответствующей маской, на позиции интересующего бита которой установлена единица, а все остальные биты имеют значение нуль. Результат такого логического сложения будет иметь два значения: нуль или не нуль. По этому результату и принимается окончательное решение.
Управление модуля выполняется по средствам программной записи управляющих слов в регистры управления с последующим чтением регистров состояний и анализом слов состояний. Последовательность действий при управлении зависит от используемого стандарта или интерфейса связи с внешним устройством и регламентирована. Очень часто между процессами записи управляющего слова в регистр управления и чтения слово состояния из регистров состояния должна быть выполнена временная задержка. Способы формирования временных задержек просты и известны. При использовании программного метода формирования временной задержки необходимо учитывать тот факт, что время выполнения команд зависит от типа процесса. Поэтому рекомендуется использовать программно-доступные аппаратные таймеры времени.
Основные требования к оформлению пояснительной записки устанавливает стандарт ВятГТУ «ОБЩИЕ ТРЕБОВАНИЯ К ОФОРМЛЕНИЮ ТЕКСТОВЫХ ДОКУМЕНТОВ» СТП ВятГТУ 101-2000.
Графическая часть пояснительной записки (структурная, функциональная, принципиальная схемы и перечень элементов) должна быть выполнена с соблюдением всех стандартов ЕСКД (единая система конструкторской документации).
Перечень структурных элементов пояснительной записки курсового проекта:
Содержание составляется после выполнения всех необходимых работ по проектированию. Все материалы, собранные при проектировании, подразделяются на логически завершенные части, каждой из которых дается свое название.
Перечень заголовков параграфов, написанный в виде столбца с указанием порядковых номеров параграфов и номеров страниц, на которых эти параграфы начинаются, составляет содержание. Содержание позволяет представить общее содержание пояснительной записки и быстро найти необходимый раздел (пункт) пояснительной записки. Примерное содержание курсовой работы приведено ниже.
СОДЕРЖАНИЕ
Введение
1 Анализ темы курсовой работы
Заключение
Библиографический список
Приложение А. Принципиальная схема устройства
Приложение Б. Перечень элементов
Приложение В. Листинги программных модулей
Таблица А.1 - Описание сигналов шин ISA
Обозначение |
Назначение |
Направление |
Тип источника |
SA<19...0> |
Адресные сигналы |
I |
ТРИ |
LA<23...17> |
Адресные сигналы |
I |
ТРИ |
-SBHE |
Разрешение старшего байта по линиям SD<15...8> |
I |
ТРИ |
BALE |
Строб для записи адреса по линиям LA |
I |
ТТЛ |
AEN |
Разрешение адреса. Сообщает устройствам о выполнении на шине циклов ПДП |
I |
ТТЛ |
SD<15...0> |
Шина данных |
I/O |
ТРИ |
-MEMR (-SMEMR) |
Чтение памяти (чтение памяти в пределах первого мегабайта адресного пространства) |
I |
ТРИ |
-MEMW (-SMEMW) |
Запись в память (запись в память в пределах первого мегабайта адресного пространства) |
I |
ТРИ |
-IOR |
Чтение УВВ |
I |
ТРИ |
-IOW |
Запись в УВВ |
I |
ТРИ |
-MEM CS16 |
Выбор цикла для памяти, указывает о том, что память 16-ти разрядная |
О |
ОК |
-I/O CS16 |
Выбор цикла для УВВ, указывает о том, что УВВ 16-ти разрядное |
О |
ОК |
-I/O CH RDY |
Готовность канала ввода/вывода. Предназначен для удлинения циклов доступа |
О |
ОК |
-0WS |
0 тактов ожидания |
О |
ОК |
-REFRESH |
Регенерация памяти |
I |
ОК |
-MASTER |
Ведущий. Предназначен для захвата шины внешней платой |
I/O |
ОК |
-I/O CH CK |
Проверка канала ввода/вывода. Сообщение о фатальной ошибке |
О |
ОК |
RESET DRV |
Сброс устройств |
I |
ТТЛ |
SYSCLK |
Системная частота |
I |
ТРИ |
OSC |
Частота, равная 14.3818 МГц |
I |
ТТЛ |
IRQ<15,14,12,11,10,9,7...3> |
Запрос на прерывание |
О |
ТТЛ |
DRQ<7...5,3...0> |
Запрос на ПДП |
O |
ТТЛ |
-DASK<7...5, 3...0> |
Подтверждение ПДП |
I |
ТТЛ |
TC |
Окончание счета ПДП |
I |
ТТЛ |
Примечание.
В таблице используются следующие обозначения:
Таблица А.2 - Назначение выводов шины ISA
Номер вывода |
Сторона А |
Сторона B |
Сторона C |
Сторона D |
1 |
-I/O CH CK |
GND |
-SBHE |
-MEM CS16 |
2 |
SD7 |
RESET DRV |
LA23 |
-I/O CS16 |
3 |
SD6 |
+5V |
LA22 |
IRQ10 |
4 |
SD5 |
IRQ9 |
LA21 |
IRQ11 |
5 |
SD4 |
-5V |
LA20 |
IRQ12 |
6 |
SD3 |
DRQ2 |
LA19 |
IRQ15 |
7 |
SD2 |
-12V |
LA18 |
IRQ14 |
8 |
SD1 |
0WS |
LA17 |
-DACK0 |
9 |
SD0 |
+12V |
-MEMR |
DRQ0 |
10 |
-I/O CH RDY |
GND |
-MEMW |
-DACK5 |
11 |
AEN |
-SMEMW |
SD8 |
DRQ5 |
12 |
SA19 |
-SMEMR |
SD9 |
-DACK6 |
13 |
SA18 |
-IOW |
SD10 |
DRQ6 |
14 |
SA17 |
-IOR |
SD11 |
-DACK7 |
15 |
SA16 |
-DACK3 |
SD12 |
DRQ7 |
16 |
SA15 |
DRQ3 |
SD13 |
+5V |
17 |
SA14 |
-DACK1 |
SD14 |
-MASTER |
18 |
SA13 |
DRQ1 |
SD15 |
GND |
19 |
SA12 |
-REFRESH |
||
20 |
SA11 |
CLK |
||
21 |
SA10 |
IRQ7 |
||
22 |
SA9 |
IRQ6 |
||
23 |
SA8 |
IRQ5 |
||
24 |
SA7 |
IRQ4 |
||
25 |
SA6 |
IRQ3 |
||
26 |
SA5 |
-DACK2 |
||
27 |
SA4 |
TC |
||
28 |
SA3 |
BALE |
||
29 |
SA2 |
+5V |
||
30 |
SA1 |
OSC |
||
31 |
SA0 |
GND |
Таблица А.3 - Электрические характеристики источников сигналов шины ISA
ТТЛ |
ТРИ |
ОК |
||||
передатчик |
Приемник |
передатчик |
приемник |
ТРИ |
Передатчик |
|
I1l I1h |
- - |
-0.8 0.04 |
- - |
-0.8 0.04 |
-0.4 0.04 |
-0.4 0.02 |
Iol Ioh |
24 -3 |
- -3 |
24 -3 |
0.4 -0.04 |
0.4 -0.04 |
24 |
Примечания:
Таблица А.4 - Максимальные токи потребления внешней платой шины ISA
Напряжение |
[8] |
[8/16] |
+5 B |
3.0 A |
4.5 A |
+12 B |
1.5 A |
1.5 A |
-5 B |
1.5 A |
1.5 A |
-12 B |
1.5 A |
1.5 A |
Примечания:
/*
Программный модуль контроллера ПДП
*/
// Макрос для извлечения байтов из 20-разрядного адреса
#define LSB(x) (*((unsigned char *) &x))
#define MSB(x) (*(((unsigned char *) &x) + 1))
#define PG(x) (*(((unsigned char *) &x) + 2))
int page_tbl[] = // таблица адресов страничных регистров
{ 0x87, 0x83, 0x81, 0x82, // для каналов ПДП 0, 1, 2, 3
0x8f, 0x8b, 0x89, 0x8a }; // 4, 5, 6, 7
//**************************************************************
// Назначить указатель для буфера ПДП <buf_dma>
// с выравниванием границ и
// размещения буфера в зоне одной страницы
// возвращает: 0 - буфер ПДП организован в памяти
// 1 - мало памяти для буфера ПДП
// bufer - начало рабочего буфера ПДП
// block - начало блока памяти farmalloc
//**************************************************************
//#pragma argsused
int AllocDmaBuf(char far** bufer, char far** block, unsigned int size_dma)
{
unsigned buf; /* temp variables for various */
unsigned max; /* paragraph addreses */
unsigned seg;
unsigned size; /* buffer size in paragraphs */
char far *cp; // указатель на начало свободной памяти
size = (unsigned)((size_dma >> 4) + 1); /*convert bytes to paragraphs .by dividing by 16 */
seg = FP_SEG (cp = (char far *)farmalloc(size_dma)) + 1;
//определение начала свободной памяти
farfree(cp);
buf = seg; /* initial attempt at buffer segment */
if( ((buf + size - 1) & 0xf000) /* if buffer crosses */
!= (buf & 0xf000) ) /* phys page bdry */
buf = (buf & 0xf000) + 0x1000; //adjust to next phys page
*bufer = (char far *) /* convert buffer segment */
((long) buf << 16); /*... to far pointer for return */
size = buf + size - seg; /* compute actual size needed */
*block = (char far *)farmalloc((long)size << 4);
//printf("\nБуфер ПДП: выделено %04lX hex байт", (long)size << 4);
if(*block == NULL)
return (1);
return (0);
}
//**************************************************************
// Программирование канала ПДП
// chan - номер канала ПДП 0-3, 5-7
// *buf - адрес буфера в памяти (far, huge)
// bytes - размер буфера, байт
// dma_enable - 1/0 разрешить/запретить канал после программирования
//**************************************************************
void StartDma(int chan, char far *buf, long bytes, int mode, int dma_enable)
{
int sel, // dma channel select bits
basereg, // dma controller base address register
cntreg, // dma controller count register
maskreg, // dma controller mask register
modereg, // dma controller mode register
pagereg, // dma page address register
page;
long addr;
sel = chan & 3; // isolate channel select bits
pagereg = page_tbl[chan]; // locate corresponding page reg
addr = // 20-bit address of dma buffer
FP_OFF(buf) + ((long) FP_SEG(buf) << 4);
page = PG(addr); // extract upper bits of address
if(chan < 4) // setup depends on chan number
{ basereg = DMA0_BASE + sel * 2; // standard dma controller
cntreg = basereg + 1; // note that this controller
maskreg = DMA0_BASE + 10;// is addressed on byte
modereg = DMA0_BASE + 11; // boundaries
}
else
{ basereg = DMA1_BASE + sel * 4; // alternate dma ctrlr (AT only)
cntreg = basereg + 2; // note that this controller
maskreg = DMA1_BASE + 20; // is addressed on word
modereg = DMA1_BASE + 22; // boundaries
bytes >>= 1; // convert count to words
addr >>= 1; // convert address to words
page &= 0x7e; // address bit 16 is now in 'addr'
}
bytes--; // compute count-1 (xfr stops at ffff)
disable();
outp(maskreg, sel | 0x04); // set mask bit to disable dma
outp(modereg, sel | mode); // xfr mode
outp(basereg, LSB(addr) ); // output base address lsb
outp(basereg, MSB(addr) ); // output base address msb
outp(pagereg, page ); // output page number to page register
outp(cntreg, LSB(bytes)); // output count lsb
outp(cntreg, MSB(bytes)); // output count msb
enable();
// запомним начальный адрес ПДП
par.start_dma_addr = (unsigned int)(addr & 0xffff);
if(dma_enable)
outp(maskreg, sel); // clear mask bit, enabling dma
}
//**************************************************************
// Запрет работы канала ПДП
//**************************************************************
void DmaFinish(void) // called via atexit() mechanism
{
int sel, // dma channel select bits
maskreg, // dma controller mask register
chan; // номер канала
if(block_dma != NULL)
{
chan = CHAN_DMA1;
sel = chan & 3; // isolate channel select bits
if(chan < 4) // setup depends on chan number
maskreg = DMA0_BASE + 10; // is addressed on byte
else
maskreg = DMA1_BASE + 20;// is addressed on word
disable();
outp(maskreg, sel | 0x04); // set mask bit to disable dma
enable();
farfree(block_dma); // освободить память выделенную под буфер ПДП
}
if(block_dma3 != NULL)
{
chan = CHAN_DMA3;
sel = chan & 3; // isolate channel select bits
if(chan < 4) // setup depends on chan number
maskreg = DMA0_BASE + 10; // is addressed on byte
else
maskreg = DMA1_BASE + 20; // is addressed on word
disable();
outp(maskreg, sel | 0x04); // set mask bit to disable dma
enable();
farfree(block_dma3); // освободить память выделенную под буфер ПДП
}
}
// **********************************
// Инициализация ПДП
// возвращает: 0 - буфер ПДП организован в памяти
// 1 - мало памяти для буфера ПДП
//***********************************
int DmaSetup(void)
{
// Выделяем память с запасом
if (AllocDmaBuf(&buf_dma, &block_dma, SIZE_DMA1+0x10) != NULL)
return (1);
//if (AllocDmaBuf(&buf_dma3, &block_dma3, SIZE_DMA3+0x10) != NULL)
if (AllocDmaBuf(&buf_dma3, &block_dma3, SIZE_DMA3+0x1000) != NULL)
return (1);
StartDma(CHAN_DMA1, buf_dma, SIZE_DMA1, MODE_DMA1, ENABLE);
return (0);
}