Как то при разговоре с другом, речь зашла о "ретро" консолях и играх того времени. Хорошие были времена, наполненные яркими эмоциями и впечатлениями. Оказалось, что и у меня и у моего друга, от самих приставок не осталось ничего кроме джойстиков. Ну а что еще кроме самого джойстика нужно, чтобы окунуться в настольгические ощущения? И тут мы задумались как же можно подключить их - к компьютеру...


Роль телевизора и игровой приставки, хорошо выполнит компьютер с эмулятором нужной консоли на борту. А вот аутентичные  тактильные ощущения не сможет заменить ни клавиатура ни тем более мышь.
Для начала, было выяснено что джойстики Dendy бывают 2 видов: 
1) с широким 15-pin
2) с узким 9-pin 
разъемами... 
Как оказалось, разница кроется только в самом используемом разъеме. Количество проводов и протокол передачи данных при этом одинаковы. 
К тому же разъем  джойстиков Sega и Dendy 9-pin физически одинаковы, и представляют из себя - обычный разъем COM порта компьютера. можно реализовать опрос обоих типов джойстиков на одном разъеме -  что сделает устройство более универсальным. 
Некоторые редкие игры того времени поддерживали одновременную игру 4 игроков. К приставке подключался дополнительный переходник в который и вставлялись 2 дополнительных джойстика.

Немного поискав в интернете, были найдены алгоритмы работы джойстиков  и принципы работы переходника. В качестве самого устройства связывающего компьютер и джойстики решил использовать микроконтроллер AVR с аппаратным USB на борту. Atmega AT90USB162 . 
С интерфейсом USB мне работать еще не приходилось, тем интереснее казалась задача. Я привык писать код для контроллеров AVR в программе CodeVisionAVR. Примеры найденный в интернете в основном были написаны в среде WinAVR или AtmelStudio с использованием библиотеки V-USB  или LibUSB. были так же и скетчи для arduino с использованием библиотеки от adafruit. Использовать готовые решения можно, но это не интересно. К тому же примеров работы с USB  в привычной среде CodeVisionAVR крайне мало. Но как оказалось, в ней уже есть встроенные средства для работы с USB. Генератор первоначального кода сгенерировал инициализацию контроллера и подключил все необходимые библиотеки. За что мне и нравится эта среда программирования!
Дальше уже пришлось разбираться с дескрипторами интерфейса USB. По мере изучения этого материала - было выпито не мало кружек кофе.
В итоге был составлен дескриптор соответствующий требуемым условиям. Изначально решил эмулировать каждый джойстик - как отдельное устройство. Поэтому в дескрипторе применил "нумерование" устройств. 2 dendy  + 2 sega/dendy
Прототип был собран и протестирован. В последствии развел и заказал из Китая печатную плату. 
Устройство приобрело законченный вид. Ну а я в полной мере насладился ретро играми. 

Спустя некоторое время, выяснилось, что при подключении переходника к компьютеру с Linux  на борту, джойстики начинают работать не адекватно. 
Если в системе Windows  каждый джойстик определялся как отдельное HID устройство:

Hid devisesgame devicesТо в Linux, переходник определяется как одно "объединенное" устройство:
Joystic linuxjoysick linux2
Количество кнопок в котором, равно сумме кнопок всех джойстиков. Именно кнопок! Все "крестовины" джойстиков при этом - объединяются в одну. Т.е. сигнал с крестовины любого джойстика - один и тот же. Это не позволяет играть вдвоем. По какой то причине - "стики" в Linux распознаются как один единственный манипулятор.
Очевидно, что крестовины джойстиков (стики) необходимо эмулировать как кнопки а не как "стики" к тому же по факту - это и есть кнопки. 
Стики же - используются на более продвинутых игровых устройствах и выдают диапазон значений, соответствующий углу отклонения стика в одной из плоскостей. 
Добавив в дескрипторе устройств по 4 дополнительные кнопки и немного подправив код, столкнулся с еще одной проблемой. Опять же в windows определилось все корректно- у каждого из игровых устройств добавилось по 4 кнопки. В Linux переходник вообще перестал определяться как "игровое" устройство. Опытным путем пришел к тому, что если суммарное количество  кнопок превышает 32 шт. то система Linux перестает видеть устройство. Полагаю что это связанно именно с "нумерованием" устройств в дескрипторе. Т.к. эмуляция одного единственного джойстика ( одного устройства HID ) позволило присвоить джойстику, даже 64 кнопки ( в системе Linux ).  Система Windows при этом видит всего 32 кнопки. С чем это связано - пока для меня не понятно. 
Но как то выходить из ситуации необходимо. Чтобы уложиться в лимит 32 кнопок, решил пойти на компромисс. Для 15-pin разьемов Dendy- решил оставить все как есть...  а для джойстиков Sega / Dendy 9-pin  крестовины джойстиков- эмулировать как дополнительные кнопки. Тем самым в сумме кнопок получается как раз ровно 32.
При таком подходе удалось решить возникшую проблему. 

Ниже, фото готового устройства. 

20190201 14524820190201 14522720190201 14514320190201 145132

КОМЕНТАРИИ МОГУТ ОСТАВЛЯТЬ - ТОЛЬКО ЗАРЕГИСТРИРОВАННЫЕ ПОЛЬЗОВАТЕЛИ ! ! !