Добил zx-unikeyboard до более-менее законченного варианта. Сейчас работает вся осмысленная часть клавиатуры плюс 4 спецсигнала (/reset, /magic, turbo on/off, special on/off). У себя их привязал на F12, F2, F10 и PrtScr соответственно.
У клавиатуры не смог добиться стабильной работы макросов, которые с одной клавиши в несколько "нажатий" эмулируют ввод символов [ ] { }, а поскольку в нестабильном варианте все равно ими пользоваться не буду, решил от них отказаться. Еще пока не не смог красиво привязать PC-шную раскладку символов -/_ =/+ ;/: (т е без шифта и с шифтом), поэтому символы _, +, : разнес по другим клавишам.
Благодаря упрощению SPI была уменьшена CLPD-часть, правда осталась CPLD той же "емкости", но не требуется тактовый генератор для нее; также убран даже кварц атмеги - совершенно нормально все работает с внутренним 8мгц- генератором, таким образом вся схема упрощена до atmega32-16au, epm7128slc84, разъемов и пуллап-резисторов.
Также убрал с контроллера все светодиоды и прочие бантики - все в пользу максимального количества ног для клавиатуры.
Играть в лотерею с epm7128slc больше не хочу, беда с ними - все приходят непригодные для прошивки по jtag, поэтому живой вариант буду делать на epm3128atc100 (вроде значительно меньше хлама продается ?) и с прицелом на максимально плоскую плату.
Да простит CLR, ибо тема начиналась с идеи о другом, но тем не менее ссылку пока выложу здесь.
Пробую пользоваться гитхабом, поэтому вот: https://github.com/valerium-labs/zx-unikeyboard - схема, сорсы CPLD и AVR-частей.
Как это работает. По прежнему оговорюсь, полной автоматизации нет, многое придется "есть руками".
Этап 1. Подключаем клавиатуру к атмеге (32, 16 или какой там захочется - главное, чтоб было как минимум четыре 8-разрядных порта) и собираем под нее avr-keyexplorer.ino в Arduino IDE.
Если нет поддержки нужного контроллера, ставим его, например, из модуля MightyCore через менеджере плат - https://mcudude.github.io/MightyCore...ore_index.jsonhttps://mcudude.github.io/MightyCore/package_MCUdude_MightyCore_index.json), как добавить в менеджер плат - читать здесь. Обращаем внимание на установку частоты 8 мгц в IDE при сборке прошивки, а также на установку соответствующих фьюзов (8 мгц на внутреннем генераторе). В случае других частот/вариантов тактирования правим то и другое единообразно.
Если есть отклонения от схемы в подключении пинов клавиатурного разъема к атмеге - приводим в соответствие все #define PIN* в скетче.
Прошиваем сборку прошивки в атмегу своим любимым программатором и соответствующим софтом.
Если CPLD уже запаяна, нужно прошить ее ДО атмеги, чтобы ее выводы SPI были уже в режиме входов и не мешали работа программатора с атмегой.
Этап 2. Подключаем UART атмеги к ПК через любой удобный преобразователь, смотрим дебаг с соответствующего компорта, я пользовался встроенным монитором ком-порта в Arduino IDE. Нажимаем все клавиши своей клавиатуры, они все должны генерировать нажатия с парой чисел в дебаговом выводе - это номера пары пинов для каждой клавиши. Записываем эти значения.
Этап 3. Нужно разделить все пины на столбцовые и строковые, столбцовых обычно <=8, строковых может быть заметно больше. Один из способов найти пины столбцов - это собрать воедино неповторяющиеся пины парных клавиш-модификаторов (LCTRL, RCTRL, LALT, RALT, LSHIFT, RSHIFT, Fn, WIN/GUI).
Пример для клавиатуры от Asus X200:
---------------------------
LCTRL 4 12
RCTRL 4 6
LALT 2 7
RALT 2 9
LSHIFT 5 11
RSHIFT 5 8
GUI(WIN) 3 13
Fn 1 6
---------------------------
Здесь жирным выделены номера пинов не пересекающиеся в парах лев/прав модификаторов, они будут назначены столбцами: 6,7,8,9,11,12,13. Предположительно еще линия 10 будет столбцом, это можно проверить по ОТСУТСТВИЮ клавиши для нее в паре с какой-либо из этих семи столбцовых линий. Таким образом получаем линии столбцов 6,7,8,9,10,11,12,13, остальные линии 1,2,3,4,5,14,15,16,17,18,19,20,21,22,23,24 будут строками.
Для проверки строится таблица-матрица для всех линий и соответствующих им клавиш. Если в ходе внесения очередной клавиши мы не можем ее внести потому что она объединяет два "столбца" или две "строки", значит в выборе столбца/строки была допущена ошибка - пересматриваем назначение столбцов/строк.
Этап 4. Когда есть матрица, переходим к модулю avr-kbd правим в customkey.h перечисление всех нужных нам клавиш с уникальными номерами, а также заполняем массив keyaddr в формате {<клавиша>, <столбец>, <строка>} (пример: { KEY_LCTRL, 12, 4 }).
В самом скетче правим массивы констант cols и rows, заполняя их номерами столбцовых и строковых пинов соответственно. Если клавиатура имеет нестандартную размерность, корректируем COLS_MAX и ROWS_MAX (8 и 16 по умолчанию).
Если есть отклонения от схемы в подключении пинов клавиатурного разъема к атмеге - приводим в соответствие номера пинов в #define PIN*.
Просматриваем все кейсы в функции fill_kbd_matrix, корректируем обработчики нужных клавиш, ненужные убираем, нужные отсутствующие добавляем (скорее всего они будут дублировать уже существующие, поэтому их значения просто добавляются как кейсы перед нужным обработчиком).
Собираем прошивку, для первоначальной отладки есть DEBUG_MODE=1, можно через UART посмотреть, читает ли и обрабатывает ли атмега нужную клавишу.
Этап 5. Если CPLD еще нет, то запаиваем ее и прошиваем (пример прошивки для epm7128slc84 в проекте соответствует схеме). Подключаем к Спеку - в соответствии со схемой. Проверяем и допиливаем прошивки по своему вкусу.
Что еще можно сделать.
1. Если отказаться от UART и дебага, можно количество ног клавиатуры расширить до 28.
2. Хочу немного автоматизировать формирование матрицы, идея проста - делим все пины на "два лагеря", т е на два непересекающихся множества. Получив из дебага массив опроса клавиш в вида пар пинов для N клавиш это достаточно просто сделать за N проходов по этому массиву (взяли первую клавишу, один пин - в столбцы, второй - в строки, дальше ищем все клавиши с таким же столбцом в одной из координат, значит вторые ее координату добавляем к строкам, дальше по каждой из полученных строк ищем клавиши с такой же строкой - получаем новые столбцы, перебираем новые столбцы - так до тех пор, пока не обойдем пройдем все клавиши (надо как-то их отмечать при переборе). Если находим клавишу с обоими пинами в предполагаемых столбцах или строках, значит где-то есть ошибка переноса данных или опроса клавиатуры. Если все пройдено, но остались клавиши с никуда не отнесенными пинами - значит клавиатуры имеет клавиши вне основной матрицы, надо будет заадуматься, нужно ли их использовать.
Писать такое на C как-то уныло, наверное пришло время осваивать python.
3. Раз уж остается свободной довольно немалая часть CPLD (много и ног, и макроячеек), есть идея развести плату как "CPLD-макетку", чтоб в дальнейшем можно было в нее добавлять какие-то посторонние доработки. Мне раньше всегда было мало макетного поля Ленинграда - это будет решением в угоду моей жадности до макеток )




Ответить с цитированием