내 Beaglebone Black I을 타고I2C 실시간 클록 추가정확한 타이밍을 유지하기 위해 ntpd에 의존하지 않습니다. 결과적으로 .txt 파일에는 두 개의 특수 장치 파일이 있습니다 /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