Làm cách nào để cài đặt Đồng hồ thời gian thực (RTC) trên Raspbian?


9

Tôi có:

  • Raspberry Pi với 2015-05-05-raspbian-wheezy
  • DS1307 được đính kèm (đó là bảng Adaf nhung, điện trở pullup chưa được cài đặt).

Làm thế nào để tôi:

  • cấu hình trình điều khiển
  • chắc chắn rằng Pi thực sự sử dụng thời gian RTC khi khởi động?

Tôi thực sự đã thực hiện phần đầu tiên, theo như tôi có thể nói, nhưng không có may mắn với phần thứ hai. Phần lớn thông tin ngoài kia, bao gồm cả các hướng dẫn của Adafbean, đã lỗi thời do điều này: https://www.raspberrypi.org/forums/viewtopic.php?t=97314

Vì vậy, bước đầu tiên: bạn kích hoạt I2c và trình điều khiển trong raspi-config, thêm dtoverlay=i2c-rtc,ds1307vào cuối /boot/config.txt và bạn đã có trình điều khiển và hwclocklàm việc cho tôi ngay bây giờ, rõ ràng (không thể chạy i2cdetect, hơn nữa về điều đó sau).

Bây giờ bạn cần xóa fake-hwclock và thiết lập để nó thực sự đọc rtc khi khởi động. Tôi đã cố gắng làm theo lời khuyên này - phần lớn là đồng ý với những điều khác tôi đã thấy và rất gần đây - https://www.raspberrypi.org/forums/viewtopic.php?p=842661#p842661

(đó là cho một RTC khác, nhưng tôi chỉ theo dõi phần thứ hai về việc loại bỏ giờ giả và vân vân).

Nhưng không có may mắn, và 'dòng để được nhận xét' không tồn tại trên pi của tôi. Số pi của tôi xuất hiện vào ngày 1 tháng 1 năm 1970 00:00 và hwclock -rnói rằng RTC bị hỏng. Ngay cả khi tôi không tắt nguồn kể từ khi cài đặt RTC và khởi động lại pi, vì vậy có vẻ như nó đã bị hỏng khi khởi động.

Tôi cũng không thể chạy i2cdetect. Nó phàn nàn rằng các thiết bị / dev / i2c (thứ gì đó) không tồn tại - và thực sự chúng không ...


Cập nhật tạm thời

OK, tôi đã thiết lập rằng:

  • tham nhũng chỉ là thông tin thời gian / ngày. Nếu tôi sử dụng i2cset để điền vào mẫu nvram, thông tin đó không được sửa đổi khi khởi động lại, nhưng năm sẽ chuyển sang 0x66
  • Nếu tôi xóa dòng ,ds1307khỏi dtoverlay=i2c-rtc,ds1307config.txt, thì hệ thống sẽ xuất hiện mà không làm hỏng RTC! Điều này hỗ trợ cho ý tưởng rằng chính trình điều khiển đang làm hỏng dữ liệu. Tôi đã xem mã trình điều khiển, và nó đi qua thời gian và thay đổi những thứ nó không thích (ví dụ: nó thay đổi định dạng 12 giờ thành 24 giờ). Vì vậy, có lẽ vấn đề là trình điều khiển được cài đặt tại thời điểm cổng I2C chưa thực sự sẵn sàng để hoạt động (có lẽ do đồng hồ chưa sẵn sàng?)
  • Nếu tôi làm điều này sau khi khởi động: sudo sh -c 'echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device'nó khiến trình điều khiển rtc_ds1307 tải và / dev / rtc0 xuất hiện. Và thời gian vẫn ổn. Và do đó, có thể được sử dụng làm cơ sở cho cách sửa đổi các tập lệnh init
  • Thêm một chi tiết thú vị: nếu tôi sử dụng hwclock -strong một tập lệnh ngay sau khi viết vào /sys/..../new_device, thì nó thất bại. Cần phải có một sleep 0.5hoặc một cái gì đó giữa.

Vì vậy, có vẻ như bây giờ tôi có một hệ thống có thể ngừng hoạt động và khởi động và sẽ có thời gian chính xác - tôi sẽ viết nó ngay lập tức.


Tham nhũng có thể (hoặc có thể không) xảy ra với ntpdate đang chạy ... raspberrypi.org/forums/viewtopic.php?p=690492#p690492
greggo

Tôi đã thêm dtparam=i2c1=onvào config.txt như đã làm việc cho micksulley vào tháng 1 raspberrypi.org/forums/viewtopic.php?f=28&t=97639 - Khởi động lại. Vẫn không có / dev / i2c *, vẫn không có i2cdetect.
greggo


@goldilocks - cảm ơn, một mảnh ghép quan trọng. i2cdetect hiện hoạt động và 1: 0x68 hiển thị dưới dạng UU. Sẽ thử một số thứ khác sau ngày hôm nay.
greggo

1
lưu ý sudo invoke-rc.d hwclock.sh startkhông có gì, nó thoát vì /run/udevtồn tại. Nhưng sudo invoke-rc.d hwclock.sh showđọc đồng hồ, và sudo invoke-rc.d hwclock.sh stopsao chép đồng hồ hệ thống sang đồng hồ phần cứng.
greggo

Câu trả lời:


6

Đây là cách tôi làm cho nó hoạt động.

Hầu hết mọi thứ ở đây cần phải được thực hiện dưới dạng siêu người dùng, vì vậy hãy sử dụng 'sudo bash' hoặc đặt sudo trước mọi thứ (nếu chưa được hiển thị).

Các bước cơ bản sau là cần thiết:

  • Sắp xếp để trình điều khiển 'i2c' có mặt nếu chưa có;
  • có một trình điều khiển bổ sung cho rtc_ds1307
  • loại bỏ giả-hwclock. Đây là một hệ thống con thường được sử dụng khi bạn không có mạng để cung cấp thời gian; nó tiết kiệm thời gian hệ thống trong một tệp khi tắt hệ thống và tải nó từ cùng một tệp khi khởi động. Vì vậy, thời gian không đúng, nhưng ít nhất nó không trở về số không (ngày 1 tháng 1 năm 1970) mỗi khi bạn khởi động lại. Khi RTC được cài đặt, thời gian sẽ bắt đầu chính xác một cách hợp lý ngay cả khi không có mạng.
  • sắp xếp để hệ thống đọc thời gian từ RTC khi khởi động.

Xin lưu ý rằng đây là hình ảnh 2015-05-05-raspian-wheezy, trên rev 2.0 'Pi 1', và một rtc DS1307 được gắn vào bộ kết nối mở rộng. Một số hoặc nhiều trong số đó nên áp dụng cho các tình huống khác (nhưng có lẽ không áp dụng cho raspian cũ). Có thể vấn đề với RTC bị hỏng là đặc trưng cho trình điều khiển DS1307, vì vậy nó có thể đơn giản hơn đối với các chip khác. Và vấn đề đó có thể được khắc phục tại một số bản phát hành trong tương lai.

Ngoài ra, các hướng dẫn này được viết cho PCB mô hình 2, trong đó bus I2C # 1 đang được sử dụng. Nếu bạn có PCB rev1 (không có đầu nối 'P5' 8 chân gần với P1), bạn sẽ gắn RTC vào bus I2C # 0. Vì vậy, bất cứ khi nào bạn nhìn thấy /i2c-1/dưới đây, sử dụng /i2c-0/thay thế.

Đầu tiên, chạy raspi-config và trong 'tùy chọn nâng cao', bạn sẽ tìm thấy cài đặt để bật I2C và tải trình điều khiển I2C. Kích hoạt chúng.

Bây giờ, về nguyên tắc, bạn có thể thêm một dòng vào dưới cùng của /boot/config.txt: dtoverlay=i2c-rtc,ds1307, nó sẽ tải ổ đĩa DS1307; nhưng - như nhiều người đã tìm thấy - việc tải trình điều khiển sẽ làm hỏng nội dung của đồng hồ, đánh bại mục đích của nó. Tôi không biết tại sao, nhưng tôi đã xem nguồn trình điều khiển và thấy rằng khi khởi động, nó đọc đồng hồ và sau đó, nếu nó tìm thấy những thứ nó không thích (chẳng hạn như định dạng 12 giờ thay vì 24), nó "Sửa" các cài đặt đó bằng ghi. Vì vậy, tôi nghi ngờ điều có thể xảy ra là trình điều khiển tải quá sớm sau khi I2C khởi động và có lẽ đồng hồ không được thiết lập đúng hoặc một cái gì đó và giao tiếp bị hỏng. Trong mọi trường hợp, điều đó không hoạt động với cấu hình tôi có, và vì vậy chúng tôi sẽ khiến trình điều khiển được tải sau đó.

Tại thời điểm này, bạn có thể khởi động lại và sử dụng lsmod | grep i2cbạn sẽ thấy i2c_bcm2708trình điều khiển được tải (như được yêu cầu trong raspi-config).

Tiếp theo, chạy lệnh này:

echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device

hoặc (nếu chưa có siêu người dùng):

sudo sh -c 'echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device'

( sudo echosẽ không hoạt động vì đó >là những gì cần phải là siêu người dùng).

Điều này sẽ khiến rtc_ds1307trình điều khiển tải, và sẽ tạo ra một thiết bị /dev/rtc0. Bây giờ bạn có thể chạy hwclock:

sudo hwclock -r

... Điều này hiển thị thời gian từ RTC. Nó cũng có thể tạo ra lỗi vì đồng hồ của bạn chưa được khởi tạo đúng cách. Trong mọi trường hợp, bây giờ chúng tôi sẽ thiết lập nó.

(1) đảm bảo đồng hồ hệ thống được đặt bằng cách sử dụng date. Nếu bạn đang ở trên một mạng, nó đã được đặt rồi; nếu không, hãy lấy điện thoại ra, hoặc đồng hồ bỏ túi của bạn và thử một cái gì đó như

sudo date -s '18 nov 2015 22:20:24'

khi bạn có thời gian hệ thống được đặt đúng - cẩn thận để làm đúng theo múi giờ - bạn có thể làm

sudo hwclock -w

sao chép nó vào RTC.

Và sau đó hwclock -rnên hoạt động, và hiển thị thời gian trong RTC, và bạn sẽ thấy nó tiến lên nếu bạn đọc nó nhiều lần.

Wed 18 Nov 2015 22:48:41 EST  -0.181329 seconds
Wed 18 Nov 2015 22:48:53 EST  -0.013721 seconds

Lưu ý: giá trị đồng hồ được lưu trữ theo múi giờ UTC, nhưng nó được hiển thị theo giờ địa phương.

Bước tiếp theo: loại bỏ giả-hwclock. Trước tiên hãy tắt nó và đảm bảo hwclock.sh được bật:

sudo update-rc.d hwclock.sh enable
sudo update-rc.d fake-hwclock remove

sudo apt-get remove fake-hwclock
sudo rm /etc/cron.hourly/fake-hwclock
sudo rm /etc/init.d/fake-hwclock

hwclock.shsẽ không làm gì khi khởi động - nó phát hiện sự hiện diện của udev và cho rằng udev đã thực hiện công việc khởi động - nhưng nó làm được điều gì đó hữu ích, đó là khiến thời gian hệ thống được ghi vào RTC khi powerup. Vì vậy, khi bạn kết nối với mạng, thời gian Pi sẽ đồng bộ hóa với mạng và độ trôi RTC của bạn sẽ được sửa khi bạn tắt máy.

Một điều còn lại - chúng ta cần sắp xếp để đọc RTC khi bật nguồn, vì vậy thời gian hệ thống sẽ được đặt. udev có một thứ trong đó cố gắng làm điều đó, nhưng nó sẽ thất bại hoặc bị bỏ qua, vì trình điều khiển RTC không được tải.

Cách tôi đã thiết lập, là thêm bốn dòng này ở đầu /etc/rc.local(ngay trên đầu, bên dưới các nhận xét):

echo 'setting up RTC'
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
sleep 0.5
hwclock -s

Điều này sẽ đảm bảo rằng trình điều khiển được tải và thời gian hệ thống được đặt từ đồng hồ phần cứng, mỗi khi hệ thống khởi động. 'Ngủ 0,5' là có vì tôi thấy rằng hwclocklệnh sẽ không hoạt động nếu không có nó - hành động được kích hoạt bằng cách viết vào /sys/class/i2c-adapter/i2c-1/new_device(bao gồm tạo / dev / rtc0 tồn tại) dường như mất một chút thời gian (có thể dưới 0,5 giây).

Và đó là nó. Tôi không thực sự hài lòng với việc sử dụng này /etc/rc.local- Tôi muốn nó được thiết lập sớm hơn nhiều, vì có rất nhiều thứ xảy ra trước khi rc.localđược thực thi và sẽ tốt hơn nhiều nếu đặt đồng hồ trước khi những thứ đó chạy. Nhưng nó làm việc cho tôi. Tôi sẽ cập nhật câu trả lời này nếu tôi tìm thấy một cách tốt hơn.

Tài liệu tham khảo https://www.raspberrypi.org/forums/viewtopic.php?t=97314 https://www.raspberrypi.org/forums/viewtopic.php?p=842661 https://www.raspberrypi.org/forums /viewtopic.php?t=85683 https://www.raspberrypi.org/blog/upasing-board-revision/


Tôi đã có một RTC theo đơn đặt hàng, và đã đọc các bài đăng RTC. Đây là một trong số ít trên trang web này có đề cập đến RTC. My RTC đến, tôi đã thêm dtoverlay=i2c-rtc,ds3231vào config.txttrên mới nhất Raspbian (Jessie). Mọi thứ dường như hoạt động tốt. Không cần cấu hình đặc biệt. Phải thừa nhận rằng đây là một con chip khác (mặc dù bảng dữ liệu trông rất giống nhau, ngoài chip Xtal và nó chạy từ 3,3V). hwclockNhu cầu PSsudo
Milliways

1
@Milliways /etc/rc.localchạy như root. Tôi không nhớ nếu DS3231 sử dụng cùng một trình điều khiển và tôi không biết điều gì gây ra tham nhũng, chỉ là điều đó xảy ra khi trình điều khiển tải. Ngoài ra, như tôi đã đề cập trong một nhận xét ở trên, tôi nghi ngờ rằng một số vấn đề này có thể là do điều kiện cuộc đua trong khi init (ví dụ: trình điều khiển rtc có thể tải trước khi i2c được thiết lập đúng) và có thể bị ảnh hưởng đáng kể bởi tốc độ của thẻ SD. Khi tôi lần đầu tiên chạy Jessie, nó nằm trong thẻ lớp 4, và nó đã bị hỏng nghiêm trọng; lỗi lạ, và nó bỏ qua shutdown. Đã ổn trên lớp 10
greggo

@Milliways nhưng vâng, tôi thực sự khuyên bạn nên sử dụng DS3231, nó chạy trên 3.3v, chính xác hơn nhiều. Nếu nó cũng cứu bạn khỏi những rắc rối này, đó là một phần thưởng rất lớn.
greggo

2

Trả lời bổ sung - Khắc phục sự cố với các công cụ I2C

Trong khi cố gắng làm cho nó hoạt động, tôi thấy thật hữu ích khi sử dụng các công cụ i2c để xem RTC và bạn sẽ tìm thấy nhiều tài liệu tham khảo về vấn đề này trong các cuộc thảo luận khác. Tôi đã thêm một số thông tin cho câu hỏi về những gì tôi tìm thấy với nó; Tôi đã chuyển nó đến câu trả lời này trong trường hợp nó hữu ích.

Bạn sẽ cần kích hoạt I2C (raspi-config) và mô-đun i2c-dev được tải - bạn có thể buộc điều này với a sudo modprobe i2c-dev. i2c-devkhông cần thiết để làm cho RTC hoạt động, nhưng cần sử dụng các công cụ i2c.

Bạn có thể cài đặt các công cụ i2c bằng cách sử dụng sudo apt-get install i2c-tools, nếu 'i2cdetect' không xuất hiện.

Nếu bạn có PCB Rev. 1: Thay đổi i2cdetect -y 1thành i2cdetect -y 0và thay đổi tất cả 1 0x68thành 0 0x68trong các i2cdumplệnh.

Bạn có thể làm i2cdetect -y 1

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --

... '68' cho thấy một thiết bị đã phản hồi tại địa chỉ 0x68 để được xử lý trên xe buýt I2C. Nếu bạn đã tải trình điều khiển rtc_ds1307, nó sẽ hiển thị dưới dạng 'UU' do trình điều khiển dành riêng.

Lệnh i2cdump -y -f -r 0-6 1 0x68 ccó thể được sử dụng để kết xuất 7 thanh ghi đầu tiên của DS1307 có chứa thời gian ('-f' chỉ cần thiết nếu bạn đã cài đặt trình điều khiển rtc; nó ghi đè lên phần đặt trước).

Dưới đây là những gì xảy ra sau khi powerup, khi RTC bị hỏng do tải trình điều khiển bởi dtoverlay=i2c-rtc,ds307.

hwclock -r ban đầu báo cáo rằng cài đặt đồng hồ bị hỏng và thực sự năm là '66'.

pi@raspberrypi ~ $ sudo hwclock -r
hwclock: The Hardware Clock registers contain values that are either invalid (e.g. 50th day of month) or beyond the range we can handle (e.g. Year 2095).
pi@raspberrypi ~ $ sudo i2cdump -y -f -r 0-6 1 0x68 c
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 50 04 00 05 01 01 66                               P?.???f         
pi@raspberrypi ~ $ sudo i2cdump -y -f -r 0-6 1 0x68 c
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 52 04 00 05 01 01 66                               R?.???f         
pi@raspberrypi ~ $ sudo hwclock -w
pi@raspberrypi ~ $ sudo i2cdump -y -f -r 0-6 1 0x68 c
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 35 09 01 03 17 11 15                               5??????         
pi@raspberrypi ~ $ sudo i2cdump -y -f -r 0-6 1 0x68 c
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 37 09 01 03 17 11 15                               7??????         
pi@raspberrypi ~ $ sudo hwclock -r
Tue 17 Nov 2015 01:09:42 UTC  -0.384866 seconds
pi@raspberrypi ~ $ sudo i2cdump -y -f -r 0-6 1 0x68 c
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
00: 46 09 01 03 17 11 15                               F??????         

Bảy số từ i2cdump là: [giây min giờ ngày trong tuần tháng năm], tất cả đều bằng bcd, vì vậy lần cuối cùng là 17-nov-2015, 01:09:46 UTC.

Thời gian 'bị hỏng' là 1-jan-66 và tôi đã thấy những người khác đã báo cáo rằng cùng một giá trị hiển thị.


2

Tôi gặp vấn đề tương tự trên hai Raspberry Pi 2 Model B với Arch Linux, một với TinyRTC (với DS1307) và một với RTC tụ điện (với DS3231).

Chạy NTPD khi daemon bị hỏng cả ngày của RTC và đặt thành 2066/01/01.

#hwclock --debug
hwclock from util-linux 2.27
Using the /dev interface to the clock.
Last drift adjustment done at 1420070400 seconds after 1969
Last calibration done at 1420070400 seconds after 1969
Hardware clock is on UTC time
Assuming hardware clock is kept in UTC time.
Waiting for clock tick...
/dev/rtc does not have interrupt functions. Waiting in loop for time from /dev/rtc to change
...got clock tick
Time read from Hardware Clock: 2066/01/01 00:01:12
Invalid values in hardware clock: 2066/01/01 00:01:12
Time since last adjustment is -1420070400 seconds
Calculated Hardware Clock drift is 0.000000 seconds
hwclock: The Hardware Clock registers contain values that are either invalid (e.g. 50th day of month) or beyond the range we can handle (e.g. Year 2095).

Các thiết lập

Tôi đã thêm vào /boot/config.txt

dtparam=i2c_arm=on
dtoverlay=i2c-rtc,ds1307

hoặc là

dtparam=i2c_arm=on
dtoverlay=i2c-rtc,ds3231

Tôi đã thêm vào /etc/modules-load.d/raspberrypi.conf

i2c-bcm2708
i2c-dev

Tôi đã tắt systemd-timesyncd

# timedatectl set-ntp false

Tôi đã cài đặt NTP

# pacman -S ntp

Làm thế nào nó giải quyết nó

Tôi thấy rằng bằng cách bắt đầu một phiên bản NTPD duy nhất trước khi bắt đầu dịch vụ cập nhật thời gian hệ thống và không đặt RTC nhưng nếu tôi khởi động dịch vụ NTPD thì nó sẽ cập nhật ngày RTC mà không làm hỏng nó.

Tôi nghĩ rằng có một vấn đề cho phép. Nhóm mặc định là âm thanh.

# ls -l /dev/rtc0
crw-rw---- 1 root audio 254, 0 Jan  1  1970 /dev/rtc0

Tôi đã tạo /etc/udev/40-rtc-permissions.rules để kiểm tra nó

KERNEL=="rtc0", GROUP="ntp", MODE="0666"

nhưng nó không giúp được gì nên tôi đã xóa nó.

Tôi cũng đã phải cập nhật ngày hệ thống khi khởi động vì nó không được thực hiện tự động.

Tôi đã thêm vào tập tin /etc/ntpd.service

ExecStartPre=-/usr/bin/hwclock -s
ExecStartPre=/usr/bin/ntpd -gq

và kích hoạt dịch vụ NTPD

# systemctl enable ntpd

và ngày cập nhật và không bị hỏng trong khi khởi động.

Tôi đã không tìm ra nguyên nhân khiến trình nền NTPD bị hỏng RTC nếu được khởi động trước và sẽ đánh giá cao nếu ai đó cải thiện giải pháp của tôi nhưng điều này hiệu quả với tôi.


Cảm ơn vì bài đăng. Tôi đã chiến đấu với điều này trên Raspberry Pi 3 cả ngày và bài đăng của bạn cuối cùng đã ghép những mảnh còn thiếu cuối cùng lại với nhau. Tôi đang chạy Fedberry cho HĐH và đang cố gắng thiết lập thiết bị làm máy chủ IPA (tại sao? Bởi vì IPA miễn phí ở mức 10watts - có vị rất tuyệt, ít bị lấp đầy!) Bây giờ tôi đã có một máy chủ IPA hoạt động có thể tồn tại khi mất điện không cần can thiệp thủ công. Tôi đang sử dụng rtc DS1307 và đã gặp phải một số vấn đề tương tự khi khắc phục sự cố đồng hồ bạn đã xác định. Điều tồi tệ nhất là sự hỏng hóc của bộ nhớ RTC khi khởi động. Tôi không chắc chắn nếu dtparam = i2c_arm = on là mánh khóe o
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.