En la segunda parte del trabajo práctico número 5 de Informática Electrónica se propone leer el RTC en un sistema Linux haciendo uso de la interfaz ioctl, resulta que investigando un poco encontramos que hay una forma aún mejor y más sencilla que es usando el API definidio por sysfs, esté código implementa una posible solución usando python (aviso por ser un ejemplo academico esta cargado de cosas no del todo necesarias, el código se puede reducir en muchas lineas)
#!/bin/env python # -*- coding: utf-8 -*- ''' Código simple que muestra el estado del RTC utilizando la interfaz provista por sysfs, según: http://www.kernel.org/doc/Documentation/rtc.txt Este método no sólo es más simple que el acceso via ioctl, sino que además permite que cualquier usuario lea el RTC, sin comprometer la seguridad del sistema. Autores: Naranjo Manuel Francisco Sanchez Gonzalo Daniel ''' import os from os import path SYS_CLASS_RTC = path.join(path.sep, 'sys', 'class', 'rtc') class RTC(): def __init__(self, rtc=None): ''' Inicializa el acceso al RTC, chequea que el acceso sea valido ''' if not rtc: rtc = self.encontrarRTC() if not path.isdir(rtc): raise Exception("RTC invalido") self.rtc = rtc self.__date = path.join(self.rtc, 'date') self.__time = path.join(self.rtc, 'time') self.__epoch = path.join(self.rtc, 'since_epoch') def encontrarRTC(self): ''' Esta funcion trata de encontrar el RTC por defecto provisto en cualquier sistema compatible con x86 o con acceso ACPI ''' return path.join(SYS_CLASS_RTC, os.listdir('/sys/class/rtc/')[0]) def __leer(self, arg): ''' Función genérica que lee el contenido provisto por el RTC ''' return open(arg, 'r').readline().strip() def leerDia(self): ''' Devuelve el día según lo que indica el RTC ''' return self.__leer(self.__date) def leerHora(self): ''' Devuelve la hora según lo que indica el RTC ''' return self.__leer(self.__time) def leerEpoch(self): ''' Devuelve la cantidad de segundos desde las 00:00:00 UTC del 1ero de Enero de 1970 día ''' return self.__leer(self.__epoch) def __str__(self): ''' Generar representacion lejible de este objeto ''' return '%12s|%10s|%10s' % \ (self.leerEpoch(), self.leerDia(), self.leerHora()) if __name__ == '__main__': # se ejecuta sólo cuando se ejecuta la aplicación import time try: # instanciar objeto rtc = RTC() #imprimir formato print "%-12s|%-10s|%-10s" %("Desde 1-1-70", "dia", "hora") while 1: print "%s" % rtc # forzar conversion a string time.sleep(.1) # esperar 100 millisegundos except KeyboardInterrupt: print "Chau"
El código se debe bajar a un archivo (no es necesaria la extensión .py) y darle permisos de ejecución.
La salida del mismo resulta
[manuel@localhost:tmp]$ ./leerrtc
Desde 1-1-70|dia |hora
1290899928|2010-11-27| 23:18:48
1290899928|2010-11-27| 23:18:48
1290899928|2010-11-27| 23:18:48
1290899928|2010-11-27| 23:18:48
1290899928|2010-11-27| 23:18:48
1290899928|2010-11-27| 23:18:48
1290899928|2010-11-27| 23:18:48
1290899928|2010-11-27| 23:18:48
1290899928|2010-11-27| 23:18:48
1290899928|2010-11-27| 23:18:48
1290899929|2010-11-27| 23:18:49
1290899929|2010-11-27| 23:18:49
1290899929|2010-11-27| 23:18:49
1290899929|2010-11-27| 23:18:49
1290899929|2010-11-27| 23:18:49
1290899929|2010-11-27| 23:18:49
1290899929|2010-11-27| 23:18:49
1290899929|2010-11-27| 23:18:49
1290899929|2010-11-27| 23:18:49
1290899929|2010-11-27| 23:18:49
1290899930|2010-11-27| 23:18:50
1290899930|2010-11-27| 23:18:50
1290899930|2010-11-27| 23:18:50
1290899930|2010-11-27| 23:18:50
1290899930|2010-11-27| 23:18:50
1290899930|2010-11-27| 23:18:50
1290899930|2010-11-27| 23:18:50
1290899930|2010-11-27| 23:18:50
1290899930|2010-11-27| 23:18:50
1290899931|2010-11-27| 23:18:51
1290899931|2010-11-27| 23:18:51
1290899931|2010-11-27| 23:18:51
1290899931|2010-11-27| 23:18:51
1290899931|2010-11-27| 23:18:51
1290899931|2010-11-27| 23:18:51
1290899931|2010-11-27| 23:18:51
1290899931|2010-11-27| 23:18:51
1290899931|2010-11-27| 23:18:51
1290899931|2010-11-27| 23:18:51
1290899932|2010-11-27| 23:18:52
1290899932|2010-11-27| 23:18:52
1290899932|2010-11-27| 23:18:52
^CChau