Прошу совета.
После последнего моего проекта "Простой текстовый терминал" пришла в голову мысль сделать настоящий терминал вроде какого нибудь стандартного терминала VT100.
Эта задача мне сначала показалась весьма простой: текстовый видеоадаптер у меня уже есть из предыдущего проекта и его можно попробовать подключить к системе на кристалле Амбер с процессором ARMv2a. Еще останется добавить в систему модуль PS/2 клавиатуры, написать саму программу терминала VT100 - там должно быть простой протокол, думал я.
В результате я втянулся в эту "авантюру" и конца края её пока не видно..
Да уж.. Прошли времена простых проектов марсохода типа "проект выходного дня". Никак не ожидал сколько подводных камней, сколько неожиданных трудностей.
Как ни кажется странным, собственно с ПЛИС и проектом системы на кристалле у меня почти не было проблем. А вот с программой терминала VT100, с его подключением к Линуксу - проблем много.
Вот, например, такая совершенно странная проблема. Плата Марсоход2 при подключении к ПК опознается как последовательные порты - там ведь у нас микросжема FTDI стоит на плате. Собственно через последовательный порт мой VT100 в плате Марсоход2 и должен работать. Я думал, что достаточно сконфигурировать Linux использовать мой последовательный порт для дополнительной консоли - и все само собой получится. Я добавил такой файл /etc/init/tty7.conf в мою Ubuntu:
# tty7 - getty
#
# This service maintains a getty on tty1 from the point the system is
# started until it is shut down again.
start on stopped rc RUNLEVEL=[2345] and (
not-container or
container CONTAINER=lxc or
container CONTAINER=lxc-libvirt)
stop on runlevel [!2345]
respawn
exec /sbin/getty -8 115200 ttyUSB1
Ну как добавил - скопировал из имеющегося tty6.conf и отредактировал последнюю строку: задал скорость 115200 и ttyUSB1.
Ну думаю, сейчас буду получать какие-то символы, esc-последовательности протокола VT100. А вот и нет. Приходит в мой терминал какая-то белиберда. Главное что если подключаю не к Ubuntu а просто к программе терминала TeraTerm - нормально символы приходят в мой терминал, в подключаю к Ubuntu - просто белиберда. Довольно долго отчего-то не мог понять что происходит. Потом дошло - видимо скорость передачи последовательного порта из Ubuntu совсем не 115200. Оказалось - 57600 и приходят какие-то странные команды мне в терминал вроде AT+GCAP... Это совсем на протокол VT100 не похоже.
Оказалось, что кроме getty последовательным портом хочет завладеть другой процесс /usr/sbin/modem-manager. Этот процесс при подключении COM-порта думает, что там модем и пытается его свойства прочитать. Как это фишку отключить в Ubuntu я так и не понял. Просто переименовал этот модем-manager, как бы удалил. Только тогда как-то заработало..
Вот еше проблема.
Я думал протокол VT100 простой. Я даже начал писать программу терминала для него на языке С. В моей системе на кристалле процессор ARMv2, компилятор Си у меня есть. Начал делать программу. Чем больше вникаешь, тем больше понимаешь, что не все так просто - очень много ньюансов. В конце концов решил поискать какие-то сторонние исходники терминала.
Нашел на GitHub то, что мне показалось наиболее подходящим: https://github.com/JulienPalard/vt100-emulator. Вот эти исходники взял за основу, но конечно пришлось их перерабатывать для себя. Этот терминал не поддерживал цветные режимы, а у меня ведь текстовый экран цветной. Сделал. Потом оказалось, что Ubuntu посылает не ASCII символы в терминал, а UTF-8. Русские буквы приходят в виде двух байтов. Нужно как-то перекодировать. Это я сделал частично - буква Ё будет не правильно показываться. Псевдографика приходит тремя байтами - то же нужно перекодировать - пока толком не доделал.
В целом и общем сейчас работает вот что:
- терминал VT100 на базе платы Марсоход2 (плюс VGA монитор и PS2 клвиатура) при подключении к Ubuntu показывает диалог входа: нужно ввести логин и пароль;
- после успешного логина можно пользоваться почти полноценной консолью Ubuntu Linux - вводить всякие команды типа ls, cd, mkdir, cat - ну в общем почти вся консоль работает;
- текстовый экран у меня довольно большой (разрешение на экране 1440х900 точек или 90x56 символов), но сам терминал занимает всего 80х24 символов;
- можно запустить mc и он работает! (собственно фото вверху).
Что пока не работает:
- не все клавиши клавиатуры работают и сделать полную поддержку довольно много работы. Хорошо бы доделать хотя бы функциональные клавиши F1-F10 и Ctrl;
- не работают лампочки клавиатуры.
- нет аппаратного курсора на экране - пичалька..
- нет русской буквы Ё - вместо нее какая-то другая.
- вся псевдографика одним "кирпичиком".
В общем получается, что несмотря на большой объем проделанной работы этот проект все еще остается сыроватым. Вот думаю - выкладывать как есть? или еще усовершенствовать его до человеческого вида? Чего-то я подустал от этого VT100 :-) делаю-то его вечарами да по выходным..
ЗЫ: Еще нужно сделать краткое описание Альтеровского проекта всей системы на кристалле терминала VT100 - что-то у меня уже на все это терпения не хватает.
Подробнее...