Хочу в своём эмуляторе задействовать PS/2 клавиатуру, подключенную к GPIO пинам Raspberry Pi. Подключается элементарнейше 4-мя проводами:
Но так как Raspberry Pi рассчитана на сигналы 3.3В, а клавиатура выдаёт 5В, которые запросто могут спалить GPIO, то сигналы CLOCK и DATA подключаются через делители, выполненные на резисторах:
Код:
/*
* kbdtest.c basic PS/2 keyboard input test
*
* Test operation of a PS/2 keyboard wired to P1 on
* the Raspberry Pi.
*
* PS/2 CLK line goes to P1-16 through voltage divider
* PS/2 DATA line goes to P1-18 through voltage divider
* PS/2 5 VDC line goes to P1-2 or P1-4
* PS/2 GND line goes to P1-6
*
* You MUST use a voltage divider between the PS/2 CLK
* or DATA lines and the RasPi P1 connector! The RasPi
* cannot handle 5 VDC logic signals. If you don't
* divide the PS/2 signals down to 3.3 VDC, you will
* damage the RasPi!
*
* Building this code will yield a kernel.img file. Copy
* this file to the root directory in a RasPi boot SD card,
* install the card into your RasPi, power it up, and the
* video display should show the test results.
*
* Note that you will have to set the display parameters
* in your SD card's config.txt file to match those of
* the console display parameters. For example, if your
* console library is built to use 800 x 600 pixel display,
* you will need to edit your SD card's config.txt to
* show a framebuffer_width of 800 and a framebuffer_height
* of 600.
*
* Karl Lunt 7 Aug 2015
*/
Код:
/*
* ps2kbd.c PS/2 keyboard support for the Raspberry Pi
*
* This code is based on the work by Paul Stoffregen, L. Abraham Smith,
* and others. I've retained Paul's copyright notice below.
*
* This code assumes a connection to the Raspberry Pi's expansion
* connector (P1). Two connections are required, one for the
* DATA signal and one for the CLK signal.
*
* WARNING! The Raspberry Pi GPIO inputs are NOT 5 VDC tolerant!
* You can use the 5 VDC supply on the RasPi to drive your keyboard,
* but you MUST use voltage dividers on the CLK and DATA lines when
* you wire them to your RasPi, or you will damage your RasPi.
*
* Here is a diagram for suitable voltage dividers:
*
* KBD DATA <---------[ 2.2K ]------+-------[ 3.3K ]---------> GND
* |
* +------------------------> RasPi GPIO
*
* KBD CLK <---------[ 2.2K ]------+-------[ 3.3K ]---------> GND
* |
* +------------------------> RasPi GPIO
*
* Karl Lunt (10 Aug 2015)
*/
/*
Протокол обмена простейший:
Смотрим на сигнал CLOCK и по его спаду получаем последовательно биты с сигнала DATA. Всё просто и элементарно.
И вот я всё подключил и начал разбираться c сигналами и писать драйвер на ассемблере. Всё вслепую, потому что на тот момент не нашёл ни одной готовой программы, которая обслуживает такой тип подключения. То есть у меня не было уверенности, что я всё подключил корректно, хотя ошибиться там сложно, а я всё прозвонил и проверил не один раз.
А потом я отыскал таки готовую, скомпилированную программу, которая работает с таким типом подключения. Там изображение сбито, но оно изменяется с каждой нажатой клавишей. То есть гарантированно подключение верное и программа на клавиатуру реагирует. Бился я бился с драйвером, какие-то данные из DATA я получаю, но они нестабильные и хаотичные. Но совершенно точно это реакция на нажатие клавиш. Перед тем как пойти спать до меня таки дошло, что я ошибочно полагал (по аналогии с геймпадом NES!), что это я должен передавать сигнал CLOCK, в ответ на который клавиатура будет слать мне данные. Но на деле оба сигнала должна выдавать клавиатура. С этим я и лёг спать, рассчитывая, что теперь-то уж я точно всё сделаю. На следующий день снова ничего не получилось. И даже как-то хуже стало. Вообще пропала какая-либо реакция. Я решил запустить ту же самую программу, которая выступала индикатором правильности подключения. Но и она перестала что-либо выдавать. Причём я ничего не переподключал, ничего не менял и вообще никаких изменений не делал. И вот вчера оно работало, а сегодня при тех же условиях перестало. Первая мысль - сгорели порты GPIO. Проверил - порты исправны: принимают и передают данные, как и раньше. Прозвонил схему - всё везде ОК. Клавиатуру втыкал в два разных устройства - в обоих работает без нареканий и гарантированно в режиме PS/2. Перепаял схему, всё заизолировал и проверил - всё ОК. Нашёл другую программу, собрал её из исходников - клавиатуру она не видит. Подключил клавиатуру на другие пины, пересобрал программу - ноль эмоций. Проверил питание клавиатуры - 5В без просадок. В общем, всё по отдельности работает, а вместе не хочет. Хотя вчера работало, а сегодня уже не работает. Я думал, что может я своими экспериментами порты как-то пожёг. Но опять же на тех же портах на Rasberry Pi другие устройства работают, а клавиатура тоже работает с другими устройствами. Не могу гарантировать, но мне кажется, что почему-то CLOCK не тикает. Осциллографа у меня нет, поэтому проверить не могу.
К сожалению, у меня только одна клавиатура PS/2 и проверить другую я пока не могу. Но может быть кто-нибудь что-нибудь посоветует?
Если что, вот здесь описание и программа, которой я тестировал (в конце статьи есть архив с исходниками, и в недрах в одной из папок лежит скомпилированный кернель): http://www.deater.net/weave/vmwprod/hardware/pi-ps2/
Вот здесь bare-metal OS с поддержкой такого типа подключения: https://github.com/deater/vmwos/tree/master (я смог собрать и запустить, но клавиатуру она не видит)
А вот короткий исходник на Си, которым можно быстро скомпилировать и опробовать: https://github.com/deater/vmw-meter/tree/master/pi-ps2 (клавиатуру не видит ни на этих пинах, ни на других)
Прошу любой помощи!