Настройка часов точного времени DS3231 на Debian 12 для платы Le Potato AML-S905X-CC
Настройка часов точного времени DS3231 на Debian 12 для платы Le Potato AML-S905X-C.
Предыстория
Для одного своего хобби-проекта купил себе 5 штук модулей DS3231-module-for-pi. Дома был еще LePotato, решил туда добавить.
Оказалось, что настройка под armbian и debian сильно отличается. Что стало поводом сделать конспект и сохранить на будущее.
Commands
Необходимо зайти в систему
Remove Fake HWClock.
sudo systemctl disable fake-hwclock.service
sudo apt remove -y fake-hwclock
sudo systemctl reboot
Add ltdo i2c.
/usr/bin/ldto enable i2c-ao
/usr/bin/ldto enable i2c-ao-ds3231
/usr/bin/ldto merge
i2cdetect -y 1
hwclock --show
Теперь данные времени должны браться с DS3231.
Если мы перезагрузимся, то все настройки слетят.
Сделаем отдельный systemd service, который будет при старте все настраивать.
cat<<EOF | sudo tee /etc/systemd/system/ds3231-setup.service
[Unit]
Description=Setup DS3231 realtime clock on system.
Documentation=https://www.hdfilm.kz
After=network-online.target
Wants=udev.target
[Install]
WantedBy=multi-user.target
[Service]
Type=simple
ExecStart=/usr/local/bin/ds3231-setup.sh
EOF
cat<<EOF | sudo tee /usr/local/bin/ds3231-setup.sh
#!/bin/bash
#
/usr/bin/ldto enable i2c-ao
/usr/bin/ldto enable i2c-ao-ds3231
/usr/bin/ldto merge
i2cdetect -y 1
hwclock --show
EOF
sudo chmod a+x /usr/local/bin/ds3231-setup.sh
sudo systemctl daemon-reload
sudo systemctl enable ds3231-setup.service
Ansible playbook
Решил добавить ansible playbook, так как все равно все делаю в ansible уже последние пару лет.
Необходимо создать следующие файлы.
- ansible.cfg
- inventory
- ds3231-setup-playbook.yaml
- ds3231-setup.service.j2
- ds3231-setup.sh.j2
ansible.cfg
[defaults]
inventory = inventory
inventory
[podman]
192.168.1.3
[podman:vars]
ansible_user=support
ansible_port=22
ds3231-setup.service.j2
[Unit]
Description=Setup DS3231 realtime clock on system.
Documentation=https://www.hdfilm.kz
After=network-online.target
Wants=udev.target
[Install]
WantedBy=multi-user.target
[Service]
Type=simple
ExecStart=/usr/local/bin/ds3231-setup.sh
ds3231-setup.sh.j2
#!/bin/bash
#
/usr/bin/ldto enable i2c-ao
/usr/bin/ldto enable i2c-ao-ds3231
/usr/bin/ldto merge
i2cdetect -y 1
hwclock --show
ds3231-setup-playbook.yaml
---
- name: Install and setup ds3231 RTC module.
hosts: all
become: true
handlers:
- name: Daemon-reload.
ansible.builtin.systemd:
daemon_reload: true
- name: Enable service.
ansible.builtin.systemd:
enabled: true
name: ds3231-setup.service
- name: Start service.
ansible.builtin.systemd:
name: ds3231-setup.service
state: started
tasks:
- name: Ensure that fake-hwclock is disabled and absent.
ansible.builtin.systemd:
name: fake-hwclock.service
enabled: false
state: absent
- name: Enable I2C.
block:
- name: Enable I2C 1/3.
ansible.builtin.command:
cmd: /usr/bin/ldto enable i2c-ao
register: _rc
failed_when: _rc.rc != 0
- name: Enable I2C 2/3.
ansible.builtin.command:
cmd: /usr/bin/ldto enable i2c-ao-ds3231
register: _rc
failed_when: _rc.rc != 0
- name: Enable I2C 3/3.
ansible.builtin.command:
cmd: /usr/bin/ldto merge
register: _rc
failed_when: _rc.rc != 0
- name: Detect I2C bus 1.
ansible.builtin.command:
cmd: i2cdetect -y 1
register: _rc
failed_when: _rc.rc != 0
- name: Show Hardware Clock Data.
block:
- name: Show Hardware Clock Data 1/2.
ansible.builtin.command:
cmd: hwclock --show
register: _rc
failed_when: _rc.rc != 0
- name: Show Hardware Clock Data 2/2.
ansible.builtin.debug:
msg: "{{ _rc.stdout }}"
- name: Create systemd ds3231-setup service file.
ansible.builtin.template:
src: ./ds3231-setup.service.j2
dest: /etc/systemd/system/ds3231-setup.service
owner: root
group: root
mode: 0644
notify:
- Daemon-reload.
- Enable service.
- Start service.
- name: Create systemd ds3231-setup script file.
ansible.builtin.template:
src: ./ds3231-setup.sh.j2
dest: /usr/local/bin/ds3231-setup.sh
owner: root
group: root
mode: 0755
notify:
- Daemon-reload.
- Enable service.
- Start service.
Запускаем ansible playbook - в режиме DRY-RUN, смотрим, что все хорошо. Если не хорошо, то делаем исправления в ansible playbook.
ansible-playbook -C -K ds3231-setup-playbook.yaml
Затем уже запускаем и смотрим что получилось
ansible-playbook -K ds3231-setup-playbook.yaml
