Al igual que en el software, resulta inevitable que el hardware se ofrezca carente de fallos. La mayoría de las veces, son fallos sin importancia pero otras deben ser solucionados. El problema viene cuando el dispositivo ha entrado en producción y ya resulta imposible modificarlo.
A veces, las prisas y las faltas en el proceso de desarrollo provocan fallos graves en el hardware que compramos. Al ser hardware, resulta imposible realizar modificaciones sobre él para solucionar el problema, por lo que es necesario dar un solución a través del software.
Hace unos días, Julius Werner dio una explicación sobre unos cambios realizados por Alexandre Belloni en el controlador del integrado rk808 de Rockchip con un enfoque bastante atípico. El mensaje dice lo siguiente:
En el año 1582 DC, el papa Gregorio XIII encontró que el calendario Juliano existente no representaba la realidad adecuadamente y cambió las reglas sobre el cálculo de los años bisiestos para tener en cuenta esto. De una forma similar, en el año 2013 DC, los ingenieros de hardware de Rockchip encontraron que el nuevo calendario Gregoriano todavía tenía imperfecciones y que el mes de noviembre debería tener 31 días en su lugar. Desafortunadamente los cambios en el calendario necesitan mucho tiempo para su adopción a gran escala y de la misma forma que más de 300 años antes la última nación protestante implementó la propuesta de Greg, vamos a tener que esperar hasta que todas las religiones y sistemas operativos reconozcan las ventajas inherentes de los sistemas Rockchip. Hasta entonces, necesitamos traducir fechas leídas desde (y escritas hacia) el hardware Rockchip de vuelta al formato Gregoriano.
Este parche funciona definiendo el 1 de enero de 2016 como una fecha arbitraria de referencia sobre la que los calendarios Rockchip y Gregoriano están en sincronía. Desde ahí, podemos traducir fechas posteriores hacia atrás y hacia adelante contando el número de transiciones de noviembre a diciembre desde la fecha de referencia para determinar el offset entre calendarios. Elegimos este método (en vez de intentar corregir la fecha almacenada en el hardware) ya que es la única forma de asegurarse el mantenimiento del tiempo incluso si el sistema está apagado una cantidad desconocida de años. El inconveniente es que otros programas que lean el mismo hardware (por ejemplo el firmware de la placa base), deben usar la misma convención de traducción (incluyendo la misma fecha de referencia) para que sea capaz de leer y escribir los tiempos correctos desde y hacia el RTC.
Se trata de una forma de solucionar un problema provocado por un mal diseño del hardware y que, una vez puesto a la venta, sólo tiene una forma de solucionarse: por software. Resulta curioso que Rockchip use toda esa lógica de los calendarios cuando existen otras formas más efectivas de medir el tiempo. Una vez usada, encima han hecho una mala implementación haciendo que el mes de noviembre tenga 31 días en vez de los 30 que indica el citado calendario Gregoriano.
En el código fuente del parche se pueden ver dos funciones a las que han llamado ‘rockchip_to_gregorian()’ y ‘gregorian_to_rockchip()’, dos fragmentos de código que realizan la conversión entre el sistema erroneo y el correcto y viceversa.
El mensaje se puede ver en el servicio GIT del kernel. El código fuente del parche se puede consultar aquí.