Skip to content

И снова про tm1637 на FreeBSD

tm1637 4-digit 7-segment displayСегодня снова речь пойдёт про недрогой 7 сегментный дисплей tm1637, пригодный для отображения 4х цифр и двоеточия, характерного для электронных часов. Особенность дисплея в том, что он не следует стандарту i2c, хотя подключение его к GPIO шине и протокол передачи данных по ней очень похож.
Несмотря на то, что я уже написал библиотеку для tm1637 на FreeBSD и в целом она меня вполне устраивает (два года на этом дисплее моя "малинка" показывала время), отчасти из-за некоей обиды, что такое простое устройство для простого общения с ним требует весьма непростых усилий, а отчасти из-за желания попробовать свои силы, я решил написать простенький драйвер для символьного устройства, на которое можно было бы просто отправить строку цифр.
Теперь же, с помощью этого драйвера, отображение на этом дисплее возможно и из PHP, и из Python, и, даже, из bash с помощью команды echo.

Прежде чем начать описание установки сообщаю, что Вы можете скачать исходный код драйвера и распаковать его с помощью следующих команд:
CODE:
mkdir ~/src cd ~/src git clone https://gitlab.com/alexandermishin13/tm1637-kmod.git cd ~/src/tm1637-kmod

Для сборки драйвера Вам понадобятся исходные коды FreeBSD, обычно они лежат в папке /usr/src. Можно также установить их на флешку и монтировать её в указанную папку при необходимости. Как исходные коду скачать и распаковать поищите в Интернете - процесс этот несложный, но лучше следовать описанию.

После того как исходные коды Вашей ОС распакованы в /usr/src, можно пробовать собрать и установить драйвер:
CODE:
make sudo make install

Исходные коды используются только на этапе сборки и больше не требуются.
Драйвер будет установлен в /boot/modules как tm1637.ko. Но загружать его пока рано... Почему? Видите ли, я намеренно немного изменил порядок действий для сборки драйвера - предложил Вам сделать сперва самое сложное, но зато Вы уверены, что драйвер успешно собирается и устанавливается.

Теперь нам необходимо подключить устройство к "малинке" или "апельсинке", но прежде чем мы это сделаем, хочу сказать пару слов: в папке fdt-overlays/ исходников драйвера лежат готовые примеры оверлеев с расширением .dtso.
В них уже указаны пины scl (CLK) и sda (DIO) (это пины, которые я использовал на своих тестовых машинках) и в скобках указаны физические номера пинов. Если Вы подключите свой дисплей именно к ним, то ничего больше делать не надо. Но Вы вольны выбирать любые свободные пины, кроме питания и GND и, в этом случае, Вам поможет Интернет - наберите в поисковике название Вашей платы и слово "pinout". Найдите названия Ваших пинов и следуйте следующим правилам:
  • Для малины: название GPIO21 означает, что ячейка для этого пина записывается как &gpio 21 0. Заметьте, что это совершенно не пин № 21. Для покупных дисплеев вторую цифру ставим 0 - не использовать подтягивающий резистор;
  • Для апельсина: название PC4 раскладывается в две цифры: порядковый номер буквы после P A=0, B=1 и т.д. У нас C=2 и вторая цифра 4, т.е. &pio 2 4 0. Последняя цифра 0 - это опять подтягивающий резистор.
Аккуратно и внимательно поменяйте в нужном вам оверлее все упоминания пинов - и имена в первом блоке, и ячейки во втором (и физические номера в скобках - Вам же потом понятнее будет), сохраните файл и выйдите из редактора. Теперь запустите команды (можно в папке fdt-overlay/, а можно перейти в родительскую - результат будет один и тот же):
CODE:
make sudo make install

Оверлей с исправленными настройками установлен в /boot/dtb/overlays. Мы могли бы сделать это сразу, перед сборкой модуля, но тогда, если бы что-то пошло не так при сборке, мы бы сомневались, не допустили ли мы ошибку при редактировании.

Теперь добавьте имя оверлея в файл /boot/loader.conf, например:
CODE:
fdt-overlays="<ваши,другие,оверлеи>,tm1637-gpio-rpi2"

и перегрузитесь.
..........
Если всё прошло нормально, то команда:
CODE:
sudo kldload tm1637

загрузит драйвер в систему. Вот несколько команд для контроля того, что мы только что сделали:
  • kldstat покажет список загруженных модулей всместе с нашим новым драйвером;
  • dmesg покажет сообщение системы, о найденном устройстве и занятых им пинах;
  • devinfo выдаст дерево устройств, в верхних строках которого будет и tm1637;
  • ls /dev/tm1637 укажет, что в системе появилось символьное устройство;
  • sysctl dev.tm1637 выведет на эран доступные переменные ядра, для управления драйвером;
  • sudo echo "12:34" > /dev/tm1637 отобразит на дисплее 12:34.
Не могу удержаться, чтобы не похвалить себя :-), если после первой строки Вы отправите следом строку "12:35", то драйвер отправит на дисплей только одну изменённую цифру, что заметно экономит ресурсы, если обновление информации происходит каждую секунду.

Вот собственно и всё! Осталось напомнить про пару мелочей:

Если Вы хотите запускать драйвер при старте компьютера автоматически, добавьте в файл /boot/loader.conf:
CODE:
tm1637_load="YES"


Если Вы желаете написать программу, которой будет нужно выводить на дисплей, то вам помогут примеры, расположенные в папке examples/. Там всё просто, не забудьте каждый раз завершать строку символом '\n' - он необходим в строковом формате драйвера.

Если Вы хотите управлять выводом каждого сегмента дисплея, то для Вас подойдет "сырой" режим драйвера. Для его включения запустите команду:
CODE:
sudo sysctl dev.tm1637.0.raw_mode=1

или заново соберите оверлей, раскоментировав соответствующую строку. В этом режиме драйвер ждет от Вас 4 байта, каждый включенный бит которых соответствует сегменту одного из 4-х символов. В отличие от строкового режима, перед выводом группы байт следует использовать позиционирование в файле с помощью seek() - доступны смещения от 0 до 3-х.

Версия драйвера остаётся alpha, но это не значит, что что-то в нём не работает. Это значит, что я ещё не определился окончательно с его функционалом - я всё ещё добавляю функции (например ioctl() вызовы для тех, кто пишет на C).

Почитайте файл README.md - я стараюсь отображать там все свои добавления.

Удачи!!!

Обратные ссылки

Нет обратных ссылок

Комментарии

Показывать комментарии Как список | Древовидной структурой

Нет комментариев.

Добавить комментарий

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.
E-Mail addresses will not be displayed and will only be used for E-Mail notifications.
To leave a comment you must approve it via e-mail, which will be sent to your address after submission.
Опции формы

Добавленные комментарии должны будут пройти модерацию прежде, чем будут показаны.