RetroGame
如何替換UBoot圖片
Uboot開機顯示圖片如下所示:

雖然官方並沒有開放UBoot程式碼,不過,為了可以換掉開機圖片,司徒想到一個可以使用trial and error的方式,定位出位該圖片的位置,那就是依序將Binary資料當作Pixel顯示,藉此定位出該圖片位置。
show_bin.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <errno.h>
#include <termios.h>
#include <unistd.h>
#include <SDL.h>
#include <SDL_image.h>
#include <SDL_ttf.h>
uint16_t buf[10 * 1024 * 1024]={0};
int main(int argc, char* argv[])
{
SDL_Init(SDL_INIT_VIDEO);
SDL_ShowCursor(0);
SDL_Surface *screen = SDL_SetVideoMode(320, 800, 16, SDL_SWSURFACE);
int fd = open(argv[1], O_RDONLY);
long len = read(fd, buf, sizeof(buf));
close(fd);
// uboot image: 176148
long index=0;
for(int c=0; c<len/(320*800*2); c++){
uint16_t *p = screen->pixels;
for(int y=0; y<320; y++){
for(int x=0; x<800; x++){
*p++ = buf[index++];
}
}
SDL_Flip(screen);
SDL_Delay(3000);
}
SDL_Quit();
return 0;
}
編譯程式
$ gcc show_bin.c -g -o show_bin -lSDL_image -lSDL -lSDL_ttf -I/usr/include/SDL $ sudo dd if=/dev/sdx of=head.img bs=1M count=8 $ ./show_bin head.img
Uboot image offset: 176148

接著寫一個Image轉Hex的程式,替換自己喜愛的圖片,使用的方式也很簡單,經由SDL載入圖片(這樣就不用煩惱PNG/JPEG Library相容問題),然後把Pixel像素存成檔案,最終透過dd指令,把存好的檔案覆蓋回原本MicroSD,Image轉Hex程式如下所示。
img2hex.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
#include <errno.h>
#include <termios.h>
#include <unistd.h>
#include <SDL.h>
#include <SDL_image.h>
#include <SDL_ttf.h>
uint16_t buf[320*480*2]={0};
int main(int argc, char* argv[])
{
SDL_Init(SDL_INIT_VIDEO);
SDL_ShowCursor(0);
SDL_Surface *screen = SDL_SetVideoMode(320, 480, 16, SDL_SWSURFACE);
SDL_Surface* img = IMG_Load(argv[1]);
SDL_Surface *p = SDL_ConvertSurface(img, screen->format, 0);
SDL_SoftStretch(p, NULL, screen, NULL);
SDL_FreeSurface(img);
SDL_FreeSurface(p);
SDL_Flip(screen);
long index=0;
uint16_t *px = screen->pixels;
for(int y=0; y<320; y++){
for(int x=0; x<480; x++){
buf[index++] = *px++;
}
}
int fd = open("hex.bin", O_CREAT | O_WRONLY, S_IRUSR);
long len = write(fd, buf, 320*480*2);
close(fd);
SDL_Delay(3000);
SDL_Quit();
return 0;
}
編譯程式
$ gcc img2hex.c -g -o img2hex -lSDL_image -lSDL -lSDL_ttf -I/usr/include/SDL $ ./img2hex xxx.jpg $ sudo dd if=hex.bin of=/dev/sdx bs=1 seek=176148 conv=notrunc
替換後,開機的第一張UBoot圖片就是使用者更換的圖片,當然,充電圖片也是可以換的,方法如上面的步驟。

P.S. 第二張圖片是從Kernel顯示的,因此,必須解壓縮uImage才可以替換。
返回上一頁