Getting the RTC rv3028 to be used as /dev/rtc0

Hi

I have a RTC rv3028 on my system. It sits on i2c-2 at address 0x52.
I want it to update the system time with a correct time at each start of system regardless contact to internet time or not. I have no need of the alarm functions.

RV3028 is really low power and claim to be accurate.

I have checked it working using i2cset and i2cget.

Now I want to have the system use it instead of the one not backed up battery.

I found out that the most important registers of rv3028 are at the same place as for the ds3231 that the kernel supports. This made me try

$ echo ds3231 0x52 > /sys/class/i2c-dev/i2c-2/device/new_device

and what I hoped happened. The /dev/rtc1 was created and responded with the set time from
$ hwclock -r -f /dev/rtc1

But I still have some steps to take to make everything work. The system should use the clock as /dev/rtc and use it at startup, correct the time and so forth.

I thought of using overlays, there is an overlay for ds3031 which codes for another i2c address.

Is it possible/enough to change bus and address of an existing ds3031 overlay like https://github.com/beagleboard/bb.org-overlays/blob/master/src/arm/BB-I2C2-RTC-DS3231.dts to make it work for the rv3028?

/johan

Correct, just update these 3 lines and it should just work..

https://github.com/beagleboard/bb.org-overlays/blob/master/src/arm/BB-I2C2-RTC-DS3231.dts#L81-L84

The rest is more informal that get's reported to userspace for your
sanity to see if it loaded..

Regards,

Thanks Robert for suggestion

I did the editing as you proposed, kernel finds it but still does not use it as I expected.

Details follow.

I did edit them like this

extrtc: ds3231@68 {
compatible = “micro-crystal,rv3028”;
reg = <0x52>;
};

and change the overlay name in fragment0.

Renamed the file to BB-I2C2-RTC-RV3028.dts
Compiled, installed and included the line
dtb_overlay=/lib/firmware/BB-I2C2-RTC-RV3028.dtbo
in /boot/uEnv.txt

After reboot there is no /dev/rtc0 created, neither the /dev/rtc link
Some filtered results from
$ dmesg

[ 0.000798] timer_probe: no matching timers found

[ 1.373919] omap_rtc 44e3e000.rtc: registered as rtc1
[ 1.663955] PM: rtc0 not available
[ 1.665284] PM: rtc0 not available

[ 1.666533] hctosys: unable to open rtc device (rtc0)

[ 1.933272] PM: rtc0 not available

So the overlay is processed since the renumbering of the rtc (built in becomes rtc1) work.
But the new rtc is not installed in kernel

It is listed in /proc/device-tree/chosen/overlay.

The unit seem to be noticed in /sys/class/i2c-dev/i2c-2/device/2-0052
The file name inside returns the right name
$ cat name
rv3028

But it is not occupied by the kernel since I can still do
$ i2cdetect -y 2 0x52 0x0
22

So any clues how I can get the kernel to use it?

/johan

lördag 6 februari 2021 kl. 05:51:08 UTC+1 skrev RobertCNelson:

I believe I finally solved it.
Seem I changed the overlay a little too much, it should still say it is “maxim,ds3221” as compatible. I did not think that line was interpreted.
Hence

extrtc: ds3231@68 {
/* compatible = “micro-crystal,rv3028”; */
compatible = “maxim,ds3231”;
reg = <0x52>;
};
now works
rtc0 rtc1 and rtc are created. System time is updated from rtc0.
I still have to confirm rtc0 is updated from network time.

Thanks Robert for putting me on the right track.

torsdag 11 februari 2021 kl. 12:59:59 UTC+1 skrev Johan Ingvast:

Hi Johan,

DId your trickle charger and backup switchover work with this simple one?

I am also struggling

Kind regards

Richard