π
<-
Chat plein-écran
[^]

Phi pour N0110: déverrouillage + multiboot Omega 2.0

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

Message non lude 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: Tout sélectionner
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: Tout sélectionner
#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);
}

}
}
Avatar de l’utilisateur
parisseVIP++
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 77.2%
 
Messages: 3500
Inscription: 13 Déc 2013, 16:35
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

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

Message non lude 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.
Avatar de l’utilisateur
parisseVIP++
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 77.2%
 
Messages: 3500
Inscription: 13 Déc 2013, 16:35
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

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

Message non lude critor » 04 Avr 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
Avatar de l’utilisateur
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Prochain niv.: 41.8%
 
Messages: 41467
Images: 14480
Inscription: 25 Oct 2008, 00:00
Localisation: Montpellier
Genre: Homme
Calculatrice(s):
MyCalcs profile
YouTube: critor3000
Twitter/X: critor2000
GitHub: critor

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

Message non lude stevetuc » 05 Avr 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?
Avatar de l’utilisateur
stevetuc
Niveau 3: MH (Membre Habitué)
Niveau 3: MH (Membre Habitué)
Prochain niv.: 52%
 
Messages: 18
Inscription: 06 Avr 2015, 10:05
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

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

Message non lude parisse » 05 Avr 2022, 11:08

stevetuc a écrit: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.
Avatar de l’utilisateur
parisseVIP++
Niveau 12: CP (Calculatrice sur Pattes)
Niveau 12: CP (Calculatrice sur Pattes)
Prochain niv.: 77.2%
 
Messages: 3500
Inscription: 13 Déc 2013, 16:35
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

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

Message non lude stevetuc » 06 Avr 2022, 10:01

Thanks, I'll give that a try.
Avatar de l’utilisateur
stevetuc
Niveau 3: MH (Membre Habitué)
Niveau 3: MH (Membre Habitué)
Prochain niv.: 52%
 
Messages: 18
Inscription: 06 Avr 2015, 10:05
Genre: Non spécifié
Calculatrice(s):
MyCalcs profile

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

Message non lude critor » 07 Avr 2022, 10:31

parisse a écrit: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
Avatar de l’utilisateur
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Prochain niv.: 41.8%
 
Messages: 41467
Images: 14480
Inscription: 25 Oct 2008, 00:00
Localisation: Montpellier
Genre: Homme
Calculatrice(s):
MyCalcs profile
YouTube: critor3000
Twitter/X: critor2000
GitHub: critor

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

Message non lude critor » 07 Avr 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
Avatar de l’utilisateur
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Prochain niv.: 41.8%
 
Messages: 41467
Images: 14480
Inscription: 25 Oct 2008, 00:00
Localisation: Montpellier
Genre: Homme
Calculatrice(s):
MyCalcs profile
YouTube: critor3000
Twitter/X: critor2000
GitHub: critor

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

Message non lude critor » 15 Avr 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
Avatar de l’utilisateur
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Prochain niv.: 41.8%
 
Messages: 41467
Images: 14480
Inscription: 25 Oct 2008, 00:00
Localisation: Montpellier
Genre: Homme
Calculatrice(s):
MyCalcs profile
YouTube: critor3000
Twitter/X: critor2000
GitHub: critor

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

Message non lude critor » 22 Avr 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
Avatar de l’utilisateur
critorAdmin
Niveau 19: CU (Créateur Universel)
Niveau 19: CU (Créateur Universel)
Prochain niv.: 41.8%
 
Messages: 41467
Images: 14480
Inscription: 25 Oct 2008, 00:00
Localisation: Montpellier
Genre: Homme
Calculatrice(s):
MyCalcs profile
YouTube: critor3000
Twitter/X: critor2000
GitHub: critor

PrécédenteSuivante

Retourner vers News NumWorks

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 25 invités

-
Rechercher
-
Social TI-Planet
-
Sujets à la une
Comparaisons des meilleurs prix pour acheter sa calculatrice !
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
Phi NumWorks jailbreak
123
-
Faire un don / Premium
Pour plus de concours, de lots, de tests, nous aider à payer le serveur et les domaines...
Faire un don
Découvrez les avantages d'un compte donateur !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partenaires et pub
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1931 utilisateurs:
>1911 invités
>16 membres
>4 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Autres sites intéressants
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)