|
Эмулятор PS/2 клавиатуры, проблемы с передачей данных |
|
|
|
Jul 4 2007, 12:09
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 8-03-06
Из: Kyiv, UA
Пользователь №: 15 066

|
Есть устройство на AVR - считыватель карточек, включенный в разрыв PS/2-клавиатуры. При считывании карточки клавиатура блокируется и устройство от имени клавиатуры передает код карточки в виде скан-кодов. Проблема в том, что если в это время дергать PS/2-мышкой, передача идет со сбоями. Может кто-то что-то посоветовать?
|
|
|
|
|
Jul 4 2007, 13:43
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 8-03-06
Из: Kyiv, UA
Пользователь №: 15 066

|
С питанием и наводками все ОК. PS/2-мышка использует ту же линию клока, что и PS/2-клавиатура, соответственно, если мышкой дергать, она занимает линию клоков, освобождая ее после каждой посылки на несколько миллисекунд. Мое устройство подключено к ПК, параллельно ему через ключи подключена клавиатура - если надо передать код карточки, ее сигнальные линии на время передачи отлючаются. У реальной клавиатуры комп всегда может переспросить, если был сбой, а мой девайс просто шлет данные - вот и проблема, как узнать, дошли они или нет. Ведь ПК вроде бы АСК по приему байта не выдает, или я не прав ?
|
|
|
|
|
Jul 4 2007, 18:07
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(AndryG @ Jul 4 2007, 19:47)  Если вы говорите, что мышка занимает CLK (я работал только с одной клавой), то "дружное" прижимание CLK на землю клавиатура должна воспринять как запрос на передачу ей команды... что-то не вяжется. У мышки и клавиатуры разные CLK Цитата (я думал что это два независимых порта) Так и есть.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 4 2007, 18:51
|
Частый гость
 
Группа: Участник
Сообщений: 106
Регистрация: 12-09-05
Пользователь №: 8 503

|
не знаю, как клавиатура на мышь, но мышь на порт клавиатуры влияет и именно по CLK. Как то делал устройство, висящее на PS/2 на MSP430. Поначалу решил проблему установив мышь на ЮСБ. Потом решил это программно. Дело было 2 года назад - плохо помню. Но по-моему просто при высоком CLK со стороны клавы опрашивал вход CLK (уже в процессе передачи). Если он 0 - то начинал передачу сначала.
Кстати, насчет квитирования. Цитирую Гука, проверял - работает: "Клавиатура может начать передачу данных в произвольный момент, когда интерфейс находится в покое. Клавиатура формирует стартовый бит (низкий уровень) на линии KB-Data и первый импульс KB-Clock, что является сигналом контроллеру(имеется ввиду контроллер на стороне матери) о необходимости начала приема. После подъема KB-Clock она выводит 0-й бит данных на линию KB-Data, а затем и следующий импульс KB-Clock. Контроллер должен «защелкивать» принятый бит данных по спаду KB-Clock. Так передаются все 8 бит данных и бит паритета, дополняющий число единичных бит до нечетного. После синхроимпульса бита паритета контроллер клавиатуры (имеется ввиду контроллер на стороне матери) должен сформировать импульс KB-Clock, подтверждающий прием байта (Ack). Если весь байт с битом паритета не будет получен контроллером за 2 мс, контроллер прекращает прием данного байта и фиксирует ошибку тайм-аута."
Сообщение отредактировал Dimmy - Jul 4 2007, 18:41
|
|
|
|
|
Jul 4 2007, 21:25
|
Частый гость
 
Группа: Участник
Сообщений: 106
Регистрация: 12-09-05
Пользователь №: 8 503

|
Совершенно с вами согласен!!! :-) И я о том-же. Рисунок 2 Device-to-host. Но инициатор сигнала STOP (ACK) - ХОСТ! Впрочем, мы уходим от темы - человек задал вопрос - как побороть конфликт с мышью. Я ответил. Конфликт действительно ЕСТЬ. Не раз натыкался - при активности мышки хост манипулирует клоком клавиатуры подтягивая его к 0. Возможны два варианта, когда это произойдет: 1. Во время передачи данных от девайса к хосту. (он самый маловероятный, т.к. в этот момент хост делает то же самое с клоком мышки, заставляя прекращать передачу от нее). В этом случае необходимо в процессе передачи считывать значение пина CLK когда этот самый клок ДЕВАЙСОМ же и отпущен (выход с открытым коллектором). И если CLK подтянут к нулю - прекращать передачу. Подождем для уверенности 2мс - и снова передадим те-же данные. А то что данные приняты ХОСТОМ - определяем по наличию ACK. Он как-раз 11-й. А в Вашей же статье (to Rezident): "If a transmission is inhibited before the 11th clock pulse" Если надо - схему сопряжения которую использовал приаттачу 2. Линия CLK подтягивается к 0 во время простоя девайса. Это более вероятный вариант. По сути в данном случае хост сигнализирует, что в данный момент обрабатывается мышка. Я обрабатывал его в прерывании по пину (вход CLK на девайс). В прерывании отслеживал состояние пина DATA. Если DATA в 1 - то это либо ACK (если до этого мы что-нить передавали), либо запрет на передачу нашим устройством (как раз этот случай мы и рассматривали). Его обрабатывать не надо - просто ничего не передавать. А если в момент когда CLK со стороны хоста подтянут к 0 и DATA в 0 - то это запрос от хоста на передачу в наше устройство. (HOST_RQ_BIT в моем случае) Вот кусок - он для MSP430: ;----------------------------------------------------------------------------- ; прерывание от Хоста (по CLK) ;----------------------------------------------------------------------------- P2_INT: bic.b #0x02,P2IFG bit.b #DIN_BIT,&P2IN jc HostAck bis #HOST_RQ_BIT,Flags bic #LPM3, 0(SP) ; Decode = Active in Mainloop reti HostAck: bis #HOST_ACK_BIT,Flags bis.b #WDTIE,&IE1 ;разрешим прерывания от WDT reti
Сообщение отредактировал Dimmy - Jul 4 2007, 21:52
|
|
|
|
|
Jul 4 2007, 21:54
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Dimmy @ Jul 5 2007, 00:25)  Впрочем, мы уходим от темы - человек задал вопрос - как побороть конфликт с мышью. Для начала абсолютно непонятно, откуда растут ноги у конфликта. 1. У всех виданных мной IBM/PC железяк PS/2 порты заводятся в контроллер совершенно независимо и физически не могут влиять друг на друга. 2. Прерывания от контролера хоста для PS/2 портов тоже раздельные. 3. У кого-нибудь мышка хоть когда-нибудь _реальную_ клавиатуру сбивала  Посему, если 'конфликт' имеет место быть, то варианты: 1. Что-то не то железяка по диаграмме выдает и вышибает мозги контроллеру хоста и он как-то замешивается с мышью. 2. Просто драйвер обслуживающий девайс написан неправильно и конфликтует с той-же мышью. Для направления на путь истинный могу извлечь из архива писанную в 80x годах дамповалку сканкодов, добавить в нее пару строчек активизации (через загруженный дрвайвер мышки) мышинного курсора - ну и попробуйте сбить мышкой сканкоды от реальной клавиатуры  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|