И снова про tm1637 на FreeBSD
Сегодня снова речь пойдёт про недрогой 7 сегментный дисплей tm1637, пригодный для отображения 4х цифр и двоеточия, характерного для электронных часов. Особенность дисплея в том, что он не следует стандарту i2c, хотя подключение его к GPIO шине и протокол передачи данных по ней очень похож.
Несмотря на то, что я уже написал библиотеку для tm1637 на FreeBSD и в целом она меня вполне устраивает (два года на этом дисплее моя "малинка" показывала время), отчасти из-за некоей обиды, что такое простое устройство для простого общения с ним требует весьма непростых усилий, а отчасти из-за желания попробовать свои силы, я решил написать простенький драйвер для символьного устройства, на которое можно было бы просто отправить строку цифр.
Теперь же, с помощью этого драйвера, отображение на этом дисплее возможно и из PHP, и из Python, и, даже, из bash с помощью команды echo.
Несмотря на то, что я уже написал библиотеку для tm1637 на FreeBSD и в целом она меня вполне устраивает (два года на этом дисплее моя "малинка" показывала время), отчасти из-за некоей обиды, что такое простое устройство для простого общения с ним требует весьма непростых усилий, а отчасти из-за желания попробовать свои силы, я решил написать простенький драйвер для символьного устройства, на которое можно было бы просто отправить строку цифр.
Теперь же, с помощью этого драйвера, отображение на этом дисплее возможно и из PHP, и из Python, и, даже, из bash с помощью команды echo.
Прежде чем начать описание установки сообщаю, что Вы можете скачать исходный код драйвера и распаковать его с помощью следующих команд:
Для сборки драйвера Вам понадобятся исходные коды FreeBSD, обычно они лежат в папке /usr/src. Можно также установить их на флешку и монтировать её в указанную папку при необходимости. Как исходные коду скачать и распаковать поищите в Интернете - процесс этот несложный, но лучше следовать описанию.
После того как исходные коды Вашей ОС распакованы в /usr/src, можно пробовать собрать и установить драйвер:
Исходные коды используются только на этапе сборки и больше не требуются.
Драйвер будет установлен в /boot/modules как tm1637.ko. Но загружать его пока рано... Почему? Видите ли, я намеренно немного изменил порядок действий для сборки драйвера - предложил Вам сделать сперва самое сложное, но зато Вы уверены, что драйвер успешно собирается и устанавливается.
Теперь нам необходимо подключить устройство к "малинке" или "апельсинке", но прежде чем мы это сделаем, хочу сказать пару слов: в папке fdt-overlays/ исходников драйвера лежат готовые примеры оверлеев с расширением .dtso.
В них уже указаны пины scl (CLK) и sda (DIO) (это пины, которые я использовал на своих тестовых машинках) и в скобках указаны физические номера пинов. Если Вы подключите свой дисплей именно к ним, то ничего больше делать не надо. Но Вы вольны выбирать любые свободные пины, кроме питания и GND и, в этом случае, Вам поможет Интернет - наберите в поисковике название Вашей платы и слово "pinout". Найдите названия Ваших пинов и следуйте следующим правилам:
Оверлей с исправленными настройками установлен в /boot/dtb/overlays. Мы могли бы сделать это сразу, перед сборкой модуля, но тогда, если бы что-то пошло не так при сборке, мы бы сомневались, не допустили ли мы ошибку при редактировании.
Теперь добавьте имя оверлея в файл /boot/loader.conf, например:
и перегрузитесь.
..........
Если всё прошло нормально, то команда:
загрузит драйвер в систему. Вот несколько команд для контроля того, что мы только что сделали:
Вот собственно и всё! Осталось напомнить про пару мелочей:
Если Вы хотите запускать драйвер при старте компьютера автоматически, добавьте в файл /boot/loader.conf:
Если Вы желаете написать программу, которой будет нужно выводить на дисплей, то вам помогут примеры, расположенные в папке examples/. Там всё просто, не забудьте каждый раз завершать строку символом '\n' - он необходим в строковом формате драйвера.
Если Вы хотите управлять выводом каждого сегмента дисплея, то для Вас подойдет "сырой" режим драйвера. Для его включения запустите команду:
или заново соберите оверлей, раскоментировав соответствующую строку. В этом режиме драйвер ждет от Вас 4 байта, каждый включенный бит которых соответствует сегменту одного из 4-х символов. В отличие от строкового режима, перед выводом группы байт следует использовать позиционирование в файле с помощью seek() - доступны смещения от 0 до 3-х.
Версия драйвера остаётся alpha, но это не значит, что что-то в нём не работает. Это значит, что я ещё не определился окончательно с его функционалом - я всё ещё добавляю функции (например ioctl() вызовы для тех, кто пишет на C).
Почитайте файл README.md - я стараюсь отображать там все свои добавления.
Удачи!!!
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 - это опять подтягивающий резистор.
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.
Вот собственно и всё! Осталось напомнить про пару мелочей:
Если Вы хотите запускать драйвер при старте компьютера автоматически, добавьте в файл /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 - я стараюсь отображать там все свои добавления.
Удачи!!!
Комментарии
Показывать комментарии Как список | Древовидной структурой