1

salut,

j’essaie de modifier le binaire du kernel, mon but est de modifier le logo de boot actuel,
je possède le patch des sources,
j'ai appliqué le patch, lancé la compilation, ça ma généré depuis le ppm un fichier C

depuis le fichier C j'ai pécho les tailles des deux tableaux, que j'ai présumé le raw 8bit de l'image et la palette,
j'ai pécho assez d'octet au début comme signature,
ai extrait le gz du kernel compressé de uImage, l'ai decompacté
(dans un second temps j'ai trouvé ce script qui me sort aussi un footer de 60 octets et c'est plus simple qu'à la main avec dd)
j'ai trouvé les offset de l'image et la palette dans le binaire du kernel avec binwalk .. avec dd j'ai extrait deux fichiers brut correspondant aux deux tableaux

j'ai fait un programme chargeant un png quelconque, comptant les couleurs, me générant un 8bit + palette avec verif des couleurs max et nombre de px suivant l'image originale,
il charge le binaire du kernel, l'image originale, la palette originale, trouve les offset et écrase avec la nouvelle image/palette
source
#include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <cstring> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/ioctl.h> #include <termios.h> #include <errno.h> #include <signal.h> #include <png.h> using namespace std; #define u8 u_int8_t #define u16 u_int16_t #define u32 u_int32_t #define ARGS_MAX_LENGTH 8 #define MAX_ARGS 2 #define wait(ms) usleep(ms*1000) u8 * png2img(const char* file, int*width , int*height){ png_byte color_type; png_byte bit_depth; png_structp png_ptr; png_infop info_ptr; png_bytep * row_pointers; char header[8]; /* open file and test for it being a png */ FILE *fp = fopen(file, "rb"); if (!fp) return 0; fread(header, 1, 8, fp); if(png_sig_cmp((const unsigned char*)header, 0, 8)) return 0; /* initialize stuff */ png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); if(!png_ptr) return 0; info_ptr = png_create_info_struct(png_ptr); if(!info_ptr) return 0; if(setjmp(png_jmpbuf(png_ptr))) return 0; png_init_io(png_ptr, fp); png_set_sig_bytes(png_ptr, 8); png_read_info(png_ptr, info_ptr); *width = png_get_image_width(png_ptr, info_ptr); *height = png_get_image_height(png_ptr, info_ptr); color_type = png_get_color_type(png_ptr, info_ptr); bit_depth = png_get_bit_depth(png_ptr, info_ptr); if(bit_depth == 16) png_set_strip_16(png_ptr); if(color_type == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(png_ptr); // PNG_COLOR_TYPE_GRAY_ALPHA is always 8 or 16bit depth. if(color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) png_set_expand_gray_1_2_4_to_8(png_ptr); if(png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png_ptr); // These color_type don't have an alpha channel then fill it with 0xff. if(color_type == PNG_COLOR_TYPE_RGB || color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_PALETTE) png_set_filler(png_ptr, 0xFF, PNG_FILLER_AFTER); if(color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA) png_set_gray_to_rgb(png_ptr); png_read_update_info(png_ptr, info_ptr); row_pointers = (png_bytep*) malloc(sizeof(png_bytep) * *height); if( !row_pointers ) return 0; for (int y=0; y<*height; y++){ row_pointers[y] = (png_byte*) malloc(png_get_rowbytes(png_ptr,info_ptr)); if( !row_pointers[y] ) return 0; } png_read_image(png_ptr, row_pointers); fclose(fp); u8 * bf = (u8*)malloc( *width * *height + 225*4 ); if( !bf ) return 0; u8 *img = &bf[225*4], *i = img; u32 *nbColor = (u32*)bf, *colors = nbColor + 1, *start = colors, *end = start+1; int x, y, px=0; for( y = 0 ; y < *height ; y++){ png_byte* row = row_pointers[y]; u32 * c = (u32*)row, n; for( x = 0; x < *width; x++){ px++; *c &= 0xffffff; u32 * p = start; while( p < end && *c != *p ) p++; if( p != end ){ // found //printf("use color %u\n", p - start); *i++ = p - start; } else { // new color if( *nbColor == /*224*/ 224 ){ printf("too much colors, stop at %u, on px %u\n",*nbColor,px); free(bf); return 0; } *i++ = *nbColor; *nbColor = *nbColor + 1; *end++ = *c; //printf("new color %u 0x%x\n", *nbColor, *c); } c++; // next pixel } free(row); } free(row_pointers); return bf; } u32 getSize(FILE *f) { int last, size ; last = ftell(f) ; fseek(f,0,SEEK_END) ; size = ftell(f) ; fseek(f,last,SEEK_SET) ; return size ; } u8 * loadFile(const char *path, u32*size) { FILE *f ; int sz ; u8 * fl ; f = fopen(path,"r") ; if(!f) return 0; else { sz = getSize(f) ; if(size) *size=sz; } fl = (u8*)malloc(sz) ; if( !fl ) return 0; fread(fl,sz,1,f) ; fclose(f) ; return fl ; } u32 writeFile(const char *path, void*buffer, u32 size) { FILE *f = fopen(path,"w") ; if(!f) return 0 ; fwrite(buffer,size,1,f);fclose(f); return 1; } int main(int argc, char const *argv[]) { int width, height, nbpx; // load png into a 8b raw buffer u8 * bf = png2img( argv[1], &width, &height ); if( !bf ){ printf("cannot load picture\n"); return EXIT_FAILURE; } nbpx = width * height; u32 *nbColor = (u32*)bf, *pal = nbColor + 1; u8 *img = (u8*)&bf[225]; printf( "%u colors found\n", *nbColor ); /*for( int n=0; n < *nbColor ; n++ ){ printf("%u - 0x%x\n", n, pal[n]); }*/ u32 kernelLength = 0, pictureLength = 0, palLength = 0; u8 * kernel = loadFile("./kernel", &kernelLength); if( !kernel ) return EXIT_FAILURE; u8 * picture = loadFile("./picture", &pictureLength); if( !picture ) return EXIT_FAILURE; u8 * kpal = loadFile("./pal", &palLength); if( !kpal ) return EXIT_FAILURE; if( kernelLength < pictureLength || nbpx > pictureLength ){ printf("impossible\n"); free( kernel ); free( picture ); free( bf ); return EXIT_FAILURE; } u8 *k = kernel, *kend = k + kernelLength - pictureLength; while( k <= kend && memcmp( k, picture, pictureLength ) ) k++; if( k == kend ){ // not found printf("picture not found in kernel\n"); free( kernel ); free( picture ); free( kpal ); free( bf ); return EXIT_FAILURE; } // found printf("picture found in kernel at offset %u\n", k - kernel); printf("replace original picture..\n"); memcpy( k, img, nbpx ); memset( k+nbpx, 0, pictureLength-nbpx ); k = kernel; kend = k + kernelLength - palLength; while( k <= kend && memcmp( k, kpal, palLength ) ) k++; if( k == kend ){ // not found printf("palette not found in kernel\n"); free( kernel ); free( picture ); free( kpal ); free( bf ); return EXIT_FAILURE; } // found printf("palette found in kernel at offset %u\n", k - kernel); printf("replace original palette..\n"); memset( k, 0, palLength ); u8 * p = (u8*)pal; for( int n=0;n < *nbColor; n++ ){ *k++ = *p++; *k++ = *p++; *k++ = *p++; p++; } //memcpy( k, pal, ( *nbColor ) * 4 ); /* > 56*12 672 > 672/4 168 > 672/3 224 > */ writeFile("./kernel.patched",kernel,kernelLength); free( kernel ); free( picture ); free( kpal ); free( bf ); return EXIT_SUCCESS; }

ensuite je refait le gz via un gzip --no-name puis cat header kernel.gz footer > uImage

mais ca bloque au splash screen de uboot :- /

je ne peux debuguer via le port série, impossible de ne recevoir autre chose que de la merde malgré les deux adaptateurs différents et les milliard d'essais à différents baudrate et changement de config sur différents kernel fonctionels via stty

je n'ai plus d'idées ... si vous en auriez une ^^

2

visiblement verif de CRC par uboot, je testerais de jouer du mkimage plutôt que du cat ^^

3

Tu ne serait pas en train d'essayer de reinventer une roue qui existe et fonctionne plutot bien?
avatarProud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

4

à quel niveau ?

5

Ben soit tu veux changer les Tux, et on ne patche pas le kernel pour ca, on le configure et recompile (la configuration est prevu pour ca)

http://www.armadeus.org/wiki/index.php?title=Linux_Boot_Logo

Soit tu veux mettre un bootsplash, et il y a plein plein plein d'utilitaires pour cela

Genre Xplash chez Ubuntu: https://launchpad.net/xsplash
fbsplash:
Framebuffer Boot Splash ScreenSourceForgeDownload Framebuffer Boot Splash Screen for free. fbsplash is a userspace implementation of a splash screen for Linux systems. It provides a graphical environment during system boot using the Linux framebuffer layer.



Problemes avec ton approche:

Le fichier uImage n'est pas qu'une simple archive GZ avec une entete. Il y a du code, checksum et autre.
Le tux au boot est joli, mais a la base ce n'est pas un splash screen, mais en fait un indicateur du nombre de CPU dans la machine, et quelqu'un de bourré c'est dit "tiens et si on affichais des TUX plutot qu'un chiffre" et c'est resté.

Si ce que tu veux est avoir un boot propre avec un logo, utilise les options en ligne de commande du kernel pour etre muet par defaut et ne pas afficher les tux, et utilise un outil comme fbsplash pour afficher comme bon te semble un boot splash. Tu auras beaucoup plus de control, et aucun "patch" a faire sur le kernel.
avatarProud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

6

Godzil (./3) :
Tu ne serait pas en train d'essayer de reinventer une roue qui existe et fonctionne plutot bien?
C'est robinHood hein, c'est un peu sa spécialité cheeky
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

7

xD
avatarProud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

8

intéressant les utilitaires pour mettre un bootsplash, malgré toutes mes recherches je n’étais tombé dessus

après il ne me reste qu'à patcher l’entête uboot pour recalculer le crc du gz, autant changer le ppm original de tux inclus dans le kernel

aussi si il faut désactiver tux pour ça la je ne peux pas, la config du kernel en ligne de commande est dans le fichier conf de uboot, ça ne lui plaît pas du tout que je la touche et le code d'uboot utilisé n'a pas été releasé :/ après je n'ai pas tenté de le recompiler

reconfigurer et recompiler le kernel c'est ce que je fais depuis un moment, mais en utilisant le code du master, j'ai donc patché les patch fait pour du 4.x ... tout sauf le splash modifié que j'ai dégagé pour donc voir tux (et visiblement le crop n'est pas supporté, seul trois sont affichés pour quatre coeurs)

le soucis c'est que ça reste figé sur les tux, techniquement je voudrais donc plutôt afficher la console au boot, sans succès pour le moment malgré mass recherches/config/compilation
j'ai donc bidouillé pour foutre dans un connecteur supra petit des pattes de resistance et utiliser un usbttl .. que de la merde, mais c'est une autre histoire

> Le fichier uImage n'est pas qu'une simple archive GZ avec une entete.
oui, l'ente uboot, du code de décompression et le kernel compressé, binwalk le parse super bien, firmware mod kit lui ne peux bosser dessus par contre :/
après c'est mkimage du package uboot-tools qui génère uImage depuis le kernel

perso le splash je m'en tape, c'est plus une demande communautaire, donc pas question de recompiler pour eux ou les faire galérer à tout mettre en place pour qu'ils le fassent eux même, patcher leur kernel existant me parait une solution viable

9

Si ce n'est pas pour toi, oublie. Ce n'est pas un moyen correcte de faire une release publique. Si c'est pour toi et ta propre bidouille fait toi plaisir, si c'est pour distribuer, non.

Et non pas que l'entete uBoot, il y a aussi le bootstrap du kernel xD

Ton probleme avec la config d'uboot est absolument pas normal. Tu ne doit pas generer le fichier comme il faut, ou alors ton uBoot ne cherche pas ce fichier mais un autre (voir il ne cherche pas de fichier du tout)


Pour enlever les tux, il faut ajouter "logo=nologo" a la ligne de commande. Associé a un quiet, et tu n'a plus qu'a avoir un outil qui affiche sur le framebuffer l'image de ton choix.


Tu utilise bien:

mkimage -C none -A arm -T script -d /boot/boot.cmd /boot/boot.scr

pour faire le fichier de config depuis un fichier texte local?
avatarProud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

10

si j'arrive à repackager proprement le kernel en quoi ce ne serait pas "propre" ?

je n'ai touché la conf d'uboot que quant j'ai tenté de changer le baudrate, fait à l'arrache en éditant directement le scr ou se trouve la conf en clair, mais la aussi il devait y avoir un checksum dans les parages..
merci pour la commande qui génère sa conf ! je ne pensais pas devoir mettre "script" plutôt que "conf" dans mes recherches cheeky

11

Parce que c'est super périlleux? (et aussi que personne ne fait ca? Surtout avec un projet open source..)
avatarProud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

12

bon j'ai pu trouver deux minutes pour rebidouiller tout ça :- )

la commande pour changer la conf d'uboot à fonctionné au poil, j'ai pu rajouter au passage un console=tty en rab qui m'a direct fait afficher la console au boot \o/

par contre c'etait logo.nologo sans =, avec le logo affiché on ne vois que la dernière ligne du shell

donc je me suis dis holyshit je peux enfin debuguer le dernier kernel et va savoir pourquoi, inutile il à booté direct ???!
peut être à cause du dtb de l'os 1.0 que je n'ai pas remplacé par le mien ? je dois investiguer ^^

dZtE

13

Tu pouvais indiquer le hardware direct tu sais, on aurais pu aller plus vite tongue
avatarProud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

14

c'est vrai :P

tu avais réussi à établir correctement la liaison rs232 par le pinout de steward-fu ?

15

Oui et l'interet est tres limité a moins de faire/devoir faire certains choses bien précises, je ne recommande pas.

Et je n'ai pas besoin de "steward-fu" pour savoir ou aller chercher les broches du port serie, suffit de lire 1 min la schematique pour savoir quoi faire.
avatarProud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

16

il avait le mérite d'indiquer que le connecteur était inversé
ici pour le coup j'aurais eu les printk du boot

je reçoit toutes les trames mais comme si le baudrate était mauvais
j'avais trouvé des choses comme quoi le bluetooth touchait le baudrate de l'uart sur les chip sunxi
ça doit donc être mes adaptateurs qui ne sont pas compatibles les deux sont basés sur du pl2303 :/

17

Je n'ai pas eu de soucis notable donc je ne peux dire (et j'ai le cable officiel qui va bien a brancher au connecteur)
avatarProud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.