Перейти к содержанию
    

STM32F4 и PS/2 мышь

Сейчас пользуюсь драйвером немца - http://mikrocontroller.bplaced.net/word ... age_id=744

Один "странный" косяк я исправил - если мышь не понимает команду 0xF2 (идентификация мыши) он тупо вываливается с ошибкой, хотя весь дальнейший алгоритм прекрасно понимает оба типа мыши (стандартная и Intellimouse).

 

Но обнаружилась странная вещь - на старых мышах он работает, а на большинстве новых - нет.

Есть 2 мыши Logitech RX250, одна белая, 2-я чёрная. Белая работает достаточно стабильно, хоть и не без приколов, Чёрная - труп трупом. Кроме фэн-шуя в голову ничего не приходит..

Уже 3 дня читаю разные мануалы, примеры кода под авры и прочее - по фиг. Если надо, дам все ссылки и свой код.

Всё чего удалось добиться - команды нормально передаются в мышь. На драйвере немца мышь вообще не генерит синхронизацию. Он вначале притягивает к земле только данные, а синхру - нет.

 

Дальше странности - многие команды дают либо код ошибки 0xFC, либо какой-то недокументированный код - 0xF8.

Даже команда сброса 0xFF корректно отрабатывает только один раз, в ответ на все остальные летит некий бред типа 0xF8.

 

Вопрос - кто-нибудь работал с мышей, каковы результаты и есть ли у кого нормальный драйвер?

 

Спасибо.

 

PS. Все мыши рабочие. Проверены в компе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нынче все PS2-мыши это совмещенные с USB. То есть по сигналам от хоста понимают что им работать в режиме USB или PS/2

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не скажите.

Я пытался подключать 2 свои USB мыши к компу через переходник на PS/2 - не работают.

Logitech RX250 не в счёт, она изначально с двойным интерфейсом.

Так что, это, по-моему - "территория заблуждений" :) .

 

Да даже если б и работало, подключить её к USB хосту я не могу, у меня там флэшка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не к усб надо подключать, а с мышой договорится что она к пс/2 подключается. А как это делать хрен знает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Работал с мышами когда-то очень давно, все забыл.

либо код ошибки 0xFC, либо какой-то недокументированный код - 0xF8.

Код 0xF8 очень похож на 0xFC сдвинутый на один бит влево. Возможно какая-то проблема в синхронизации? Не по тому фронту читаете? Дребезг на фронтах захватываете? В общем я бы вывел принимаемый бит на свободную ногу порта, зарядил в цикле команду сброса и осциллографом сравнивал все три сигнала (такт, данные и принятые данные) с учебником.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не к усб надо подключать, а с мышой договорится что она к пс/2 подключается. А как это делать хрен знает

Я пытаюсь работать с мышами, которые изначально имеют PS2 разъём. А что из себя представляют те или иные переходники - пока что совершенно не волнует. 4 провода в них там или какая-то микросхема, переделывающая USB в PS2 - по идее всё равно.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я пытаюсь работать с мышами, которые изначально имеют PS2 разъём

 

в порядке бреда предложу посмотреть частоту синхроимпульса при работе от компа.

 

то есть интерфейс SD-карт тоже синхронный, но по иннициализации нужно ведь работать на 200кГц

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Код 0xF8 очень похож на 0xFC сдвинутый на один бит влево. Возможно какая-то проблема в синхронизации? Не по тому фронту читаете? Дребезг на фронтах захватываете? В общем я бы вывел принимаемый бит на свободную ногу порта, зарядил в цикле команду сброса и осциллографом сравнивал все три сигнала (такт, данные и принятые данные) с учебником.

 

Прерывание одно и то же, программа одна и та же.

 

	// 0xFF - Сброс - 3 раза
st = P_PS2_Mouse_Send ( PS2_MOUSE_CMD_RESET );
P_PS2_Mouse_Timeout_RX ( 50000 );			// checks PS2_MOUSE_VAR.receive_code
P_PS2_Mouse_Timeout_RX ( 50000 );
P_PS2_Mouse_Timeout_RX ( 50000 );

st = P_PS2_Mouse_Send ( PS2_MOUSE_CMD_RESET );
P_PS2_Mouse_Timeout_RX ( 50000 );
P_PS2_Mouse_Timeout_RX ( 50000 );
P_PS2_Mouse_Timeout_RX ( 50000 );

st = P_PS2_Mouse_Send ( PS2_MOUSE_CMD_RESET );
P_PS2_Mouse_Timeout_RX ( 50000 );
P_PS2_Mouse_Timeout_RX ( 50000 );
P_PS2_Mouse_Timeout_RX ( 50000 );

 

PS2_MOUSE_VAR.receive_code - принятый из мыши байт. Первый раз там 0xFA - это правильно. 2 и 3-й - бред.

Проверю, может где-то у немца какие-то флажки не сбрасываются ...

Кстати, проверил его оригинальный драйвер на работающей мыше - инициализация проходит только один раз.

Далее лезет тот самый 0xF8.

 

в порядке бреда предложу посмотреть частоту синхроимпульса при работе от компа.

 

Можно .. Когда исчерпаю другие варианты - проверю ..

Придётся спаять некий "переходник" для доступа к контактам.

 

А кстати, DATA и CLK подтягивать резюками к +5в надо?

У меня сейчас не подтянуто. Идут непосредственно на процессор.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, проверил его оригинальный драйвер на работающей мыше - инициализация проходит только один раз.

Далее лезет тот самый 0xF8.

Значит в этом драйвере ошибка. Надо разобраться как работает интерфейс и найти ее. Возможно на этапе изучения описания интерфейса отпадет вопрос "нужны ли подтяжки".

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А кстати, DATA и CLK подтягивать резюками к +5в надо?

У меня сейчас не подтянуто. Идут непосредственно на процессор.

 

ну я ставил 10 ком

 

ADD: вот по ссылке тоже указано о необходимости ставить pullup

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ADD: вот по ссылке тоже указано о необходимости ставить pullup

 

Спасибо. Вечером постараюсь добавить их. Тогда отпишусь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На 95% работает. Инициализация всех мышей проходит нормально, координаты считываются и прочее.

Единственная проблема на текущий момент - какие-то баги с определением типа мыши.

Есть команда 0xF2 - Get Id - считать типа мыши.

 

Здесь написано, что ответ мыши - 2 байта - подтверждение 0xFA и код типа.

А вот здесь утверждается, что ответ - один байт - код типа.

 

Бардак натуральный.

Не инициализируется только старая PS2 мыша. Она без колеса, т.е. Standard mouse. Команду 0xF2 она не понимает. С ней ещё не возился.

Тут тоже вопрос - как она должна себя вести? Игнорировать команду вообще? Слать ошибку 0xFC?

Может она и глючит на этой 0xF2.

 

По ходу выяснил, что заявление о том, что по умолчанию в мыше включён потоковый режим - мягко говоря, неправда. На старых мышах это так.

А новые мыши без явной подачи команды 0xEA - включить потоковый режим просто ни фига не шлют. Проверено.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не, ну так не честно...

Проблема-то в чем была?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да в принципе всё просто.

Основной баг немца -для инициации обмена с мышью надо дрыгать и DATA и CLK. Он дрыгал только DATA. А это далеко не на всех мышах пашет.

 

Чтение неверных кодов из мыши были связаны с "самогенерацией" прерывания по CLK при его дёргании. При этом, естественно, сбивались управляющие переменные и последующий приём байта проходил неверно.

Когда выключил прерывания перед ногодрыгом, бред мгновенно исчез.

 

Проблема сейчас одна - 0xF2.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...