Призначення скан коду у клавіатурах. До питання оцінки пемін цифрових сигналів




Більшість сучасних клавіатур мають мультимедійні клавіші, та й мишки вже мають від трьох до семи кнопок. На диску, що йде в комплекті, і на сайті виробника доступні драйвери та всілякі корисні програмитільки для Windows. Всім відомо, що Linux славиться своєю можливістю налаштувати систему під себе, якщо, звичайно, знати, де і що налаштовувати. Наше завдання – навчити пінгвіна працювати з додатковими батонами.

Визначення скан-коду клавіш

Що б ти там не натискав на своїй клавіатурі, X-сервері та ядрі, загалом, все одно, що на ній написано або намальовано. Їх цікавлять виключно скан-код кнопки, причому спочатку ікси зчитують таблицю кодів клавіш ядра, а потім код прив'язується до власної таблиці кодів. Якщо в Windows проблемиНалаштування мультимедійних клавіш у консолі як такої не існує, то в Linux доводиться окремо налаштовувати реакцію на натискання кнопок у консолі та в X-Window.

Щоб дізнатися код клавіші, слід використовувати утиліту xev, що входить до складу сервера Х. Після її запуску з'являється вікно Event Tester, тепер послідовно натискаємо клавіші, запам'ятовуючи код, що видається:

$xev
...
KeyRelease event, serial 31, synthetic NO, window 0x3e00001,
root 0x67, subw 0x0, time 279734676, (311,611), root:(1104,687),
state 0x2000, keycode 236 (keysym 0x1008ff19, XF86Mail), same_screen YES,

XFilterEvent returns: False
KeyRelease event, serial 31, synthetic NO, window 0x2600001,
root 0x67, subw 0x0, time 265877259, (883,334), root:(886,358),
state 0x0, keycode 161 (keysym 0x0, NoSymbol), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False

Висновок може бути величезний, тому що відстежується кожен рух мишки під час проходження над вікном Event Tester. Клавішу описує блок KeyRelease, зокрема значення keycode якраз і є скан-кодом, який ми хочемо дізнатися. У наведеному прикладі натиснуто дві клавіші. Клавіше з кодом 236 відповідає код клавіші для X-сервера, вказаний у keysym, а також дія XF86Mail, яка в KDE запускає використовується за умовчанням поштовий клієнт. Для клавіші з номером 161 код та дія не визначені.

Можлива ситуація, коли кнопка натискається, але її скан-код не видається. Це означає, що ядро ​​неспроможна знайти відповідне значення. У висновку dmesg має бути такий рядок:

Use "setkeycodes 0xec to make it known.

Тобто тобі пропонують встановити скан-код клавіші самостійно за допомогою setkeycodes, при цьому значення keycode вибрати дуже просто. Переведи отриману цифру в десяткове число(Більшість калькуляторів це вміють) і додай 128. даному прикладі 0xec=236, тобто отримуємо скан-код 364. Якщо є сумніви, список задіяних та незадіяних скан-кодів можна переглянути, запустивши в консолі утиліту getkeycodes або dumpkeys. Наприклад, якщо висновок «getkeycodes | grep<код клавиши>» нічого не дав, отже, цей код можна сміливо використовувати.

Допомогти визначити скан-код здатна і утиліта ХKeycaps (www.jwz.org/xkeycaps), яка є графічним фронт-ендом до Xmodmap.

У консолі програма xev, ясна річ, не працює. Щоб дізнатися скан-код, що видається ядром, слід використовувати утиліту showkey або getkeycodes:

$showkey
клавіатура була у режимі UNICODE
натисніть будь-яку клавішу (програма завершиться через 10 с після останнього натискання).
0xe0 0x6c 0xe0 0xec

Перші дві цифри відповідають натиснутій клавіші, другі – відсутності натискання.

Налаштування прив'язки скан-кодів у X-Window

Отже, скан-коди тепер у нас є, потрібно вказати Х-серверу, що він, власне, повинен робити при натисканні цієї клавіші, тобто надати їй символьне ім'я. Список символьних імен наведено у файлі заголовків XF86keysym.h. За замовчуванням файли заголовків Х-сервера в сучасних дистрибутивах не встановлюються. Щоб побачити його в Ubuntu, потрібно встановити пакет x11proto-core-dev, після чого файл буде лежати в каталозі /usr/include/X11. Як варіант - можна звернутися до CVS-сервера X.Org. Дивимося:

$cat /usr/include/X11/XF86keysym.h
/*
* Keys found on some "Internet" keyboards.
*/
#define XF86XK_Standby 0x1008FF10
#define XF86XK_AudioLowerVolume 0x1008FF11
#define XF86XK_AudioRaiseVolume 0x1008FF13
#define XF86XK_AudioPlay 0x1008FF14
#define XF86XK_AudioStop 0x1008FF15
#define XF86XK_Mail 0x1008FF19

Якщо ми порівняємо останній рядок з виведенням xev, то побачимо, що значення збігаються з клавішею keycode 236 - keysym 0x1008ff19, XF86Mail (без суфікса XK_). Список всіх доступних значень у тому вигляді, в якому вони повинні використовуватися, ти знайдеш у /usr/share/X11/XKeysymDB.

Скласти свій варіант розкладки можна двома способами: створити опис клавіатури або використовувати Xmodmap. Останній спосіб найпростіший, тому про нього і говоритимемо далі. У домашньому каталозі користувача створюємо файл Xmodmap, в який заносимо бажані значення:

$ mcedit ~/. Xmodmap

keycode 161 XF86Calculator
keycode 174 XF86AudioLowerVolume
keycode 176 XF86AudioRaiseVolume
keycode 162 XF86AudioPause

І так далі принцип, думаю, зрозумілий. Причому код клавіш можна заносити як у десятковому, так і шістнадцятковому вигляді. За моїми спостереженнями, коди більшості клавіш стандартизовані. Тому, якщо ти один раз налаштуєш реакцію на натискання кнопки і перенесеш файл на інший комп, є можливість, що на іншій клаві реакція на натискання також підписаної кнопки буде аналогічна. Користувачі робочого столу Gnome з GDM можуть прописати всі ці рядки до загальносистемного файлу /etc/X11/Xmodmap.

В інших випадках нам потрібно вказати X-серверу, щоб він використовував створений файл. У різних дистрибутивах це реалізовано по-різному, основна ідея полягає в запуску команди /usr/bin/xmodmap $HOME/.Xmodmap при вході користувача в систему або старту Х. Тут вже кожен танцює, як хоче. На форумах пропонують використовувати $HOME/.xsession (у деяких дистрибутивах він може називатися .Xsession), .xprofile або системний /etc/X11/Xsession. І боюсь, що це далеко не всі можливі варіанти. Давай подивимося, як зроблено в KUbuntu:

$ sudo grep -iR xmodmap / etc

В результаті знаходимо найцікавіший файл /etc/X11/Xsession.d/80ubuntu-xmodmap такого змісту:

$cat /etc/X11/Xsession.d/80ubuntu-xmodmap

/usr/bin/xmodmap /usr/share/apps/kxkb/ubuntu.xmodmap || true

USRMODMAP="$HOME/.Xmodmap"

if [-x /usr/bin/xmodmap]; then
if [-f "$USRMODMAP"]; then
/usr/bin/xmodmap "$USRMODMAP" || true
fi
fi

Тобто завантажується вміст файлу ubuntu.xmodmap і .Xmodmap, якщо він існує. Відкривши в редакторі ubuntu.xmodmap, ви знайдете список keycode і зіставлені символьні імена. Звідси можна дійти невтішного висновку: якщо розробник повідомляє у тому, що його дистрибутив підтримує мультимедійні клавіатури, з великою ймовірністю можна знайти подібний файл. В інших дистрибутивах присутня аналогічна система запуску користувацьких xmodmap-файлів.

Тепер, коли символьні імена присвоєно клавішам, можна призначати їм бажані дії. Деякі віконні середовища на кшталт KDE можуть відпрацьовувати дії за символьними іменами. Так, при натисканні кнопки з XF86AudioPlay (ПИТАННЯ) починає відтворення плеєр, який використовується за замовчуванням. Щоб встановити потрібну комбінацію, достатньо зайти в "Центр управління KDE -> Регіональні та спеціальні можливості -> Комбінації клавіш" (в KUbuntu шукай в "System Setting -> Keyboard & Mouse"). Аналогічний пункт меню є і в Gnome (можна просто викликати gnome-keyboard-bindings), і XFce. Плюс деякі програми на кшталт Amarok, Konqueror, MPD також можуть обробляти натискання кнопок. В інших середовищах, які не мають
графічних засобів налаштування, швидше за все, знадобиться ручне втручання у конфігураційні файли. Наприклад, щоб у IceWM після натискання клавіші з символьним ім'ям XF86AudioPlay запускався програвач XMMS, а при повторному натисканні він ставав на паузу, файл ~/.icewm, що з'являється після першого запуску, слід додати рядок:

$ mcedit ~/.icewm

key XF86AudioPlay xmms --play-pause

У Fluxbox рядок для запуску програвача виглядатиме так:

$ mcedit ~/.fluxbox/keys

None XF86AudioPlay:ExecCommand xmms --play-pause

У конфігах зазвичай є приклади, тому з рештою віконними менеджерамиДумаю, ти легко розберешся сам.

Налаштування реакції в консолі

У консолі порядок дій дещо інший. Як пам'ятаєш, висновок dmesg рекомендував призначити клавішні коди за допомогою команди setkeycodes. Але тут є відмінності – клавішних команд у консолі не може бути більше 128, слід вибирати значення від 0 до 127:

$ setkeycodes 0xec 118

Ви можете переглянути вільні значення у файлі поточної клавіатурної розкладки. У Ubuntu та всіх дистрибутивах, що базуються на Debian, це зазвичай /etc/console-setup/boottime.kmap.gz. Якщо після запуску проблем із клавішами немає, заносимо цей рядок в один зі стартових скриптів, наприклад /etc/init.d/rc.local.

Тепер залишилося задати відповідність клавіші та виконуваної дії. Тут простір для творчості навіть більший, ніж в іксах. У keymaps(5) процедура встановлення відповідності keycode виглядає так:

(Plain | ) keycode keynumber = keysym

# Переключення консолі на одну назад при натисканні на клавішу з кодом 105
keycode 105 = Decr_Console
# Перемикання консолі на одну вперед при натисканні на та клавішу з кодом 106
alt keycode 106 = Incr_Console

Але можна створювати свої варіанти, вказуючи команду в змінних:

keycode 120 = F100
string F100 = "/sbin/shutdown -h now\n"

Іншими словами, після натискання клавіші з кодом 120 буде виконано дію, вказану в змінній F100; у нашому випадку встановлено вимкнення комп'ютера. Замість F100 можна використовувати будь-яке інше ім'я.

Тепер не менш важлива частина – куди все це записувати. У документації та численних порадах пропонується використовувати поточний файл консольної розкладки (у моєму випадку - boottime.kmap.gz). До речі, це єдиний файл опису розкладок, доступний після встановлення Kubuntu; Щоб побачити інші варіанти, слід встановити пакет console-data. Після цього в /usr/share/keymaps/i386/ можна знайти кілька підкаталогів з файлами всередині. Але якщо тобі знадобиться перейти на іншу розкладку (в Ubuntu та деяких інших дистрибутивах для цих цілей використовується файл /etc/default/console-setup або ~/.console-setup), всі налаштування потрібно буде перенести в інший файл, що кілька
незручно. Якщо ти все-таки зважишся на цей крок, використовуй наявні записи як шаблон, нічого не записуючи на першу позицію, а наприкінці не забудь залишити порожній рядок.

Трохи про ноутбук

Поки що мені не траплявся ноутбук, скан-коди клавіш якого визначити не вдалося б. Тому параметри тут нічим не відрізняються від описаних вище. Хоча є один прийом, про який хотілося б розповісти. Я вважаю дуже зручним у використанні режим глибокого сну, коли, включивши комп'ютер, виявляєш все на своїх місцях. Сучасні дистрибутиви, як правило, його підтримують, хоча налаштування, загалом, нескладна - достатньо встановити пакет hibernate і перевизначити необхідні параметри в конфігураційному файлі. Єдине, щоразу для переходу в цей режим потрібно запускати скрипт /usr/sbin/hibernate, що не завжди зручно. Хочеться просто закрити кришку ноутбука, а знову ввімкнувши
харчування, виявити все на своїх місцях.

Це дуже просто зробити, використовуючи демон acpid, який являє собою щось на зразок інтерфейсу користувача, що дозволяє керувати будь-якими подіями ACPI, доступними через /proc/acpi/event. При цьому acpid читає набір файлів конфігурації з каталогу /etc/acpi/events/. Якщо пакет із демоном у дистрибутиві відсутній, встановлюємо його з репозитарію; останню версію можна взяти із сайту phobos.fs.tum.de/acpi. Після встановлення необхідно в каталозі /etc/acpi/events створити два файли: lid та power. Перший описує реакцію на закриття кришки, другий – на натискання кнопки живлення.

$ sudo mcedit /etc/acpi/events/lid

event=button/lid.*
action=/usr/sbin/hibernate

$ sudo mcedit /etc/acpi/events/power

event=button/power.*
action=/sbin/shutdown -h now

Це дещо спрощені варіанти, у KUbuntu ти знайдеш складніші скрипти. Після цього потрібно перезапустити демон acpid:

$ sudo /etc/init.d/acpid restart

Тепер при закритті кришки ноутбука система впадатиме в сплячку з вимкненим живленням, а при натисканні на кнопку живлення - вимикатися. Просто та зручно.

Програми налаштування

Якщо тобі не до душі метушня з конфігураційними файлами, пропоную кілька програм, які допоможуть налаштувати роботу мультимедійних клавіш. Наприклад, початкове призначення програми Sven (sven.linux.kiev.ua) - налаштування додаткових клавіш на мультимедійній клавіатурі, але починаючи з версії 0.4 вона вміє виправляти помилки при наборі тексту та змінювати клавіатурну розкладку. Більше того, навіть якщо у тебе звичайна клава, за її допомогою ти зможеш емулювати мультимедіа-клавіші, використавши замість них клавіатурні поєднання. Також можна призначити дії певних кнопок миші. Вона розуміє приблизно 10 000 російських слів та 9 500 англійських. Якщо програма не перемкнулась
сама, то розкладку можна змінити і вручну за допомогою спеціально заданої клавіші (за замовчуванням Break). Окремою кнопкою (Scroll Lock) можна змінювати регістр слів (верхній, нижній, перша літера - верхній, інші - нижній). Індикатор-перемикач розкладки клавіатури запам'ятовує свій стан для кожного вікна, тому часто перемикаючись між додатками, тобі вже не потрібно буде додатково змінювати і розкладку. Програма має великі можливості, і я радив би на неї поглянути. Усі налаштування виконуються за допомогою графічної програми, побудованою на бібліотеках GTK+. Sven тестувався в Linux, але, в принципі, повинен працювати і на *BSD-системах. Використовуваний віконний менеджер
не має значення.

Можливості KeyTouch (keytouch.sf.net) дещо скромніші, ця утиліта застосовується виключно для налаштування мультимедійних клавіш. Хоча за її допомогою будь-якій клавіші можна призначити свою дію, яка відрізняється від стандартних установок. На сайті програми, окрім вихідних текстів та пакетів для деяких дистрибутивів, можна знайти готові налаштування для мультимедійних клавіатур більшості відомих виробників.

Ще одне цікаве рішення - xbindkeys (hocwp.free.fr/xbindkeys/xbindkeys.html) - дозволяє надавати будь-якій кнопці клавіатури та мишки будь-які команди, у тому числі і команди оболонки. Усі налаштування виконуються в конфігураційному файліякий має простий і зрозумілий формат.

  1. У верхній частині вікна Google Play є пошуковий рядок. Саме нею ми й скористаємося. Активуємо та пишемо назву нашої програми. Вводити його остаточно необов'язково. Як тільки в пошуковій видачіз'явиться позначений на скріншоті об'єкт, просто тапайте по ньому.
  1. Ми будемо переадресовані на домашню сторінку програми. Тут є велика зелена кнопка з написом "ВСТАНОВИТИ". Натисніть її.
  1. Очікуємо закінчення завантаження програми. Так як воно "важить" трохи менше 5 МБ, процес не займе багато часу.
  1. Готово. Після того, як автоматична інсталяція буде закінчена, ми зможемо запустити програму прямо звідси.
  1. Також на домашньому екрані (якщо активовано у налаштуваннях) з'явиться ярлик запуску.

На цьому налаштування програми завершено, і ми можемо переходити до огляду роботи з нею.

На скріншоті нижче ви бачите програмний інтерфейс. Тут він поділений на три основні вкладки. Також є іконка налаштувань, виконана у вигляді шестерні. На головній вкладці «SCAN» знаходяться 4 основні інструменти:

  • Scan Barcode. Це і є сканер QR, який працює за допомогою камери;
  • Manual Key-in. Функція ручного введення даних про код;
  • Decode from File. Декодування із файлу. Звідси можна відкрити раніше завантажений QR-код і рахувати його;
  • Decode from Url. Сканування за посиланням.

Внизу знаходяться кілька кнопок, які не несуть корисного функціоналу. На них звертати увагу не слід.

Розглянемо налаштування програми. Їх тут чимало. На ваших екранах будуть скріншоти різних областей конфігурації, ми просто озвучимо деякі найцікавіші моменти.

Наприклад, на першому екрані можна увімкнути або вимкнути звук програми. Те саме вийде зробити і з вібровідгуком. Ви можете встановити режим роботи, коли програма почне запускатися відразу зі сканера, минаючи головне меню. Ще однією важливою особливістю є автоматичне копіювання даних у буфер обміну.

Як тільки ми захочемо розпочати сканування та запустимо сам сканер, програма запросить доступ до потрібних системним ресурсам. Звичайно, його потрібно дозволити. Тиснемо кнопку, позначену на скріншоті.

Далі наводимо рамку сканера так, щоб горизонтальна смужка потрапила прямо на QR. Намагайтеся, щоб ваші руки не тремтіли і водночас слідкуйте за фокусуванням. Без нормальної різкості сканування не вдасться.

Для роботи QR BARCODE SCANNER в умовах недостатнього освітлення є підсвічування.

Як тільки код буде розпізнано, ви побачите інформацію, наведену на скріншоті нижче.

Крім сканування QR тут можна також створювати їх. Для цього переходимо до третьої вкладки. Ми відзначили її на скріншоті. У списку наведено всі типи даних, які можна зашифрувати. Підтримується таке:

  • контакт телефонної книги;
  • номер телефону;
  • URL-адреса;
  • Email;
  • додаток;
  • місцезнаходження;
  • будь-який текст;
  • закладка;
  • подія календаря.

Виглядає все це так:

Коли тип даних буде обраний і заданий, залишається лише натиснути кнопку «Encode». У цьому випадку ми зашифрували посилання.

Спробуємо зашифрувати також довільний текст. Для цього вибираємо потрібний пункт.

Вводимо фразу в зазначене поле і натискаємо кнопку «Encode».

Результат виглядає чудово. Давайте ще змінимо його колір. Тиснемо кнопку, призначену для цього.

Вибираємо потрібний відтінок із палітри.

І милуємося отриманим QR.

Переходимо до наступної програми, яка теж має значний функціонал.

QR Droid Code Scanner

Ще одна програма, знайти яку можна в Google Play. Також ви можете завантажити його за прямим посиланням на сайті Google. Ми поки розглянемо саму програму.

Так виглядає ярлик запуску QR Droid Code Scanner - тиснемо по ньому.

Цей додаток, на відміну від попереднього, виконаний російською мовою і, як тільки він запуститься, нам знадобиться натиснути кнопку з написом: «ПОЧАТОК РОБОТИ».

Відразу ж видно сканер, але спочатку давайте розберемося з його налаштуваннями. Тапаємо по кнопці, розташованій у верхньому правому кутку.

У головному меню видно 6 плиток-кнопок, які переадресують користувача до потрібного розділу. Ось вони:

Отже, щоб скористатися сканером, потрібно активувати його у головному меню і, навівши на QR-код, натиснути кнопку «Рахувати».

Тут вибирається стартовий екран, задається адреса для резервного копіюваннята настроюється мова програмного інтерфейсу.

Далі ми можемо встановити механізм сканування. Використовується один із фірмових алгоритмів: Zapper або ZXing. Нижче вдасться увімкнути або вимкнути перехрестя, настроїти автоматичну дію після сканування та ввімкнути відображення підказок або копіювання посилання в буфер обміну.

У цьому розділі налаштовується звуковий супровід, вмикається та вимикається вібро. Також конфігурується процес запису дій у журнал та взаємодія з розумним годинником Android Wear.

Потім у нас вийде експортувати чи імпортувати резервну копіюабо встановити дату.

Дозволити надсилання анонімних даних (краще вимкнути), активувати перевірку одержуваного під час сканування посилання на безпеку або налаштувати пакетне сканування. Нижче наведено такі функції, як масштабування або підсвічування.

Але на цьому наші налаштування не закінчуються. Крім наведених вище функцій, ми маємо таке:

  • налаштування орієнтації екрана;
  • робота з фронтальною камерою;
  • парсинг посилань;
  • показ магазинів.
  • функція розширеного описка;
  • заборона деяких спецсимволів;
  • активація WEB-передбачення;
  • пошук збережених зображень.

Останній екран налаштувань містить такі цікаві функції, як: налаштування максимальної кількості позицій, конфігурація користувацьких CSV, струшування «розумного» годинника і збереження позицій, що повторюються.

Крім налаштувань у меню QR Droid Code Scanner є пункт під назвою «Ще». Розглянемо його функціонал.

Тут є такі можливості:

Розглянемо останній, але від цього не менш функціональний, додаток у нашому списку.

NeoReader QR & Barcode Scanner

Дану програму, як і інші, ви можете завантажити та встановити через Google playабо за прямим посиланням . Коли це буде зроблено, можна переходити безпосередньо до роботи з нею.

При першому запуску нам потрібно буде задовольнити запит доступу. Тиснемо «ДОЗВІЛИТИ».

Потім з'явиться вікно з налаштуваннями. Тут вдасться вибрати мову, вказати свою країну, стать та вік. Дві галочки, розміщені нижче, дозволяють увімкнути або вимкнути доступ програми до геоданих.

Можна, власне, починати сканування. Наведіть камеру на QR-код і NeoReader QR & Barcode Scanner автоматично розпізнає його вміст.

Ми думаємо, що цих трьох програм цілком вистачить для будь-якої людини. Виберіть найбільш зручну для вас і використовуйте на власний розсуд. Ми ж поговоримо про деякі особливості китайських девайсів.

Стандартний функціонал

У деяких смартфонах та планшетах (залежно від марки) є функціонал сканування QR-кодів у штатному виконанні і зробити все можна без застосування. Не будемо перераховувати їх усі, торкнемося лише моделі від Xiaomi.

Підбиваємо підсумки

В результаті ми з вами дізналися, як сканувати QR-код на Андроїд. різними способами. Сподіваємося, стаття виявилася для вас корисною. Якщо питання все ж таки залишилися, ставте їх у коментарях. Ми намагатимемося допомогти кожному.

Якщо навіть цього не станеться, хтось із користувачів, що знаходяться на сайті, обов'язково підкаже як вийти із ситуації та дасть слушну пораду. Вам залишиться лише втілити його у життя.

Відеоінструкція

У книзі зібрані та узагальнені поради щодо рішення різних проблемякі рано чи пізно виникають при експлуатації як економічних нетбуків, так і сучасних настільних моделей. Всі наведені рецепти випробувані на практиці та розбиті на теми: апаратні засоби персональних комп'ютерів, комп'ютерні мережіта підключення до Інтернету, встановлення, налаштування та ремонт Windows, робота в Інтернеті, захист від вірусів. Розглянуто не тільки готові рішенняраптово виникаючих проблем, а й відповіді багато питань, що виникають ще до покупки комп'ютера. Наведено необхідний мінімум технічних відомостей, що дозволяє ухвалити усвідомлене рішення.

Компакт-диск додається лише до друкованого видання книги.

Книга:

Розділи на цій сторінці:

На клавіатурі є багато клавіш, якими ви ніколи не користуєтеся. Одна з найдокучливіших – клавіша , що збереглася з часів програмістських мов типу Фортрана, де все писалося великими літерами. Рідко хто користується і системними клавішами Windows(і основний, і для виклику контекстного меню) – це зручніше робити мишею. Тим часом випадкове натискання цих кнопок гальмує всю роботу. Ті, кого це дратує, можуть відключити їх або перепризначити інші функції – наприклад, на сусідні клавіші.

Розглянемо на прикладах ці дії, а потім розповімо, як це здійснюється у загальному випадку – для будь-якої клавіші.

Спочатку потрібно в розділі реєстру HKEY_LOCAL_MACHINESYSTEMCurrentControlSet ControlKeyboard Layout (не плутати з Keyboard Layouts!) створити новий двійковий параметр (у меню так і буде написано - двійковий параметр), назвавши його Scancode Map (з пробілом!), і привласнити йому значення за слідом:

00 00 00 00 00 00 00 00

03 00 00 00 00 00 5C E0

00 00 5D E0 00 00 00 00

Цей рядок відключить клавішу з прапорцем Windows та сусідню клавішу виклику спливаючого меню. Розберемося в тому, що тут написано.

Спочатку має йти 8 пар нулів поспіль. Потім йде число (з провідним нулем) – в даному випадку 03, яке означає кількість клавіш, що відстежуються, плюс одиниця (тобто в цьому прикладі відстежуємо дві клавіші). Після нього завжди має йти три пари нулів (доповнюючи до 4 пар цифр). Закінчуватися запис повинен завжди четвіркою пар нулів. А ось між ними ми повинні записати стільки четвірок парних чисел, скільки ми передбачили клавіші для відстеження – у цьому випадку дві. У них записуються так звані скан-код клавіш, які бажаємо відключити. У табл. 12.2 наведено коди тих клавіш, які доцільно розглядати у плані кандидатів на відключення чи заміну (див. далі).

Ці коди записуються в останні дві пари кожної четвірки пар чисел, перші дві пари знову ж таки нулі – як ви і бачите у зразку. Таким чином, наведений як приклад рядок відключить нам праву клавішу (з прапорцем Windows) (00 00 5C E0) та сусідню клавішу Виклик спливаючого меню (00 00 5D E0).

Таблиця 12.2. Скан-коди клавіш


Що таке скан-коди та де їх взяти

Скан-код – це число, яке видає клавіатура при натисканні певної клавіші. Скан-коди не слід плутати з віртуальними кодами клавіш - останні формуються вже на рівні BIOS і Windows і надалі визначають коди символів, ті, що, наприклад, утворюють вміст текстових документів. У більшості випадків вони ніяк не пов'язані між собою. Наприклад, віртуальний код клавіші "пробіл" - 32 (збігається з кодом символу "пробіл" в однобайтних кодуваннях), а скан-код її - 57 (в HEX-формі це буде 20 і 39 відповідно). Зауважте, що віртуальні коди не еквівалентні символьним – щоб перетворити віртуальний код на код символу, треба ще врахувати мовну розкладку, стан клавіш , і, між іншим, систему кодувань, що використовується - однобайтну або Unicode. Все це робить системний драйвер клавіатури ще до того, як подія натискання потрапляє в чергу Windows-повідомлень. Деякі клавіші ( або ) взагалі ні з якими символами не пов'язані та у зазначену чергу не потрапляють. Тому для повної заміни функціональності якоїсь клавіші підмінити віртуальні коди (що взагалі-то може зробити будь-хто, хто володіє навичками програмування в Delphi або Visual C++) недостатньо - треба діяти на більш глибокому рівні, маніпулюючи саме скан-кодами. Це дозволяє здійснити параметр Scancode Map в реєстрі Windows.

Для наших цілей скан-коди, як ви можете здогадатися за наведеною таблицею, мають бути представлені у шістнадцятковій (HEX), а не десятковій формі. Таблиці віртуальних кодів та кодів символів зазвичай додається до будь-якого посібника з Windows-програмування, а ось повну таблицю скан-кодів розшукати непросто. Одна з таких таблиць знаходиться на сайті « Електронна бібліотека» за посиланням http://ntlib.chat.ru/ware/tables/scan.htm. Вона трохи невдало складена - так звані розширені клавіші (це ті, у яких другий байт у нашій таблиці дорівнює E0) там показані додаванням зайвого розряду, що дорівнює 1. Тобто вибравши з колонки HEX скан-код, наприклад, 11С (клавіша на цифровій клавіатурі), його треба для наших цілей переписати як 1С E0. Офіційний повний набір скан-кодів, включаючи клавіші керування живленням (але виключаючи додаткові медіаклавіші), можна завантажити з сайту Microsoft. Посилання на документ дуже довге, тому просто наберіть у пошуку на microsoft.com слова «Keyboard Scan Code Specification», і отримайте шукане – щоправда, англійською. Під час вивчення цього документа врахуйте, що нас цікавить лише один набір кодів: Scan Code Set 1.

Зрозуміло, готувати такий рядок чисел слід заздалегідь і уважно перерахувати всі пари, перш ніж вводити їх у реєстр. Але під час введення ви побачите, що вам допоможуть не наробити помилок. Введення значення двійкового числа здійснюється вручну (мал. 12.11), але незважаючи на незвичний вигляд цього редактора, ви швидко переконаєтесь, що працювати з ним дуже зручно. Зокрема, не виникає проблем при підрахунку пар, що вводяться – вони автоматично групуються по вісім у рядку. Не забудьте перезавантажити комп'ютер після остаточного введення значень параметра.


Рис. 12.11. Введення значень двійкового параметра

Для не просто скасування, а ще й перепризначення, доведеться трохи ускладнити запис – перші дві пари нулів у тих четвірках, що містять коди клавіш, замінити на ті коди, які повинні, на вашу думку, працювати. Наприклад, значення параметра Scancode Map, що дорівнює

00 00 00 00 00 00 00 00

03 00 00 00 00 00 5C E0

1D E0 5D E0 00 00 00 00

зробить так, що права клавіша з прапорцем Windows відключиться, а Буде дублювати правий , Т. е. найближчу до неї клавішу. Саме це значення Scancode Map наведено як приклад на рис. 12.11.

Покажемо, як впоратися з . Експерименти показують, що з нею не все однозначно – зокрема спроба простого відключення може не дати результатів. Але я наведу значення параметра Scancode Map, яке гарантовано відключає - її функція змінюється на функцію (правого, але на практиці це не має значення), а Тут, як і раніше, дублює правий :

00 00 00 00 00 00 00 00

03 00 00 00 1D E0 5D E0

2A 00 3A 00 00 00 00 00

На диску, що додається, в папці Registry знаходиться файл key.reg, при запуску якого і підтвердження того, що ви дійсно хочете внести зміни до реєстру, автоматично створиться параметр Scancode Map з таким значенням. Якщо не хочете чіпати нічого, крім , то відредагуйте це значення наступним чином: 03 замініть на 02 і замініть чотири байти з ненульовим значенням у другому рядку нулями.

Нічого фатального в результаті цих ваших експериментів статися не повинно - якщо ви в чомусь помилилися або вирішили залишити все як є, просто видаліть параметр Scancode Map з реєстру і перезавантажте комп'ютер. Або поверніть систему у вихідний стан за допомогою точок відновлення.

Вимкнення клавіші як входу в меню

На жаль, упоратися з клавішею як системної для Windows (виклику головного меню), зберігши її функціональність як клавіші-модифікатора, через реєстр не вийде - вона взагалі перестане реагувати на натискання. Тому, якщо ми зайнялися клавішами, заразом вкажу засіб з нею впоратися, хоча воно і не має відношення до реєстру. На диску до книги є папка AltSpy, в якій розміщено програму того ж імені. Скопіюйте всю папку (вона містить три файли) на жорсткий диск і запустіть файл із розширенням js (сценарій на мові Java Script). Щоб не запускати руками щоразу, його слід включити в автозавантаження (див. 10.1.3 «Автозавантаження»). Через 10 секунд після запуску сценарію AltSpy створить в області повідомлень кароокий значок, у якого виявиться єдиний пункт контекстного меню - Закрити. Пауза потрібна для того, щоб AltSpy гарантовано виявився останнім при запуску і перекрив інші служби. Після цього перестане викликати головне меню, проте збереже свою основну функціональність. Можливість викликати головне меню у вас при цьому не пропадає - цю функцію, як і раніше, виконує клавіша , Зате тепер набагато важче викликати його випадково і тим самим збити фокус введення з потрібного елемента.

Зайнятися пристроєм подібного роду мене спонукав той факт, що більшість простих для повторення геймортівських пристроїв не дозволяла продати достатню кількість кнопок управління. Ігровий порт PC спочатку взагалі розрахований максимум на чотири кнопки. Різні розширення також не мають бажаної гнучкістю. Наприклад, популярне серед саморобів розширення CH Flightstick Pro дозволяє реалізувати до 14-ти кнопок, але при цьому одночасно не можна використовувати дві будь-які кнопки - про польоти на таких пристроях в іграх, в яких доводиться постійно «крутити головою» - у тих же пташках, можна забути. Деякі розширення використовують виключно цифровий інтерфейс - дані про натиснені кнопки і відхилення ручки передаються цифровими лініями геймпорту, які спочатку призначалися для передачі даних про чотири «стандартні» кнопки. Я навіть вважаю такі розширення чимось надмірними. Та й перетворення аналогових даних на цифрові ускладнює конструкцію джойстика. Крім того, не всяка гра захоче зрозуміти, що за монстр до неї «присмоктався». А клава – ось вона, у всій своїй 102-х клавішній красі! Крім того, масла у вогонь підливали передплатники RU.GAME.FLIGHT, що час від часу запитували «а як би мені клаву приручити і з джоєм схрестити?» і ті, що йшли ні з чим.

Коротше кажучи, завдання пристрою – «сидіти» на шині між клавіатурою та PC та імітувати натискання клавіш на клавіатурі, відповідно до натиснутих кнопок пристрою.

Отже, я засів за розробку. До цього в мене був досвід роботи з різними мікропроцесорами та мікроконтролерами. Загалом – пальці від вуха до вуха. І я наївно вважав, що ось зараз я візьму доки, зроблю RTFM і через тиждень буду на білому коні. Вся проблема виявилася в тому, що документації про протокол передачі даних між клавіатурою і контролером я не зміг знайти ні в Інтернеті, ні у відповідних конференціях Фідо. Довелося брати осцилограф і кілька тижнів займатися розбором часників та спробами їх повторити. Тому більша частина наведеної нижче інформації є результатом моїх висновків і не підтверджена документально. Якщо я в чомусь помиляюсь - радий вислухати коментарі за адресою rashpil at ukr dot net.

Основні принципи передачі

Все наведене нижче справедливо для PS/2 і AT-клавіатур, які відрізняються тільки виконанням роз'єму (можуть підключатися через перехідник).

Між клавіатурою та контролером, розташованим на материнській платі комп'ютера (далі – просто «контролером»), здійснюється двосторонній обмін даними. Контролер передає різні команди (наприклад – зміна стану світлодіодів чи швидкості автоповтору). Клавіатура передає скан-коди натиснутих клавіш (скан-код – умовне позначення клавіші, не варто плутати з ASCII-кодами).

Скан-коди

Клавіша Скан-код Клавіша Скан-код Клавіша Скан-код Клавіша Скан-код
1 16 2 1E 3 26 4 25
5 2E 6 36 7 3D 8 3E
9 46 0 45 - 4E + 55
Backspace 66 Tab 0D Q 15 W 1D
E 24 R 2D T 2C Y 35
U 3C I 43 O 44 P 4d
[ 54 ] 5B Enter 5A Ctrl(L) 14
A 1C S 1B D 23 F 2B
G 34 H 33 J 3B K 42
L 4B ; 4C " 52 ` 0E
Shift(L) 12 \ 61 Z 1A X 22
C 21 V 2A B 32 N 31
M 3A , 41 . 49 / 4A
Shift(R) 59 Alt(L) 11 Space 29 Caps Lock 58
Esc 76 F1 05 F2 06 F3 04
F4 0C F5 03 F6 0B F7 83
F8 0A F9 01 F10 09 F11 78
F12 07 Scroll Lock 7E * 7C Num Lock 77
7 6C 8 75 9 7D - 7B
4 6B 5 73 6 74 + 5A
1 69 2 72 3 7A 0 70
. 71 Alr(R) E0-11 Ctrl(R) E0-14 Print Screen E0-12-E0-7C
Insert E0-70 Delete E0-71 Left E0-6B Home E0-6C
End E0-69 Up E0-75 Down E0-72 PageUp E0-7D
PageDown E0-7A Right E0-74 Enter E0-5A / E0-4A

Примітка: насправді AT-клавіатура має три різні набори сканкодів. Я навів лише значення для набору №2 – дефолтного.

При натисканні клавіші клавіатура передає контролеру скан-код цієї клавіші. При відпусканні спочатку префікс 0F0h, а потім скан-код відпущеної клавіші.

Комбінації клавіш із Shift, Alt і Ctrl передаються як послідовність двох скан-кодів. З погляду контролера ці кнопки нічим не відрізняються від решти. Так само на апаратному рівні не відрізняються режими Num Lock і Caps Lock - вони різняться на програмному рівні програмою, яка обслуговує переривання від клавіатури.

Коротко хочу зупинитись на реалізації режиму автоповтору. Як правило функції автоповтору покладаються на саму клавіатуру - через певний час, якщо клавіша не відпущена, то клавіатура посилає ще один такий самий скан-код. Якщо в цей час натиснути ще одну клавішу, то до контролера «полетить» вже інший скан-код і вважатиметься, що натиснуто лише одну клавішу. У іграх цю проблему вирішено елементарно - клавіша вважається натиснутою, доки прийде відповідний скан-код з префіксом 0F0h. Тому я не став реалізовувати функцію автоповтору в принципі.

Крім наведених вище скан-кодів, клавіатура може повертати деякі службові команди. Але ці команди, як і команди, видані контролером, не становлять у разі практичної цінності. Тому на них зупинятись не буду.

Опис протоколу обміну

Обмін даними між клавіатурою та контролером здійснюється асинхронно за послідовним протоколом. Суть асинхронної передачі полягає в тому, що дані передаються лише тоді, коли є що передавати – натиснута/відпущена клавіша на клавіатурі і потрібно видати відповідний скан-код або контролеру потрібно видати команду клавіатури.

Для обміну даними служать дві лінії - KBData та KBSync. Під час передачі скан-кодів клавіатура виставляє черговий розряд даних на лінії KBData та підтверджує передачу перекладом з «1» на «0» сигналу на лінії KBSync. При прийомі даних від контролера клавіатура зчитує розряд даних з лінії KBData і підтвердження прийому перекладом з «1» в «0» сигналу на лінії KBSync. Контролер може сигналізувати про свою неготовність передавати/приймати дані низьким рівнем лінії KBSync. Решта часу, коли немає даних передачі, обидві лінії мають високий рівень сигналу. Частота проходження імпульсів лінії KBSync становить близько 10-25КГц.

Дані передаються у такому порядку: один стартовий біт – «0», вісім біт даних, біт парності (сума всіх розрядів +1), один стоповий біт – «1». Після прийому кожного байта даних контролер виставляє низький рівень лінії KBSync, сигналізуючи тим самим, що зайнятий обробкою прийнятих даних і готовий приймати такі. Це вважатимуться підтвердженням прийому. Клавіатура підтверджує кожен байт команди, що приймається видачею коду 0FAh. У разі помилки під час передачі, контролер може вимагати повторити передачу останнього байта, видачею команди 0FEh. Клавіатура поводиться інакше - просто ігнорує помилки. Я не бачу в цьому нічого фатального – якщо ваша система дає часті збої, то їй не місце на робочому столі.

Швидше за все, мої пояснення були надто заплутані, тому намагатимусь проілюструвати їх кількома часовими діаграмами.

Загальний вид передачі даних від клавіатури (S1 - стартовий біт; S2 - стоповий біт; D0-D7 - дані; P - біт парності; W - обробка прийнятих даних)

Приклад передачі байта 74h – клавіша «6» на нумпаді. У цьому прикладі при ініціації передачі клавіатурою контролер сигналізує про свою неготовність приймати дані і клавіатура чекає на звільнення лінії KBSync

Апаратна реалізація

Тепер я перейду безпосередньо до опису реалізації пристрою у «залізі».

Пристрій вмикається в розрив сигналів KBSync і KBData і пропускає через себе сигнали від / до клавіатури, опитує стан чотирьох кнопок і видає відповідні скан-коди, тим самим імітуючи роботу клавіатури.

Основу пристрою становить однокристальний мікроконтролер AT89C2051. Мікроконтролер AT89C2051 фірми Atmel належить до сімейства MCS-51 (вітчизняний аналог – МК-51). Основна відмінність AT89C2051 від i8051 - знижене енергоспоживання, скорочена до 15-ти кількість ліній введення-виведення, відсутність можливості використовувати зовнішню пам'ять. Більш детальну інформацію щодо AT89C2051 та i8051 можна знайти на www.atmel.com та www.intel.com. Замість AT89C2051 можна використовувати AT89C51, i8051 (КР1816ВЕ51) або i8031 (КР1816ВЕ31) із зовнішнім ПЗП. Але два останні варіанти через своє підвищене енергоспоживання можуть призвести до перегорання запобіжника контролера клавіатури.

На мікроконтролерах фірми Atmel після основного позначення вказується максимальна частота генератора тактового в мегагерцах. Я раджу ставити мікроконтролер розрахований на частоту 24МГц і кварц із частотою вище – 16-20МГц.

Принципова схема. (R1-R4 - 47K; R5 - 10K; C1, C2 - 18пФ; C3 - 1мкФ; D1 - AT89C2051; BQ1 - кварц 12-24МГц)

Лінія P1.4 використовується як вихід роздільної здатності опитування кнопок. Це - заділ для майбутніх розширень, - лінії P1.4-P1.7 будуть використані для видачі адреси рядка для опитування натиснутих кнопок (до 16-ти рядків по 4 кнопки). "0" на лінії P1.0-P1.3 означає, що натиснута відповідна кнопка.

Елементи C3 та R5 реалізовують схему генерації сигналу скидання при подачі живлення.

Лінії KBData з боку клавіатури та контролера подаються на входи P3.2 (INT0) та P3.3 (INT1). Таким чином, спроба ініціювати передачу даних з боку клавіатури або контролера викликає відповідне переривання. Підпрограми обслуговування цих переривань просто транслюють сигнали, що відповідають передачі одного байта через мікроконтролер. Коли мікроконтролер не зайнятий передачею даних, відбувається опитування ліній P1.0-P1.4, обробка отриманих даних і видача відповідних скан-кодів контролеру. У цій версії пріоритет надається даним, що передається самим пристроєм. Тому дані від клавіатури іноді можуть губитися.

Завершуючи цей розділ, наведу розпинання роз'ємів AT- та PS/2-клавіатури.

Сигнал -KBReset – необов'язковий сигнал. Деякі контролери можуть використовувати його, щоб скинути клавіатуру.

Текст мікропрограми

Я наводжу вихідний текст мікропрограми для мікроконтролера AT89C2051, сподіваючись, що допитливий читач зможе мене поправити або адаптувати програму для роботи з іншим типом мікроконтролера.

Org 0 sjmp start org 3 jmp from_keyboard; INT0 org 13h jmp to_keyboard; INT1 start mov a, # 5; установка типу переривань mov tcon, a; INT0 і INT1 по фронту - mov a, # 0; перехід з "1" до "0" mov ip,a mov a,#85h mov ie,a mov a,#0ffh; за адресою 06h зберігається останній mov 6,a; оброблений код clr ​​p1.4; дозвіл опитування loop mov a, p1; зчитується стан кнопок anl a, # 15; - молодші чотири розряди порту P1; D0 – вгору; D1 – вправо; D2 – вниз; D3 - вліво mov dptr, # hat_table; лічені дані про чотири кнопки movc a, @ a + dptr; розширюються до восьми напрямків; D0 – вгору; D1 – вправо; D2 – вниз; D3 – вліво; D4 - вправо-вгору; D5 – вправо-вниз; D6 - вліво-вниз; D7 - вліво-вгору mov r2, a; збереження даних mov r0,a xrl a,6; якщо нові дані не відрізняються від jz loop; отриманих у попередньому циклі - повторюємо опитування mov r1, # 8; цикл для восьми розрядів loop3 jnb acc.7, loop2; "1" - було зміна push acc mov a, r1 mov dptr, # key_table-1; вилучаємо відповідний скан-код movc a, @ a + dptr push acc mov a, r0; ресистр R0 - ознака натискання/відпускання rlc a; емульованої клавіші mov r0,a; "1" - "клавіша" була відпущена pop acc mov acc.7, c; якщо D7=1 - скан-код передуватиме 0f0h acall send_key ; видача скан-коду pop acc sjmp loop2a loop2 push acc mov a, r0 rlc a mov r0, a pop acc loop2a rl a djnz 1, loop3 mov 6, r2 sjmp loop send_key mov ie, # 80h; переривання заборонені acall send2comp; посилка скан-коду mov ie, # 85h; переривання дозволені ret send2comp jnb acc.7,send; при необхідності першим видається 0f0h push acc mov a, #0f0h acall send pop acc clr acc.7 mov b, # 200 l9 nop djnz b, l9 send push 1 push 0 clr p3. P3.3 - KBData mov b, # 6; видача стартового біта l10 nop djnz b, l10 clr p3.5 mov b, # 15 l2 nop djnz b, l2 setb p3.5 mov b, # 6 l3 nop djnz b, l3 mov r0, # 8; видача восьми біт даних та підрахунок парності mov r1,#1 byte_loop xrl 1h,a rrc a mov p3.3,c mov b,#6 l4 setb p3.5 mov b,#6 l5 nop djnz b,l5 djnz r0,byte_loop mov a,r1 mov c,acc.0 mov p3.3,c; видача розряду парності mov b, #6 l8 nop djnz b, l8 clr p3.5 mov b, # 15 l12 nop djnz b, l12 setb p3.5 mov b, видача стопового біта mov b,#6 l7 nop djnz b,l7 clr p3.5 mov b,#15 l11 nop djnz b,l11 setb p3.5 mov b#200 l14 nop djnz b,l14 setb p3.5 pop 0 pop 1 ret from_keyboard; передача одного байта до контролера mov ie,#80h push psw push acc push b mov b#2 in6 jnb p3. 4,in8 djnz b,in6 sjmp in7 in8 mov b,#10 in1 mov a,p3 rl a orl a,#11010111b mov p3,a jnb p3.4,in1 in2 mov a,p3 rl a orl a,#11010111 p3,a jb p3.4,in2 djnz b,in1 in3 mov a,p3 rl a orl a,#11010111b mov p3,a jnb p3.4,in3 mov p3,#0ffh in4 jb p3.5,in4 in5 jnb p3 .3,in7 clr p3.4 jnb p3.5,in5 in7 mov p3,#0ffh pop b pop acc pop psw mov tcon,#5 mov ie,#85h reti to_keyboard ; передача одного байта до клавіатури mov ie, # 80h push psw push acc push b mov b, # 5 ,p3.4 mov p3.5,c mov c,p3.3 mov p3.2,c jb p3.4,out6 out8 mov b,#10 out1 mov c,p3.4 mov p3.5,c mov c, p3.3 mov p3.2,c jnb p3.4,out1 out2 mov c,p3.4 mov p3.5,c mov c,p3.3 mov p3.2,c jb p3.4,out2 djnz b,out1 out3 mov c,p3.4 mov p3.5,c mov c,p3.2 mov p3.3,c jnb p3.2,out3 out7 mov p3,#0ffh pop b pop acc pop psw mov tcon,#5 mov ie , # 85h reti hat_table; таблиця для розширення даних зчитаних з порту P1; індекс у таблиці – чотирирозрядний двійковий код; дані - стан восьми емульованих клавіш; "0" - клавіша натиснута db 0ffh; вліво+вправо+вгору+вниз=заборонена комбінація db 0ffh; вліво+вправо+вниз=заборонена комбінація db 0ffh; вліво+вгору+вниз=заборонена комбінація db 0bfh; вліво+вниз=вліво-вниз db 0ffh; вліво+вправо+вгору=заборонена комбінація db 0ffh; вліво+вправо=заборонена комбінація db 07fh; вліво+вгору=вліво-вгору db 0f7h; вліво db 0ffh; вправо+вгору+вниз=заборонена комбінація db 0dfh; вниз+вправо=вниз-вправо db 0ffh; вгору+вниз=заборонена комбінація db 0fbh; вниз db 0efh; вправо+вгору=вправо-вгору db 0fdh; вправо db 0feh; вгору db 0ffh; немає натиснутих кнопок key_table; таблиця скан-кодів db 75h; numpad 8 db 74h; numpad 6 db 72h; numpad 2 db 6bh; numpad 4 db 7dh; numpad 9 db 7ah; numpad 3 db 69h; numpad 1 db 6ch; numpad 7

В архіві tools.zip ви знайдете дві програми: a51.exe – асемблер, hex2bin – конвертер hex-файлів, які виходять на виході ассемблера, у двійковий формат, придатний для прошивки ПЗУ мікроконтролера програматором.

Складання та усунення несправностей

Зібрати пристрій за наведеною вище схемою можна на макетниці, витраченій платі в домашніх умовах або виготовленої промисловим способом. Під мікроконтролер слід встановити панельку. Найкраще залишити місце на платі під 2-3 16-вивідні DIP-корпуси - вони будуть додані в наступних версіях.

Далі, після внесення бажаних змін, асемблюється вихідний текст мікропрограми – програмою a51.exe. Для прошивки програматором отриманий hex-файл перетворюється на двійковий образ програмою hex2bin.exe.

Зібравши повністю пристрій, підключаємо його до клавіатури та комп'ютера. Три... Два... Один... Поїхали!.. Правильно зібраний із заздалегідь справних компонентів пристрій повинен запрацювати відразу. Якщо ні – перевірте правильність монтажу, наявність живлення на мікроконтролері. Перевірте осцилографом, чи запустився тактовий генератор і чи надходить імпульс високого рівня на вхід RST при включенні живлення. При натисканні клавіш на клавіатурі імпульси на лініях P3.3 та P3.5 повинні повторювати з деякою затримкою імпульси на лініях P3.2 та P3.4 відповідно. При натисканні/відпусканні кнопок пристрою на лініях P3.3 та P3.5 повинні також з'являтися іпульси. Якщо це не допоможе - напишіть мені ( rashpil at aport dot ru) багрепорт, вказавши модель і тип (AT, PS/2) своєї клавіатури, материнської плати/мультикарти, використаного мікроконтролера та частоту використаного кварцового резонатора. Я постарався протестувати пристрій з максимальною кількістю доступних мені материнських платта клавіатур - неполадок виявлено не було. У моєму випадку використано кварц 14.2МГц.

Known bugs

Поточна версія мікропрограми містить такі недоробки:

  • Чи не відстежуються двобайтові скан-коди. Це призводить до того, що іноді при використанні одночасно хатки та клавіатури клавіші клавіатури «зависають» у натиснутому стані або сприймаються невірно;
  • Іноді неправильно передаються дані від контролера до клавіатури. Це може виражатися, наприклад, у тому, що не змінюють стан світлодіоди, при натисканні клавіш Num Lock, Caps Lock, Scroll Lock;
  • Брязкіт контактів кнопок хатки. Поки що це не стало фатальним для мене в іграх.

Плани на майбутнє

Ось короткий список того, що я хотів би реалізувати в наступних версіях:

  • Дрібні багфікси - коректніша обробка сигналів; відстеження двобайтових скан-кодів;
  • Підключення матриці 16x4 - підтримка до 64 кнопок або двох хаток і до 56 кнопок;
  • Підтримка до 16 різних розкладок скан-кодів, збережених в ПЗУ мікроконтролера;
  • Підключення мікросхеми NVRAM з можливістю збереження та перепрограмування «на льоту» до 32-х розкладок скан-кодів.

Висновок

Я постарався викласти всі дані, необхідні розуміння принципу функціонування мого пристрою. Цей опис не претендує на стовідсоткову технічну точність. Якщо я в чомусь помиляюсь – будь ласка викладіть мені свою версію подій. Якщо ви зможете внести в мою схему та/або мікропрограму покращення та доповнення, якщо у вас є ідеї щодо подальшого розвитку схеми – також повідомте мені про це. Крім того, чекаю на інформацію від умільців, які змогли повторити або адаптувати цей пристрій під інші типи мікроконтролерів.

Володимир "Рашпіль" Клімус (rashpil at ukr dot net)

Наступним типовим пристроєм ПЕОМ, начебто й нескладним, але доставляє, часом, клопіт досліднику, є клавіатура.

Загалом пристрій нескладний. Особливо ноне вже застарілі моделі, що підключаються до порту PS/2. Як показують численні експериментальні дані, мікросхема управління «клави» сканує натискання клавіш і передає в послідовному коді в порт. Тактова частота цієї передачі кратна (переважно випадків) » 6,3 або 10 кГц. Хоча автору попалися в останні роки пара екземплярів, тактова частота яких лежала в районі 20 кГц.

Всі клавіатури при натисканні та утриманні будь-якої клавіші починають (після деякої паузи) повторювати передачу коду клавіші «до нескінченності». У звичайному режимі це зазвичай через кілька секунд призводить до переповнення буфера контролера і порушення роботи. З'являється звуковий сигнал системного динаміка - писк. Суть тест-режиму (найзагальнішого) полягає в блокуванні команди переповнення буфера, що дозволяє, при натиснутій клавіші, забезпечити нескінченну передачу по кабелю «клави» обраного символу.

Як і завжди, для правильного подальшого розрахунку результату, необхідно створити постійне чергування імпульсів кодового пакета. Для кодів клавіатури таких комбінацій може бути дві:

10101010 (55) клавіша +; = »

01010101 (АА) у типових таблицях - не застосовується

Загальна таблиця скан-кодів наведена у таблиці 14.1

Таблиця 14.1- Скан-коди клавіатури

Клавіша

Скан-код

Клавіша

Скан-код

Клавіша

Скан-код

Клавіша

Скан-код

Таким чином, при реалізації тест-режиму і, наприклад, покладеному на клавішу "+" грузику в кабелі "клави" буде присутня нескінченна послідовність пакетів імпульсів. При цьому період прямування імпульсів у пакеті (тобто тактова частота), дорівнюватиме 6,10 або 20 кГц, а частота прямування пакетів буде набагато нижче. Формат даних наведено на малюнку 14.1

Для обміну даними в кабелі клавіатури служать дві лінії – KBData та KBSync. Під час передачі скан-кодів клавіатура виставляє черговий розряд даних на лінії KBData та підтверджує передачу перекладом з «1» на «0» сигналу на лінії KBSync.

Контролер може сигналізувати про свою неготовність передавати/приймати дані низьким рівнем лінії KBSync. Решта часу, коли немає даних для передачі, обидві лінії мають високий рівеньсигналу.



Як випливає з вищенаведеного, у діапазоні ПЕМІН кабелю клавіатури слід очікувати частотних складових з тактовою частотою 1/76,04·10 -6 =13,15 кГц. Причому через наявність двох, зрушених по фазі, сигналів з різними (але кратними!) періодами, парні та непарні частотні складові відрізнятимуться за амплітудою.

Як і слід очікувати, ПЕМІН лінії синхронних неінформативний, в принципі. Але відрізнити один ПЕМІН від іншого зовсім непросто. Кабель один, сигнали синхронні.

Практично єдиний спосіб – підібрати скан-код із мінімальним числом логічних «1» у посилці. Такими є клавіші F3 і F9 (03 і 01 в hex-коді). Код "00" не використовується.

Осцилограма скан-коду «F3» наведена нижче.


Строго «по енергетиці», якщо виміряти всі частотні складові ПЕМІН з кодом «=» і, наприклад, кодом «F9», то різниця у показаннях приймача на КОЖНІЙ з частотних складових і є інформаційна частина енергії ПЕМІН. І це максимум максиморум. Робота досить складна та стомлива, якщо немає можливості доручити її «автомату». Самі складові ПЕМІН для таких низьких частот виявляються не легко. Так ще й різниці «ловити»…



У практиці СІ, переважно випадків, просто вимірюють рівні ПЕМІН (нічого не віднімаючи) і вважають параметр захищеності. Можна й так, «із запасом», але знати справжній стан справ фахівець зобов'язаний.

На закінчення розгляду - «розпинання» роз'ємів AT-і PS/2-клавіатури.


«Картинки» на приймачі виглядає далеко не так «класично», однак і він цілком впізнаваний. Ось приклади



На спектрі добре видно зростання амплітуди компонентів із зменшенням частоти.

Є ще особливості вимірювання «клави» в цій частотній області (від десятків кГц і далі). Справа в тому, що клавіатура, у звичайному розміщенні, знаходиться неподалік системного блоку. А у верхній частині СБ знаходиться імпульсний блок живлення – найпотужніший джерело ПЕМІН і за «Е», і за «Н» компонентами. У «світлі» такого театрального софіту, тьмяне «світло» клавіатури побачити – особливе мистецтво! Тому пропоную наступний прийом. Відсуньте «клаву» від СБ якнайдалі. Найкраще – на подовжувачі PS/2. Так метра на 2-2,5.

Розмістіть антену так, щоб на неї наводилося якнайменше від СБ (сигнал, при смузі приймача більше 10 кГц – суцільний спектр). І ось біля так зорієнтованої, нерухомої антени, починайте крутити «клаву» та її кабель (не навпаки!). Тоді у Вас буде набагато більше шансів виявити сигнали ПЕМІН саме клавіатури, побачити компоненти ПЕМІН на екрані аналізатора на власні очі.

Все вищевикладене стосувалося клавіатури з інтерфейсом PS/2. Але зараз їх масово замінюють клавіатури з USB-інтерфейсом.

Взагалі цей інтерфейс докладно розглядався разом із принтерами. Однак буде не зайвим дати деяке «цілковказ» і щодо клавіатури.

Згадаймо побудова пакетів для інтерфейсу USB, враховуючи, що клавіатура підключається, строго, з low-speed (тобто фактично за інтерфейсом USB 1.0).

Максимальний розмір корисного навантаження DATA (payload) для low-speed пристроїв складає 8 байт. Тобто це саме те, що вимагає скан-код клавіатури.

Побачити сигнал (саме дані) в лінії USB виявилося не таким простим завданням. Тим не менш - ось що виявилося саме в кабелі типової USB "клави" моделі GENIUS KB-06XE, саме в лінії (проводі) "data +" (рис. 14.10)


Ці дві осцилограми змінюють одна одну з невстановленою (хаотичною) періодичністю, причому «картинки» сигналів не залежать від натиснутої клавіші клавіатури (або ніякої ненатиснутої). Жодних інших змін у «змінній» частині пакету (фрейму) виявити не вдалося.

Періодичність цих пакетів жорстко стабілізована (рис. 14.11), а тривалість кожного становить (видно на осцилограмах) близько 34 ±1 мкс.


Пакети слідують кожні 4 мс. Однак необхідно відзначити, що закінчення кожного пакета постійно «тремтить», причому помітно, класичний «джиттер». Тому спектральна картинка дещо розмита і стає чіткою лише за досить тривалого усереднення.


Крім того, слід враховувати, що через різні періоди проходження імпульсів і різної їх тривалості спектр носить характер деякої суміші зі спектра суцільного і лінійного. Проте пелюстковий характер спектра, природний для нескінченної послідовності пакетів і кратний у своїх «пелюстках» середньої тривалості пакета, зберігається дуже наочно. Тільки «нулі» функції згладжені джиттером та неременним періодом проходження окремих імпульсів. Однак сама картинка цілком характерна. При більш тонкій частотній роздільній здатності спектр починає вирішуватися на «лінії», зумовлені частотою проходження пакетів (250 Гц) (рис. 14.13) Таким чином, при найпростішому і незасинхронізованому з істинною передачею скан-коду перегляді осцилограм, виявити і візуалізувати ділянки кадру ( , який відповідає за передачу даних, не вдалося. Тим не менш, можна стверджувати, що ПЕМІН кабелю клавіатури все одно буде ось такою і жодною іншою. Зрозуміло, на яких частотах його шукати, зрозуміло, що він матиме характер суцільного (принаймні при частотному дозволі приймача більше 0,3 кГц). І зрозуміло, яку величину підставляти при розрахунках як тактову (мінімальний період імпульсів у пакеті в експерименті становив 1,322 мкс). Виміряти це, за будь-яких СІ, маючи осцилограф, хоча б із 200 МГц смугою – завдання тривіальне. Тест-режим, по суті – будь-який, можна натискати клавіші (будь-які), можна не натискати нічого. Пакети за інтерфейсом передаються однаково. І, у першому наближенні, вважаємо їх інформативними (поки що не доведено протилежне).

Наведені осцилограми та спектри отримані за допомогою осцилографа АКИП-4108/2, підключеного до того ж комп'ютера, на якому виконувались вимірювання (треба зауважити – функціональний повтор розробки фірми «PICO Technology» нашими. Не гірше китайців:)) .

Спектр явно йде далеко за 1 МГц (більше не дозволив осцилограф, а підключати аналізатор не було великого сенсу). Решту обумовлено вже кабелем, як випадковою антеною та ступенем його екранування.

Для інших режимів інтерфейсу USB потрібен вже осцилограф зі смугою в багато ГГц.

Як саме вважати суцільний спектр і, при цьому, залишитися в рамках НМД, що діють, – розмова окрема і не для відкритого обговорення, на жаль… Однак у наступних публікаціях доведеться до нього повернутися, подітися нікуди. Спробую «залишитися в рамках дозволеного».