2.1.5.Описание библиотеки API функций В настоящем разделе приведены достаточно подробные описания переменных, структур и функций, входящих в состав штатной досовской библиотеки для плат серии L7xx. Предлагаемое программное обеспечение разрабатывалось с учетом идеологического родства плат данной серии и, следовательно, все штатные функции выполняются однотипно для различных плат. Однако существуют отличительные нюансы определенного характера при использовании штатных функций для плат типа L-783 на частотах работы АЦП выше 1 МГц. Подробнее эти отличия выявлены в § 2.1.6 “Особенности работы штатной библиотеки с платами L-783”.
2.1.5.1.Переменные и структуры 2.1.5.1.1.Структура BOARD_INFO Структура BOARD_INFO описана в файле plx_api.h и представлена ниже:
struct BOARD_INFO
{
char Board_Name[8]; // название платы (макс. 7 символов):
// “L761”, “L780”, “L783” или “Unknown”
char BoardSerialNumber[9]; // серийный номер платы (8 символов)
unsigned BoardDspType; // тип установленного на плате DSP:
// 0 или ADSP2184_PLX для ADSP-2184,
// 1 или ADSP2185_PLX для ADSP-2185,
// 2 или ADSP2186_PLX для ADSP-2186,
// где ADSP2184_PLX, ADSP2185_PLX и
// ADSP2186_PLX - предопределенные константы.
double BoardQuartzFrequency; // частота установленного на плате кварца в кГц:
// 14745.6,
// 16667.0,
// 20000.0.
char BoardRevision; // тип ревизии платы: ‘A’, ‘B’ или ‘C’
unsigned int ConfigRegsBaseAddress; // базовый порт доступа к локальным
// регистрам PCI9050-1 или PCI9030
unsigned int IO_BaseAddress; // базовый порт (I/O) доступа к плате L7xx
unsigned long HighMemorySpaceBaseAddress; // базовый адрес памяти выше
// 1 Мб для доступа к платам L7xx
unsigned long LowMemorySpaceBaseAddress; // базовый адрес памяти ниже
// 1 Мб для доступа к платам L7xx
unsigned int IDMA_Word_Access; // используется в функциях доступа к плате
unsigned int IDMA_Array_Access; // используется в функциях доступа к плате
unsigned int IDMA_Address_Access; // используется в функциях доступа к плате
unsigned int DSP_Irq2_Access; // используется в функциях доступа к плате
unsigned int DSP_Reset_Access; // используется в функциях доступа к плате
unsigned int BoardAccessMode; // текущий режим доступа к плате под DOS:
// 0 или IO_ACCESS – через порты ввода-вывода I/O,
// 1 или LOW_MEM_ACCESS – через память, расположенную ниже 1Мб,
// 2 или HIGH_MEM_ACCESS – через память, расположенную выше 1Мб,
// 3 или NO_ACCESS_MODE – доступ к плате вообще запрещен,
// где IO_ACCESS, LOW_MEM_ACCESS, HIGH_MEM_ACCESS и
// NO_ACCESS_MODE - предопределенные константы.
unsigned int IsDacPresented; // наличие ЦАП'а на плате:
// 0 – ЦАП отсутствует,
// 1 - ЦАП присутствует,
unsigned InterruptNumber; // номер прерывания, назначенный плате
int IrqVectorNumber; // вектор прерывания этого прерывания
int IrqMask; // маска прерывания для этого прерывания
void interrupt (*OldHandlerPlx)(PARM); // старый адрес
// обработчика прерывания
int IsInterruptInProgress; // флажок нахождения в режиме
// работы по прерываниям
unsigned Bus; // используется при опросе конфиг. пространства PCI
unsigned Device; // используется при опросе конфиг. пространства PCI
unsigned Function; // используется при опросе конфиг. пространства PCI
};
Перед работой с платами серии L7xx необходимо заполнить поля данной структуры для каждой платы, с которой Вы собираетесь работать, потому что все функции входящие в API используют информацию, заложенную в нее. Для каждой платы должен быть свой экземпляр данной структуры и указатель на нее должен передаваться в качестве одного из параметров в функции штатной библиотеки. В штатной библиотеке подпрограмм (набор API-функций) для надлежащего заполнения всех полей структуры для каждой из плат серии L7xx вставленных в PC имеется соответствующая функция INIT_ACCESS_TO_PLX(struct BOARD_INFO *bi). Именно она должна вызываться в начале каждой пользовательской программы. В качестве параметра ей передается указатель на массив структур типа BOARD_INFO. Размер массива структур должен быть равен или больше количеству установленных в компьютере плат серии L7xx (можно использовать предопределенную в plx_api.h константу MAXDEVICENUMBER равную 7). Определить какой именно плате принадлежит конкретный индекс в массиве структур BOARD_INFO можно по полю BoardSerialNumber, содержащему уникальный серийный номер платы.
2.1.5.1.2.Структура PLATA_DESCR Структура PLATA_DESCR описана в файле plx_api.h и представлена ниже:
struct PLATA_DESCR
{
char SerialNumber[9]; // серийный номер платы (8 символов)
char Name[5]; // название платы (макс. 4 символов):
// “ L761”, “L780” или “L783”
char Revision; // ревизия платы: ‘A’, ‘B’ или ‘C’
char Dsp_Type[5]; // тип установленного на плате DSP:
// “2184” для ADSP-2184,
// “2185” для ADSP-2185,
// “2186” для ADSP-2186,
long QuartzFrequency; // частота установленного на плате кварца в Гц:
// 14745600,
// 16667000,
// 20000000.
unsigned int IsDacPresented; // наличие ЦАП'а на плате:
// 0 – ЦАП отсутствует,
// 1 - ЦАП присутствует,
unsigned int ReservedWord[7]; // зарезервировано
};
Данная структура используется в функциях, которые работают со служебной областью пользовательского ППЗУ: SAVE_PLATA_DESCR_PLX(struct BOARD_INFO *bi, PLATA_DESCR *pd) и GET_PLATA_DESCR_PLX(struct BOARD_INFO *bi, PLATA_DESCR *pd). Подробности конфигурации этого ППЗУ см. § 2.1.2.3 “Формат пользовательского ППЗУ”. Структура PLATA_DESCR используется, например, в функции INIT_ACCESS_TO_PLX() при чтении служебной информации из пользовательского ППЗУ платы и заполнении соответствующих полей структуры BOARD_INFO.
2.1.5.1.3.Глобальные переменные штатной библиотеки Глобальная переменная PLX_Board_Quantity объявлена в файле plx_api.cpp и представлена ниже:
int PLX_Board_Quantity=0; // кол-во обнаруженных плат L7xx
В пользовательской программе эту переменную необходимо описать как extern и именно в ней после выполнения функции INIT_ACCESS_TO_PLX() будет находится количество обнаруженных плат серии L7xx
2.1.5.1.4.Переменные LBIOS Программист под DOS может напрямую работать с памятью DSP (и программ, и данных), используя библиотечные функции, которые обеспечивают доступ по каналу IDMA процессора ADSP-2184/2185/2186 как к отдельным ячейкам памяти модуля, так и к целым массивам. Эта возможность позволяет программисту работать с платой, непосредственно обращаясь к соответствующим ячейкам памяти программ либо данных. Карты распределения, как памяти программ, так и памяти данных для различных типов DSP, которые могут быть установлены на плате, приведены в приложении B.
В Таблице 7 (см. ниже) приводятся предопределенные адреса переменных LBIOS, хранящихся в памяти данных DSP, и их краткое описание. Программист может напрямую обращаться к ним, чтобы считать или изменить их содержимое. Собственно сами эти адреса являются 14ти битными, но старшие два бита в них могут задаваться в самих API-функциях для доступа к памяти данных DSP (например, GET_DM_WORD_PLX() и т.д.) в зависимости от значения поля BoardDspType структуры BOARD_INFO (тип DSP, на который настроен LBIOS). Так при использовании предопределенных констант два старших бита в этих адресах задаются как 0х2 при BoardDspType=0 (ADSP-2184) и 0х3 при BoardDspType=1 (ADSP-2185) и BoardDspType=2 (ADSP-2186). Подробности см. § 2.1.5.3 “Функции для доступа к памяти DSP”.
Адреса управляющих переменных LBIOS
Название переменной
| Адрес в Hex формате
| Назначение переменной
| L_CONTROL_TABLE_PLX
| _A00
| Управляющая таблица, содержащая последовательность логических номеров каналов (максимум 96). В соответствии с ней DSP производит последовательный циклический сбор данных с АЦП. Размер этой таблицы задается переменной L_CONTROL_TABLE_ LENGHT_PLX (см. ниже). По умолчанию – { 0, 1, 2, 3, 4, 5, 6, 7}
| L_SCALE_PLX
| _D00
| Массив с 4 калибровочными коэффициентами, используемый для корректировки масштаба данных с АЦП. По умолчанию – { 0x7FFF, 0x7FFF, 0x7FFF, 0x7FFF}
| L_ZERO_PLX
| _D04
| Массив с 4 калибровочными коэффициентами, используемый для корректировки смещения нуля данных с АЦП. По умолчанию – { 0x0, 0x0, 0x0, 0x0}
| L_CONTROL_TABLE_ LENGHT_PLX
| _D08
| Размер управляющей таблицы (максимум 96 логических каналов). По умолчанию – 8.
| L_BOARD_REVISION_ PLX
| _D3F
| В этой переменной хранится ревизия текущей платы: ‘A’(0x41), ‘B’(0x42) или ‘C’(0x43).
| L_READY_PLX
| _D40
| Флажок готовности платы к дальнейшей работе. После загрузки управляющей программы в DSP, необходимо дождаться установления данного флажка в ‘1’.
| L_TMODE1_PLX
| _D41
| Тестовая переменная. После загрузки драйвера (LBIOS) по этому адресу должно читаться число 0x5555.
| L_TMODE2_PLX
| _D42
| Тестовая переменная. После загрузки драйвера (LBIOS) по этому адресу должно читаться число 0xAAAA.
| L_DAC_IRQ_SOURCE_ PLX
| _D43
| Содержит информацию об источнике прерываний в РС от ЦАП платы: 0x1 – требуется пересылка очередной порции данных длиной L_DAC_IRQ_ STEP_PLX отсчётов в FIFO буфер ЦАП, 0x2 – работа ЦАП остановлена. Только для плат ревизии ‘C’ и выше.
| L_DAC_ENABLE_IRQ_ VALUE_PLX
| _D44
| Переменная, значение которой (при выполнении соответствующей команды) передается в переменную L_DAC_ENABLE_IRQ_PLX. Только для плат ревизии ‘C’ и выше.
| L_DAC_IRQ_FIFO_ ADDRESS_PLX
| _D45
| Если произошло прерывание в РС от ЦАП платы, то, начиная с этого адреса можно записать очередных L_DAC_IRQ_STEP_PLX отсчетов в FIFO буфер ЦАП. Только для плат ревизии ‘C’ и выше.
| L_DAC_IRQ_STEP_PLX
| _D46
| Переменная, задающая шаг (число отсчетов) в генерировании прерываний в РС от ЦАП платы по мере необходимости в новых данных для FIFO буфера ЦАП. При помощи этой переменной можно сделать так, что прерывания в РС будут генериться, например, через каждые 20 отсчетов, выведенных на ЦАП. По умолчанию – 0х200. Только для плат ревизии ‘C’ и выше.
| L_ENABLE_TTL_OUT_ PLX
| _D47
| Данная переменная разрешает (0х1) либо запрещает (0х0) использование выходных цифровых линий (т.е. регулирует перевод их в ‘третье’ состояние и обратно). Только для плат ревизии ‘C’ и выше.
| L_DSP_TYPE_PLX
| _D48
| Переменная, передающая драйверу (LBIOS) тип установленного на плате DSP. Если она равна 0, то на модуле установлен ADSP-2184 (4 КСлов памяти программ и 4 КСлов памяти данных). Если она равна 1, то – ADSP-2185 (16 КСлов памяти программ и 16 КСлов памяти данных). Если она равна 2, то – ADSP-2186 (8 КСлов памяти программ и 8 КСлов памяти данных). По умолчанию L_DSP_TYPE_PLX=0.
| L_COMMAND_PLX
| _D49
| Переменная, при помощи которой драйверу передается номер команды. Краткое описание номеров команд приведено ниже в Таблице 8.
| L_TTL_OUT_PLX
| _D4C
| Слово (16 бит), в котором по-битово хранятся значения 16ти выходных цифровых линий для их выставления по команде C_TTL_OUT_PLX (см. Таблицу 8).
| L_TTL_IN_PLX
| _D4D
| Слово (16 бит), в котором после выполнения команды C_TTL_IN_PLX (см. Таблицу 8) по-битово хранятся значения 16ти входных цифровых линий.
| L_DAC_FIFO_PTR_PLX
| _D4F
| Переменная, в которой хранится текущий адрес значения, предназначенного для вывода из FIFO буфера ЦАП на сам ЦАП. Данная переменная по мере вывода данных меняет свое значение от L_DAC_FIFO_BASE_ADDRESS_PLX до L_DAC_FIFO_BASE_ADDRESS_PLX + L_DAC_FIFO_LENGTH_PLX – 1.
| L_ADC_FIFO_PTR_PLX
| _D50
| Переменная, в которой хранится текущий адрес заполнения FIFO буфера АЦП в памяти данных DSP. Данная переменная по мере ввода данных с АЦП меняет свое значение от L_ADC_FIFO_BASE_ADDRESS_PLX до L_ADC_FIFO_BASE_ADDRESS_PLX + L_ADC_FIFO_LENGTH_PLX – 1.
| L_TEST_LOAD_PLX
| _D52
| Тестовая переменная.
| L_ADC_RATE_PLX
| _D53
| Переменная, задающая частоту работы АЦП.
| L_INTER_KADR_ DELAY_PLX
| _D54
| Переменная, задающая межкадровую задержку при вводе данных с АЦП.
| L_DAC_RATE_PLX
| _D55
| Переменная, задающая частоту вывода данных с ЦАП’ов.
| L_DAC_VALUE_PLX
| _D56
| Величина, которую требуется однократно установить на выходе ЦАП’а.
| L_ENABLE_IRQ_PLX
| _D57
| Данная переменная разрешает (0х1) либо запрещает (0х0) генерирование прерываний в PC от АЦП платы при соответствующем заполнении FIFO буфера АЦП. По умолчанию – 0х0.
| L_IRQ_STEP_PLX
| _D58
| Переменная, задающая шаг (число отсчетов) в генерировании прерываний в РС от АЦП платы по мере заполнения FIFO буфера АЦП. При помощи этой переменной можно сделать так, что прерывания в РС будут генериться, например, через каждые 20 отсчетов. По умолчанию – 0х400.
| L_IRQ_FIFO_ ADDRESS_PLX
| _D5А
| Если произошло прерывание в РС от АЦП платы, то начиная с этого адреса можно считать в РС L_IRQ_STEP_PLX отсчетов из FIFO буфера АЦП.
| L_ENABLE_IRQ_ VALUE_PLX
| _D5B
| Переменная, значение которой (при выполнении соответствующей команды) передается в переменную L_ENABLE_IRQ_PLX.
| L_ADC_SAMPLE_PLX
| _D5C
| Данная переменная используется при однократном вводе с АЦП, храня считанное значение.
| L_ADC_CHANNEL_PLX
| _D5D
| Данная переменная используется при однократном вводе с АЦП, задавая логический номер канала.
| L_CORRECTION_ENABLE _PLX
| _D60
| Переменная запрещающая (0)/разрешающая (1) корректировку данных аналоговых каналов при помощи калибровочных коэффициентов. По умолчанию L_CORRECTION_ENABLE_PLX = 0х0.
| L_ADC_ENABLE_PLX
| _D62
| Переменная запрещающая (0)/разрешающая (1) работу АЦП.
| L_ADC_FIFO_BASE_ ADDRESS_PLX
| _D63
| Текущий базовый адрес FIFO буфера АЦП. По умолчанию L_ADC_FIFO_BASE_ADDRESS_ PLX = 0x2000.
| L_ADC_FIFO_BASE_ ADDRESS_INDEX_PLX
| _D64
| Переменная, задающая базовый адрес FIFO буфера АЦП. Может принимать три значения: 0 – базовый адрес начинается с адреса 0х0 только для ADSP-2185 1 – базовый адрес начинается с адреса 0х2000 только для ADSP-2185 и ADSP-2186 2 – базовый адрес начинается с адреса 0х3000 для ADSP-2185 и ADSP-2186 и с адреса 0х2000 для ADSP-2184.
| L_ADC_FIFO_ LENGTH_PLX
| _D65
| Текущая длина FIFO буфера АЦП. По умолчанию L_ADC_FIFO_LENGTH_PLX = 0x800.
| L_ADC_NEW_FIFO_ LENGTH_PLX
| _D66
| Переменная, задающая длину FIFO буфера АЦП.
| L_DAC_ENABLE_ STREAM_PLX
| _D67
| Переменная запрещающая (0)/разрешающая (1) вывод данных из FIFO буфера ЦАП на сам ЦАП.
| L_DAC_FIFO_BASE_ ADDRESS_PLX
| _D68
| Текущий базовый адрес FIFO буфера ЦАП. Данный буфер расположен в памяти программ DSP. По умолчанию L_DAC_FIFO_BASE_ ADDRESS_PLX = 0xС00.
| L_DAC_FIFO_ LENGTH_PLX
| _D69
| Текущая длина FIFO буфера ЦАП. По умолчанию L_DAC_FIFO_LENGTH_PLX = 0x400.
| L_DAC_NEW_FIFO_ LENGTH_PLX
| _D6А
| Переменная, задающая длину FIFO буфера ЦАП.
| L_DAC_ENABLE_IRQ_ PLX
| _D6B
| Данная переменная разрешает (0х1) либо запре-щает (0х0) генерирование прерываний в PC при работе с ЦАП. По умолчанию – 0х0. Только для плат ревизии ‘C’ и выше.
| L_SYNCHRO_TYPE_PLX
| _D70
| Переменная, задающая тип синхронизации (аналоговая, цифровая или ее отсутствие).
| L_SYNCHRO_AD_ CHANNEL_PLX
| _D73
| При аналоговой синхронизации задает логический номер канала, по которому происходит синхронизация.
| L_SYNCHRO_AD_ POROG_PLX
| _D74
| При аналоговом типе задает порог синхронизации в кодах АЦП.
| L_SYNCHRO_AD_ MODE_PLX
| _D75
| Переменная, задающая режим аналоговой синхронизации по переходу ‘снизу-вверх’ (0х0) или ’сверху-вниз’ (0х1).
| L_SYNCHRO_AD_ SENSITIVITY_PLX
| _D76
| Переменная, задающая аналоговую синхронизацию по уровню (0х0) либо по переходу (0х1).
| 2.1.5.1.5.Номера команд штатного LBIOS Фирменный LBIOS для плат серии L7xx работает по принципу команд, т.е. в переменной L_COMMAND драйверу передается номер команды, которую он должен выполнить. Список доступных номеров команд LBIOS приведен ниже в таблице.
Номера команд LBIOS.
Название команды
| Номер команды
| Назначение
| Используемые переменные
| C_TEST_PLX
| 0
| Проверка загрузки платы и ее работоспособности.
| L_TEST_LOAD_PLX
| C_LOAD_CONTROL_ TABLE_PLX
| 1
| Загрузка управляющей таблицы в память DSP.
| L_CONTROL_ TABLE_PLX,
L_CONTROL_TABLE_ LENGHT_PLX
| C _ENABLE_ADC_ PLX
| 2
| Разрешение/запрещение работы АЦП. Если работа разрешена, то заполнение FIFO буфера АЦП начинается заново.
| L_ADC_ENABLE_PLX
| C_ADC_FIFO_ CONFIG_PLX
| 3
| Конфигурирование параметров FIFO буфера АЦП.
| L_ADC_FIFO_BASE_ ADDRESS_PLX,
L_ADC_FIFO_BASE_ ADDRESS_INDEX_PLX,
L_ADC_FIFO_ LENGTH_PLX,
L_ADC_NEW_FIFO_ LENGTH_PLX
| C_SET_ADC_ KADR_PLX
| 4
| Установка временных параметров работы АЦП.
| L_ADC_RATE_PLX,
L_INTER_KADR_ DELAY_PLX
| C_ENABLE_DAC_ STREAM_PLX
| 5
| Разрешение/запрещение потокового вывода данных из FIFO буфера ЦАП. А для плат Rev. C можно использовать при этом прерывания в РС.
| L_DAC_ENABLE_ STREAM_PLX
L_DAC_IRQ_STEP_PLX
L_DAC_ENABLE_IRQ_ PLX
| C_DAC_FIFO_ CONFIG_PLX
| 6
| Конфигурирование параметров FIFO буфера ЦАП.
| L_DAC_FIFO_BASE_ ADDRESS_PLX,
L_DAC_FIFO_ LENGTH_PLX,
L_DAC_NEW_FIFO_ LENGTH_PLX
| C_SET_DAC_ RATE_PLX
| 7
| Установка частоты вывода данных из FIFO буфера ЦАП’а.
| L_DAC_RATE_PLX
| C_ADC_SAMPLE_ PLX
| 8
| Однократный ввод отсчета АЦП с заданного канала.
| L_ADC_SAMPLE_PLX,
L_ADC_CHANNEL_PLX
| C_TTL_IN_PLX
| 9
| Получение состояния 16ти внешних цифровых линий.
| L_TTL_IN_PLX
| C_TTL_OUT_PLX
| 10
| Управление 16тью внешними цифровыми линиями.
| L_TTL_OUT_PLX
| C_SYNCHRO_ CONFIG_PLX
| 11
| Управление синхронизацией начала ввода данных с АЦП.
| L_SYNCHRO_TYPE_PLX,
L_SYNCHRO_AD_ CHANNEL_PLX,
L_SYNCHRO_AD_ POROG_PLX,
L_SYNCHRO_AD_ MODE_PLX,
L_SYNCHRO_AD_ SENSITIVITY_PLX
| C_ENABLE_IRQ_PLX
| 12
| Разрешение/запрещение работы с АЦП по прерываниям в РС.
| L_ENABLE_IRQ_PLX,
L_ENABLE_IRQ_ VALUE_PLX,
L_IRQ_STEP_PLX
| C_IRQ_TEST_PLX
| 13
| Тестовая функция для генерирования прерываний в РС с частотой примерно 300 Гц.
| L_ENABLE_IRQ_PLX
| C_SET_DSP_ TYPE_PLX
| 14
| Передает в драйвер LBIOS тип установленного на плате DSP и соответствующим образом модифицирует код драйвера.
| L_DSP_TYPE_PLX
| C_ENABLE_TTL_ OUT_PLX
| 15
| Управление доступом выходных цифровых линий. Для плат ревизии ‘C’ и выше при наличии перемычки на контактах 1–2 на разъёме X5 платы. См. § 1.4.3.2 “Внешний вид платы L-780M (Rev. C)”.
| L_ENABLE_TTL_OUT_ PLX
|
|