私のBeaglebone Black Iに乗るI2Cリアルタイムクロックの追加正確なタイミングを維持するためにntpdに依存しません。その結果、.txtファイルには2つの特別なデバイスファイルがあります/dev
。彼らは/dev/rtc0
、しかし、というシンボリックリンク/dev/rtc1
もあります。/dev/rtc
/dev/rtc0
/dev/rtc0
ボード上のARM SOCのリアルタイムクロックであり、/dev/rtc1
I2Cデバイスです。現在私はI2C時計に時間を手動で読み書きするスクリプトを使用していますが、シンボリックリンク/dev/rtc
が/dev/rtc1
。
それで、質問はこれがどのように達成できるかということです。私のbeaglebone blackのLinuxディストリビューションは、すべての管理タスクにsystemdを使用するArch Linuxです。
シンボリックリンクを削除して新しいシンボリックリンクを作成すると、次の再/dev/rtc1
起動後にシンボリックリンクがリセットされ、これまで設定ファイルまたはシステムデバイスが見つかりませんでした。
助けてくれてありがとう。
答え1
udevルールのヒントが私に正しい方向を教えてくれました。簡単なレビューの後udevルールの作成私は次のことをしました。
udevadm info -a -p /sys/class/rtc/rtc1
出力(省略)は、udevルールを定義するいくつかの便利なプロパティを示しています。
looking at device '/devices/platform/ocp/4802a000.i2c/i2c-1/1-0068/rtc/rtc1':
KERNEL=="rtc1"
SUBSYSTEM=="rtc"
DRIVER==""
ATTR{date}=="2015-12-04"
ATTR{hctosys}=="0"
ATTR{max_user_freq}=="64"
ATTR{name}=="ds1307"
ATTR{since_epoch}=="1449230817"
ATTR{time}=="12:06:57"
...
/etc/udev/rules.d/
したがって、ルールファイルは99-rtc1.rules
。
ファイルの内容は
KERNEL=="rtc1", SUBSYSTEM=="rtc", DRIVER=="", ATTR{name}=="ds1307", SYMLINK="rtc", MODE="0666"
実行できるルールをテストするには
udevadm test /sys/class/rtc/rtc1
出力の重要な行は次のとおりです。
...
creating link '/dev/rtc' to '/dev/rtc1'
atomically replace '/dev/rtc'
...
結果/dev
は望ましい設定です。
答え2
私のI2C RTCは、RTCが組み込みのOrange Pi PCで動作するようにするためにいくつかの方法を試した後(不快な方法で)動作させました。
- 組み込みrtcのパスを探します。
#>find /sys | egrep 'rtc$'
/sys/bus/platform/drivers/sun6i-rtc/1f00000.rtc
多くの行が表示されることがあります。 「/sys/bus...」のある行に集中してください。
- デバイスの作成とデバイス接続を管理するためにudevを作成します。
#>nano /etc/udev/rules.d/99-rtc1.rules
これを貼り付けてください:
KERNEL=="rtc1", SUBSYSTEM=="rtc", DRIVER=="", ATTR{name}=="rtc-ds1307 0-0068", ATTR{hctosys}=="0", SYMLINK+="rtc", SYMLINK+="rtc0", MODE="0666"
- これでsystemdサービスを作成する必要があります。
#>nano /etc/systemd/system/rtc.service
内蔵のrtc0およびrtc1 i2cデバイスに応じて、次の内容を編集する必要がありますExecStart
。
[Unit]
Description=Initialize ds1307 RTC and sincronize system clock
DefaultDependencies=no
Requires=systemd-modules-load.service
After=systemd-modules-load.service
#Before=sysvinit.target
ConditionPathExists=/sys/class/i2c-adapter
#Conflicts=shutdown.target
[Service]
Type=oneshot
RemainAfterExit=yes
User=root
WorkingDirectory=/root
ExecStart=/bin/sh -c "echo -n "1f00000.rtc" > /sys/bus/platform/drivers/sun6i-rtc/unbind && echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-0/new_device && hwclock --rtc /dev/rtc --hctosys --utc"
[Install]
WantedBy=multi-user.target
- サービスを有効にします。
#>systemctl enable rtc.service
- サービスを開始します。
#>systemctl start rtc.service
- 以下を使用して、
/dev/rtc*
デバイスがそれに応じて変更されたことを確認できます。ls -lah /dev/rtc*
lrwxrwxrwx 1 root root 4 Apr 3 18:19 /dev/rtc -> rtc1
lrwxrwxrwx 1 root root 4 Apr 3 18:19 /dev/rtc0 -> rtc1
crw-rw-rw- 1 root root 253, 1 Apr 3 18:19 /dev/rtc1
今rtcとrtc0はrtc1を指します!
- hwclockが使用中であることを確認する
hwclock --verbose
hwclock from util-linux 2.37.2
System Time: 1680548612.161304
Trying to open: /dev/rtc0
Using the rtc interface to the clock.
Last drift adjustment done at 1680540088 seconds after 1969
Last calibration done at 1680540088 seconds after 1969
Hardware clock is on UTC time
Assuming hardware clock is kept in UTC time.
Waiting for clock tick...
ioctl(4, RTC_UIE_ON, 0): Invalid argument
Waiting in loop for time from /dev/rtc0 to change
...got clock tick
Time read from Hardware Clock: 2023/04/03 19:03:33
Hw clock time : 2023/04/03 19:03:33 = 1680548613 seconds since 1969
Time since last adjustment is 8525 seconds
Calculated Hardware Clock drift is 0.000000 seconds
2023-04-03 19:03:32.766066+00:00
システム時間を使用して時計を更新するには、次のようにhwclock -w
rtcで更新を使用します。hwclock -s
/etc/modules にモジュールを追加する必要があります。
echo "rtc-ds1307" >> /etc/modules