Difference between revisions of "DESK-MX8M-AN-0003: Add an external RTC to SBC ORCA"

From DAVE Developer's Wiki
Jump to: navigation, search
(Accessing the rtc device)
Line 62: Line 62:
 
</pre>
 
</pre>
  
A proper ''systemd'' script can be used for synchronizing the system clock from the hardware rtc device:
+
A proper ''systemd'' service <code>/lib/systemd/system/hwrtc.service</code> can be used for synchronizing the system clock from the hardware rtc device:
  
 
<pre>
 
<pre>
Line 80: Line 80:
 
WantedBy=multi-user.target
 
WantedBy=multi-user.target
 
</pre>
 
</pre>
 +
 +
and the service has to be enabled:
 +
 +
systemctl enable hwrtc.service
  
 
Now the <code>date</code> command shows the system clock synchronized at any reboot.
 
Now the <code>date</code> command shows the system clock synchronized at any reboot.

Revision as of 16:38, 6 March 2024

Info Box


200px-Emblem-important.svg.png

This application note has been validated using the kit version in the History table.

History[edit | edit source]

Version Date Development Kit version
4.0.0 Mar 2024 DESK-MX8M-L 4.0.0

Introduction[edit | edit source]

An external RTC device can be connected to ORCA SBC to keep date & time and synchronizing the system clock at boot time.

As an example, an easy - just ready - RTC small board can be bought from Amazon with the DS3231 RTC device.

DS3231 small board with CR2032 battery

Linux driver[edit | edit source]

DESK-MX8M-L 4.0.0 kernel has the related rtc-ds1307 driver module already built and available in the root file system image.

It is enough to connect the RTC board to an I2C and probe the kernel module.

For the purposes of this AN, it is possible to use the GROOVE connector which has the four required signals available: SCL, SDA, VDD, GND (see the SBC schematics page).

Then, the driver has to be enabled in the device tree using the i2c6 interface available in the GROOVE connector:

/* groove connector */
&i2c6 {
        clock-frequency = <100000>;
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_i2c6>;
        status = "okay";

        rtc: ds3231@68 {
                compatible = "maxim,ds3231";
                reg = <0x68>;
                status = "okay";
        };
};

Accessing the rtc device[edit | edit source]

The RTC device is available as /dev/rtc1 device and the related time can be read using the hwclock command:

root@desk-mx8mp:~# dmesg | grep rtc1
[    5.794607] rtc-ds1307 5-0068: registered as rtc1
root@desk-mx8mp:~# hwclock -f /dev/rtc1
2024-03-06 16:18:28.182912+01:00
root@desk-mx8mp:~#

A proper systemd service /lib/systemd/system/hwrtc.service can be used for synchronizing the system clock from the hardware rtc device:

[Unit]
Description=Synchronise System clock to hardware RTC
DefaultDependencies=no
After=ntpdate.service
Conflicts=shutdown.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/hwclock -f /dev/rtc1 --hctosys
RestrictRealtime=yes

[Install]
WantedBy=multi-user.target

and the service has to be enabled:

systemctl enable hwrtc.service

Now the date command shows the system clock synchronized at any reboot.

root@desk-mx8mp:~# date
Wed Mar  6 16:40:44 CET 2024
root@desk-mx8mp:~#