Problèmes et corrections de la RTC DS1302 sur carte ACME Fox

Dans un précédent billet j’ai détaillé la mise en oeuvre d’une RTC à base de DS1302 pour la carte ACME Fox. Constatant une dérive d’horloge assez importante, j’ai décidé de revoir la chose. Un quartz c’est fragile et il y a un petit problème dans le code du support DS1302 dans le noyau…

La dérive d’horloge vient du montage lui-même. Il faut faire très attention avec les quartz et respecter les conseils donnés dans la datasheet :

Ground plane is the key ! Sinon le quartz fait un peu… antenne et ne tient pas la route. J’ai donc bien blindé la chose et cela devrait mieux se passer (le temps nous le dira puisque la dérive est de quelques dixièmes de seconde par jour seulement).

Mais durant les expérimentations, le DS1302 ne fonctionnait pas toujours. Certes, il pouvait stocker la date mais l’horloge elle-même ne fonctionnait pas. Étrange. La datasheet apporte la réponse :

«CLOCK HALT FLAG : it 7 of the seconds register is defined as the clock halt (CH) flag. When this bit is set to logic 1, the clock oscillator s stopped and the DS1302 is placed into a low-power standby mode with a current drain of less than 100nA. When his bit is written to logic 0, the clock will start. The initial power-on state is not defined.»

En bon français, le bit 7 du registre des secondes est le drapeau CH qui, à 1, arrête l’horloge. Pire encore, l’état à la mise sous tension du composant est indéfini ! Un petit coup d’oeil dans le code (os/linux-2.6-tag–devboard-R2_01-1/arch/cris/arch-v10/drivers/ds1302.c) et, surprise, pas une seule ligne ne s’assure que ce drapeau est bien à zéro.

On ajoute donc :
/* LEFINNOIS */
printk(KERN_INFO « %s: HC enable.n », ds1302_name);
out_byte(0x81);
lefinnois = in_byte();
ds1302_wenable();
out_byte(0x80);
out_byte(lefinnois & 0x7F);
ds1302_wdisable();
out_byte(0x81);
if((res = in_byte()) && 0x80) {
printk(KERN_INFO « %s: HC enable OK.n », ds1302_name);
}
printk(KERN_INFO « %s: HC enable done.n », ds1302_name);
/* /LEFINNOIS */
Dans la fonction ds1302_probe(void). Effectivement au démarrage on retrouve :
ds1302: RTC found.
ds1302: SDA, SCL, RST on PB0, PB1, GENIO2
ds1302: HC enable.
ds1302: HC enable OK.
ds1302: HC enable done.

ACME FOX, Webcam OV511 et time-lapse vidéo

Dans un billet précédent, je parlais de l’intégration de code dans le SDK de la carte ACME Fox 4/16. Ce code est en grande partie tiré du programme vidcat (w3cam) permettant de récupérer une image PPM depuis une caméra supportée par l’API V4L (Video for Linux). Le premier essai d’utilisation de ce code est la récupération d’image toutes les 3 minutes pour composer une vidéo.
 
 

Le code modifié et personnalisé de vidcat est pour l’heure copié dans zone de mémoire flash en lecture/écriture (/mnt/flash). Une clef USB de 256Mo est montée dans /mnt/flash/mount. Depuis ce répertoire un script est utilisé :
while(true);
do
../vidcat;
date
cp rototo.ppm `date +%s`.ppm;
sleep 180;
done
On récupère ensuite les PPM en montant la clef sur un PC ou en téléchargeant les fichiers avec scp.

On produit ensuite une liste de fichier avec un simple ls *.ppm | sort > list.

Reste ensuite à produite une vidéo avec transcode :
% transcode -x imlist,null -y ffmpeg,null -F mpeg4 –use_rgb
-i list -o test.mp4 -w 8000 –import_asr 1 -g 640×480
-z -k –export_fps 15
250 PPM avec un frame par seconde de 15 nous donne une vidéo de quelques 16 secondes de la webcam posée sur le bord de la fenêtre un jour ensoleillé. Rien de bien fantastique mais pour un premier essai, c’est pas mal je trouve…

Intégration de code dans le SDK ACME FOX

Toujours dans la série «je joue avec ma carte FOX» voici l’intégration d’un petit code dans le SDK. En d’autres termes, plutôt de de compiler les sources de mon outil, j’ai voulu l’intégrer proprement dans l’interface de configuration du SDK.

Procédure à suivre…

On commence par ajouter les sources dans un sous-répertoire du répertoire apps et on ajoute un Makefile qui va bien :
AXIS_USABLE_LIBS = UCLIBC GLIBC
include $(AXIS_TOP_DIR)/tools/build/Rules.axis

PROGS = vidcat
INSTDIR = $(prefix)/usr/bin
#LDLIBS = -lusb

all: $(PROGS)
$(PROGS): $(PROGS).o
$(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@

install: $(PROGS)
$(INSTALL) -p -o root -g root -m 0777 $(PROGS) $(INSTDIR)
clean:
rm -f $(PROGS) *.o core
On enregistre et on lance un petit make cris-axis-linux-gnu.

On se tourne ensuite vers configure-files/common/AC_common et on y ajoute :
menu « Lefinnois »
config LEFINNOIS_V4LCAPTURE
bool « Client de capture de frame V4L pour cam OV511 YUV »
default n
endmenu
Ceci permet d’ajouter le menu qui va bien dans l’interface de configuration. Reste à prendre cela en considération. Pour ce faire on tripote configure-files/devboard/devboard :
if [ « $AXIS_CONFIG_LEFINNOIS_V4LCAPTURE » = « y » ]; then
sub_no_fetch apps/v4lcapture
fi
Et voilà. L’affaire est dans le sac. Un petit coup de ./configure et le Makefile est mis à jour avec le répertoire apps/v4lcapture. Un coup d’oeil à axis_config.h et on retrouve :
i#define AXIS_CONFIG_LEFINNOIS_V4LCAPTURE 1
Petite compilation avec un simple make et voilà, tout est en place :
% find . -name vidcat
./apps/v4lcapture/vidcat
./target/cris-axis-linux-gnu/usr/bin/vidcat

Ma carte ACME Fox Classic à l'heure

Cela faisait longtemps que je devais le faire mais je n’avais jamais prit le temps. Voilà chose faite, ma « vieille » carte ACME Fox Classic (par opposition aux nouvelle carte LX 4/16, 8/16 ou 8/32) dispose maintenant d’une RTC (Real Time Clock).


Je n’ai rien inventé. J’ai simplement suivi les indications données par ACME sur leur site et procédé au montage de l’ensemble à base de DS1302. Résultat (après changement du quartz défectueux), ma carte embarqué dispose d’une horloge comme un ordinateur de bureau. Une horloge alimentée par une pile CR2032 lui permettant de rester à l’heure même la carte Fox éteinte :
ds1302: RTC found.
ds1302: SDA, SCL, RST on PB0, PB1, GENIO2
rtc_time : 09:24:10
rtc_date : 2008-03-23
LEFGADSENSE

J’en ai profité pour tester le dernier SDK et reflasher ma carte. Sans problème. Je pense la ressortir du tiroir pour la coupler à une Fonera d’ici peu. La carte Fox ne dispose pas d’interface Wifi (sauf par ajout de clef USB) et la Fonera ne dispose pas d’USB. De plus coupler ces deux jouets permettra également de profiter des dizaines de GPIO de la FOX ainsi que des 3 ports série, l’i2c, etc… Je ne parle même pas de l’USB et de la connexion d’une Webcam OV511…

En projet également, l’éventualité de porter le code et le montage de la RTC sur la Fonera. Just for fun !