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,ds1307
di akhir /boot/config.txt, dan Anda punya driver, dan hwclock
berfungsi 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 -r
mengatakan 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
,ds1307
dari barisdtoverlay=i2c-rtc,ds1307
di 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 -s
skrip tepat setelah menulis ke /sys/..../new_device, gagal. Perlu adasleep 0.5
atau 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.
sumber
dtparam=i2c1=on
ke 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.sudo invoke-rc.d hwclock.sh start
tidak apa-apa, itu keluar karena/run/udev
ada. Tetapisudo invoke-rc.d hwclock.sh show
membaca jam, dansudo invoke-rc.d hwclock.sh stop
menyalin jam sistem ke jam perangkat keras.Jawaban:
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:
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 i2c
Anda akan melihati2c_bcm2708
driver 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 echo
tidak akan bekerja karena>
itulah yang perlu menjadi superuser).Ini akan menyebabkan
rtc_ds1307
driver memuat, dan akan membuat perangkat/dev/rtc0
. Anda sekarang dapat menjalankanhwclock
: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 sepertisudo 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 -r
harusnya bekerja, dan tunjukkan waktu di RTC, dan Anda akan melihatnya maju jika Anda membacanya lebih dari sekali.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:
hwclock.sh
tidak 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):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
hwclock
perintah 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 sebelumrc.local
dieksekusi 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/
sumber
dtoverlay=i2c-rtc,ds3231
untukconfig.txt
di 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).hwclock
Kebutuhan PSsudo
/etc/rc.local
berjalan 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 diabaikanshutdown
. Baik-baik saja di kelas 10Jawaban 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-dev
tidak 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 1
kei2cdetect -y 0
, dan ubah semua1 0x68
ke0 0x68
dalami2cdump
perintah.Anda dapat melakukan
i2cdetect -y 1
... '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 c
ini 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'.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.
sumber
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.
Pengaturan
Saya menambahkan di /boot/config.txt
atau
Saya menambahkan /etc/modules-load.d/raspberrypi.conf
Saya menonaktifkan systemd-timesyncd
Saya menginstal 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.
Saya membuat /etc/udev/40-rtc-permissions.rules untuk mengujinya
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
dan mengaktifkan layanan 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.
sumber