Game Gear Micro
Linux系統刷機、解說細項
參考資料:
1. releases
目前司徒已經完成Game Gear Micro掌機的第一版Linux系統,雖然改機難度有點偏高,不過,司徒還是相當推薦喜歡改機的愛好者可以動手試試,那種樂趣只有自己體驗過才懂得,而基於開源精神,司徒目前已經把所有源代碼發布在GitHub,分享給有興趣研究的開源愛好者,雖然開源並沒有強制的法律約束力,不過,司徒還是建議大家可以多多分享修改後的源代碼,這種東西或許就是我們可以傳承給下一代的好東西!司徒接著說明刷機過程和源代碼修改的部份,如果對於源代碼沒興趣的玩家,只要看前半部份的說明就可以。
刷機步驟:
1. 下載ggm_linux_sd_20220618.img.7z
2. 解壓縮ggm_linux_sd_20220618.img.7z
3. 將ggm_linux_sd_20220618.img刷到MicroSD
4. 插入MicroSD後,開機就可以看到如下畫面:
按鍵1:官方系統(NAND Flash)
按鍵2:Linux系統(MicroSD)
按下按鍵1就會進入官方系統(NAND Flash)
按下按鍵2就會進入Linux系統(MicroSD)
為了致敬SEGA,司徒將桌面拆成四個字母使用:
S:設定(Setting)
進入S後,有兩個設定可以使用,分別是亮度調整以及超頻,使用十字按鍵操作,按下藍色START按鍵會返回桌面
E:實驗(Experiment)
目前尚未完成,這部份之後會用來跑虛擬GPU實驗項目,目前司徒先放閃屏測試程式,按下藍色START按鍵會返回桌面
G:GBA模擬器(GBA Emulator)
司徒使用gpsp模擬器進行修改,為了配合GGM的屏幕特性,司徒修改很多東西,而進入GBA模擬器後,如果沒有遊戲檔案(/roms/gba/),則提示如下畫面
司徒重新改寫了載入遊戲選單,支援中文顯示,字型大小做了適當調整,每次啟動該選單時,會自動停在上次載入遊戲的位置,選單效能也進行優化,不會因為大量遊戲而造成卡頓(如PSP上面那樣),支援LR快速選單跳躍功能
GGM的屏幕顯示區域是240x195,但是,GBA解析度是240x160,因此,多餘的35像素部份,司徒使用GAME BOY ADVANCE字眼顯示
按下藍色START按鍵進入選單(按鍵1退出菜單),司徒也對菜單進行大改寫,只保留司徒覺得想要的部份
司徒也花了相當大量的時間在改善閃屏問題,司徒覺得目前狀態算是相當不錯,畫面顯示也相當柔順,如果玩家還是不滿意,建議超頻使用
A:Arduboy模擬器(Arduboy Emulator)
目前尚未完成,目前司徒先放聲音以及按鍵測試,按下藍色START按鍵會返回桌面
源代碼修改說明:
UBOOT修改部份如下
在reset時,就先跳轉到boot_menu,為何要在reset一開始就先跳轉呢?因為這是唯一一個可以轉從SPI啟動的時機
.globl reset .globl save_boot_params_ret .type save_boot_params_ret,%function reset: bl boot_menu /* Allow the board to save important registers */ b save_boot_params
boot_menu一開始就會判斷是否從RAM執行(UBOOT Relocate後),如果是,代表UBOOT正在啟動Linux Kernel
boot_menu: push {lr} tst pc, #0x80000000 bne boot_linux
如果不是正在啟動Linux Kernel,則顯示開機選單,圖片位於MicroSD 2MB偏移位置
bl ccu_module_init bl dram_module_init bl sd_module_init ldr r0, =IMG_BASE / 512 ldr r1, =0x80000000 ldr r2, =(2 * 1024 * 1024) / 512 bl load_image bl lcd_init ldr r4, =PIO_BASE + PE 0: ldr r0, [r4, #PIO_DATA] tst r0, #(1 << 9) beq boot_stock tst r0, #(1 << 10) beq boot_linux b 0b
如果是需要從SPI啟動,則直接呼叫BROM的SPI啟動位址,反之則直接返回原本UBOOT,繼續啟動Linux Kernel的步驟
boot_stock: bl lcd_off ldr pc, =0xffff4110 boot_linux: pop {pc}
GBA模擬器修改部份,菜單源代碼替換成gui4ggm.c,原本舊的gui.c保留不動,SDL部份都改成Double Buffer
rl_screen = SDL_SetVideoMode(240, 240, 16, SDL_SWSURFACE | SDL_DOUBLEBUF); screen = SDL_CreateRGBSurface(SDL_SWSURFACE, 240 * video_scale, 240 * video_scale, 16, 0, 0, 0, 0);
像素搬移的部份
int x=0, y=0; uint32_t *s = (uint32_t*)screen->pixels + (30 * 120); uint32_t *d = (uint32_t*)rl_screen->pixels + (30 * 120); for(y=0; y<195; y++){ for(x=0; x<120; x++){ *d++ = *s++; } }
VSYNC改使用IOCTL方式(司徒已經實作在Framebuffer顯示驅動中)
//delay_us((u64)virtual_frame_count * 50000 / 3 - new_ticks + 2); if(fbdev > 0){ int zero=0; ioctl(fbdev, FBIO_WAITFORVSYNC, &zero); }
編譯步驟:
Miyoo編譯開發工具
$ cd $ wget https://github.com/steward-fu/miyoo/releases/download/v1.0/toolchain.7z $ 7za x toolchain.7z $ sudo mv miyoo /opt/ $ export PATH=$PATH:/opt/miyoo/bin
編譯Kernel
$ cd $ wget https://github.com/steward-fu/ggm/releases/download/src/kernel_20220618.tar.gz $ tar xvf kernel_20220618.tar.gz $ cd kernel $ ./run.sh ggm
編譯UBOOT
$ cd $ wget https://github.com/steward-fu/ggm/releases/download/src/uboot.tar.gz $ tar xvf uboot.tar.gz $ cd uboot $ ./run.sh /dev/sdX ggm
編譯GBA模擬器
$ cd $ wget https://github.com/steward-fu/ggm/releases/download/src/gpsp_20220618.tar.gz $ tar xvf gpsp_20220618.tar.gz $ cd gpsp/ggm $ make -j
MicroSD佈局如下
ui:主界面顯示App
app_s:設定App(run.sh)
app_e:實驗App(run.sh)
app_g:GBA模擬器(run.sh)
app_a:Arduboy模擬器(run.sh)
rootfs:系統
mininit:由Kernel呼叫用來掛載rootfs(squashfs系統)
swap.img:虛擬內存(128MB)
司徒幫Miyoo Mini(SSD202)上了一顆虛擬GPU(Google SwiftShader),用來跑PPSSPP模擬器,原本打算再次移植給F1C200S使用,讓它跑OpenGL ES 2.0程式,可惜司徒錯估SwiftShader需要至少ARMv7才可以支援,於是司徒再度修改項目,將原本app_e(OpenGL ES)改成跑GB模擬器,而app_a(Arduboy模擬器)改成跑GBC模擬器,而司徒最後再度挖掘,才發現GGM音量轉輪是接到PA0,透過TouchPanel方式輸入,利用其電壓做音量控制,修改後的Kernel位於:Kernel,目前已經可以控制音量大小~
app_e(GB模擬器)
編譯後:app_e
源代碼:gambatte
玩家只要將編譯後的檔案解壓縮到app_e資料夾就可以,接著執行如下程式
司徒將GBA的選單拿來重複使用,因此,字型大小算是相當剛好(遊戲請放在roms/gb資料夾)
司徒保留GB的BIOS開機畫面,每次看到這個畫面總是相當懷念~
司徒打包了很多調色盤以供使用,因此,有相當多調色盤使用好好試試~
別有一番風味~
app_a(GBC模擬器)
編譯後:app_a
源代碼:gambatte
玩家只要將編譯後的檔案解壓縮到app_a資料夾就可以,接著執行如下程式
字型大小算是相當剛好(遊戲請放在roms/gbc資料夾)
保留GBC的BIOS開機畫面,是不是相當懷念~哈~
如果玩家有注意到,司徒將GB的外框往上移動,GBC則是往下移動,這樣看起來是不是更有感覺呢~哈~
菜單都是使用藍色按鍵做設定~