nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 17 Oct 2018 00:16



Reply to topic  [ 37 posts ]  Go to page Previous  1, 2, 3
Подключение PS/2 клавиатуры через COM порт 
Author Message
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
Потратил я немного времени, чтобы посмотреть какую-либо техническую информацию по этим
самым клавиатурам с RS-232 интерфейсом: Palm portable keyboard и Apple Newton Keyboard...

Заинтересовало, поскольку по ASCII Serial keyboard я тут в первый заход ничего путного не нашел. :osad:
Теперь хоть знал - что конкретно искать, хотя задачу это сильно не облегчило - уходит эта информация,
ссылки битые, на других ссылках уже и информация другая... :-?

Но по Palm portable keyboard я некоторую техническую информацию нашел! :wink:
http://wb9kzy.com/palm.htm ; http://www.splorp.com/pdf/stowawayhwref.pdf
Attachment:
Palm Portable Keyboard.gif
Palm Portable Keyboard.gif [ 82.33 KiB | Viewed 526 times ]

В мануале stowawayhwref.pdf расписаны особенности RS-232 интерфейса к Palm и приведена
таблица кодов: Key Code Matrix.
Attachment:
Key Code Matrix.gif
Key Code Matrix.gif [ 22.27 KiB | Viewed 526 times ]

При взгляде на таблицу, возникает мысль, что Palm portable keyboard - это не ASCII Serial keyboard, и, возможно,
в драйвере придется сделать перекодировку либо в скан-коды, либо - сразу в ASCII-коды.

Насколько я успел посмотреть, в тексте драйвера NTKEY2LX.COM какая-то перекодировка вроде тоже есть...


P.S. По драйверу NTKEY2LX.COM см. предыдущую страницу.

_________________
iLavr


07 Jun 2018 13:00
Profile
Junior

Joined: 06 Jun 2018 05:13
Posts: 5
Reply with quote
Quote:
При взгляде на таблицу, возникает мысль, что Palm portable keyboard - это не ASCII Serial keyboard, и, возможно,
в драйвере придется сделать перекодировку либо в скан-коды, либо - сразу в ASCII-коды.

Насколько я успел посмотреть, в тексте драйвера NTKEY2LX.COM какая-то перекодировка вроде тоже есть...


Попробовал подключить клавиатуру (Palm) по rs232 (использовал только GND и RXD контакты, питание 3v от palm кпк).
Драйвер NTKEY2LX.COM ни как не реагировал на нажатия :(
Попробовал "послушать" что принимает com port через приложение DataCom- терминал порта, реакция на нажатия клавиш есть (хоть что-то...).
На разные кнопки показываются различные символы (обычно 3, по типу: DDD ... /// FFF ), т.е. можно забиндить как-то по таблице эти символы к реальным кнопкам.
И получается вы правы, в терминале должны выводиться ASCII символы, а показываются как есть, то что пришло от клавиатуры.

Настройки подключения такие ставил COM 1, скорость 9600, bit-1.

Attachment:
File comment: palm portable keyboard pinout rs232
tungsten t3

IMG_20180605_195633_sm.jpg
IMG_20180605_195633_sm.jpg [ 269.01 KiB | Viewed 525 times ]
Attachment:
File comment: ms dos hp 200lx rs232 gnd rxd connection
palm portable keyboard

IMG_20180607_164113_sm_sm.jpg
IMG_20180607_164113_sm_sm.jpg [ 151.36 KiB | Viewed 525 times ]


07 Jun 2018 13:26
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
be3 wrote:
Попробовал "послушать" что принимает com port через приложение DataCom- терминал порта, реакция на нажатия клавиш есть (хоть что-то...).
На разные кнопки показываются различные символы (обычно 3, по типу: DDD ... /// FFF ), т.е. можно забиндить как-то по таблице эти символы к реальным кнопкам.

А вы можете заставить приложение DataCom-терминал порта показывать то, что принимает, в HEX-виде?
Ну типа 0А, 0С, 1В ... вот это меня зело смущает: "обычно 3, по типу: DDD ... /// FFF ".

Но, согласно мануалу, похоже, что их действительно дожно быть 3:
Attachment:
KeyDown.gif
KeyDown.gif [ 37.84 KiB | Viewed 507 times ]

А X и Y - берутся из таблицы в моём предыдущем посте.

В общем - задача решаемая: что выдаёт клавиатура - известно (хотя неплохо и проверить).
Образец написания драйвера есть - если что непонятно - смотреть у Р. Джордейна.

Примерная суть работы драйвера (кратко):
1. При старте драйвер проверяет, не был ли он запущен уже (в коде это есть).
2. Если драйвер запущен впервые, он подменяет прерывание INT 9 клавиатуры на прерывание от COM-порта - эта программа внутри самого драйвера.
3. Драйвер устанавливаеся резидентно (есть такая функция).

4. Если пришло прерывние от COM-порта - попадаем в код нашего драйвера.
5. Проверяем не было ли ошибок COM-порта (см.у Р. Джордейна.)
6. Если нет ошибок читаем код из буфера COM-порта.
7. Перекодируем код клавиши.
8. Сохраняем полученное значение в кольцевой буфер клавиатуры.

9. Если драйвер запущен повторно, он выдаст сообщение и не установится.
10. Если драйвер запущен с нужным ключом, он вернет на место прерывание INT 9 клавиатуры и завершит работу.

Как-то так... 8)

_________________
iLavr


07 Jun 2018 13:57
Profile
Maniac
User avatar

Joined: 19 Feb 2017 04:46
Posts: 209
Location: Россия
Reply with quote
Lavr wrote:
некоторые программы сами подменяют INT 9 и работают с клавиатурой
напрямую. Они либо не будут работать

То, что другие программы не будут работать, это не волнует. Гораздо хуже, когда другие программы вредят твоей программе подменяющей INT 9. DOS-овые эмуляторы В.Пыхонина и А.Дёмина не подменяли обработчик INT 9 к тому же ещё нуждались в русификаторе, причём большая часть русификаторов конфликтовала с этими эмуляторами.

А я в своих эмуляторах РК и ОРИОНА для MSDOS в 90-тые ставил свой обработчик на вектор INT 9 и функциями MSDOS и ROM-BIOS для ввода с клавиатуры и вывода на экран вообще не пользовался. Из-за этого, кстати, никакие программы получения копии экрана не работают. В режиме отладчика на экран VGA выводил мой цветной графический драйвер на 64 символа в строке (т.к у меня плохое зрение и я всегда предпочитаю более крупные буквы) русские буквы выводились без русификаторов. Потому проблем с эмуляцией клавиатуры ни на Win 98, ни на Win ME не было.

И на Win XP проблем тоже не было до 2017 года. Пока я недавно не стал пользоваться Punto Switcher-ом. А он оказался наглым и каким-то образом вредит. Я полагаю, что он сам нагло и постоянно во времени восстанавливает вектор INT 9 на себя, потому что иногда вообще в запущенном с ним эмуляторе не работают клавиши в режиме монитора отладчика эмулятора (в режиме монитора эмулятора INT 9 восстановлен на тот, что был на момент старта эмулятора), но это бывает редко и влияет только в режиме отладчика.

А вот в режиме эмуляции (при входе в режим эмуляции ставится свой INT 9) с загруженным Punto Switcher-ом - всегда проблемы. Нажимаешь на клавишу в программе ОРИОНА, - 0.5-2 секунды нет реакции, а затем выскакивает сразу десяток букв. Это делает невозможным пользование эмулятором.

Причём мой обработчик INT 9 ставится не цепочечно, а только на себя. Потому никакой Punto Switcher или другая программа не должна влиять, она не получает управления по нажатиям. Но влияет. Это значит, что он нагло восстанавливает INT 9 на себя.

Из-за этого для пользования эмулятором приходится выгружать Punto Switcher. А он постоянно нужен, т.к я уже привык переключать РУС-ЛАТ левым и правым шифтами (одновременное нажатие CTRL+Shift, то что в Windows по умолчанию неудобно). Причём, что нагло, в настройке Punto Switcher-а можно указать программы при работе которых Punto Switcher не должен работать и как-либо влиять. Но это не работает, возможно имеется ввиду, что такая услуга Punto Switcher-а работает только для программ Windows, не MSDOS.

Lavr wrote:
сталкивался с такой ситуацией - так поступает QBasic. Долго мучался как его обмануть...
Подскажите что-нибудь по борьбе за INT 9, чтобы чужие программы Windows не влияли на мои программы.


Last edited by barsik on 08 Jun 2018 13:23, edited 1 time in total.



08 Jun 2018 11:21
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
barsik wrote:
Lavr wrote:
сталкивался с такой ситуацией - так поступает QBasic. Долго мучался как его обмануть...
Подскажите что-нибудь по борьбе за INT 9, чтобы чужие программы Windows не влияли на мои программы.

Мне кажется, я поступил, как поступает упомянутый вами Punto Switcher - отбирал INT 9 у QBasic-а.
Я ему приделывал всплывающее меню, более привычное для программ Windows:

Image

Всё, что я делал - подробно расписано вот здесь:
http://www.nedopc.org/forum/viewtopic.php?p=97419#p97419

Единственное, что могу добавить, отобрав INT 9 у QBasic-а, я еще патчил в нём, кажется,
несколько байт на некотором удалении от входа в его собственное INT 9.
Зачем-то это было надо: кажется, чтобы он не делал повторно то, что я уже сделал в своём INT 9.

_________________
iLavr


08 Jun 2018 12:33
Profile
Junior

Joined: 06 Jun 2018 05:13
Posts: 5
Reply with quote
Lavr, Большое спасибо за такое подробное описание драйвера :surprised:

Попробовал подключить клавиатуру без КПК и проверил что клавиатура шлет в HEX
Тестировал с помощью программы COMMCHK.EXE (Commchk v1.8 Serial protocol analizer), запускал с параметрами: COMMCHK -I 1 -B 9600 -P N -W 8 -S 1
* программу прикрепил

Подключал вот так:
Palm keyboard pin = rs232
    7 - GND = GND
    9 - Vout = +3.2V-5v (battery)
    10 - RxD = RS-232 RxD
    14 - RTS = LOW after HIGH will activate keyboard (if Vout on)

Потыкал разные клавиши, вот такой результат:
Action = Responce
    On keyboard connect, after LOW => HIGH on RTS = fa fd
    1 = 00 80 80
    2 = 01 81 81
    3 = 02 82 82
    4 = 04 84 84
    5 = 05 85 85
    q = 09 89 89
    w = 0a 8a 8a
    shift = 58 d8 d8
    enter = 41 c1 c1
    space = 17 97 97
    del = 50 d0 d0
    up = 49 c9 c9
    down = 52 d2 d2
    left = 51 d1 d1
    right = 53 d3 d3
    backspace = 32 b2 b2
    tab = 19 99 99

Пока такие проблемы клавиатурой:
1) Чтобы клавиатура активизировалась после подачи питания, нужно на 14pin(RTS) подать LOW потом HIGH - пока вручную прикрутил включатель on\off :econfused:
Как я понял что то похожее происходит в исходнике (988 строка, функция init_com):
Code:
mov   al,00001001B   ; OUT2=1 OUT1=RTS=0 DTR=1...for kbd power

и если подключить com DTR к RTS клавиатуры, то она тоже включится :roll:

В драйвере для определения клавиши используется 2 байта, а в palm клавиатуре 3 байта:
Нажимаем 8-бит отправляется:
• Первый бит - 0 если нажата клавиша
• След 4 бита: Y номер из таблицы
• Еще 3 бита: X номер из таблицы
Когда отпускаем клавишу, отправляется все тоже самое(8-бит) но первый бит 1 (!)
И еще важно, если отпускаем клавишу и не нажато не одной другой клавиши, последние 8-бит отправляются еще раз (поэтому и получается 1 = 00 80 80)

Для питания использую 3.7v аккумулятор, возможно получится питать от COM (безопасно ли это?)

Думаю, проблемы получится решить и тогда будет готовый ms dos rs232 драйвер для Palm клавиатур


Attachments:
File comment: hp200lx vs portable palm keyboard connection
IMG_20180608_210118_lol.jpg
IMG_20180608_210118_lol.jpg [ 45.19 KiB | Viewed 462 times ]
File comment: hp200lx Commchk rs232 serial output from palm keyboard
IMG_20180608_193940_rs232_input.jpg
IMG_20180608_193940_rs232_input.jpg [ 145.15 KiB | Viewed 462 times ]
File comment: ms dos rs232 Commchk v1.8 Serial protocol analizer. HEX ASCII input output
COMCHK18.zip [30.2 KiB]
Downloaded 12 times
08 Jun 2018 13:31
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 09:08
Posts: 7777
Location: Россия
Reply with quote
be3 wrote:
Большое спасибо за такое подробное описание драйвера :surprised:

Вот здесь я забыл один момент, хотя он в принципе очевиден:
4. Если пришло прерывние от COM-порта - попадаем в код нашего драйвера.
5. Проверяем не было ли ошибок COM-порта (см.у Р. Джордейна.)
6. Если нет ошибок читаем код из буфера COM-порта.
7. Перекодируем код клавиши.
8. Сохраняем полученное значение в кольцевой буфер клавиатуры.
8'. Выходим из аппаратного прерывания. (IRET)

be3 wrote:
Для питания использую 3.7v аккумулятор, возможно получится питать от COM (безопасно ли это?)
Судя по описанию - stowawayhwref.pdf - должно быть вполне безопасно до +5В.
Обычно COM-порты строятся так, чтобы выдерживать короткое замыкание на любой линии.
Надеюсь, что у HP 200lx COM-порт тоже способен это выдержать.
Есть только один нюанс: стандартный COM-порт выдает на линии от +/-12 В до +/-3В.
Померяйте сначала - если в пределах +/-5В сигналы, то питать клавиатуру можно, хотя и осторожно:
не подавать на неё -5В (т.е. питание от COM-порта подавать через диод Шоттки).
Если на линиях будет +/-12 В - сделать через диод и малый резистор, а в параллель клавиатуре -
стабилитрон на 3.6...4.7В и параллельно с ним - электролит.

Я выкроил немного времени и почитал исходник драйвера NTKEY2LX.ASM - в принципе все основные
части драйвера в нём есть - надо только внимательно разобраться в них и изменить лишь то, что
касается приема и перекодировки кода от клавиатуры.

За одно взглянул я, что за зверь "Hewlett-Packard серии LX" - там MS-DOS 5.0 сидит в ПЗУ?

_________________
iLavr


08 Jun 2018 16:17
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 37 posts ]  Go to page Previous  1, 2, 3

Who is online

Users browsing this forum: No registered users and 0 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.