Bon, je suis en train de lire le code source du driver du mode examen qu'Omega a modifie par rapport a Epsilon 15.5, et il y a des problemes. Il s'agit du fichier ion/src/device/shared/drivers/exam_mode.cpp.
Les infos du mode examen sont stockees a l'offset 0x1000 du firmware dans une zone de taille 0x2000. Cette zone est remplie de 1 au flashage. A chaque changement d'etat du mode examen on va remplacer des 1 par des 0 au fur et a mesure en incrementant l'offset d'ecriture si necessaire, jusqu'a atteindre la fin et dans ce cas on reformatte le secteur (avec des 1). Ceci permet de preserver la duree de vie de la flash.
Le code initial d'Epsilon 15.5 compte les 0 modulo 3 pour connaitre l'etat du mode examen, et permet d'ajouter 1 ou 2 zeros pour modifier l'etat du mode examen.
- Code: Tout sélectionner
* We erase the dedicated flash sector (all bits written to 1) and, upon
* deactivating or activating standard or Dutch exam mode we write one or two
* bits to 0. To determine in which exam mode we are, we count the number of
* leading 0 bits. If it is equal to:
* - 0[3]: the exam mode is off;
* - 1[3]: the standard exam mode is activated;
* - 2[3]: the Dutch exam mode is activated. */
Le code d'Omega voudrait permettre d'ajouter jusqu'a 4 zeros.
- Code: Tout sélectionner
* We erase the dedicated flash sector (all bits written to 1) and, upon
* deactivating or activating standard, nosym or Dutch exam mode we write one, two or tree
* bits to 0. To determine in which exam mode we are, we count the number of
* leading 0 bits. If it is equal to:
* - 0[3]: the exam mode is off;
* - 1[3]: the standard exam mode is activated;
* - 2[3]: the NoSym exam mode is activated;
* - 3[3]: the Dutch exam mode is activated;
* - 4[3]: the NoSymNoText exam mode is activated. */
Le modulo 3 n'a plus de sens, il faudrait faire modulo 5. Ca pourrait etre un oubli dans le commentaire. Mais dans la suite du code d'Omega, les %3 ont ete remplaces par des %4 et pas par des %5 (ce qui rend d'ailleurs le code bizarre parce qu'il y a de multiplications par 8 suivies par des modulos 4 qui ne servent a rien).
Plus embetant, il y a des tests qu'il faut modifier pour savoir si un ou 2 octets doivent etre reflashes.
- Code: Tout sélectionner
// Write the value in flash
/* As the number of changed bits is capped by 2, if *writingAddress has more
* than one remaining 1 bit, we know we toggle bits only in the first byte of
* newValue. We can settle for writing one byte instead of two. */
size_t writtenFlash = *writingAddress == 1 ? sizeof(uint16_t) : sizeof(uint8_t);
/* Avoid writing out of sector */
assert(writingAddress < (uint8_t *)&_exam_mode_buffer_end - 1 || (writingAddress == (uint8_t *)&_exam_mode_buffer_end - 1 && writtenFlash == 1));
Ion::Device::Flash::WriteMemory(writingAddress, newValue, writtenFlash);
Le nombre de bits a modifier n'est plus borne par 2 dans le cas d'Omega. Il est borne par 4, donc il faut remplacer par *writingAddress<=15. De meme plus haut
- Code: Tout sélectionner
if (persitence_start_8 == persitence_end_8
// we can't toggle from 0[3] to 2[3] when there is only one 1 bit in the whole sector
|| (persitence_start_8 + 1 == persitence_end_8 && *persitence_start_8 == 1)) {
il faut tester si *persitence_start_8 <=15