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

From DAVE Developer's Wiki
Jump to: navigation, search
(Linux driver)
Line 41: Line 41:
 
         status = "okay";
 
         status = "okay";
  
         rtc: ds3231@68 {
+
         ds3231: ds3231@68 {
 
                 compatible = "maxim,ds3231";
 
                 compatible = "maxim,ds3231";
 
                 reg = <0x68>;
 
                 reg = <0x68>;
Line 50: Line 50:
  
 
== Accessing the rtc device ==
 
== Accessing the rtc device ==
The RTC device is available as <code>/dev/rtc1</code> device and the related time can be read using the <code>hwclock</code> command:
+
Setting the RTC device as <code>rtc0</code> lets the system clock be synchronized. The related section can be added to the device tree as an ''alias'':
 +
 
 +
<pre class="board-terminal">
 +
    aliases {
 +
            /* ds3231 is our default rtc dev (rtc0) */
 +
            rtc0 = &ds3231;
 +
            rtc1 = &snvs_rtc;
 +
    };
 +
</pre>
 +
 
 +
The RTC device is available as <code>/dev/rtc0</code> device and the related time can be read using the <code>hwclock</code> command:
  
 
<pre class="workstation-terminal">
 
<pre class="workstation-terminal">
root@desk-mx8mp:~# dmesg | grep rtc1
+
root@123456789:~# dmesg | grep rtc0
[    5.794607] rtc-ds1307 5-0068: registered as rtc1
+
[    6.949783] rtc-ds1307 5-0068: registered as rtc0
root@desk-mx8mp:~# hwclock -f /dev/rtc1
+
root@desk-mx8mp:~# hwclock -f /dev/rtc0
 
2024-03-06 16:18:28.182912+01:00
 
2024-03-06 16:18:28.182912+01:00
 
root@desk-mx8mp:~#
 
root@desk-mx8mp:~#
 
</pre>
 
</pre>
 
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>
 
[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
 
</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:56, 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: 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";

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

Accessing the rtc device[edit | edit source]

Setting the RTC device as rtc0 lets the system clock be synchronized. The related section can be added to the device tree as an alias:

    aliases {
            /* ds3231 is our default rtc dev (rtc0) */
            rtc0 = &ds3231;
            rtc1 = &snvs_rtc;
    };

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

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

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:~#