Unification des sources CM4/CM5 : makefiles scindés (common/cm4/cm5/cm5.debug), #ifdef CIBLE_CM5 pour GPIO, correctifs get_ip_address()/signal handler/backtrace, portabilité 32/64 bits

This commit is contained in:
2026-09-23 14:51:33 +02:00
parent 8fe204361b
commit fdf08bf1d7
23 changed files with 373 additions and 154 deletions
+75 -8
View File
@@ -1593,11 +1593,11 @@ char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG];
//Fermeture de MySQL :
mysql_close(bdd.pointeur);
// Désactivation des sorties de commandes d'alimentations :
// ecriture_sortie(TYPE_SORTIE_GPIO, 0, CM3P_DO_USBPWR_EN, OFF); // Coupure de l'alim des USB /!\ Il ne faut PAS couper en mode debuug ous peine de ne plus avoir accès au réseau Ethernet via le routeur USB/Ethernet....!
// ecriture_sortie(TYPE_SORTIE_GPIO, 0, audio.cle_primaire_sortie_cm_do_audio_sd, OFF); // Coupure du circuit audio
ecriture_sortie(TYPE_SORTIE_GPIO, 0, audio.sortie_gpio_cm_do_audio_sd, OFF); // 0 est l'adresse de ShipBase// Coupure du circuit audio (évite les glitch désagréable après un CTR+C)
// ecriture_sortie(TYPE_SORTIE_GPIO, 0, ecran.cle_primaire_sortie_cm_pdown_hdmi_cmd_n, OFF); // Coupure de la sortie du flux HDMI
// ecriture_sortie(TYPE_SORTIE_GPIO, 0, ecran.cle_primaire_sortie_cm_do_lcd_en_vgx, OFF); // Coupure de l'alim VGx
@@ -1792,6 +1792,8 @@ char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG];
printf("\n");
}
json_object_put(parsed_json); // Libère l'objet JSON racine (et, par cascade, tous ses sous-objets/champs internes)
return(json_version);
}
@@ -1887,13 +1889,25 @@ int8_t version_compute_module(void)
FILE *fp;
char revcode[32];
uint32_t code;
unsigned long long nb_secteurs;
unsigned long long taille_octets;
double taille_go_reelle;
char chaine_valeur[300];
char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG];
//========================================================================================================
// Lecture des données système et extraction des données :
//========================================================================================================
//---------------------------------------------------------------
fp = popen("cat /proc/cpuinfo | awk '/Revision/ {print $3}'", "r"); // récupération du code de Révision via la commande "cat /proc/cpuinfo | awk '/Revision/ {print $3}'". Exemple de retour : "c03141"
if (fp == NULL) return(-1); // Cas où la commande n'a pas pu être exécutée correctement
if (fp == NULL)
{
affichage_debug(__FILE__, __LINE__, "/!\\ La lecture du fichier 'cpuinfo' est impossible...!", TYPE_MESSAGE_DEBUG_ERREUR);
return(-1);
}
fgets(revcode, sizeof(revcode), fp); // Lecture de la ligne
pclose(fp); // Fermeturre du fichier
@@ -1905,13 +1919,41 @@ char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG];
systeme.cm.otp_reading_allowed = (code >> 29) & 0x1;
systeme.cm.warranty_bit = (code >> 25) & 0x1;
systeme.cm.new_style_revision = (code >> 23) & 0x1;
systeme.cm.memory_size = (code >> 20) & 0x7;
systeme.cm.ram_size = (code >> 20) & 0x7;
systeme.cm.manufacturer = (code >> 16) & 0x0F;
systeme.cm.processor = (code >> 12) & 0x0F;
systeme.cm.type = (code >> 4) & 0xFF;
systeme.cm.revision = (code >> 0) & 0x0F;
if (systeme.cm.new_style_revision == 0) // Ce bit indique le format du code de révision. Le 'new' type est actif depuis le RaspberryPi2 donc on devrait toujours être dans ce cas...
//---------------------------------------------------------------
fp = fopen("/sys/block/mmcblk0/size", "r");
if (fp == NULL)
{
affichage_debug(__FILE__, __LINE__, "/!\\ La lecture du fichier 'cpuinfo' est impossible...!", TYPE_MESSAGE_DEBUG_ERREUR);
return(-1);
}
if (fscanf(fp, "%llu", &nb_secteurs) != 1)
{
affichage_debug(__FILE__, __LINE__, "/!\\ La lecture du nombre de secteurs de flash est impossible...!", TYPE_MESSAGE_DEBUG_ERREUR);
return(-1);
}
fclose(fp);
taille_octets = nb_secteurs * 512ULL; // /sys/block/<dev>/size est toujours exprimé en secteurs de 512 octets, quelle que soit la taille physique du secteur
taille_go_reelle = (double)taille_octets / 1000000000.0; // Go décimaux (norme fabricants eMMC), pas Gio
systeme.cm.flash_size = taille_octets;
//========================================================================================================
// Traitement de l'affichage de debug et génération de la ligne 'Version_cm" de TB_Systeme :
//========================================================================================================
if (systeme.cm.new_style_revision == 0) // Ce bit indique le format du code de révision. Le 'new' type est actif depuis le RaspberryPi2 donc on devrait toujours être dans ce cas...
{
sprintf(tmp, "/!\\ Le bit de style de révision indique un ancien style de révision qui ne peut pas être lu...!");
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_ERREUR);
@@ -1948,7 +1990,12 @@ char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG];
case 0x13 : { strcpy(chaine_valeur, "400"); break; }
case 0x14 : { strcpy(chaine_valeur, "CM4"); break; }
case 0x15 : { strcpy(chaine_valeur, "CM4S"); break; }
case 0x16 : { strcpy(chaine_valeur, "Internal Use only"); break; }
case 0x17 : { strcpy(chaine_valeur, "5"); break; }
case 0x18 : { strcpy(chaine_valeur, "CM5"); break; }
case 0x19 : { strcpy(chaine_valeur, "500/500+"); break; }
case 0x1A : { strcpy(chaine_valeur, "CM5 Lite"); break; }
case 0x1B : { strcpy(chaine_valeur, "CM0"); break; }
case 0x07 :
case 0x0B :
@@ -1964,7 +2011,7 @@ char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG];
//---------------------------------------------------------------
switch (systeme.cm.memory_size)
switch (systeme.cm.ram_size)
{
case 0 : { strcpy(chaine_valeur, "256Mo"); break; }
case 1 : { strcpy(chaine_valeur, "512Mo"); break; }
@@ -1972,9 +2019,11 @@ char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG];
case 3 : { strcpy(chaine_valeur, "2Go"); break; }
case 4 : { strcpy(chaine_valeur, "4Go"); break; }
case 5 : { strcpy(chaine_valeur, "8Go"); break; }
case 6 : { strcpy(chaine_valeur, "16Go"); break; }
case 7 : { strcpy(chaine_valeur, ">16Go"); break; }
default :
{
sprintf(chaine_valeur, "Inconnue [code = %i]", systeme.cm.memory_size);
sprintf(chaine_valeur, "Inconnue [code = %i]", systeme.cm.ram_size);
break;
}
}
@@ -1982,6 +2031,25 @@ char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG];
strcat(systeme.cm.chaine_version, "-");
strcat(systeme.cm.chaine_version, chaine_valeur);
strcat(systeme.cm.chaine_version, "[RAM]");
//---------------------------------------------------------------
// Arrondi à la taille commerciale la plus proche (la capacité réelle exposée est toujours < capacité nominale, à cause du sur-provisionnement)
if (taille_go_reelle <= 9.0) strcpy(chaine_valeur, "8Go");
else if (taille_go_reelle <= 18.0) strcpy(chaine_valeur, "16Go");
else if (taille_go_reelle <= 36.0) strcpy(chaine_valeur, "32Go");
else if (taille_go_reelle <= 72.0) strcpy(chaine_valeur, "64Go");
else if (taille_go_reelle <= 144.0) strcpy(chaine_valeur, "128Go");
else sprintf(chaine_valeur, "%.1fGo", taille_go_reelle);
affichage_ligne_version_compute_module(tmp, "Taille Flash", chaine_valeur);
strcat(systeme.cm.chaine_version, "-");
strcat(systeme.cm.chaine_version, chaine_valeur);
strcat(systeme.cm.chaine_version, "[FLASH]");
//---------------------------------------------------------------
@@ -2064,7 +2132,6 @@ char tmp[MAX_LONGUEUR_BUFFER_TEMPORAIRE_DEBUG];
}
affichage_ligne_version_compute_module(tmp, "Processeur", chaine_valeur);
//---------------------------------------------------------------
affichage_debug(__FILE__, __LINE__, tmp, TYPE_MESSAGE_DEBUG_OK);