π
<-

Phi pour N0110: déverrouillage + multiboot Omega 2.0

Online

Re: Phi pour N0110: déverrouillage + multiboot Omega 2.0

Unread postby parisse » 29 Mar 2022, 08:37

Le code que je propose pour exam_mode.cpp, sous forme de diff et ci-dessous en entier.
Apres, je n'ai pas encore compris comment le changement de slot du bootloader interfere avec le mode examen. D'ailleurs en lisant boot.cpp du bootloader j'ai l'impression que MAXDELTA devrait valoir 4 plutot que 5.
Code: Select all
6,7d5
< #define MAXDELTA 5 // must be <= 8
<
26,30c24,28
<  * - 0[MAXDELTA]: the exam mode is off;
<  * - 1[MAXDELTA]: the standard exam mode is activated;
<  * - 2[MAXDELTA]: the NoSym exam mode is activated;
<  * - 3[MAXDELTA]: the Dutch exam mode is activated;
<  * - 4[MAXDELTA]: the NoSymNoText exam mode is activated. */
---
>  * - 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. */
33,34c31,32
<  * flash sector that does not point to 0. If this flash sector does not have
<  * enough 1, it is erased (to 1) and significantExamModeAddress
---
>  * flash sector that does not point to 0. If this flash sector has only 0s or
>  * if it has only one 1, it is erased (to 1) and significantExamModeAddress
39c37
< // if i = 0b00011101, firstOneBitInByte(i) returns 5
---
> // if i = 0b000011101, firstOneBitInByte(i) returns 5
70c68,69
<       || (persitence_start_8 + 1 == 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)) {
82c81
<   uint32_t nbOfZerosBefore = ((readingAddress - (uint8_t *)&_exam_mode_buffer_start) * numberOfBitsInByte) % MAXDELTA;
---
>   uint32_t nbOfZerosBefore = ((readingAddress - (uint8_t *)&_exam_mode_buffer_start) * numberOfBitsInByte) % 4;
84,85c83,84
<   size_t numberOfLeading0 = (numberOfBitsInByte - numberOfBitsAfterLeadingZeroes(*readingAddress)) % MAXDELTA;
<   return (nbOfZerosBefore + numberOfLeading0) % MAXDELTA;
---
>   size_t numberOfLeading0 = (numberOfBitsInByte - numberOfBitsAfterLeadingZeroes(*readingAddress)) % 4;
>   return (nbOfZerosBefore + numberOfLeading0) % 4;
89c88
<   assert(delta >= 1 && delta < MAXDELTA);
---
>   assert(delta == 1 || delta == 2 || delta == 3);
95c94
<   /* We write in 2 bytes instead of 1, in case there were not enough bits
---
>   /* We write in 2 bytes instead of 1, in case there was only one bit
113c112,115
<   size_t writtenFlash = *writingAddress <= (1<<(MAXDELTA-1))-1 ? sizeof(uint16_t) : sizeof(uint8_t);
---
>   /* 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);
115c117
<   assert(writingAddress < (uint8_t *)&_exam_mode_buffer_end - 1 );
---
>   assert(writingAddress < (uint8_t *)&_exam_mode_buffer_end - 1 || (writingAddress == (uint8_t *)&_exam_mode_buffer_end - 1 && writtenFlash == 1));

et au complet
Code: Select all
#include <ion/exam_mode.h>
#include <drivers/config/exam_mode.h>
#include "flash.h"
#include <assert.h>

#define MAXDELTA 5 // must be <= 8

extern "C" {
  extern char _exam_mode_buffer_start;
  extern char _exam_mode_buffer_end;
}

namespace Ion {
namespace ExamMode {

char ones[Config::ExamModeBufferSize]
  __attribute__((section(".exam_mode_buffer")))
  __attribute__((used))
= {EXAM_BUFFER_CONTENT};

/* The exam mode is written in flash so that it is resilient to resets.
* 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[MAXDELTA]: the exam mode is off;
* - 1[MAXDELTA]: the standard exam mode is activated;
* - 2[MAXDELTA]: the NoSym exam mode is activated;
* - 3[MAXDELTA]: the Dutch exam mode is activated;
* - 4[MAXDELTA]: the NoSymNoText exam mode is activated. */

/* significantExamModeAddress returns the first uint32_t * in the exam mode
* flash sector that does not point to 0. If this flash sector does not have
* enough 1, it is erased (to 1) and significantExamModeAddress
* returns the start of the sector. */

constexpr static size_t numberOfBitsInByte = 8;

// if i = 0b00011101, firstOneBitInByte(i) returns 5
size_t numberOfBitsAfterLeadingZeroes(int i) {
  int minShift = 0;
  int maxShift = numberOfBitsInByte;
  while (maxShift > minShift+1) {
    int shift = (minShift + maxShift)/2;
    int shifted = i >> shift;
    if (shifted == 0) {
      maxShift = shift;
    } else {
      minShift = shift;
    }
  }
  return maxShift;
}

uint8_t * SignificantExamModeAddress() {
  uint32_t * persitence_start_32 = (uint32_t *)&_exam_mode_buffer_start;
  uint32_t * persitence_end_32 = (uint32_t *)&_exam_mode_buffer_end;
  assert((persitence_end_32 - persitence_start_32) % 4 == 0);
  while (persitence_start_32 < persitence_end_32 && *persitence_start_32 == 0x0) {
    // Scan by groups of 32 bits to reach first non-zero bit
    persitence_start_32++;
  }
  uint8_t * persitence_start_8 = (uint8_t *)persitence_start_32;
  uint8_t * persitence_end_8 = (uint8_t *)persitence_end_32;
  while (persitence_start_8 < persitence_end_8 && *persitence_start_8 == 0x0) {
    // Scan by groups of 8 bits to reach first non-zero bit
    persitence_start_8++;
  }
  if (persitence_start_8 == persitence_end_8
      || (persitence_start_8 + 1 == persitence_end_8 )) {
    assert(Ion::Device::Flash::SectorAtAddress((uint32_t)&_exam_mode_buffer_start) >= 0);
    Ion::Device::Flash::EraseSector(Ion::Device::Flash::SectorAtAddress((uint32_t)&_exam_mode_buffer_start));
    return (uint8_t *)&_exam_mode_buffer_start;
  }

  return persitence_start_8;
}

uint8_t FetchExamMode() {
  uint8_t * readingAddress = SignificantExamModeAddress();
  // Count the number of 0[3] before reading address
  uint32_t nbOfZerosBefore = ((readingAddress - (uint8_t *)&_exam_mode_buffer_start) * numberOfBitsInByte) % MAXDELTA;
  // Count the number of 0[3] at reading address
  size_t numberOfLeading0 = (numberOfBitsInByte - numberOfBitsAfterLeadingZeroes(*readingAddress)) % MAXDELTA;
  return (nbOfZerosBefore + numberOfLeading0) % MAXDELTA;
}

void IncrementExamMode(uint8_t delta) {
  assert(delta >= 1 && delta < MAXDELTA);
  uint8_t * writingAddress = SignificantExamModeAddress();
  assert(*writingAddress != 0);
  size_t nbOfTargetedOnes = numberOfBitsAfterLeadingZeroes(*writingAddress);

  // Compute the new value with delta bits switched to 0.
  /* We write in 2 bytes instead of 1, in case there were not enough bits
   * left to 1 in writingAddress. */
  nbOfTargetedOnes += numberOfBitsInByte;
  nbOfTargetedOnes -= delta;
  constexpr size_t newValueSize = sizeof(uint16_t)/sizeof(uint8_t);
  uint8_t newValue[newValueSize];
  if (nbOfTargetedOnes > numberOfBitsInByte) {
    size_t nbOfTargetedOnesInFirstByte = nbOfTargetedOnes - numberOfBitsInByte;
    assert(nbOfTargetedOnesInFirstByte <= numberOfBitsInByte);
    newValue[0] = ((uint16_t)1 << nbOfTargetedOnesInFirstByte) - 1;
    newValue[1] = 0xFF;
  } else {
    assert(nbOfTargetedOnes <= numberOfBitsInByte);
    newValue[0] = 0;
    newValue[1] = ((uint16_t)1 << nbOfTargetedOnes) - 1;
  }

  // Write the value in flash
  size_t writtenFlash = *writingAddress <= (1<<(MAXDELTA-1))-1 ? sizeof(uint16_t) : sizeof(uint8_t);
  /* Avoid writing out of sector */
  assert(writingAddress < (uint8_t *)&_exam_mode_buffer_end - 1 );
  Ion::Device::Flash::WriteMemory(writingAddress, newValue, writtenFlash);
}

}
}
User avatar
parisseVIP++
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Level up: 86%
 
Posts: 3661
Joined: 13 Dec 2013, 16:35
Gender: Not specified
Calculator(s):
MyCalcs profile

Online

Re: Phi pour N0110: déverrouillage + multiboot Omega 2.0

Unread postby parisse » 29 Mar 2022, 09:26

Bon, j'avance.
Il y a en fait 3 zones de flash qui utilisent le driver du mode examen: une en flash interne et une par slot. Celle de la flash interne conserve le slot de boot (mais aucune info sur le mode examen), et chaque firmware conserve son propre etat du mode examen.
Avec le bootloader actuel, si on a un seul firmware installe, on est donc conforme a la reglementation.
Si on utilise 2 firmwares, il faut valider le mode examen dans chaque firmware separement au debut de l'examen. Pour eviter cette manip un peu suspecte, il faudrait que le bootloader qui connait le slot actif verifie l'etat du mode examen dans le slot actif et le reflete dans l'autre slot si il est valide. Mais ca suppose que le bootloader sache reconnaitre le firmware pour pouvoir ecrire dans la flash des 0.
Du coup, je crains fort que ca reponde par la negative a mon autre question sur comment connaitre l'adresse du scriptstore du firmware actif par le DFU. Car le slot actif est en flash interne et n'est donc pas lisible par DFU puisque le bootloader est actif.
User avatar
parisseVIP++
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Level up: 86%
 
Posts: 3661
Joined: 13 Dec 2013, 16:35
Gender: Not specified
Calculator(s):
MyCalcs profile

Re: Phi pour N0110: déverrouillage + multiboot Omega 2.0

Unread postby critor » 04 Apr 2022, 10:57

Sur YouTube, on trouve maintenant un tuto accompagnant les différentes étapes de l'installation de Phi + Omega en partant d'Epsilon v18.2.3, pendant que les utilisateurs le peuvent encore :bj:



N'aborde malheureusement pas le multiboot. C'est dommage vu que la pensée de perdre les fonctionnalités spécifiques aux Epsilon v16+ refroidira les utilisateurs n'étant pas au courant de cette possibilité, et d'autant plus dommage que c'est une configuration très simple à obtenir lorsque l'on part justement d'une machine déjà verrouillée sur Epsilon v18.2.3.
Image
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 47.5%
 
Posts: 41976
Images: 15730
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
MyCalcs profile
YouTube: critor3000
Twitter: critor2000
GitHub: critor

Re: Phi pour N0110: déverrouillage + multiboot Omega 2.0

Unread postby stevetuc » 05 Apr 2022, 10:31

It's getting quite confusing understanding what is/not possible in multibooting all the different firmware options. I currently have phi installed and Omega in slotA, Epsilon 18.2.0 in slotB. This arrangement doesn't allow me to install Khicas. It wipes the other slot. How can I dual boot and have Khicas?
User avatar
stevetuc
Niveau 3: MH (Membre Habitué)
Niveau 3: MH (Membre Habitué)
Level up: 52%
 
Posts: 18
Joined: 06 Apr 2015, 10:05
Gender: Not specified
Calculator(s):
MyCalcs profile

Online

Re: Phi pour N0110: déverrouillage + multiboot Omega 2.0

Unread postby parisse » 05 Apr 2022, 11:08

stevetuc wrote:It's getting quite confusing understanding what is/not possible in multibooting all the different firmware options. I currently have phi installed and Omega in slotA, Epsilon 18.2.0 in slotB. This arrangement doesn't allow me to install Khicas. It wipes the other slot. How can I dual boot and have Khicas?

Install KhiCAS from my site
https://www-fourier.univ-grenoble-alpes.fr/~parisse/nws.html
Make sure you overwrite Phi multiboot with Khi multiboot (it is proposed the first time you run KhiCAS).
Khi can boot 3 slots: slot 1 (=slot A of phi), slot 2 (not available on phi), slot 3 (=slot B of phi).
Slot 3 (=B) is incompatible with KhiCAS. But you can dual boot with any firmware in slot 1, and Khi in slot 2. And if you run KhiCAS from Khi in slot 2, you will have access to 176K of RAM, instead of 116K or 97K.
User avatar
parisseVIP++
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Level up: 86%
 
Posts: 3661
Joined: 13 Dec 2013, 16:35
Gender: Not specified
Calculator(s):
MyCalcs profile

Re: Phi pour N0110: déverrouillage + multiboot Omega 2.0

Unread postby stevetuc » 06 Apr 2022, 10:01

Thanks, I'll give that a try.
User avatar
stevetuc
Niveau 3: MH (Membre Habitué)
Niveau 3: MH (Membre Habitué)
Level up: 52%
 
Posts: 18
Joined: 06 Apr 2015, 10:05
Gender: Not specified
Calculator(s):
MyCalcs profile

Re: Phi pour N0110: déverrouillage + multiboot Omega 2.0

Unread postby critor » 07 Apr 2022, 10:31

parisse wrote:Install KhiCAS from my site
https://www-fourier.univ-grenoble-alpes.fr/~parisse/nws.html
Make sure you overwrite Phi multiboot with Khi multiboot (it is proposed the first time you run KhiCAS).
Khi can boot 3 slots: slot 1 (=slot A of phi), slot 2 (not available on phi), slot 3 (=slot B of phi).
Slot 3 (=B) is incompatible with KhiCAS. But you can dual boot with any firmware in slot 1, and Khi in slot 2. And if you run KhiCAS from Khi in slot 2, you will have access to 176K of RAM, instead of 116K or 97K.

C'est enfin annoncé de notre côté, j'espère ne pas avoir raconté trop de bêtises, et ne pas avoir oublié trop de choses non plus :
viewtopic.php?t=25595&p=267519#p267519

Merci pour ce formidable travail utile et salvateur qui tombe juste à temps pour les examens.
Image
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 47.5%
 
Posts: 41976
Images: 15730
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
MyCalcs profile
YouTube: critor3000
Twitter: critor2000
GitHub: critor

Re: Phi pour N0110: déverrouillage + multiboot Omega 2.0

Unread postby critor » 07 Apr 2022, 10:43

Nouveau tuto-vidéo d'installation de Phi+Omega toujours par GUIGUIPICH, cette fois-ci parfaitement clean pour ce que je peux voir ; ne devrait donc pas sauter :


Comme il n'y a aucun problème à ma connaissance, je rajoute aux liens utiles en fin d'annonces.

Toutefois ne traite toujours que de l'installation Phi+Omega, et pas du multiboot Epsilon 18 qui reste utile et parfois même essentiel pour les scolaires.
Et malheureusement, ne traite bien évidemment plus du cas de l'installation sur les machines qui ont déjà été passées sur Epsilon 18.2.3.
Image
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 47.5%
 
Posts: 41976
Images: 15730
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
MyCalcs profile
YouTube: critor3000
Twitter: critor2000
GitHub: critor

Re: Phi pour N0110: déverrouillage + multiboot Omega 2.0

Unread postby critor » 15 Apr 2022, 18:21

J'ai pointé à l'équipe Omega la non-conformité au mode examen français de Phi+Omega2 .
Ils réfléchissent pour une mise à jour à une solution, peut-être différente de celle de Khi/Upsilon.
Image
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 47.5%
 
Posts: 41976
Images: 15730
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
MyCalcs profile
YouTube: critor3000
Twitter: critor2000
GitHub: critor

Re: Phi pour N0110: déverrouillage + multiboot Omega 2.0

Unread postby critor » 22 Apr 2022, 11:45

La riposte semble se préciser, on commence à voir quelques signes de ce que NumWorks prépare depuis bientôt 3 semaines.

Le workshop officiel marque maintenant toutes tes machines enregistrées N0100 ou N0110 qui ne sont pas sous une configuration officielle (autre chose qu'Epsilon donc). Au choix :
  • "0.0.0 (unofficial)"
  • "0.0.0 (0000000)"


Une configuration multiboot avec Epsilon 18.2 est également marquée comme mauvaise comme on peut voir, sinon j'aurais eu la plupart des machines à jour.

Par contre, j'ignore totalement à ce jour les éventuelles conséquences négatives de ce marquage.
Image
User avatar
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Level up: 47.5%
 
Posts: 41976
Images: 15730
Joined: 25 Oct 2008, 00:00
Location: Montpellier
Gender: Male
Calculator(s):
MyCalcs profile
YouTube: critor3000
Twitter: critor2000
GitHub: critor

PreviousNext

Return to News NumWorks

Who is online

Users browsing this forum: ClaudeBot [spider] and 4 guests

-
Search
-
Social TI-Planet
-
Featured topics
Comparaisons des meilleurs prix pour acheter sa calculatrice !
"1 calculatrice pour tous", le programme solidaire de Texas Instruments. Reçois gratuitement et sans aucune obligation d'achat, 5 calculatrices couleur programmables en Python à donner aux élèves les plus nécessiteux de ton lycée. Tu peux recevoir au choix 5 TI-82 Advanced Edition Python ou bien 5 TI-83 Premium CE Edition Python.
Enseignant(e), reçois gratuitement 1 exemplaire de test de la TI-82 Advanced Edition Python. À demander d'ici le 31 décembre 2024.
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
1234
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...
Donate
Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
681 utilisateurs:
>629 invités
>44 membres
>8 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)