Міністерство освіти і науки України
Національний університет „Львівська політехніка”
Кафедра ЕОМ
КУРСОВИЙ ПРОЕКТ
з предмету:
“Системне програмування”
на тему:
“Розробка програми керування PCI пристроєм в операційній системі Windows.”
Львів 2009
Зміст
1. Завдання на курсовий проект 3
2. Розробка драйверу пристрою 6
2.1. Створення INF-файлу 6
2.2. Створення діагностичної програми засобами пакету WinDriver 9
2.3. Розробка функцій драйверу 12
2.4. Розробка графічного інтерфейсу діагностичної програми. 13
3. Розробка віртуальної панелі керування пристроєм 16
4. Відладка та тестування програми. 17
5. Висновки 20
6. Література 21
Завдання на курсовий проект
Варіант
Пристрій
Переривання
Розташування даних
Тип даних
Тип обміну даними
Конфігурування
24
Бітовий процесор
+
Зовнішнє
блок
Пам'ять
Програмне
Бітовий процесор «Цикловий синхронізатор» призначений для циклової синхронізації потоків даних І ,ІІ та ІІІ рівнів ієрархії. Пристрій забезпечує циклову та надциклову синхронізацію при прийомі цифрових потоків із швидкістю передачі до 40 Мбіт/сек.;
Основною задачею пристрою циклової синхронізації є знаходження та адаптивне утримання циклового синхронізму, видача на подальшу обробку вхідного інформаційного потоку у супроводі тактової послідовності і циклових синхроімпульсів, які формуються на узгодженому місці в циклі.
Пристрій працює у двох основних режимах: пошуку або перевірки наявності синхронізму. При цьому розуміється, що пристрій увійшов у синхронізм, якщо в режимі перевірки після закінчення пошуку на належних для них місцях виявляється задана кількість (поріг входу Пвх) послідовних синхросигналів (синхрогруп), та виходить з синхронізму, якщо пристрій не знаходить задану кількість (поріг виходу Пвих) послідовних синхроознак на їх місцях. В останньому випадку СХР-Ц знову переходить у режим пошуку. Тому пристрій має в своєму складі вузли пошуку синхросигналів та перевірки синхронізму.
Крім циклового, необхідно забезпечувати ще й наявність надциклового синхронізму по тому самому принципу. Це викликає необхідність мати у складі пристрою окремий блок надциклової синхронізації.
Структура циклу має в своїй основі умову, що кожному біту інформаційної послідовності ставиться у відповідність його місце (адреса) в циклі, починаючи з нульової адреси. Відповідно, кожна синхрогрупа має свою адресу, по якій її можна знайти в циклі. Для визначення цієї адреси СХР-Ц має відповідний блок.
Програмованість СХР-Ц полягає в отриманні від керуючої ПЕОМ кодів значень основних параметрів синхронізатора, які можуть бути постійними для даного потоку або змінними. Ці значення параметрів зберігаються на час роботи пристрою в окремих регістрах. Тому в складі СХР-Ц є вхідний інтерфейсний блок.
“Схема структурна пристрою синхронізації”
Блок БВП підключається до шин даних, адреси, керування і забезпечує інформаційний обмін між СХР-Ц та іншими пристроями, зокрема - запис в регістри пристрою значень параметрів і зчитування цих параметрів;
Інші блоки повинні виконувати функції, що відповідають їх призначенню.
Робота пристрою визначається наступними параметрами:
Назва Діапазон Адреса** Значення
Адреса частини СГ* 0...16383 28
Довжина циклової СГ 1...24 24
Довжина частини СГ 0...24 29
Кiлькiсть дозволених помилок 0...7 27
Довжина надциклової СГ 1...8 40
Кiлькiсть частин СГ 1...24 23
Маска надцикловоi СГ 0...255 39
Надциклова СГ 0...255 38
Порiг виходу цикловий 1...15 26
Порiг входу цикловий 1...15 25
Порiг надцикловий 1...15 41
Розподiл надциклових СГ 0...3 42 (В кожному, в кожному 2-му, 4-му)
Розподiл циклових СГ 0...3 30 (В кожному, в кожному 2-му, Немає)
Циклова СГ 0...16777215 21,22
Довжина циклу 1...16384 20
Адреса надциклового біта 1...16384 37
* СГ - синхрогрупа
** Адреса вказана в 10 системі числення .
Параметри Адреса частини СГ та Довжина частини СГ - це масиви довжиною 24 слова
Для запису цих парамерів використати процедуру блочної пересилки. Перед виконанням пересилки необхідно подати команду «Скидання» адресної частини пам'яті. Така команда подається шляхом запису (Адреса shl 8)+CmdRes; за адресою 1. CmdRes =1. Адреса = 28 для параметру «Адреса частини СГ» та 29 для параметру «Довжина частини СГ»
Наприклад, перед записом параметру «Довжина частини СГ» треба записати число 7425 (1D01 h) за адресою 1.(1D01 h = 29 * 8 + 1)
Аналогічну процедуру скидання адресної частини необхідно виконати безпосередньо перед зчитуванням цих параметрів.
Параметр Циклова СГ задається 24-розрядним словом (двома 16-розрядними словами)
Старші 16 розрядів записуються за адресою 21, а 8 молодших розрядів – за адресою 22.
Всі інші параметри передаються 16-розрядними словами (молодша частина 32-розрядного слова)
Для кожного параметру виділяється своя адреса в адресному просторі пристрою.
Бітовий процесор є пристроєм, який допускає переконфігурування. Цикловий синхронізатор – це один із можливих типів бітового процесора. Конкретний тип (пристрій) обирається під час роботи програми шляхом запису відповідного конфігураційного файлу в ПЛІС. Адреса для запису конфігураційного файлу - 100 h
Віртуальна панель пристрою
Програма керування пристроєм складається з процедур драйверу керування обміном даними з фізичним пристроєм та процедур керування пристроєм за допомогою віртуальної панелі.
Віртуальна панель пристрою повинна забезпечувати наступні можливості :
перегляд, редагування параметрів пристрою,
відображення стану пристрою (на вимогу оператора)
Керування пристроєм за допомогою команд : Пуск, Стоп, Скидання
На віртуальній панелі доцільно передбачити індикатори режиму роботи пристрою (Робота, Стоп, ін).
Розробка драйверу пристрою
Створення INF-файлу
Майстер «DriverWizard", є складовою частиною пакету WinDriver. Це інструмент з графічним інтерфейсом для діагностування та генерування драйверу. Він дозволяє здійснювати читання чи запис в фізичні пристрої за допомогою простого рядка коду. Зручно виконується діагностування обладнання через графічний інтерфейс, що дозволяє перевіряти пам'ять, регістри та переривання. Якщо перевірка задовольняє вимогам розробника, Майстер генерує код драйверу, який містить функції доступу до ресурсів обладнання. Пакет WinDriver містить додаткові матеріали та засоби для створення драйверів на основі поширених наборів мікросхем: PLX 9030, 9050, 9052, 9054, 9056, 9080 and 9656; Altera pci_dev_kit; Xilinx VirtexII and Virtex 5; AMCC S5933Майстер може бути використаний для перевірки присутності вашого пристроюв ПК, та створенні INF файлу.
Майстер зручно використовувати у двох фазах розроблення :
Діагностування обладнання:
Створений пристрій підключіть до комп’ютера, та за допомогою Майстра переконайтесь, що він розпізнається операційною системою, як і очікувалось.
Генерування коду: Код, сгенерований Майстром складається з наступних частин :
Бібліотечні функції
Використовуються для звернення до ресурсів пристрою (пам'яті, портів вводу/виводу, регістрів, переривань )
32- розрядна програма діагностування.
Пристрій діагностується в консольному режимі, програма використовує бібліотечні функції, які згадувались вище. Ця програма може бути використана як основа драйверу, що створюється.
Підтримка проектів
Здійснюється за рахунок завантаження всієї проектної інформації та файлів в середовище розроблення. Майстер також генерує відповідний makefile для ОС Linux
Використання Майстра «DriverWizard"
Перед запуском програми Майстер під’єднайте пристрій до комп’ютера. Якщо немає фізичного пристрою для підключення, можно використати Майстер для генерації коду драйверу віртуального пристрою.
Для запуска программи DriverWizard :
Виберіть «Пуск | Програми |WinDriver | DriverWizard», або wdwizard утиліту із директорії …WinDriver/wizard/ Для запуска програми в ОС Windows Vista потрібно мати права адміністратора
Виберіть новий проект, чи відкрийте існуючий.
Рис. 1 Створення/відкриття проекту
Із списку пристроїв, які визначив Майстер можна обрати «Plug-and-Play» карту. Якщо карта не підтримує стандарту «Plug-and-Play», треба обрати ISA пристрій.
Рис. 2 Вибір Plug-and-Play карту
Для генерування коду PCI пристрою, який в даний момент не є під’єднаний до комп’ютера,
Треба обрати « PCI Virtual Device».
У випадку обрання опції «PCI Virtual Device» Майстер дозволить визначити ресурси пристрою. Обравши діапазони для памяті та вводу/виводу, в подальшому можна визначити регістри (run-time registers) часу виконання (зміщення визначається відносно BAR регістрів).
На додаток, можна визначити переривання (IRQ), якщо в подальшому передбачається генерування коду, в якому підтверджується отримання переривання через регістри часу виконання.
Номер переривання та діапазон пам’яті несуттєві, тому що вони визначаються Майстром автоматично коли під’єднується фізичний пристрій.
Генерування INF файлу.
Якщо розробляється драйвер для Plug-and-Play пристроїв (PCI/PCI Express/PCMCIA) під управлінням ОС Windows, з метою правильного визначення ресурсів пристрою, та правильної взаємодії з драйвером WinDriver, необхідно встановити INF файл для реєстрації спільної роботи пристрою та WinDriver (windrvr6.sys).
Майстер автоматизує створення INF файлу, та процес його інсталяції.
Для створення та інсталяції INF файлу треба виконати наступні кроки :
Натиснути кнопку «Generate .INF file» в діалоговому вікні «Select Your Device»
Майстер відобразить інформацію, яку він визначив для пристрою – ID виробника (vendor ID) та ID пристрою (device ID) , клас пристрою, ім’я виробника та назву пристрою. Клас пристрою, ім’я виробника та назву пристрою можна редагувати.
Коли Майстер використовується в ОС Windows, надається можливість автоматичного встановлення INF файлу. Для цього треба в діалоговому вікні обрати опцію «Automatically Install the INF file» . Якщо автоматичне встановлення не виконається, Майстер видасть повідомлення та надасть інструкції для встановлення в ручному режимі.
Натиснути кнпку «Next»
Коли інсталяція завершиться оберіть із списку пристроїв відповідний, та відкрийте його.
Рис. 3 Вікно редагування інформації INF файлу.
Якщо доступна опція підтримки переривання, що сигналізує повідомленням (MSI), можна ії використати для створення INF файлу, який підтримує керування перериваннями такого типу, або типу MSI-X (розширений тип). Так опція є опцією по замовчуванню для віртуального PCI-пристрою або пристрою, який підтримує переривання такого типу в ОС Vista.
Для деінсталяції INF файлу пристрою треба обрати пристрій в списку, та натиснути кнопку «Uninstall .INF file». Після цього слід обрати INF файл для вилучення. Після деінсталяції INF файлу, пристрій не буде працювати спільно з драйвером windrvr6.sys, а INF файл буде видалено з відповідної директорії .
Створення діагностичної програми засобами пакету WinDriver
Перед написанням драйверу доцільно переконатись чи працює фізичний пристрій як це очікувалось. Майстер можно використати для такої перевірки пристрою. Майстер створює текстовий файл, в якому фіксуються всі дії , що надає можливість детально проаналізувати функціонування пристрою.
Визначення та перевірка ресурсів.
Для «Plug-and-Play» пристроїв Майстер автоматично визначає наступні ресурси :
= діапазон вводу/виводу
= діапазон памяті
= переривання
Рис 4. PCI ресурси.
Для пристроїв, що не підтримують стандарт «Plug-and-Play», ресурси задаються вручну.
Вручну можна також задати регістри, як це відображено на рис.5
Рис 5. Регістри.
Якщо обрано опцію автоматичного читання (Auto Read) , такі регістри будуть зчитуватись автоматично при виконанні будь-яких операцій читання/запису, а результати зчитування будуть зафіксовані в файлі протоколу.
Рис 6. демонструє процедуру запису/читання даних в порти вводу/виводу та пам'ять.
Рис 6. Читання/запис в пам'ять та порт.
Для перевірки переривань необхідно обрати в лівому вікні переривання та натиснути кнопку прослуховування переривань («Listen to interrupts»).
Рис 7. Переривання.
Для переривань по рівню, традиційних PCI переривань, потрібно визначити регістр статусу, та зв’язати з ним команду читання/запису для підтвердження (скидання) переривання. Це треба зробити перед початком прослуховування переривань, інакше може відбутися зависання ОС.
На Рис 8. демонструється процедура визначення команди підтвердження переривання для регістру «INTCSR».
Рис 8. Команда передачі для переривання по рівню.
Генерування коду драйверу.
Генерування коду драйверу виконується або обранням іконки «Generate Code» панелі інструментів, або відповідного пункту меню.
Діалогове вікно опцій пропонує обрати мову та середовище розроблення, як це показано на Рис 9.
Рис 9. Опції генерування коду драйверу .
Натисніть кнопку «Next» для вибору додаткових опій :
керування подіями режиму Plug-and-Play, та управління живленням, а також Kernel PlugIn для генерування коду з використанням функцій ядра. Перед використанням Kernel PlugIn на комп’ютері повинен бути встановлений пакет розроблення драйверів DDK (Driver Development Kit).
Рис 10. Додаткові опції генерування коду драйверу .
Збережіть в разі необхідності проект, та натисніть ОК для запуску обраного середовища розроблення.
Отриманй код використовується як початковий для створення драйверу. Вподальшому його можна модифікувати у відповідності до специфічних функцій пристрою.
Розробка функцій драйверу
В даному курсовому проекті використовується досить велика множина функцій. Детальний опис функцій, які найчастіше використовуються подано нижче.
DIAG_INPUT_RESULT DIAG_GetMenuOption(PDWORD pdwOption, DWORD dwMax,int r) - Get menu option from user, дана функція забезпечує вибір операції роботи користувача;
static WDC_DEVICE_HANDLE DeviceFindAndOpen(DWORD dwVendorId, DWORD dwDeviceId); - пошук і відкриття пристрою;
static BOOL DeviceFind(DWORD dwVendorId, DWORD dwDeviceId, WD_PCI_SLOT *pSlot); - пошук пристрою;
static WDC_DEVICE_HANDLE DeviceOpen(const WD_PCI_SLOT *pSlot); - відкриття пристрою;
static void DeviceCloseF(WDC_DEVICE_HANDLE hDev); - закриття пристрою;
static void WDC_DIAG_DeviceResourcesPrint(const WD_CARD *pCard, DWORD hCard, FILE *fp); - визначення ресурсів пристрою;
void WDC_DIAG_ReadWriteAddr(WDC_DEVICE_HANDLE hDev, WDC_DIRECTION direction, DWORD dwAddrSpace, WDC_ADDR_MODE mode); - запис і читання даних з пристрою за певними алресами;
void WDC_DIAG_PciSlotPrint(WD_PCI_SLOT *pPciSlot); - Print PCI device location information;
void WDC_DIAG_PciSlotPrintFile(WD_PCI_SLOT *pPciSlot, FILE *fp); - Print PCI device location information to file;
void WDC_DIAG_PciDeviceInfoPrint(WD_PCI_SLOT *pPciSlot, BOOL dump_cfg); - Print PCI device location and resources information;
void WDC_DIAG_PciDeviceInfoPrintFile(WD_PCI_SLOT *pPciSlot, FILE *fp, BOOL dump_cfg); - Print PCI device location and resources information to file;
void WDC_DIAG_PciDevicesInfoPrintAll(BOOL dump_cfg); - Print location and resources information for all connected PCI devices;
void WDC_DIAG_PciDevicesInfoPrintAllFile(FILE *fp, BOOL dump_cfg); - Print location and resources information for all connected PCI devices to * file;
DWORD SPO_LibInit(void); - WDC library initialize;
DWORD SPO_LibUninit(void); - WDC library uninit;
static void MenuMain(WDC_DEVICE_HANDLE *phDev); - головне діагностичне меню.
Розробка графічного інтерфейсу діагностичної програми.
Головне вікно програми роботи з пристроєм містить декілька кнопок керування, а саме: «Scan PCI», «Memory operations», «Configure device», «Send».
Рис.11. Стартове вікно програми
Активація кнопки «Scan PCI»
Рис.11. Вибір пристрою
Відповідає за сканування всіх пристроїв на комп’ютері. Під час натиснення кнопки SCAN викликається метод void CScan::OnBnClickedScan(), де відбувається весь процес сканування. Після натиснення клавіші у вікні-комбо, яке подане зліва від кнопки SCAN відображаться всі пристрої і їх ресурси; для роботи потрібно вибрати потрібний пристрій зі списку, він автоматично відкриється і отримає хендлер. Якщо на PCI платі встановлений пристрій наш пристрій (vendorID=1031 deviceID=9031), він відкриється автоматично. Після успішного відкриття пристрою, становляться активними всі інші кнопки.
Активація вкладки «Memory operations»
Рис.12. Дочірнє вікно: тестуюча програма
Дане вікно призначене для тестування пристрою. Тут можна записувати та читати дані з будь якої адреси будь якого адресного простору. Також можлива блокова передача даних, яка активізується встановленням прапорця ”enable block transfers”. Блок записується за одною адресою, або використовується автоінкремент адреси. Адресний простір вибирається в комбо – вікні “Select address space”. Режим (розмір слова) можна вибрати в комбо – вікні “Select address mode”.
Активація вкладки «Config space»
Рис.13. Дочірнє вікно конфігурування пристрою
Детальна робота конфігурування описана в пункті 3.
Активація вкладки «Send»
Призначена для передачі даних з пристрою в іншу програму. В ролі програми приймача використовується існуюча програма DiGiProg яка автоматично запускається при натисканні кнопки Send. Параметри в цій програмі для нормального функціонування повинні бути такими:
Channel = 0
Buffer size = 2
У вікні програми відображається тільки кількість отриманих даних. Самі дані можна буде продивитись у записаному файлі. Для запису у файл необхідно встановити прапорець “write to file”.
Програмою – передавачем є наша програма, яка послівно читає дані з пристрою, і, згідно з встановленим у комбо – вікні інтервалом, пересилає ці дані програмі – приймачу.
Розробка віртуальної панелі керування пристроєм
Віртуальна панель Рис 15.(параметри пристрою), за допомогою процедур пристрою дозволяє керувати пристроєм. Принцип роботи віртуальної панелі полягає в тому, що для того щоб встановити певний параметр потрібно за відповідною адресою в пристрої записати певні дані (з табл. 1)
Робота пристрою визначається наступними параметрами:
Назва Діапазон Адреса** Значення
Адреса частини СГ* 0...16383 28
Довжина циклової СГ 1...24 24
Довжина частини СГ 0...24 29
Кiлькiсть дозволених помилок 0...7 27
Довжина надциклової СГ 1...8 40
Кiлькiсть частин СГ 1...24 23
Маска надцикловоi СГ 0...255 39
Надциклова СГ 0...255 38
Порiг виходу цикловий 1...15 26
Порiг входу цикловий 1...15 25
Порiг надцикловий 1...15 41
Розподiл надциклових СГ 0...3 42 (В кожному, в кожному 2-му, 4-му)
Розподiл циклових СГ 0...3 30 (В кожному, в кожному 2-му, Немає)
Циклова СГ 0...16777215 21,22
Довжина циклу 1...16384 20
Адреса надциклового біта 1...16384 37
Кнопки “Read” та ”Write” призначені, відповідно, для читання та запису цих параметрів у пристрій за вказаними вище адресами. Поля типу Edit призначені одночасно для введення та відображення. Три поля: “SG”, “SGMask” та “SynchroGroup” відображають значення параметрів у двійковому форматі, отже і для введеня необхідно використовувати тільки символи 0 та 1.
В полі СТАН відображається поточний стан пристрою. Стан пристрою обновлюється після кожного натиснення(вводу) будь-якого параметру.
Характеристика кнопок «СТАРТ» «СТОП» «СКИДАННЯ»:
СТАРТ. Розпочинає пересилання даних до пам’яті за адресою 28. Якщо в полях «Розмір пам'яті, яку потрібно переслати» і «Довжина блоку» записано 0, тоді вискочить повідомлення про помилку. Тут також відбувається запис 04 за адресою1.
СТОП. Зупиняє пересилання даних до пам’яті. Запис за адресою 1 числа 02.
СКИДАННЯ. Скид, і запис за адресою 1 числа 1.
Відладка та тестування програми.
Результат сканування PCI та відкриття пристрою
Рис.17.Результат сканування пристроїв
Тестування Memory operations
Прочитаємо 64-х розрядне число за адресою 0х0000 адресного простору 0. В результаті в полі виводу результату з’явилось число 65536.
Рис.20.Читання даних з пристрою
Тестування Config space.
Рис.21. Вікно конфігураціїї
Як видно з рисунку в нашому пристрої вже записані деякі дані, а саме:
Адреса частини СГ
Довжина циклової СГ 24
Довжина частини СГ
Кiлькiсть дозволених помилок 0
Довжина надциклової СГ 8
Кiлькiсть частин СГ 10
Маска надцикловоi СГ 01001001
Надциклова СГ 00101000
Порiг виходу цикловий 1
Порiг входу цикловий 1
Порiг надцикловий 1
Розподiл надциклових СГ В кожному
Розподiл циклових СГ В кожному
Циклова СГ 000000000001101000100000
Довжина циклу 64
Адреса надциклового біта 1024
Тепер змінимо парметри:
Адреса частини СГ
Довжина циклової СГ 21
Довжина частини СГ
Кiлькiсть дозволених помилок 5
Довжина надциклової СГ 4
Кiлькiсть частин СГ 11
Маска надцикловоi СГ 0101
Надциклова СГ 0011
Порiг виходу цикловий 2
Порiг входу цикловий 2
Порiг надцикловий 2
Розподiл надциклових СГ В кожному 2му
Розподiл циклових СГ В жодному
Циклова СГ 000010001101010000000
Довжина циклу 14
Адреса надциклового біта 128
Рис.22. Вікно конфігурації після зміни параметрів
З рисунку видно, що параметри які ми змінили дійсно записалися до пристрою, про що свідчать недоступні поля , які стоять біля кожного параметру.
Висновки
В процесі створення даного курсового проекту ми виконали наступне:
Створили INF-файл пристрою;
Розробили функції сканування пристрою, пошуку і відкриття пристрою, читання / запис в пристрій.
Створили віртуальну панель керуванням пристрою;
Розробили графічний інтерфейс для двох вище зазначених пунктів;
Успішно провели тестування програми (усі пункти програми виконуються без помилок);
В результаті виконання даної курсового проекту ми успішно засвоїли методи розробки та реалізації компонент системного програмного забезпечення, оволоділи основними функціями їх реалізації.
Література
1. Шильдт Г. С++. – Санкт-Петербург: BXV, 2002. – 688 с.
Шамис В. А. С++Builder 4 Техника визуального программирования. – М.: Нолидж, 2000. – 656 с.
В.С. Проценко, П.Й. Чаленко, А.Б.Ставровський “Техніка програмування мовою Сі”.-Київ “Либідь”, 1993. – 224с.
Б.Керниган, Д.Ритчи “Язык программирования Си”. – Москва “Финансы и статистика”, 1992. – 271с.
Л.Бэк “Введение в системное програмирование”. – М.: Мир, 1999
Додатки:
// KR_Visual 8Dlg.cpp : implementation file
#include "stdafx.h"
#include "KR_Visual 8.h"
#include "KR_Visual 8Dlg.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
// Implementation
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CKR_Visual8Dlg dialog
CKR_Visual8Dlg::CKR_Visual8Dlg(CWnd* pParent /*=NULL*/)
: CDialog(CKR_Visual8Dlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
hDev = NULL;
//=========================================================
DWORD dwStatus;
/* Initialize the KR library */
dwStatus = KR_LibInit();
if (WD_STATUS_SUCCESS != dwStatus)
{
MessageBox("kr_diag: Failed to initialize the KR library", KR_GetLastErr());
return;
}
/* Find and open a KR device (by default ID) */
if (KR_DEFAULT_VENDOR_ID)
hDev = DeviceFindAndOpen(KR_DEFAULT_VENDOR_ID, KR_DEFAULT_DEVICE_ID);
}
CKR_Visual8Dlg::~CKR_Visual8Dlg(){
DeviceClose(hDev);
dwStatus = KR_LibUninit();
if (WD_STATUS_SUCCESS != dwStatus)
MessageBox("kr_diag: Failed to uninit the KR library", KR_GetLastErr());
}
//=========================================================void CKR_Visual8Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CKR_Visual8Dlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON4, &CKR_Visual8Dlg::OnBnClickedButton4)
ON_CBN_SELCHANGE(IDC_COMBO1, &CKR_Visual8Dlg::OnCbnSelchangeCombo1)
ON_BN_CLICKED(IDC_BUTTON1, &CKR_Visual8Dlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CKR_Visual8Dlg::OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON3, &CKR_Visual8Dlg::OnBnClickedButton3)
END_MESSAGE_MAP()
// CKR_Visual8Dlg message handlers
BOOL CKR_Visual8Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
//=========================================================
if (!hDev){
CWnd* pWnd3 = GetDlgItem(IDC_BUTTON3);
CWnd* pWnd2 = GetDlgItem(IDC_BUTTON2);
CWnd* pWnd1 = GetDlgItem(IDC_BUTTON1);
pWnd3->EnableWindow(FALSE); //disable
pWnd2->EnableWindow(FALSE); //disable
pWnd1->EnableWindow(FALSE); //disable
}
//=========================================================focus to a control
}
void CKR_Visual8Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CKR_Visual8Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this function to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CKR_Visual8Dlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CKR_Visual8Dlg::OnBnClickedButton4()
{
WDC_DIAG_PciDevicesInfoPrintMy(FALSE);
FILE *fp;
fopen_s(&fp, "temp.txt", "r");
CComboBox *pCBox = (CComboBox*)GetDlgItem(IDC_COMBO1);
pCBox->EnableWindow();
char line[39];
while (fgets(line, 37, fp))
if (line[0] != '\n')
pCBox->AddString(line);
fclose(fp);
remove("temp.txt");
CWnd* pWnd = GetDlgItem(IDC_BUTTON4);
pWnd->EnableWindow(FALSE); //disable
}
void CKR_Visual8Dlg::OnCbnSelchangeCombo1()
{
// TODO: Add your control notification handler code here
char line[41];
CComboBox *pCBox = (CComboBox*)GetDlgItem(IDC_COMBO1);
DeviceClose(hDev);
pCBox->GetLBText(pCBox->GetCurSel(), line);
int vendor = 0, device = 0;
for (int i = 0; i < 4; i++){
device += ((line[i+32] <= 57) ? line[i+32] - 48 : line[i+32] - 55) * pow(16.0, 3 - i);
vendor += ((line[i+13] <= 57) ? line[i+13] - 48 : line[i+13] - 55) * pow(16.0, 3 - i);
}
hDev = DeviceFindAndOpen(vendor, device);
CWnd* pWnd3 = GetDlgItem(IDC_BUTTON3);
CWnd* pWnd2 = GetDlgItem(IDC_BUTTON2);
CWnd* pWnd1 = GetDlgItem(IDC_BUTTON1);
if (hDev