Драйвер для работы с платой LA48DPCI в операционной системе Windows 95/98/Me

Страницы работы

Фрагмент текста работы

Определяет маску необходимую для операций  AND/OR/XOR/TEST

m_cValue

Определяет маску необходимую для операций  AND/OR/XOR/TEST

m_uTimeOut

Определяет время ожидания для операции WAIT в millis

Подробное описание передаваемых структур для работы и настройки желаемых параметров:

struct  EasyDeviceSetup : public ParametersBase

{

// --- Унаследованные поля --int      m_nType;

int      m_nSizeOf;  

// --------------------------char*           m_szDeviceName;     // Device Name

int             m_nDeviceNumber;    // Device Number

EasyDeviceSetup()

{

m_nType   = EASYDEVICESETUP_TYPE;

m_nSizeOf = sizeof(EasyDeviceSetup);

}

};

m_szDeviceName

Определяет имя устройства

m_nDeviceNumber

Определяет номер устройства 1,2,3,4,… (по умолчанию 0)

struct  InterruptEvent : public ParametersBase

{

// --- Унаследованные поля --int      m_nType;

int      m_nSizeOf;  

// --------------------------unsigned        m_nIntOf;           // Interrupt mode

unsigned        m_hWnd;             // HWND if(m_hWnd == 0) use m_hEvent;

union                               // else               use m_uMessage;

{

unsigned        m_uMessage;         // message ID

HANDLE          m_hEvent;           // handle to Event

};

unsigned        m_uLParam;          // LPARAM (any 32 bit value)

InterruptEvent()

{

m_nType   = INTERRUPTEVENT_TYPE;

m_nSizeOf = sizeof(InterruptEvent);

}

};

m_nIntOf

Определяет режим вызова данного метода, m_nIntOf :

0 – освободить прерывание,

IEASYDRIVER_UNMASK – размаскировать прерывание

IEASYDRIVER_MASK - замаскировать прерывание

IEASYDRIVER_ALLOC  - захватить прерывание

m_hWnd

Определяет HWND окна, которому будет послано сообщение в случае возникновения прерывания, если m_hWnd равно 0 то будет срабатывать через m_hEvent

m_uMessage

Определяет значения сообщения, которое будет послано в случае возникновения прерывания

m_hEvent

Определяет Event, который произойдет в случае возникновения прерывания

m_uLParam Определяет модификацию работы методов IEASYDRIVER_UNMASK и IEASYDRIVER_ALLOC, если параметр m_uLParam  = IEASYDRIVER_PORT12, то происходит размаскирование прерываний на контроллере шины PCI для портов А и В, если параметр m_uLParam  = IEASYDRIVER_PORT1, то происходит размаскирование прерывания на контроллере шины PCI для порта А, и если параметр m_uLParam  = IEASYDRIVER_PORT2, то происходит размаскирование прерывания на контроллере шины PCI для порта В.

Возвращаемое значение:

Если  метод IO отработал правильно, то возвратится 1. Если произошли ошибки, то возможные коды следующие:

Значение

Описание

IEASYDRIVER_ERROR_NO_SUPPORTED_DEVICE

Не поддерживаемое устройство(Если вызвали Setup с именем другого устройсва)

IEASYDRIVER_ERROR_NO_REGISTERED_DLL

Не зарегистрированны DLL необходимые для работы драйвера

IEASYDRIVER_ERROR_NO_SUPPORTED_VERSION

Не поддерживаемая версия

IEASYDRIVER_ERROR_NO_INIT_DEVICE

Усройство не инициализированно

IEASYDRIVER_ERROR_INTERFACE

Не создан интерфейс

IEASYDRIVER_ERROR_OUT_RANGE

Выход за допустимые границы, скорее всего ошибка в параметрах

Описание:

Основной метод позволяет работать с цифровыми портами, при вызове данного метода ему передаетя указатель на структуру данных. Метод определяет по типу параметра необходимые действия и выполняет их, если произошла ошибка выводится код ошибки.

Пример на C++:

В данном примере показан вывод в управляющий регистр второй схемы (А-1,В-1,С-1), значения «4».

IEasyDriver*            m_pPCI;

. . .

PortIO*       pAdrPIO;

pAdrPIO = new(PortIO);

pAdrPIO->m_wIOOperation = KIOP_OP_OUT;

pAdrPIO->m_uValue = 0x04;

pAdrPIO->m_nPort  = 7; 

m_pPCI->IO(pAdrPIO);

delete pAdrPIO;

. . .

3.5. Пример использования

Ниже следует пример использования поставляемых средств разработки приложений для C++. Этот пример может быть скомпилирован, например, в среде Microsoft Developer Studio (TM) или Borland C++ Builder как консольное приложение Win32.

Данный пример использует прерывание по порту В. Порт В работает в режиме 1 на ввод, порт В-1,С-1 настраивается на вывод в режиме 0 (для того чтобы можно было создать внешнее прерывание). В порт В-1 записывается информация, в порт С-1 (бит PC2) выводится последовательно 0 потом 1. В порту В возникает прерывание. По этому прерыванию информация считывается из порта и выводится на экран. Потом разрешается прерывание. И все повторяется.

!!!!

Для того чтобы данный пример заработал нужен кабель соединяющий

Порты А,В  соответственно с портами А-1,В-1.

Биты порта С и С-1

должны быть соединены так:

Порт С              Порт С-1

PC0   не соединены  PCO

PC1   соединены     PC1

PC2   соединены     PC2

PC3   не соединены  PC3

PC4   соединены     PC4

PC5   соединены     PC5

PC6   соединены     PC6

PC7   соединены     PC7

!!!!

*/

#define             Amount      2048 //Количество прерываний которые будут сгенерированны

#include            <Windows.h>

#include            "IEasyDriver.h"

#include            "IFactory.h"

#include            "DllClient.h"

#include            <iostream.h>

#include            <conio.h>

#include            "REGKEY\VT_EasyDriver.ri"

int main()

{

DllClient                PCIClient;

IFactory*               PCIFactory = NULL;

IEasyDriver*         m_pPCI     = NULL;

EasyDeviceSetup*    pAdrEDS    = NULL;

PortIO*                 pAdrPIO    = NULL;

InterruptEvent*     pAdrIE     = NULL;

unsigned              i          = 0;

unsigned              counter    = 0;

//Загружаем драйвер устройства (LA48DPCI)

PCIFactory = (IFactory*)PCIClient.LoadRegistered(CompanyNameEASYDRV,

ProductNameEASYDRV_PORT,

VersionNameEASYDRV,

_T("LA48DPCI"));

if(PCIFactory == 0)//Если устройство не загрузилось

{

cout<<"Can not load LA48DPCI"<<endl;

getch();

return 0;

}

//Создаем интерфейс для работы с драйвером

m_pPCI = (IEasyDriver*)PCIFactory->Create(_T("IEasyDriver"), 0);

if(m_pPCI == 0)//Если интерфейс не создался

{

PCIClient.Free();

cout<<"Can not create IEasyDriver"<<endl;

getch();

return 0;

}

//----------------------------------------------------------------HANDLE hIRQEvent;

// Создание Event'а для реакции на прерывание

hIRQEvent = CreateEvent (NULL,FALSE,FALSE,NULL);

//Создание структур для передачи параметров в драйвер

pAdrEDS = new(EasyDeviceSetup);//Применяется для настройки (Setup)      //устройства

pAdrPIO = new(PortIO);         //Применяется для ввода/вывода

pAdrIE  = new(InterruptEvent); //Применяется для работы с прерываниями

if(!pAdrEDS || !pAdrPIO || !pAdrIE)//Если структуры не создались

{

cout << "Not enough memory for working!!! Press any key for terminate!" << endl;

if(pAdrEDS) delete pAdrEDS;

if(pAdrPIO) delete pAdrPIO;

if(pAdrIE)  delete pAdrIE;

getch();

return 0;

}

//Setup для платы LA48DPCI

pAdrEDS->m_szDeviceName  = "LA48DPCI";//Setup for "LA48DPCI"

pAdrEDS->m_nDeviceNumber = 1;         //Инициализируется конкретная плата, //заданная m_nDeviceNumber

if(m_pPCI->IO(pAdrEDS) != 1) //Если setup не прошел

{

if(pAdrEDS) delete pAdrEDS;

if(pAdrPIO) delete pAdrPIO;

if(pAdrIE)  delete pAdrIE;

PCIClient.Free();

cout<<"Can not setup LA48DPCI"<<endl;

getch();

return 0;

}

//Настройка портов А-1, В-1, С-1

pAdrPIO->m_wIOOperation = KIOP_OP_OUT;//Порты А-1, В-1, С-1 в режиме 0 //на вывод

pAdrPIO->m_uValue = 0x80;  

pAdrPIO->m_nPort  = 7;                //Управляющий  регистр для портов А-1, В-1, //С-1

m_pPCI->IO(pAdrPIO);

pAdrPIO->m_wIOOperation = KIOP_OP_OUT;//Сбрасываем сигналы //(Эмулирующие внешние прерывания)

pAdrPIO->m_uValue = 0;

pAdrPIO->m_nPort  = 6; 

m_pPCI->IO(pAdrPIO);

//Настройка портов А, В, С

pAdrPIO->m_wIOOperation = KIOP_OP_OUT;

pAdrPIO->m_uValue = 0x9F;   //1001 1111 Порт А в режиме 0 ввод, порт

Похожие материалы

Информация о работе