Bagaimana cara menginstal Real Time Clock (RTC) di Raspbian?

9

Saya sudah:

  • Raspberry Pi dengan 2015-05-05-raspbian-wheezy
  • ds1307 terpasang (ini adalah papan Adafruit, resistor pullup tidak dipasang).

Bagaimana saya:

  • konfigurasikan driver
  • pastikan Pi benar-benar menggunakan waktu RTC saat startup?

Sebenarnya saya sudah melakukan bagian pertama, sejauh yang saya tahu, tetapi tidak berhasil dengan bagian kedua. Banyak informasi di luar sana, termasuk instruksi Adafruit, sudah usang karena ini: https://www.raspberrypi.org/forums/viewtopic.php?t=97314

Jadi, langkah pertama: Anda mengaktifkan I2c dan driver di raspi-config, tambahkan dtoverlay=i2c-rtc,ds1307di akhir /boot/config.txt, dan Anda punya driver, dan hwclockberfungsi untuk saya sekarang, tampaknya (tidak dapat menjalankan i2cdetect, lebih lanjut nanti).

Anda sekarang perlu menghapus jam palsu dan mengaturnya agar benar-benar membaca rtc saat startup. Saya telah mencoba mengikuti saran ini - yang sebagian besar sesuai dengan hal-hal lain yang telah saya lihat, dan sangat baru - https://www.raspberrypi.org/forums/viewtopic.php?p=842661#p842661

(itu untuk RTC yang berbeda, tapi saya hanya mengikuti bagian kedua tentang menghapus jam palsu dan sebagainya).

Tapi tidak berhasil, dan 'kalimat yang harus dikomentari' di sana tidak ada pada pi saya. Pi saya muncul dengan 1 Januari 1970 00:00 dan hwclock -rmengatakan RTC rusak. Bahkan jika saya belum dimatikan sejak mengatur RTC dan me-reboot pi, jadi sepertinya itu sudah rusak oleh startup.

Saya juga belum bisa menjalankan i2cdetect sama sekali. Ia mengeluh bahwa perangkat / dev / i2c (sesuatu) tidak ada - dan memang mereka tidak ...


Pembaruan Sementara

OK, saya telah menetapkan bahwa:

  • korupsi hanya dari info waktu / tanggal. Jika saya menggunakan i2cset untuk mengisi nvram dengan sebuah pola, informasi itu tidak dimodifikasi saat reboot, tetapi tahun berjalan ke 0x66
  • Jika saya menghapus ,ds1307dari baris dtoverlay=i2c-rtc,ds1307di config.txt, maka sistem muncul tanpa merusak RTC! Yang mendukung gagasan bahwa pengemudi itu sendiri merusak data. Saya telah melihat kode driver, dan ia melewati waktu dan mengubah hal-hal yang tidak disukainya (misalnya ia mengubah format 12 jam menjadi 24 jam). Jadi, mungkin masalahnya adalah bahwa driver diinstal pada saat port I2C sebenarnya tidak siap untuk bekerja (mungkin karena jam tidak siap?)
  • Jika saya melakukan ini setelah startup: sudo sh -c 'echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device'itu menyebabkan driver rtc_ds1307 dimuat, dan / dev / rtc0 muncul. Dan waktunya masih oke. Dan itu dapat digunakan sebagai dasar bagaimana mod skrip init
  • Satu lagi detail yang menyenangkan: jika saya menggunakan hwclock -sskrip tepat setelah menulis ke /sys/..../new_device, gagal. Perlu ada sleep 0.5atau sesuatu di antaranya.

Jadi sepertinya saya sekarang memiliki sistem yang dapat dimatikan, dan memulai, dan akan memiliki waktu yang tepat - saya akan segera menuliskannya dengan benar.

greggo
sumber
Korupsi mungkin (atau mungkin tidak) berkaitan dengan menjalankan ntpdate ... raspberrypi.org/forums/viewtopic.php?p=690492#p690492
greggo
Saya menambahkan dtparam=i2c1=onke config.txt ketika bekerja untuk micksulley pada bulan Januari raspberrypi.org/forums/viewtopic.php?f=28&t=97639 - Reboot. Masih tidak ada / dev / i2c *, masih tidak ada i2cdetect.
greggo
@goldilocks - terima kasih, potongan puzzle yang penting. i2cdetect sekarang berfungsi dan 1: 0x68 muncul sebagai UU. Akan mencoba beberapa hal lain hari ini.
greggo
1
catatan sudo invoke-rc.d hwclock.sh starttidak apa-apa, itu keluar karena /run/udevada. Tetapi sudo invoke-rc.d hwclock.sh showmembaca jam, dan sudo invoke-rc.d hwclock.sh stopmenyalin jam sistem ke jam perangkat keras.
greggo

Jawaban:

6

Inilah cara saya membuatnya bekerja.

Hampir semua yang ada di sini perlu dilakukan sebagai pengguna super, jadi gunakan 'sudo bash' atau letakkan sudo di depan segalanya (jika belum ditampilkan).

Langkah-langkah dasar berikut ini diperlukan:

  • Atur driver 'i2c' untuk hadir jika belum;
  • ada driver tambahan untuk rtc_ds1307
  • hapus jam palsu. Ini adalah subsistem yang biasanya akan digunakan ketika Anda tidak memiliki jaringan untuk menyediakan waktu; ini menghemat waktu sistem dalam file ketika sistem dimatikan, dan memuatnya dari file yang sama saat startup. Jadi waktunya tidak tepat, tetapi setidaknya itu tidak kembali ke nol (1 Jan 1970) setiap kali Anda memulai ulang. Dengan RTC terinstal, waktu akan dimulai dengan benar bahkan tanpa jaringan.
  • mengatur sistem untuk membaca waktu dari RTC saat startup.

Harap dicatat bahwa ini untuk gambar 2015-05-05-raspian-wheezy, pada rev 2.0 'Pi 1', dan rtc ds1307 yang terpasang pada penghubung ekspansi. Beberapa atau banyak dari itu harus berlaku untuk situasi lain (tetapi mungkin tidak untuk raspian yang lebih tua). Ada kemungkinan bahwa masalah dengan RTC yang rusak khusus untuk driver ds1307, sehingga bisa lebih sederhana untuk chip lain. Dan masalah itu dapat diperbaiki pada beberapa rilis mendatang.

Juga, instruksi ini ditulis untuk PCB model 2, di mana I2C bus # 1 sedang digunakan. Jika Anda memiliki PCB rev1 (yang tidak memiliki konektor 'P5' 8-pin dekat dengan P1), Anda akan memasang RTC ke bus I2C # 0. Jadi, setiap kali Anda melihat /i2c-1/di bawah ini, gunakan /i2c-0/saja.

Pertama, jalankan raspi-config, dan di bawah 'opsi lanjutan', Anda akan menemukan pengaturan untuk mengaktifkan I2C dan memuat driver I2C. Aktifkan mereka.

Sekarang, Anda dapat pada prinsipnya, menambahkan baris ke bagian bawah /boot/config.txt: dtoverlay=i2c-rtc,ds1307, yang akan memuat DS1307 mobil; tetapi - seperti yang ditemukan beberapa orang - memuat driver akan merusak konten jam, mengalahkan tujuannya. Saya tidak tahu mengapa, tetapi saya melihat sumber driver, dan menemukan bahwa pada saat startup, ia membaca jam dan kemudian, jika menemukan hal-hal yang tidak disukainya (seperti format 12 jam, bukan 24), itu 'koreksi' pengaturan itu dengan write. Jadi, saya menduga apa yang mungkin terjadi adalah bahwa driver memuat terlalu cepat setelah I2C dimulai, dan mungkin jam tidak diatur dengan benar atau sesuatu, dan komunikasi rusak. Bagaimanapun, itu tidak berfungsi dengan konfigurasi yang saya miliki, dan kami akan menyebabkan driver dimuat nanti.

Pada titik ini, Anda dapat reboot, dan menggunakan lsmod | grep i2cAnda akan melihat i2c_bcm2708driver dimuat (seperti yang diminta dalam raspi-config).

Selanjutnya, jalankan perintah ini:

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

atau (jika belum superuser):

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

( sudo echotidak akan bekerja karena >itulah yang perlu menjadi superuser).

Ini akan menyebabkan rtc_ds1307driver memuat, dan akan membuat perangkat /dev/rtc0. Anda sekarang dapat menjalankan hwclock:

sudo hwclock -r

... Ini menampilkan waktu dari RTC. Mungkin menghasilkan kesalahan karena jam Anda belum diinisialisasi dengan benar. Bagaimanapun, kita sekarang akan mengaturnya.

(1) pastikan jam sistem diatur menggunakan date. Jika Anda berada di jaringan, itu harus sudah diatur; jika tidak, keluarkan ponsel Anda, atau arloji saku Anda, dan coba sesuatu seperti

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

ketika Anda memiliki waktu sistem yang ditetapkan dengan benar - berhati-hati untuk melakukannya dengan benar untuk zona waktu - Anda dapat melakukannya

sudo hwclock -w

yang menyalinnya ke RTC.

Dan kemudian hwclock -rharusnya bekerja, dan tunjukkan waktu di RTC, dan Anda akan melihatnya maju jika Anda membacanya lebih dari sekali.

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

Catatan: nilai jam disimpan relatif terhadap zona waktu UTC, tetapi ini ditampilkan dalam waktu setempat.

Langkah selanjutnya: hapus jam palsu. Nonaktifkan dulu, dan pastikan hwclock.sh diaktifkan:

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.shtidak akan melakukan apa pun saat startup - ia mendeteksi keberadaan udev dan menganggap udev telah melakukan pekerjaan startup - tetapi ia melakukan sesuatu yang bermanfaat, yang menyebabkan waktu sistem ditulis ke RTC di powerup. Jadi, ketika Anda terhubung ke jaringan, waktu Pi akan menyinkronkan ke jaringan, dan penyimpangan RTC Anda akan diperbaiki ketika Anda mematikan.

Satu hal lagi - kita perlu mengatur untuk membaca RTC saat power-up, sehingga waktu sistem akan ditetapkan. udev memiliki sesuatu di dalamnya yang mencoba melakukan itu, tetapi yang akan gagal, atau dilewati, karena driver RTC tidak dimuat.

Cara saya mengatur ini, adalah dengan menambahkan empat baris ini di bagian atas /etc/rc.local(tepat di atas, di bawah komentar):

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

Ini akan memastikan bahwa driver dimuat, dan waktu sistem diatur dari jam perangkat keras, setiap kali sistem dimulai. 'Sleep 0.5' ada di sana karena saya menemukan bahwa hwclockperintah tidak akan berfungsi tanpanya - tindakan yang dipicu oleh menulis ke /sys/class/i2c-adapter/i2c-1/new_device(termasuk membuat / dev / rtc0 ada) tampaknya membutuhkan sedikit waktu (mungkin jauh di bawah 0,5 detik).

Dan itu saja. Saya tidak terlalu senang dengan penggunaan ini /etc/rc.local- Saya lebih suka mengaturnya lebih awal, karena banyak hal terjadi sebelum rc.localdieksekusi dan akan jauh lebih baik untuk memiliki jam yang ditetapkan sebelum hal-hal itu berjalan. Tapi itu berhasil untukku. Saya akan memperbarui jawaban ini jika saya menemukan cara yang lebih baik.

Referensi 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/upcoming-board-revision/

greggo
sumber
Saya memesan RTC, dan telah membaca posting RTC. Ini adalah salah satu dari sedikit di situs ini yang menyebutkan RTC. Saya RTC tiba, saya menambahkan dtoverlay=i2c-rtc,ds3231untuk config.txtdi Raspbian terbaru (Jessie). Semuanya sepertinya bekerja dengan baik. Tidak diperlukan konfigurasi khusus. Harus diakui ini adalah chip yang berbeda (meskipun lembar data terlihat sangat sama, terlepas dari chip Xtal dan berjalan dari 3.3V). hwclockKebutuhan PSsudo
Milliways
1
@Milliways /etc/rc.localberjalan sebagai root. Saya tidak ingat apakah ds3231 menggunakan driver yang sama, dan saya tidak tahu apa yang menyebabkan korupsi, hanya saja itu terjadi ketika pengemudi memuat. Juga, seperti yang saya sebutkan dalam komentar di atas, saya menduga bahwa beberapa masalah ini mungkin disebabkan oleh kondisi balapan selama init (misalnya driver rtc dapat memuat sebelum i2c diatur dengan benar), dan mungkin sangat dipengaruhi oleh kecepatan kartu SD. Ketika saya pertama kali berlari Jessie itu pada kartu kelas 4, dan itu rusak parah; kesalahan aneh, dan itu diabaikan shutdown. Baik-baik saja di kelas 10
greggo
@Milliways tapi ya, saya sangat merekomendasikan pergi dengan ds3231, ini berjalan pada 3.3V, ini jauh lebih akurat. Jika itu juga menyelamatkan Anda dari kerepotan ini, itu bonus yang sangat besar.
greggo
2

Jawaban Tambahan - Pemecahan masalah dengan alat I2C

Ketika mencoba membuatnya berfungsi, saya merasa terbantu menggunakan i2c-tools untuk melihat RTC, dan Anda akan menemukan banyak referensi untuk ini dalam diskusi lain. Saya telah menambahkan beberapa informasi ke pertanyaan tentang apa yang saya temukan dengannya; Saya telah memindahkannya ke jawaban ini jika berguna.

Anda membutuhkan I2C diaktifkan (raspi-config) dan modul i2c-dev dimuat - Anda dapat memaksakan ini dengan a sudo modprobe i2c-dev. i2c-devtidak diperlukan untuk membuat RTC berfungsi, tetapi diperlukan untuk menggunakan i2c-tools.

Anda dapat menginstal i2c-tools menggunakan sudo apt-get install i2c-tools, jika 'i2cdetect' tidak ada.

Jika Anda memiliki PCB Rev. 1: Ubah i2cdetect -y 1ke i2cdetect -y 0, dan ubah semua 1 0x68ke 0 0x68dalam i2cdumpperintah.

Anda dapat melakukan 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' menunjukkan bahwa perangkat merespons pada alamat 0x68 untuk dialamatkan pada bus I2C. Jika Anda telah memuat driver rtc_ds1307, itu akan muncul sebagai 'UU' karena disediakan oleh driver.

Perintah i2cdump -y -f -r 0-6 1 0x68 cini dapat digunakan untuk membuang 7 register pertama dari ds1307 yang berisi waktu ('-f' diperlukan hanya jika Anda memiliki driver rtc yang diinstal; itu menimpa reservasi).

Di bawah ini adalah apa yang terjadi setelah powerup, ketika RTC rusak karena memuat driver oleh dtoverlay=i2c-rtc,ds307.

hwclock -r awalnya melaporkan bahwa pengaturan jam rusak, dan memang tahun ini '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??????         

Tujuh angka dari i2cdump adalah: [dtk dtk hari-of-minggu hari bulan tahun], semuanya dalam bcd, jadi waktu terakhir adalah 17-November-2015, 01:09:46 UTC.

Waktu 'rusak' adalah 1-jan-66, dan saya telah melihat orang lain yang melaporkan nilai yang sama muncul.

greggo
sumber
2

Saya memiliki masalah serupa pada dua Raspberry Pi 2 Model B dengan Arch Linux, satu dengan TinyRTC (dengan ds1307) dan yang lain dengan kapasitor RTC (dengan ds3231).

Menjalankan NTPD sebagai daemon merusak tanggal RTC dan menetapkannya ke 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).

Pengaturan

Saya menambahkan di /boot/config.txt

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

atau

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

Saya menambahkan /etc/modules-load.d/raspberrypi.conf

i2c-bcm2708
i2c-dev

Saya menonaktifkan systemd-timesyncd

# timedatectl set-ntp false

Saya menginstal NTP

# pacman -S ntp

Bagaimana cara mengatasinya

Saya menemukan bahwa dengan memulai satu instance NTPD sebelum memulai layanan memperbarui waktu sistem dan tidak mengatur RTC tetapi jika saya memulai layanan NTPD setelah itu memperbarui tanggal RTC tanpa merusaknya.

Saya pikir ada masalah izin. Grup default adalah audio.

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

Saya membuat /etc/udev/40-rtc-permissions.rules untuk mengujinya

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

tapi itu tidak membantu jadi saya menghapusnya.

Saya juga harus memperbarui tanggal sistem saat startup karena tidak dilakukan secara otomatis.

Saya menambahkan ke file /etc/ntpd.service

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

dan mengaktifkan layanan NTPD

# systemctl enable ntpd

dan tanggal diperbarui dan tidak rusak selama boot.

Saya tidak mengetahui apa yang menyebabkan daemon NTPD merusak RTC jika mulai lebih dulu dan akan menghargai jika seseorang memperbaiki solusi saya tetapi ini berhasil untuk saya.

iomihai
sumber
Terima kasih untuk kirimannya. Saya telah berjuang ini di Raspberry Pi 3 sepanjang hari, dan pos Anda akhirnya mengumpulkan potongan-potongan yang hilang. Saya menjalankan Fedberry untuk OS, dan mencoba mengatur unit ini sebagai server IPA (mengapa? Karena IPA Gratis di 10watts - rasanya enak, kurang mengisi!) Sekarang saya punya server IPA yang berfungsi yang dapat bertahan dari kegagalan daya tanpa intervensi manual. Saya menggunakan ds1307 rtc, dan telah mengalami beberapa masalah yang sama ketika memecahkan masalah jam yang telah Anda identifikasi. Yang terburuk adalah kerusakan memori RTC saat boot. Saya tidak yakin apakah dtparam = i2c_arm = pada adalah trik o