RTC
Please note that this guide is written for AllWinner H3 although the concepts could be applied to others. There are many H3 boards and some of them have on-board RTC clock while others dont.
On-Board RTC
For Boards that have on-board RTC, the kernel will enumerate I2C device to /dev/rtc1 because /dev/rtc0 is occupied by built-in Allwinner's RTC (sunxi-rtc). That means you have to modify a symlink "/dev/rtc" to point to /dev/rtc1 instead of /dev/rtc0 like this: sudo ln -f -s /dev/rtc1 /dev/rtc
After that standard hwclock will work fine however its recommended to use an init-script to make sure time is automatically adjusted. Here is an example (/etc/init.d/rtc_ds1307)
#! /bin/sh ### BEGIN INIT INFO # Provides: rtc_ds1307 # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: DS1307 real-time clock usage script # Description: This file should be used to construct scripts to be # placed in /etc/init.d. ### END INIT INFO # PATH should only include /usr/* if it runs after the mountnfs.sh script PATH=/sbin:/usr/sbin:/bin:/usr/bin DESC="ds1307_rtc maintenance service" do_start() { echo "Selecting correct RTC instance " echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-0/new_device sudo ln -f -s /dev/rtc1 /dev/rtc echo "Syncing system time to RTC" sudo hwclock -s } do_stop() { echo "Syncing RTC to system time" sudo hwclock -w } case "$1" in start) do_start ;; stop) do_stop ;; status) echo "RTC time:" hwclock -r echo "System time:" date ;; restart|force-reload) do_stop ;; *) echo "Usage: rtc_ds1307 {start|stop|status|restart}" >&2 exit 3 ;; esac
No on-board RTC
Nanopi M1 is one board where it doesnt have on-board RTC clock. I have used DS1307 and DS3231 IC based RTC Clocks and both work. Make you include the I2C Kernel Modules in the kernel config namely under I2C RTC drivers CONFIG_RTC_DRV_DS1307=y and CONFIG_RTC_DRV_DS3232=y. Please understand DS1307 module supports both DS1307 and DS3231. Next after booting type the following line which will help add make the RTC module load at boot time as a new device. Second command help us to test the RTC module.
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-0/new_device hwclock -r
Here is how its supposed to be connected = Nanopi m1 to RTC Clock
- RTC Pin Spec
Board-Pin# Name RTC-Pin# Name 1 SYS_3.3V VCC 3 I2C0_SDA SDA 5 I2C0_SCL SCL 7 GPIOG11 DoNOTConnect 9 GND GN
Please note in-case of on-board RTC, make you use I2C1_SDA, I2C1_SCL etc.
To ensure that the device is created at boot and the time is set from the RTC, we edit /etc/rc.local :
sudo vi /etc/rc.local
and add the following lines before ‘exit 0’ (change /i2c-0/new_device to i2c-1/new_device if required):
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-0/new_device hwclock -s
Trouble Shooting Commands
ls -l /sys/bus/i2c/devices/i2c-* dmesg
some "other" notes:
sun4i has an internal RTC sun5i does not have an internal RTC, rtc-sun5i.c is a chopped up rtc-pcf8563.c with some i2c stuff