Yo tengo:
- Raspberry Pi con 2015-05-05-raspbian-wheezy
- ds1307 conectado (es una placa Adafruit, las resistencias pullup no están instaladas).
Cómo puedo:
- configurar controladores
- ¿se asegura de que el Pi realmente use el tiempo RTC al inicio?
De hecho, he hecho la primera parte, por lo que puedo ver, pero no tuve suerte con la segunda. Gran parte de la información disponible, incluidas las instrucciones de Adafruit, son obsoletas debido a esto: https://www.raspberrypi.org/forums/viewtopic.php?t=97314
Entonces, primer paso: habilita el I2c y los controladores en raspi-config, agrega dtoverlay=i2c-rtc,ds1307
al final de /boot/config.txt, y tiene controladores, y hwclock
funciona para mí ahora, aparentemente (no puede ejecutar i2cdetect, más en eso luego).
Ahora necesita eliminar fake-hwclock y configurarlo para que realmente lea el rtc al inicio. He estado tratando de seguir este consejo, que está en gran medida de acuerdo con otras cosas que he visto, y es muy reciente: https://www.raspberrypi.org/forums/viewtopic.php?p=842661#p842661
(eso es para un RTC diferente, pero solo estoy siguiendo la segunda parte sobre la eliminación de fake-hwclock y así sucesivamente).
Pero no tuve suerte, y las 'líneas para comentar' allí no existen en mi pi. Mi pi aparece el 1 de enero de 1970 a las 00:00 y hwclock -r
dice que el RTC está dañado. Incluso si no me apagué desde que configuré el RTC y reinicié el pi, parece que debe haber sido dañado por el inicio.
Tampoco he podido ejecutar i2cdetect en absoluto. Se queja de que los dispositivos / dev / i2c (algo) no existen, y de hecho no ...
Actualización provisional
OK, he establecido que:
- la corrupción es solo de la información de hora / fecha. Si uso i2cset para llenar el nvram con un patrón, esa información no se modifica al reiniciar, pero el año va a 0x66
- Si elimino el
,ds1307
de la líneadtoverlay=i2c-rtc,ds1307
en config.txt, ¡el sistema aparece sin dañar el RTC! Lo que respalda la idea de que el controlador está corrompiendo los datos. Observé el código del controlador, revisa el tiempo y cambia cosas que no le gustan (por ejemplo, cambia el formato de 12 horas a 24 horas). Entonces, quizás el problema es que el controlador está instalado en un momento en que el puerto I2C no está realmente listo para funcionar (¿tal vez debido a que los relojes no están listos?) - Si hago esto después del inicio:
sudo sh -c 'echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device'
hace que se cargue el controlador rtc_ds1307 y que aparezca / dev / rtc0. Y el tiempo aún está bien. Y eso puede usarse como base para modificar los scripts de inicio - Un detalle más divertido: si lo uso
hwclock -s
en un script justo después de escribir en /sys/..../new_device, falla. Tiene que haber unsleep 0.5
o algo en medio.
Parece que ahora tengo un sistema que se puede apagar y encender, y que tendrá la hora correcta. Escribiré esto correctamente pronto.
fuente
dtparam=i2c1=on
a config.txt como trabajado para micksulley en enero raspberrypi.org/forums/viewtopic.php?f=28&t=97639 - Reinicio. Todavía no / dev / i2c *, aún no hay i2cdetect.sudo invoke-rc.d hwclock.sh start
no hace nada, sale porque/run/udev
existe. Perosudo invoke-rc.d hwclock.sh show
lee el reloj ysudo invoke-rc.d hwclock.sh stop
copia el reloj del sistema en el reloj de hardware.Respuestas:
Así es como lo hice funcionar.
Casi todo aquí debe hacerse como superusuario, así que use 'sudo bash' o coloque sudo delante de todo (si no se muestra).
Se necesitan los siguientes pasos básicos:
Tenga en cuenta que esto es para la imagen 2015-05-05-raspian-wheezy, en una rev 2.0 'Pi 1', y un ds1307 rtc conectado al conector de expansión. Algo o gran parte de esto debería aplicarse a otras situaciones (pero probablemente no a los raspios más viejos). Es posible que el problema con la corrupción del RTC sea específico del controlador ds1307, por lo que podría ser más simple para otros chips. Y ese problema puede solucionarse en algún lanzamiento futuro.
Además, estas instrucciones están escritas para la PCB modelo 2, donde se usa el bus I2C # 1. Si tiene una PCB rev1 (que no tiene el conector 'P5' de 8 pines cerca de P1) conectará el RTC al bus I2C # 0. Entonces, cada vez que vea
/i2c-1/
en la parte inferior, use/i2c-0/
en su lugar.Primero, ejecute raspi-config, y en 'opciones avanzadas', encontrará una configuración para habilitar I2C y cargar los controladores I2C. Habilítalos.
Ahora, en principio, puede agregar una línea en la parte inferior de
/boot/config.txt
:,dtoverlay=i2c-rtc,ds1307
que cargará la unidad ds1307; pero, como varios han encontrado, la carga del controlador corromperá el contenido del reloj, frustrando su propósito. No tengo idea de por qué, pero miré la fuente del controlador y descubrí que al inicio, lee el reloj y luego, si encuentra cosas que no le gustan (como un formato de 12 horas en lugar de 24), 'corrige' esas configuraciones con escrituras. Entonces, sospecho que lo que puede estar sucediendo es que el controlador se carga demasiado pronto después de que el I2C ha comenzado, y tal vez los relojes no están configurados correctamente o algo así, y las comunicaciones están dañadas. En cualquier caso, eso no funciona con la configuración que tengo, por lo que haremos que el controlador se cargue más tarde.En este punto, puede reiniciar, y al usar
lsmod | grep i2c
debería ver eli2c_bcm2708
controlador cargado (como se solicitó en raspi-config).A continuación, ejecute este comando:
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
o (si aún no es superusuario):
sudo sh -c 'echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device'
(
sudo echo
no funcionará ya que>
es lo que debe ser superusuario).Esto debería
rtc_ds1307
cargar el controlador y creará un dispositivo/dev/rtc0
. Ahora debería poder ejecutarhwclock
:sudo hwclock -r
... Esto muestra el tiempo desde el RTC. Es muy posible que genere un error porque su reloj aún no se ha inicializado correctamente. En cualquier caso, ahora lo configuraremos.
(1) asegúrese de que el reloj del sistema esté configurado con
date
. Si está en una red, ya debería estar configurada; si no, saca tu teléfono o tu reloj de bolsillo y prueba algo comosudo date -s '18 nov 2015 22:20:24'
cuando tiene la hora del sistema configurada correctamente, teniendo cuidado de hacerlo correctamente para la zona horaria, puede hacerlo
sudo hwclock -w
que lo copia al RTC.
Y luego
hwclock -r
debería funcionar, y mostrar la hora en el RTC, y debería verlo avanzar si lo lee más de una vez.Nota: el valor del reloj se almacena en relación con la zona horaria UTC, pero se muestra en la hora local.
Siguiente paso: eliminar fake-hwclock. Primero deshabilítelo y asegúrese de que hwclock.sh esté habilitado:
hwclock.sh
no hará nada en el inicio: detecta la presencia de udev y supone que udev ha hecho el trabajo de inicio, pero hace algo útil, que hace que la hora del sistema se escriba en el RTC en el encendido. Entonces, cuando te conectas a una red, el tiempo Pi se sincronizará con la red, y tu deriva RTC se corregirá cuando te apagues.Queda una cosa: tenemos que hacer arreglos para leer el RTC en el encendido, por lo que se establecerá la hora del sistema. udev tiene una cosa que intenta hacer eso, pero que fallará o se omitirá, porque el controlador RTC no está cargado.
La forma en que configuré esto es agregar estas cuatro líneas en la parte superior de
/etc/rc.local
(justo en la parte superior, debajo de los comentarios):Esto asegurará que el controlador esté cargado y que la hora del sistema se configure desde el reloj del hardware, cada vez que se inicie el sistema. El 'sleep 0.5' está allí porque descubrí que el
hwclock
comando no funcionaría sin él; la acción activada al escribir en/sys/class/i2c-adapter/i2c-1/new_device
(incluida la creación de / dev / rtc0 existe) aparentemente lleva un poco de tiempo (probablemente bastante por debajo de 0.5 segundos).Y eso es. No estoy muy contento con este uso de
/etc/rc.local
- Prefiero tenerlo configurado mucho antes, ya que muchas cosas suceden antes de querc.local
se ejecute y sería mucho mejor tener el reloj configurado antes de que esas cosas funcionen. Pero me está funcionando. Actualizaré esta respuesta si encuentro una mejor manera.Referencias 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/
fuente
dtoverlay=i2c-rtc,ds3231
aconfig.txt
en el último Raspbian (Jessie). Todo parece funcionar bien. No se requiere una configuración especial. Es cierto que este es un chip diferente (aunque la hoja de datos se ve muy similar, aparte del Xtal en el chip y funciona desde 3.3V).hwclock
Necesidades de PSsudo
/etc/rc.local
ejecuta como root. No recuerdo si el ds3231 usa el mismo controlador, y no sé qué causa la corrupción de todos modos, solo que sucede cuando se carga el controlador. Además, como mencioné en un comentario anterior, sospecho que algunos de estos problemas pueden deberse a condiciones de carrera durante el inicio (por ejemplo, el controlador rtc puede cargarse antes de que el i2c esté configurado correctamente), y puede verse considerablemente afectado por la velocidad de la tarjeta SD Cuando ejecuté a Jessie por primera vez, estaba en una tarjeta de clase 4, y estaba seriamente rota; errores extraños, e ignoradoshutdown
. Estuvo bien en una clase 10Respuesta complementaria: solución de problemas con herramientas I2C
Mientras intentaba que funcionara, encontré útil usar las herramientas i2c para mirar el RTC, y encontrará muchas referencias a esto en otras discusiones. Agregué información a la pregunta sobre lo que encontré con ella; Lo he movido a esta respuesta en caso de que sea útil.
Necesitará I2C habilitado (raspi-config) y el módulo i2c-dev cargado; puede forzar esto con un
sudo modprobe i2c-dev
.i2c-dev
no es necesario para que el RTC funcione, pero sí para usar las herramientas i2c.Puede instalar i2c-tools usando
sudo apt-get install i2c-tools
, si 'i2cdetect' no está presente.Si tiene una PCB Rev. 1: cambie
i2cdetect -y 1
ai2cdetect -y 0
y cambie todo1 0x68
a0 0x68
en losi2cdump
comandos.Tu puedes hacer
i2cdetect -y 1
... el '68' muestra que un dispositivo respondió en la dirección 0x68 para ser direccionado en el bus I2C. Si ha cargado el controlador rtc_ds1307, aparecerá como 'UU' ya que está reservado por el controlador.
El comando
i2cdump -y -f -r 0-6 1 0x68 c
se puede usar para volcar los primeros 7 registros del ds1307 que contienen el tiempo (el '-f' solo es necesario si tiene instalado el controlador rtc; anula la reserva).A continuación se muestra lo que sucede después del encendido, cuando el RTC está dañado debido a la carga del controlador
dtoverlay=i2c-rtc,ds307
.hwclock -r
Inicialmente informa que la configuración del reloj está corrupta, y de hecho el año es '66'.Los siete números de i2cdump son: [seg min hrs día de la semana día mes año], todos en bcd, por lo que la última vez es el 17 de noviembre de 2015, 01:09:46 UTC.
El tiempo 'corrupto' es el 1-ene-66, y he visto a otros que han informado que aparece el mismo valor.
fuente
Tuve un problema similar en dos Raspberry Pi 2 Modelo B con Arch Linux, uno con un TinyRTC (con el ds1307) y otro con un condensador RTC (con el ds3231).
Ejecutar NTPD como daemon corrompió la fecha de ambos RTC y la configuró en 2066/01/01.
La puesta en marcha
Agregué en /boot/config.txt
o
Agregué en /etc/modules-load.d/raspberrypi.conf
Deshabilité systemd-timesyncd
Instalé NTP
Cómo lo resolvió
Descubrí que al iniciar una sola instancia del NTPD antes de iniciar el servicio, se actualiza la hora del sistema y no establece el RTC, pero si inicio el servicio NTPD después de eso, actualiza la fecha del RTC sin corromperlo.
Pensé que hay un problema de permiso. El grupo predeterminado es audio.
Creé /etc/udev/40-rtc-permissions.rules para probarlo
pero no ayudó, así que lo eliminé.
También tuve que actualizar la fecha del sistema al inicio ya que no se hace automáticamente.
Agregué al archivo /etc/ntpd.service
y habilitó el servicio NTPD
y la fecha se actualiza y no se corrompe durante el arranque.
No descubrí qué causa que el demonio NTPD corrompa el RTC si se inicia primero y agradecería que alguien mejore mi solución, pero esto funciona para mí.
fuente