Настройка часов точного времени 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
