导航

    全志在线开发者论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 在线文档
    • 社区主页
    1. 主页
    2. steward
    • 资料
    • 关注 0
    • 粉丝 10
    • 我的积分 5750
    • 主题 2
    • 帖子 133
    • 最佳 47
    • 群组 0

    司徒LV 7

    @steward

    5750
    积分
    86
    声望
    81
    资料浏览
    133
    帖子
    10
    粉丝
    0
    关注
    注册时间 最后登录
    网站 steward-fu.github.io/website/index.htm 位置 台灣

    steward 取消关注 关注

    steward 发布的最佳帖子

    • Gaviar Handheld (小志掌機)

      1.jpg
      中文名稱:小志掌機
      英文名稱:Gaviar Handheld
      開源方式:GPL License
      開發人員:bankbank (銀行銀行)、steward (司徒)
      開發目的:學習 RISC-V、體驗 KOF97 振動版
      面向玩家:喜愛 DIY 樂趣、掌機的玩家
      更新時間:由於我們的本業都跟這些無關, 只能利用閒餘時間研究, 因此, 每次更新的時間有可能長達一個月

      功能簡介:
      RISC-V 是一個趨勢, 只是目前比較少有掌機面市, 因此, bankbank 和司徒將會以軟件面向, 從頭做起, 並且將這些過程紀錄下來, 以供日後參考, 除了可以學習 RISC-V 的軟件開發之外, bankbank 也會進行 KOF97 遊戲逆向分析, 分析的目的並不是要修改 KOF97 ROM, 而是要讓模擬器知道哪些角色的招式可以去驅動振動馬達, 因為讓 KOF97 具備振動功能是 bankbank 跟司徒的夢想, KOF97 振動版相信可以再度勾起童年的快樂回憶, 由於逆向遊戲比較敏感, 因此, 盡量以點到為止

      購買事項:
      小志掌機是由暈哥製作並提供給 bankbank 和司徒,因此,如果想要購買的人可以去找暈哥,bankbank 和司徒並沒有參與任何販賣事項,司徒跟 bankbank 只是以開源的方向來研究這台掌機,當然所有的資源都是公開,因此,司徒比較建議玩家從 GitHub 下載並且自己動手列印製作,這樣會更有樂趣

      資料倉庫:
      https://github.com/Strugglemeat/gngeo
      https://github.com/steward-fu/archives/releases/tag/f133

      預計流程:

      • 逆向 KOF97
      • 硬件說明
      • 硬件功能確認
        • 點屏
        • 按鍵
        • 聲音
      • 移植 Boot Loader
      • 移植 Linux Kernel
        • 屏幕驅動
        • 按鍵驅動
        • 聲音驅動
        • 電池驅動
      • 建置 Linux OS
      • 移植 GNGEO 模擬器
        • 支援振動功能

      結帖時間:視情況而定
      贊助連結:
      https://store.steampowered.com/search/?developer=bankbank&ndl=1
      https://play.google.com/store/apps/details?id=com.stylus.cavesweeper&gl=US&pli=1

      注意事項:
      由於此貼屬於開源專案, 因此, 司徒的仇家預計將前來尋仇, 這部分需要請管理員幫忙過濾惡意攻擊的言論, 如果無法有效制止, 此帖將提早結束, 我們將繼續漂流尋找下一個可以撰寫文章的地方

      關於 bankbank (銀行銀行):
      romhacker and retro gamedev bankbank ( bankbank.net ), very focused on 68000, also interested in SH-2. my favorite game is Tetris the Grand Master 2 Plus. my dream is to make games and hacks that many people can enjoy. YouTube: https://www.youtube.com/bankbank

      關於 steward (司徒):
      喜歡惡搞掌機, 賦予掌機另一種生命力, 藉由惡搞掌機來回味童年的美好, 誰叫掌機要惡搞當年的我

      前言:
      司徒相當高興可以遇到 Hack ROM 的高手 bankbank, bankbank 除了喜愛 Hack ROM 之外, 也熱愛 DIY 的樂趣, bankbank 本身可以閱讀簡單的中文, 因此, 如果需要詢問 bankbank 問題, 請盡量使用簡單的中文詞彙或者使用英文發問, 由於這個開源專案是從頭做起, 難免會遇到無法預期的開發問題, 加上 bankbank 和司徒的本業並非這個領域, 因此, 只能利用瑣碎時間研究, 基於熱愛掌機所發起的開源專案, 因此, 請不要催促開發進度

      振動原理簡介:
      左、右馬達用來代表左、右的方向, 此例使用大門武郎的岚之山, 大絕招一發動時, 同時振動馬達
      2.png

      右摔時,右邊振動馬達開始振動
      3.png

      左摔時,左邊振動馬達開始振動
      4.png

      发布在 爱搞机专区
      steward
      司徒
    • 回复: Gaviar Handheld (小志掌機)

      Allwinner F133(D1s) 是 RISC-V 64位元架構, 就規格面來看, 應該是可以對應到 Ingenic JZ4760B 600MHz, 也就是 RS-97 掌機 (RetroGame), LDK GAME 掌機(小龍王)這一系列的等級, 當然 bankbank 和司徒是以 RISC-V 的軟件角度切入, 因此, 剛好可以趁機來看一下 RISC-V 跟 MIPS 的差距會有多大~

      簡要規格
      1.jpg

      TRIMUI SMART
      1.jpg

      GAME GEAR Micro
      2.jpg

      Arduboy
      3.jpg

      FunKeyS (對不起只剩下屍體)
      4.jpg

      舊 3DS
      5.jpg

      正面
      6.jpg

      USB-TypeC、耳機孔
      7.jpg

      電源開關
      8.jpg

      R、MicroSD、L
      9.jpg

      音量開關
      10.jpg

      背面
      11.jpg

      拆掉類比搖桿帽子才可以提起A面
      12.jpg

      提起 A 面
      13.jpg

      A 面
      14.jpg

      屏
      15.jpg
      16.jpg
      17.jpg

      PCB
      18.jpg

      電源開關往下才可以取出 PCB
      19.jpg

      電池物品禁止發送到台灣,因此,司徒需要自行焊接電池,這個空間相當適合其它改造
      20.jpg

      正面
      21.jpg

      Allwinner F133 (D1s)
      22.jpg

      发布在 爱搞机专区
      steward
      司徒
    • 回复: Gaviar Handheld (小志掌機)

      逆向工程並非用於破壞攻擊的目的, 取而代之, 它是一個可以更了解細節的技術, 以這樣的角度, 則逆向變得更有趣, 就如同 bankbank 介紹的過程一樣, 透過查看變數而知道一些細節, 或許有些人不好意思詢問 bankbank 問題, 因此, 司徒帶大家走一下步驟:

      準備好 kof97.zip, neogeo.zip 後, 開啟 debug 模式

      $ mame kof97.zip -debug -resolution 320x240
      

      可以設定WatchPoint的地方
      1.jpg

      按下F11並且輸入wp 0x10843B,1,w,接著再按下F5執行
      2.jpg

      P2被攻擊後就會觸發中斷, 是不是很簡單~
      3.jpg
      4.jpg

      bankbank 透過尋找出一些位址, 讓大家知道模擬器是如何知道一些細節, 這也是振動需要判斷的數值, 這些看似很高深的技術, 其實透過說明, 大家都可以很容易上手, 因此, 如何讓懷舊遊戲變得更有趣, 有時候, 你也可以好好思考如何讓你喜愛的遊戲變得更好玩, 這才是樂趣所在, 當然, 大家更應該正向來看待逆向工程技術, 而基於一些原因, 我們盡量點到就好, 相信 bankbank 之後會為我們帶來更好玩的東西~

      发布在 爱搞机专区
      steward
      司徒
    • 回复: Gaviar Handheld (小志掌機)

      由於 KOF97 角色很多, 逆向需要花費相當多的時間去分析, 感謝 bankbank 的時間, 😁 , 於此同時, 司徒也會開始針對系統做移植, 而依照司徒的慣例, 都是先從硬件下手, 等待比較熟悉硬件後, 才會開始做移植的東西~感謝暈哥的開源文件, 將硬件原理圖開源出來, 原理圖設計得相當好, 如果有想要改版, 司徒這邊有一些想法, 或許可以參考一下

      1.jpg

      2.jpg

      3.jpg

      建議把CTRL拉到GPIO,方便用來控制雜音
      4.jpg

      MicroSD訊號沒有上拉電阻,因此,要注意PCB線長
      5.jpg

      GPIO都拉到獨立GPIO使用,避免鬼鍵問題,不過,可以使用晶片內部的提昇電阻,這樣可以減少電阻拉線
      6.jpg

      背光建議使用IC,避免壓降問題,屏使用RGB-565,建議找有TE(FRAME)的屏,這樣可以有效控制閃屏問題
      7.jpg

      发布在 爱搞机专区
      steward
      司徒
    • 回复: Gaviar Handheld (小志掌機)

      司徒接著說明一下如何編譯 Tina-Linux 做聲音測試, 不過在編譯 Tina-Linux 之前, 我們先來看一下小志掌機的聲音電路
      1.jpg
      上圖是一般最常使用的聲音電路, 直接從晶片的聲音輸出(類比訊號)拉到功率放大器, 由於是類比訊號, 因此, 在走線的過程中, 很容易受到干擾, 這方面的佈線, 比較需要經驗的累積, 當然, 如果要有比較好的聲音效果, 一般建議使用專門的 Audio Codec 晶片, 而使用的介面可以使用 I2S or PCM, 訊號傳遞的部份使用數位訊號, 可以有效抑制雜訊, 如下圖所示, 不過缺點就是需要移植聲音驅動, 這部份也是比較費時~
      2.jpg
       
      司徒接著說明如何編譯 Tina-Linux for F133, 首先, 感謝 lovexulu 的協助,提供 Tina-Linux 的移植結果給司徒參考,由於 Tina-Linux 下載相當費時也比較麻煩,因此,司徒將其搬遷到 GitHub,編譯步驟如下:

      $ cd
      $ git clone https://github.com/steward-fu/tina-linux_sdk
      $ cd tina-linux_sdk
      
      $ wget https://github.com/steward-fu/archives/releases/download/f133/tina-linux_sdk_dl.7z.001
      $ wget https://github.com/steward-fu/archives/releases/download/f133/tina-linux_sdk_dl.7z.002
      $ wget https://github.com/steward-fu/archives/releases/download/f133/tina-linux_sdk_toolchain.tar.gz
      $ tar xvf https://github.com/steward-fu/archives/releases/download/f133/tina-linux_sdk_toolchain.tar.gz
      $ 7za x https://github.com/steward-fu/archives/releases/download/f133/tina-linux_sdk_dl.7z.001
      
      $ source ./build/envsetup.sh
      $ lunch
          You're building on Linux
      
          Lunch menu... pick a combo:
               1. d1-h_nezha_min-tina
               2. d1-h_nezha-tina
               3. d1s_nezha-tina
      
          Which would you like? [Default d1s_nezha]:3
      
      $ make
      $ pack
          /home/steward/Data/tina-linux_sdk/out/d1s-nezha/tina_d1s-nezha_uart4.img
      
          pack finish
      

       
      燒錄步驟:

      1. 下載 https://github.com/steward-fu/archives/releases/download/f133/PhoenixCardv4.2.7.7z 並且解壓縮
      2. 執行 PhoenixCard.exe
      3. 選擇好 Image、Start up 後,按下 Burn 開始燒錄
        3.jpg
         
        燒錄完成
        4.jpg
         
        預設分區如下圖,如果想要使用自己編譯的 buildroot 系統,只要替換到 rootfs 分區就可以,不過預設只有 25MB
        5.jpg
         
        對 /dev/sdb8 進行擴充,這樣就可以放檔案進入測試
        6.jpg
         
        開機後,可以直接使用 adb shell 進入 console, 接著就可以手動測試聲音部份~
      $ adb devices
          * daemon not running; starting now at tcp:5037
          * daemon started successfully
          List of devices attached
          20080411	device
      
      $ adb shell
          BusyBox v1.27.2 () built-in shell (ash)
      
          ------run profile file-----
           _____  _              __     _
          |_   _||_| ___  _ _   |  |   |_| ___  _ _  _ _
            | |   _ |   ||   |  |  |__ | ||   || | ||_'_|
            | |  | || | || _ |  |_____||_||_|_||___||_,_|
            |_|  |_||_|_||_|_|  Tina is Based on OpenWrt!
           ----------------------------------------------
           Tina Linux (Neptune, 61CC0487)
           ----------------------------------------------
          nodev	debugfs
          root@TinaLinux:/#
          root@TinaLinux:/# mount /dev/mmcblk0p8 /mnt/UDISK/
          root@TinaLinux:/# amixer sset 'Headphone volume' 100%
              Simple mixer control 'Headphone volume',0
                Capabilities: volume volume-joined
                Playback channels: Mono
                Capture channels: Mono
                Limits: 0 - 7
                Mono: 7 [100%]
          root@TinaLinux:/# aplay /mnt/UDISK/ok.wav 
              Playing WAVE '/mnt/UDISK/ok.wav' : Signed 16 bit Little Endian, Rate 11025 Hz, Mono
      

       
      如果不想手動編譯, 司徒這邊有做好的聲音測試檔案
      https://github.com/steward-fu/archives/releases/download/f133/sound_test.img.7z
      解開後, 使用 dd 命令燒錄到 MicroSD 卡後, 插入開機, 就會開始播放 Nokia 手機鈴聲~

      发布在 爱搞机专区
      steward
      司徒
    • 回复: 【复刻麦当劳游戏机】用 ST7789V LCD 在 lichee pi nano (f1c100s)

      @bankbank long time no see. 💃
      Please post the pinout information of the LCD panel and then we can decide how to connect it to F1C100S.

      发布在 Linux
      steward
      司徒
    • 回复: Gaviar Handheld (小志掌機)

      UART 是嵌入式開發最常用來除錯的一個介面, 因此, 在開始移植 Boot Loader 或者 Linux Kernel 之前, 必須先確保 UART 可以正常工作, 接下來, 司徒將說明如何驗證 UART 的輸出功能, 目前司徒是直接在 PCB 上面焊上排針
      1.jpg
       
      接線方式
      2.jpg
       
      UART 連接到 PB2, PB3
      8.jpg
       
      PB2, PB3
      19.jpg
       
      GPIO Multiplex Function
      20.jpg
       
      CCU 位址
      3.jpg
       
      APB1 (HOSC 24MHz)
      4.jpg
       
      Baudrate Table (24MHz)
      5.jpg
       
      UART4 位址
      6.jpg
       
      UART 暫存器
      7.jpg
       
      main.s

          .global _start
       
          .equ CCU_BASE,   0x02001000
          .equ GPIO_BASE,  0x02000000
          .equ UART4_BASE, 0x02501000
       
          .equ PB_CFG0,      0x0030
          .equ UART_BGR_REG, 0x090c
       
          .equ RBR,  0x0000
          .equ THR,  0x0000
          .equ DLL,  0x0000
          .equ DLH,  0x0004
          .equ IER,  0x0004
          .equ IIR,  0x0008
          .equ LCR,  0x000c
          .equ MCR,  0x0010
          .equ LSR,  0x0014
          .equ USR,  0x007c
           
          .text
          .long 0x4000006f
          .byte 'e','G','O','N','.','B','T','0'
          .long 0x5F0A6C39
          .long 0x8000
          .long 0, 0
          .long 0, 0, 0, 0, 0, 0, 0, 0
          .long 0, 0, 0, 0, 0, 0, 0, 0
         
          .org 0x0400
      _start:
          li t0, 0x7700
          li a0, GPIO_BASE + PB_CFG0
          sw t0, 0(a0)
       
          li t0, (1 << 20) | (1 << 4)
          li a0, CCU_BASE + UART_BGR_REG
          sw t0, 0(a0)
       
          li t0, 0
          li a0, UART4_BASE + IER
          sw t0, 0(a0)
           
          li t0, 0
          li a0, UART4_BASE + MCR
          sw t0, 0(a0)
           
          li a0, UART4_BASE + LCR
          lw t0, 0(a0)
          li t1, (1 << 7)
          or t0, t0, t1
          sw t0, 0(a0)
       
          li t0, 13
          li a0, UART4_BASE + DLL
          sw t0, 0(a0)
           
          li t0, 0
          li a0, UART4_BASE + DLH
          sw t0, 0(a0)
           
          li a0, UART4_BASE + LCR
          lw t0, 0(a0)
          li t1, ~(1 << 7)
          and t0, t0, t1
          sw t0, 0(a0)
          lw t0, 0(a0)
          li t1, ~(0x1f)
          and t0, t0, t1
          li t1, 0x03
          or t0, t0, t1
          sw t0, 0(a0)
       
          la a1, hello
      0:
          li a0, UART4_BASE + LSR
          lw t0, 0(a0)
          li t1, (1 << 5)
          and t0, t0, t1
          beqz t0, 0b
       
          li t0, 0
          lb t0, 0(a1)
          li a0, UART4_BASE + THR
          sb t0, 0(a0)
       
          add a1, a1, 1
          bgtz t0, 0b
       
      1:
          j 1b
       
          .align
      hello: .asciz "Hello, world!"
          .end
      

       
      完成
      9.jpg
       
      不過, 目前小志掌機的外殼缺少 UART 洞口, 因此, 司徒基於暈哥的外殼, 使用 OpenSCAD 改造一下
       

      difference(){
          import("V20-bottom.stl");
          translate([-23, 10, -5]){
              cube([10, 10, 10]);
          }
      }
       
      translate([42.1, -4.5, -3]){
          cube([1.5, 3, 3]);
      }
      translate([42.1, 8.1, -3]){
          cube([1.5, 3, 3]);
      }
      

       
      UART位置
      10.jpg
       
      因為司徒的3D印表機精度不夠,只好補強音量鍵
      11.jpg
       
      3D印表機列印
      12.jpg
       
      還不錯
      13.jpg
       
      下邊
      14.jpg
       
      側邊
      15.jpg
       
      上邊
      16.jpg
       
      側邊
      17.jpg
       
      背面
      18.jpg

      发布在 爱搞机专区
      steward
      司徒
    • 回复: Gaviar Handheld (小志掌機)

      @lovehex99
      一般建議先去搞系統再去做移植, 感觸會比較深, 提供一些想法給你:

      1. 將 FunKeys rootfs 替換到 i.MX6 上面 (解開覆蓋掉原本的)
      2. 應該可以從 UART (serial port) 看到一些東西
      3. 開始看看系統裡面有什麼東西, 破壞它
      4. 如果 i.MX6 有 Framebuffer Driver, 你應該就可以看到顯示的畫面

      做完上面的, 你這時候再去做移植或者重新編譯 OS, 將會有很深的體驗~

      发布在 爱搞机专区
      steward
      司徒
    • 回复: Gaviar Handheld (小志掌機)

      司徒接著說明如何驗證按鍵功能,不過,在進行按鍵驗證之前,我們必須先了解一下按鍵的一些細節,這樣才會更了解按鍵特性,一般掌機使用的按鍵,大部分都是使用十字鍵、4 個功能鍵、SELECT、START、L、R 等按鍵,這也是早期 Nintendo 掌機的標準配備,而用來耦合按鍵和 PCB 的橋樑則是以導電膠、鍋仔片為大宗,這些看似簡單的東西,其實背後隱藏的許多設計的小細節,司徒嘗試來解說一下過程,下圖是 NDSL 掌機的 PCB 圖片
      1.jpg
      從上圖可以發現一個設計小細節,十字鍵的 PCB 缺口,它的長相跟 4 個功能鍵並不一致,這是因為十字鍵是連通按鍵(上下左右連在一起),而 4 個功能鍵則是各自分開的按鍵,因此,當十字鍵的其中一個方向被按下時,其餘方向也會受影響,因此 PCB 設計必須做些保護措施,避免鬼鍵的問題發生
       
      司徒使用如下圖片說明一下鬼鍵發生的過程,當十字鍵的下方向被按下時,左、右方向的按鍵也會稍微往下傾斜,所以最壞的情況下,系統將會收到下、左、右三個按鍵的訊息
      2.jpg
       
      十字鍵正常位置
      3.jpg
       
      下方鍵被按下時,左、右方向的按鍵也往下傾斜,說明導電膠會有誤觸到 PCB 的狀況發生
      4.jpg
       
      因此,為了避免十字鍵的鬼鍵問題,十字鍵的 PCB 缺口必須依照方向做適當排列,這樣就可以避免誤觸的問題,如下圖所示,十字鍵的左右按鍵會設計成上下導通,而十字鍵的上下按鍵則會設計成左右導通
      5.jpg
       
      至於鍋仔片,由於導通點是位於中央,因此,十字鍵的鬼鍵問題得以改善
      6.jpg
      7.jpg
       
      下圖是小志掌機使用的按鍵,由於按壓力道需要比較用力,因此,這種按鍵比較少用於掌機,不過,如果使用此類的按鍵,則需要注意彈跳的問題
      8.jpg
       
      一般按鍵使用彈片做導通,如下所示
      9.jpg
       
      因此,按下或者放開時,會有一段不穩定的彈跳時間,如下圖所示,這就是一般按鍵的彈跳問題
      10.jpg
       
      針對軟體的解法,可以延遲一段時間後,一般是 10ms,接著再判斷按鍵是否確實被按下
      11.jpg
       
      針對硬體的解法,最常見到的作法就是 RC 濾波,在按鍵旁邊加上電容,基於 10ms 計算,最常使用的是:10K 電阻 + 1uF 電容、47K 電阻 + 220nF 電容,透過電容的充、放電效應,來修飾爬升曲線
      12.jpg
      市面上,有些晶片已經有內建 Debounce 功能,這樣就可以很方便解決按鍵彈跳問題
       
      當然,有些掌機會使用類比搖桿當作十字鍵使用,如:Caanoo 掌機(類比電阻)、Neo Geo Pocket 掌機(4 顆按鍵),如果是使用 4 顆按鍵則可以使用如上的彈跳解法,但是,如果是使用類比電阻,則需要加入 Dead Zone 判斷,避免漂移問題
      13.jpg
       
      Dead Zone 一般用於無效區域設定,當類比搖桿的移動是處於這些區域時,則不會發送任何移動訊號,而類比搖桿最常遇到就是靜止不動時,搖桿自動漂移(鬼鍵問題),因此,如果使用類比搖桿當作十字鍵使用時,記得加入 Dead Zone 判斷,避免漂移問題發生
      15.jpg
      14.jpg
       
      按鍵電路
      16.jpg
       
      ASCII 字型
      17.jpg
       
      對應按鍵
      18.jpg
       
      main.s

          .global _start
       
          .equ GPIO_BASE,  0x02000000
          .equ PD_CFG0,    0x0090
          .equ PD_CFG1,    0x0094
          .equ PD_CFG2,    0x0098
          .equ PD_DAT,     0x00a0
          .equ PE_CFG0,    0x00c0
          .equ PE_CFG1,    0x00c4
          .equ PE_DAT,     0x00d0
       
          .equ LCD_RST,    (1 << 0)
          .equ LCD_WR,     (1 << 18)
          .equ LCD_RS,     (1 << 19)
          .equ LCD_RD,     (1 << 20)
          .equ LCD_CS,     (1 << 21)
          .equ LCD_BL,     (1 << 22)
       
          .equ _250MS,     50000000
          .equ _500MS,     100000000
          .equ _1S,        200000000
          .equ BG,         0x0000
          .equ FG,         0xffff
       
          .text
          .long 0x4000006f
          .byte 'e','G','O','N','.','B','T','0'
          .long 0x5F0A6C39
          .long 0x8000
          .long 0, 0
          .long 0, 0, 0, 0, 0, 0, 0, 0
          .long 0, 0, 0, 0, 0, 0, 0, 0
         
          .org 0x0400
      _start:
          li t0, 0x00000000
          li a0, GPIO_BASE + PE_CFG0
          sw t0, 0(a0)
          li a0, GPIO_BASE + PE_CFG1
          sw t0, 0(a0)
       
          li t0, 0x11111111
          li a0, GPIO_BASE + PD_CFG0
          sw t0, 0(a0)
          li a0, GPIO_BASE + PD_CFG1
          sw t0, 0(a0)
          li a0, GPIO_BASE + PD_CFG2
          sw t0, 0(a0)
       
          li t0, 0xffffffff
          li a0, GPIO_BASE + PD_DAT
          sw t0, 0(a0)
       
          jal lcd_rst
       
          li t0, 0xb2
          jal lcd_cmd
          li t0, 0x5c
          jal lcd_dat
          li t0, 0x5c
          jal lcd_dat
          li t0, 0x00
          jal lcd_dat
          li t0, 0x33
          jal lcd_dat
          li t0, 0x33
          jal lcd_dat
           
          li t0, 0xb7
          jal lcd_cmd
          li t0, 0x35
          jal lcd_dat
           
          li t0, 0x21
          jal lcd_cmd
           
          li t0, 0x11
          jal lcd_cmd
       
          li t0, _250MS
          jal delay
       
          li t0, 0xe0
          jal lcd_cmd
          li t0, 0xd0
          jal lcd_dat
          li t0, 0x06
          jal lcd_dat
          li t0, 0x0b
          jal lcd_dat
          li t0, 0x07
          jal lcd_dat
          li t0, 0x07
          jal lcd_dat
          li t0, 0x24
          jal lcd_dat
          li t0, 0x2e
          jal lcd_dat
          li t0, 0x32
          jal lcd_dat
          li t0, 0x46
          jal lcd_dat
          li t0, 0x37
          jal lcd_dat
          li t0, 0x13
          jal lcd_dat
          li t0, 0x13
          jal lcd_dat
          li t0, 0x2d
          jal lcd_dat
          li t0, 0x33
          jal lcd_dat
           
          li t0, 0xe1
          jal lcd_cmd
          li t0, 0xd0
          jal lcd_dat
          li t0, 0x02
          jal lcd_dat
          li t0, 0x06
          jal lcd_dat
          li t0, 0x09
          jal lcd_dat
          li t0, 0x08
          jal lcd_dat
          li t0, 0x05
          jal lcd_dat
          li t0, 0x29
          jal lcd_dat
          li t0, 0x44
          jal lcd_dat
          li t0, 0x42
          jal lcd_dat
          li t0, 0x38
          jal lcd_dat
          li t0, 0x14
          jal lcd_dat
          li t0, 0x14
          jal lcd_dat
          li t0, 0x2a
          jal lcd_dat
          li t0, 0x30
          jal lcd_dat
           
          li t0, 0x36
          jal lcd_cmd
          li t0, 0xb0
          jal lcd_dat
           
          li t0, 0x2a
          jal lcd_cmd
          li t0, 0x00
          jal lcd_dat
          li t0, 0x00
          jal lcd_dat
          li t0, 0x01
          jal lcd_dat
          li t0, 0x3f
          jal lcd_dat
           
          li t0, 0x2b
          jal lcd_cmd
          li t0, 0x00
          jal lcd_dat
          li t0, 0x00
          jal lcd_dat
          li t0, 0x00
          jal lcd_dat
          li t0, 0xef
          jal lcd_dat
           
          li t0, 0x3a
          jal lcd_cmd
          li t0, 0x55
          jal lcd_dat
       
          li t0, 0x29
          jal lcd_cmd
           
          li t0, 0x2c
          jal lcd_cmd
       
      loop:
          li a0, GPIO_BASE + PE_DAT
          lw t0, 0(a0)
       
          li t1, (1 << 0)
          and t1, t1, t0
          bgtz t1, 0f
          li t0, 30
          j draw
      0:
          li t1, (1 << 7)
          and t1, t1, t0
          bgtz t1, 1f
          li t0, 31
          j draw
      1:
          li t1, (1 << 4)
          and t1, t1, t0
          bgtz t1, 2f
          li t0, 16
          j draw
      2:
          li t1, (1 << 6)
          and t1, t1, t0
          bgtz t1, 3f
          li t0, 17
          j draw
      3:
          li t1, (1 << 12)
          and t1, t1, t0
          bgtz t1, 4f
          li t0, 'B'
          j draw
      4:
          li t1, (1 << 11)
          and t1, t1, t0
          bgtz t1, 5f
          li t0, 'X'
          j draw
      5:
          li t1, (1 << 1)
          and t1, t1, t0
          bgtz t1, 6f
          li t0, 'L'
          j draw
      6:
          li t1, (1 << 10)
          and t1, t1, t0
          bgtz t1, 7f
          li t0, 'R'
          j draw
      7:
          li t1, (1 << 2)
          and t1, t1, t0
          bgtz t1, 8f
          li t0, 'Y'
          j draw
      8:
          li t1, (1 << 9)
          and t1, t1, t0
          bgtz t1, 9f
          li t0, 'T'
          j draw
      9:
          li t1, (1 << 8)
          and t1, t1, t0
          bgtz t1, 10f
          li t0, 'S'
          j draw
      10:
          li t1, (1 << 3)
          and t1, t1, t0
          bgtz t1, 11f
          li t0, 'M'
          j draw
      11:
          li t1, (1 << 13)
          and t1, t1, t0
          bgtz t1, 12f
          li t0, 'A'
          j draw
      12:
          li x8, 0
          li x9, 0
          jal set_pos
       
          li t6, 320 * 240
      bg:
          li t0, BG
          jal lcd_dat
          addi t6, t6, -1
          bgtz t6, bg
       
          li t0, _250MS
          jal delay
          j loop
       
      draw:
          sll t0, t0, 3
          la a3, font
          add a3, a3, t0
          li t6, 8
          li x8, 135
          li x9, 100
      nbyte:
          li t5, 8
          lb a4, 0(a3)
          jal set_pos
      byte:
          li t1, 0x80
          and t0, a4, t1
          sll a4, a4, 1
          beqz t0, w0
      w1:
          li t0, FG
          jal lcd_dat
          li t0, FG
          jal lcd_dat
          li t0, FG
          jal lcd_dat
          li t0, FG
          jal lcd_dat
          j next
      w0:
          li t0, BG
          jal lcd_dat
          li t0, BG
          jal lcd_dat
          li t0, BG
          jal lcd_dat
          li t0, BG
          jal lcd_dat
      next:
          addi t5, t5, -1
          bgtz t5, byte
       
          add a3, a3, 1
          add x9, x9, 2
          addi t6, t6, -1
          bgtz t6, nbyte
          j loop
       
      set_pos:
          move a2, ra
          li t0, 0x2a
          jal lcd_cmd
          li t0, 0
          jal lcd_dat
          move t0, x8
          jal lcd_dat
       
          li t0, 0x2b
          jal lcd_cmd
          li t0, 0
          jal lcd_dat
          move t0, x9
          jal lcd_dat
       
          li t0, 0x2c
          jal lcd_cmd
          jr a2
       
      lcd_wr:
          li a0, GPIO_BASE + PD_DAT
       
          li t4, 0x00ff
          and t2, t0, t4
          li t4, 0xff00
          and t3, t0, t4
          sll t2, t2, 1
          sll t3, t3, 2
       
          move t4, t1
          or t4, t4, t2
          or t4, t4, t3
          sw t4, 0(a0)
       
          li t0, LCD_WR
          or t4, t4, t0
          sw t4, 0(a0)
          jr ra
       
      lcd_dat:
          move a1, ra
          li t1, LCD_RS | LCD_RD | LCD_BL | LCD_RST
          jal lcd_wr
          jr a1
       
      lcd_cmd:
          move a1, ra
          li t1, LCD_RD | LCD_BL | LCD_RST
          jal lcd_wr
          jr a1
       
      lcd_rst:
          move a1, ra
          li t0, 0x00000000
          li a0, GPIO_BASE + PD_DAT
          sw t0, 0(a0)
       
          li t0, _250MS
          jal delay
       
          li t0, 0xffffffff
          li a0, GPIO_BASE + PD_DAT
          sw t0, 0(a0)
       
          li t0, _250MS
          jal delay
          jr a1
       
      delay:
          addi t0, t0, -1
          bgtz t0, delay
          jr ra
       
      font:
          .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
          .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
          .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
          .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
          .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
          .byte 0x3C,0x42,0x99,0xBD,0xBD,0x99,0x42,0x3C,0x3C,0x42,0x81,0x81,0x81,0x81,0x42,0x3C
          .byte 0xFE,0x82,0x8A,0xD2,0xA2,0x82,0xFE,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0xFE,0x00
          .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x64,0x74,0x7C,0x38,0x00,0x00
          .byte 0x80,0xC0,0xF0,0xFC,0xF0,0xC0,0x80,0x00,0x01,0x03,0x0F,0x3F,0x0F,0x03,0x01,0x00
          .byte 0x18,0x3C,0x7E,0x18,0x7E,0x3C,0x18,0x00,0xEE,0xEE,0xEE,0xCC,0x00,0xCC,0xCC,0x00
          .byte 0x00,0x00,0x30,0x68,0x78,0x30,0x00,0x00,0x00,0x38,0x64,0x74,0x7C,0x38,0x00,0x00
          .byte 0x3C,0x66,0x7A,0x7A,0x7E,0x7E,0x3C,0x00,0x0E,0x3E,0x3A,0x22,0x26,0x6E,0xE4,0x40
          .byte 0x18,0x3C,0x7E,0x3C,0x3C,0x3C,0x3C,0x00,0x3C,0x3C,0x3C,0x3C,0x7E,0x3C,0x18,0x00
          .byte 0x08,0x7C,0x7E,0x7E,0x7C,0x08,0x00,0x00,0x10,0x3E,0x7E,0x7E,0x3E,0x10,0x00,0x00
          .byte 0x58,0x2A,0xDC,0xC8,0xDC,0x2A,0x58,0x00,0x24,0x66,0xFF,0xFF,0x66,0x24,0x00,0x00
          .byte 0x00,0x10,0x10,0x38,0x38,0x7C,0xFE,0x00,0xFE,0x7C,0x38,0x38,0x10,0x10,0x00,0x00
          .byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x1C,0x1C,0x18,0x00,0x18,0x18,0x00
          .byte 0x6C,0x6C,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x7C,0x28,0x7C,0x28,0x00,0x00
          .byte 0x10,0x38,0x60,0x38,0x0C,0x78,0x10,0x00,0x40,0xA4,0x48,0x10,0x24,0x4A,0x04,0x00
          .byte 0x18,0x34,0x18,0x3A,0x6C,0x66,0x3A,0x00,0x18,0x18,0x20,0x00,0x00,0x00,0x00,0x00
          .byte 0x30,0x60,0x60,0x60,0x60,0x60,0x30,0x00,0x0C,0x06,0x06,0x06,0x06,0x06,0x0C,0x00
          .byte 0x10,0x54,0x38,0x7C,0x38,0x54,0x10,0x00,0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00
          .byte 0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00
          .byte 0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x04,0x08,0x10,0x20,0x40,0x00,0x00
          .byte 0x38,0x4C,0xC6,0xC6,0xC6,0x64,0x38,0x00,0x18,0x38,0x18,0x18,0x18,0x18,0x7E,0x00
          .byte 0x7C,0xC6,0x0E,0x3C,0x78,0xE0,0xFE,0x00,0x7E,0x0C,0x18,0x3C,0x06,0xC6,0x7C,0x00
          .byte 0x1C,0x3C,0x6C,0xCC,0xFE,0x0C,0x0C,0x00,0xFC,0xC0,0xFC,0x06,0x06,0xC6,0x7C,0x00
          .byte 0x3C,0x60,0xC0,0xFC,0xC6,0xC6,0x7C,0x00,0xFE,0xC6,0x0C,0x18,0x30,0x30,0x30,0x00
          .byte 0x78,0xC4,0xE4,0x78,0x86,0x86,0x7C,0x00,0x7C,0xC6,0xC6,0x7E,0x06,0x0C,0x78,0x00
          .byte 0x00,0x00,0x18,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x18,0x18,0x30
          .byte 0x1C,0x38,0x70,0xE0,0x70,0x38,0x1C,0x00,0x00,0x7C,0x00,0x00,0x7C,0x00,0x00,0x00
          .byte 0x70,0x38,0x1C,0x0E,0x1C,0x38,0x70,0x00,0x7C,0xC6,0xC6,0x1C,0x18,0x00,0x18,0x00
          .byte 0x3C,0x42,0x99,0xA1,0xA5,0x99,0x42,0x3C,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0x00
          .byte 0xFC,0xC6,0xC6,0xFC,0xC6,0xC6,0xFC,0x00,0x3C,0x66,0xC0,0xC0,0xC0,0x66,0x3C,0x00
          .byte 0xF8,0xCC,0xC6,0xC6,0xC6,0xCC,0xF8,0x00,0xFE,0xC0,0xC0,0xFC,0xC0,0xC0,0xFE,0x00
          .byte 0xFE,0xC0,0xC0,0xFC,0xC0,0xC0,0xC0,0x00,0x3E,0x60,0xC0,0xCE,0xC6,0x66,0x3E,0x00
          .byte 0xC6,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0x00,0x7E,0x18,0x18,0x18,0x18,0x18,0x7E,0x00
          .byte 0x06,0x06,0x06,0x06,0xC6,0xC6,0x7C,0x00,0xC6,0xCC,0xD8,0xF0,0xF8,0xDC,0xCE,0x00
          .byte 0x60,0x60,0x60,0x60,0x60,0x60,0x7E,0x00,0xC6,0xEE,0xFE,0xFE,0xD6,0xC6,0xC6,0x00
          .byte 0xC6,0xE6,0xF6,0xFE,0xDE,0xCE,0xC6,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00
          .byte 0xFC,0xC6,0xC6,0xC6,0xFC,0xC0,0xC0,0x00,0x7C,0xC6,0xC6,0xC6,0xDE,0xCC,0x7A,0x00
          .byte 0xFC,0xC6,0xC6,0xCE,0xF8,0xDC,0xCE,0x00,0x78,0xCC,0xC0,0x7C,0x06,0xC6,0x7C,0x00
          .byte 0x7E,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00
          .byte 0xC6,0xC6,0xC6,0xEE,0x7C,0x38,0x10,0x00,0xC6,0xC6,0xD6,0xFE,0xFE,0xEE,0xC6,0x00
          .byte 0xC6,0xEE,0x3C,0x38,0x7C,0xEE,0xC6,0x00,0x66,0x66,0x66,0x3C,0x18,0x18,0x18,0x00
          .byte 0xFE,0x0E,0x1C,0x38,0x70,0xE0,0xFE,0x00,0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00
          .byte 0x60,0x60,0x30,0x18,0x0C,0x06,0x06,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00
          .byte 0x18,0x3C,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF
          .byte 0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x06,0x3E,0x66,0x66,0x3C,0x00
          .byte 0x60,0x7C,0x66,0x66,0x66,0x66,0x7C,0x00,0x00,0x3C,0x66,0x60,0x60,0x66,0x3C,0x00
          .byte 0x06,0x3E,0x66,0x66,0x66,0x66,0x3E,0x00,0x00,0x3C,0x66,0x66,0x7E,0x60,0x3C,0x00
          .byte 0x1C,0x30,0x78,0x30,0x30,0x30,0x30,0x00,0x00,0x3E,0x66,0x66,0x66,0x3E,0x06,0x3C
          .byte 0x60,0x7C,0x76,0x66,0x66,0x66,0x66,0x00,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x00
          .byte 0x0C,0x00,0x1C,0x0C,0x0C,0x0C,0x0C,0x38,0x60,0x60,0x66,0x6C,0x78,0x6C,0x66,0x00
          .byte 0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0xEC,0xFE,0xFE,0xFE,0xD6,0xC6,0x00
          .byte 0x00,0x7C,0x76,0x66,0x66,0x66,0x66,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x3C,0x00
          .byte 0x00,0x7C,0x66,0x66,0x66,0x7C,0x60,0x60,0x00,0x3E,0x66,0x66,0x66,0x3E,0x06,0x06
          .byte 0x00,0x7E,0x70,0x60,0x60,0x60,0x60,0x00,0x00,0x3C,0x60,0x3C,0x06,0x66,0x3C,0x00
          .byte 0x30,0x78,0x30,0x30,0x30,0x30,0x1C,0x00,0x00,0x66,0x66,0x66,0x66,0x6E,0x3E,0x00
          .byte 0x00,0x66,0x66,0x66,0x66,0x3C,0x18,0x00,0x00,0xC6,0xD6,0xFE,0xFE,0x7C,0x6C,0x00
          .byte 0x00,0x66,0x3C,0x18,0x3C,0x66,0x66,0x00,0x00,0x66,0x66,0x66,0x66,0x3E,0x06,0x3C
          .byte 0x00,0x7E,0x0C,0x18,0x30,0x60,0x7E,0x00,0x0E,0x18,0x0C,0x38,0x0C,0x18,0x0E,0x00
          .byte 0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x00,0x70,0x18,0x30,0x1C,0x30,0x18,0x70,0x00
          .byte 0x00,0x00,0x76,0xDC,0x00,0x00,0x00,0x00,0x10,0x28,0x10,0x54,0xAA,0x44,0x00,0x00
          .end
      

       
      完成
      19.jpg
      20.jpg

      发布在 爱搞机专区
      steward
      司徒
    • 回复: 求大神帮忙DIY流媒体后视镜

      尷尬了~我竟然無法移動主題到 V系列區域, 哈, 那就是代表有緣啦~
      那你有"视镜主控为全志V535"相關的資訊嗎?

      发布在 爱搞机专区
      steward
      司徒

    steward 发布的最新帖子

    • 回复: Gaviar Handheld (小志掌機)

      司徒看了一下, 發現是有 OpenGL ES

      EmuELEC:~ # strings /usr/bin/emulationstation | grep lib | grep ".so"
      /lib/ld-linux-aarch64.so.1
      libfreeimage.so.3
      libSDL2-2.0.so.0
      libpthread.so.0
      libfreetype.so.6
      libSDL2_mixer-2.0.so.0
      libcurl.so.4
      libvlc.so.5
      libasound.so.2
      libEGL.so
      libstdc++.so.6
      libm.so.6
      libgcc_s.so.1
      libc.so.6
      

      只好寫個 OpenGL ES 2.0 測試一下, 開發環境就使用 Miyoo Mini 的 Toolchain

      $ cd
      $ wget https://github.com/steward-fu/website/releases/download/miyoo-mini/mini_toolchain-v1.0.tar.gz
      $ tar xvf mini_toolchain-v1.0.tar.gz
      $ sudo mv mini /opt
      $ sudo mv prebuilt /opt
      
      $ export PATH=/opt/mini/bin:$PATH
      $ arm-linux-gnueabihf-gcc --version
          arm-linux-gnueabihf-gcc (GNU Toolchain for the A-profile Architecture 8.2-2018-08 (arm-rel-8.23)) 8.2.1 20180802
      

      main.c

      #include <stdio.h>
      #include <stdlib.h>
      #include <SDL2/SDL.h>
      #include <GLES2/gl2.h>
         
      const char *vShaderSrc = 
          "attribute vec4 vPosition;    \n"
          "void main(void)              \n"
          "{                            \n"
          "    gl_Position = vPosition; \n"
          "}";
        
      const char *fShaderSrc =
          "#ifdef GL_ES               \n"
          "precision mediump float;   \n"
          "#endif                     \n"
          "uniform vec4 vColor;       \n"
          "void main(void)            \n"
          "{                          \n"
          "    gl_FragColor = vColor; \n"
          "}";
         
      int main(int argc, char **argv)
      {
          SDL_Window *window = NULL;
          SDL_GLContext context = {0};
         
          SDL_Init(SDL_INIT_VIDEO);
          SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
          SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
          SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
         
          window = SDL_CreateWindow("main", 0, 0, 800, 480, SDL_WINDOW_OPENGL);
          context = SDL_GL_CreateContext(window);
         
          GLuint vShader = 0;
          GLuint fShader = 0;
          GLuint pObject = 0;
         
          vShader = glCreateShader(GL_VERTEX_SHADER);
          glShaderSource(vShader, 1, &vShaderSrc, NULL);
          glCompileShader(vShader);
         
          fShader = glCreateShader(GL_FRAGMENT_SHADER);
          glShaderSource(fShader, 1, &fShaderSrc, NULL);
          glCompileShader(fShader);
         
          pObject = glCreateProgram();
          glAttachShader(pObject, vShader);
          glAttachShader(pObject, fShader);
          glLinkProgram(pObject);
          glUseProgram(pObject);
             
          GLfloat v[] = {
               0.0f,  0.5f, 0.0f,
              -0.5f, -0.5f, 0.0f,
               0.5f, -0.5f, 0.0f
          };
        
          GLuint vp = glGetAttribLocation(pObject, "vPosition");
          glVertexAttribPointer(vp, 3, GL_FLOAT, GL_FALSE, 0, v);
          glEnableVertexAttribArray(vp);
        
          GLuint vc = glGetUniformLocation(pObject, "vColor");
          glUniform4f(vc, 1.0f, 0.0f, 0.0f, 1.0f);
        
          glViewport(0, 0, 800, 480);
          glClear(GL_COLOR_BUFFER_BIT);
          glDrawArrays(GL_TRIANGLES, 0, 3);
        
          SDL_GL_SwapWindow(window);
          SDL_Delay(300000);
         
          SDL_DestroyWindow(window);
          SDL_GL_DeleteContext(context);
          SDL_Quit();
          return 0;
      }
      

      編譯

      $ /opt/mini/bin/arm-linux-gnueabihf-gcc main.c -o main -lSDL2 -lGLESv2
      

      執行

      EmuELEC:/flash # kill -STOP `pidof emulationstation`
      EmuELEC:/flash # ./main 
          librga:RGA_GET_VERSION:4.00,4.000000 
          ctx=0xaaceb098,ctx->rgaFd=3 
          Rga built version:9de46679a07
      

      作為一台便宜的嵌入式學習機器, 這 RK3326 還是可以的~哈
      1.jpg

      发布在 爱搞机专区
      steward
      司徒
    • 回复: Gaviar Handheld (小志掌機)

      UART 腳位
      1.jpg

      焊接
      2.jpg

      連接PC
      3.jpg

      Baudrate 115200bps

      U-Boot 2017.09-00037-g0e26e35cb1-dirty (Aug 22 2024 - 08:13:33 -0700)
      
      Model: Rockchip RK3326 ODROID-GO Advanced
      DRAM:  992 MiB
      Sysmem: init
      Relocation Offset is: 3dabc000
      Using default environment
      
      adc0 (hw rev) 166
      dwmmc@ff370000: 1
      ## Error: "rkimg_bootdev" not defined
      Bootdev: mmc 0
      rockchip_get_bootdev: Can't find dev_desc!
      init_resource_list: dev_desc is NULL!
      RKPARM: Invalid parameter part table
      dtb in resource read fail, try dtb in spi flash
      sfc nor id: 0 0 0
      ret -1
      
      Device 1: sfc nor id: 0 0 0
      ret -1
      
      spinor read: device 1 block # 8192, count 200 ... sfc nor id: 0 0 0
      ret -1
      -1 blocks read: ERROR
      dtb in spi flash fail, try dtb in fat
      reading rk3326-odroidgo2-linux.dtb
      91515 bytes read in 8 ms (10.9 MiB/s)
      I2c speed: 400000Hz
      PMIC:  RK8170 (on=0x80, off=0x00)
      vdd_logic 1100000 uV
      vdd_arm 1100000 uV
      *** Warning - bad CRC, using default environment
      
      发布在 爱搞机专区
      steward
      司徒
    • 回复: Gaviar Handheld (小志掌機)

      正面
      1.jpg

      下邊
      2.jpg

      側邊
      3.jpg

      上邊
      4.jpg

      側邊
      5.jpg

      发布在 爱搞机专区
      steward
      司徒
    • 回复: Gaviar Handheld (小志掌機)

      PCB
      9.jpg

      RAM、RK3326、RK817、4057AN、48780D、TCS7191CB
      10.jpg

      按鍵、導電膠
      11.jpg

      前蓋
      12.jpg

      屏
      13.jpg

      FPC
      14.jpg

      3.7v 2000mA
      15.jpg

      PCB
      16.jpg
      17.jpg

      发布在 爱搞机专区
      steward
      司徒
    • 回复: Gaviar Handheld (小志掌機)

      來點輕鬆的拆機分享, 料雞規格如下:
      1.jpg

      包裝
      1.jpg

      正面
      2.jpg

      下邊
      3.jpg

      側邊
      4.jpg

      上邊
      5.jpg

      側邊
      6.jpg

      背面
      7.jpg

      背蓋
      8.jpg

      发布在 爱搞机专区
      steward
      司徒
    • 回复: Gaviar Handheld (小志掌機)

      @caozilong

      Q: 为什么还要让几十年前的老 ROM/固件运行在相对现代的异构处理器上 ?
      A: 初衷就是想要玩玩小時候還沒有通關的遊戲或者再度懷舊一下小時候玩過的遊戲, 然後, 芯片一直在更新, 遊戲還沒有通關時, 廠家又出新的芯片, 然後舊的遊戲機壞了, 所以, 只好一直瞎搞...

      Q: 为什么不直接用 C 重写游戏、让它们原生运行呢 ?
      A: 遊戲一般是不開放源代碼的, 裡面有很多設計師的智慧, 要寫出一個 85% 像的遊戲, 難度其實很高的, 除了需要逆向工程去了解遊戲內容以及硬件特性, 更需要花費時間撰寫, 加上裡面有很多隱藏關卡或者寶物, 只有使用逆向工程才有機會了解, 這樣的話, 搞搞模擬器是比較省時間的作法~

      Q: 直接用 C 重写游戏、让它们原生运行, 这样是否更有优势 ?
      A: 就原生運行速度來看, 模擬器的目標就是要跑出原生運行的速度, 所以, 如同你說的, 用 C 語言重寫, 這樣是不是更具有優勢呢 ? 答案: 答對一半, 因為懷舊遊戲的數量很多, 很難短時間全部重寫出來, 加上以前硬件的限制, 很多遊戲都是針對硬件特性撰寫, 那種邏輯限制的代碼, 不容易使用高階語言寫出來, 熱愛懷舊遊戲的玩家, 在音樂節奏掉半拍或者畫面慢半拍時, 其實都會知道的, 所以除了原生運行速度之外, 花費的時間以及成果數量都是沒有優勢的~

      Q: 兼容性、授权、生态或开发成本等考量
      A: 要寫出兼容性 85% 是一個很大的挑戰, 授權的話, 逆向工程是很難被允許的(只能走邊緣), 授權費用是一大筆費用, 搬磚的司徒, 付不起那個費用, 更何況有 1萬+ 以上的遊戲, 那費用太可觀, 生態的話, ROM 是一個大家認知的標準, 也就是一把尺, 不是重寫可以撼動的, 研發的時間是很漫長的, 研發成本也是很高的, 這些因素疊加後, 重寫遊戲的考量就不會是第一選項~

      其實不管是玩遊戲通關的成就感, 或者是瞎搞技術完成後的成就感, 基本上都是能夠帶給你更棒的生活體驗, 也能夠讓你更快樂, 其實這就是熱愛技術的我們所追求的目標, 或許我們一生都在瞎搞掌機, 可能臨終前也搞不出兼容性 100% 的成果, 但是那種快樂, 可能只有體驗過的人才能夠了解~

      发布在 爱搞机专区
      steward
      司徒
    • 回复: Gaviar Handheld (小志掌機)

      由於小志掌機是基於全志 F133,也就是 RISC-V 核心,因此,司徒無意間注意到一款相當迷你的 RISC-V 模擬器 (mini-rv32ima),Repo 是 https://github.com/cnlohr/mini-rv32ima, 這款迷你 RISC-V 模擬器被移植到相當多的低階晶片上,例如:ESP32,參考的 Repo 有:https://github.com/kangz543g/ESP32C3_RV32IMA_LINUX, https://github.com/xhackerustc/uc-rv32ima, https://github.com/verylowfreq/linux_on_m5stack, 為此,司徒也想來試試這款模擬器的魅力~

      mini-rv32ima
      1.jpg
      2.jpg

      linux_on_m5stack
      1.jpg

      司徒的 ESP32-C3 開發板
      3.jpg

      腳位
      4.jpg

      司徒使用的 PSRAM64H
      5.jpg

      焊接完成
      6.jpg

      司徒焊接 PSRAM64H 的腳位資訊

      PSRAM64H_MOSI   ESP32_GPIO_1
      PSRAM64H_MISO   ESP32_GPIO_2
      PSRAM64H_CS     ESP32_GPIO_9
      PSRAM64H_SCLK   ESP32_GPIO_0
      

      編譯

      $ git clone https://github.com/xhackerustc/uc-rv32ima -b 3e062c59acf745b39be63b86a8e6afad71d27ce8
      $ cd uc-rv32ima
      $ idf.py set-target esp32c3
      $ vim main/CMakeLists.txt
          target_compile_options(${COMPONENT_LIB} PRIVATE -w)
      $ idf.py reconfigure
      $ idf.py menuconfig
          Serial flasher config  ---> Flash size (4 MB)
          Component config → ESP System Settings → [] Enable Task Watchdog Timer
      
      $ vim main/port-esp.c
          206 psram_write(addr, dmabuf, 64);
          213 psram_write(addr, dmabuf, flen);
      
      $ vim main/port-esp.c
          43 #define GPIO_MOSI   1
          44 #define GPIO_MISO   2
          45 #define GPIO_CS     9
          46 #define GPIO_SCLK   0
          47 #define SPI_HOST_ID 1
          48 #define SPI_FREQ    80000000; // 80MHz
      
      $ idf.py build
      $ dtc -I dts -O dtb -o main/uc.dtb main/uc.dts
      

      燒錄

      $ esptool.py \
          --chip esp32c3 \
          -p /dev/ttyACM0 \
          -b 460800 \
          write_flash \
          0x10000 build/uc-rv32ima.bin \
          0x8000 build/partition_table/partition-table.bin \
          0x200000 main/Image \
          0x3ff000 main/uc.dtb
      

      完成 ("$ idf.py -p /dev/ttyACM0 monitor")

      Executing action: monitor
      Running idf_monitor in directory /home/steward/Downloads/uc-rv32ima
      Executing "/home/steward/.espressif/tools/python/v5.3.6/venv/bin/python /home/steward/.espressif/v5.3.6/esp-idf/tools/idf_monitor.py -p /dev/ttyACM0 -b 115200 --toolchain-prefix riscv32-esp-elf- --target esp32c3 --revision 3 --decode-panic backtrace /home/steward/Downloads/uc-rv32ima/build/uc-rv32ima.elf -m '/home/steward/.espressif/tools/python/v5.3.6/venv/bin/python' '/home/steward/.espressif/v5.3.6/esp-idf/tools/idf.py' '-p' '/dev/ttyACM0'"...
      --- esp-idf-monitor 1.10.0 on /dev/ttyACM0 115200
      --- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H
      ESP-ROM:esp32c3-eco7-20230720
      Build:Jul 20 2023
      rst:0x15 (USB_UART_CHIP_RESET),boot:0xf (SPI_FAST_FLASH_BOOT)
      Saved PC:0x420093aa
      --- 0x420093aa: cache_read at /home/steward/Downloads/uc-rv32ima/main/cache.c:113
      SPIWP:0xee
      mode:DIO, clock div:1
      load:0x3fcd5820,len:0x1820
      load:0x403cc710,len:0xbd0
      load:0x403ce710,len:0x2f5c
      entry 0x403cc71a
      I (24) boot: ESP-IDF v5.3.6 2nd stage bootloader
      I (24) boot: compile time Oct 11 2026 20:50:35
      I (25) boot: chip revision: v1.1
      I (27) boot: efuse block revision: v1.3
      I (32) boot.esp32c3: SPI Speed      : 80MHz
      I (37) boot.esp32c3: SPI Mode       : DIO
      I (41) boot.esp32c3: SPI Flash Size : 4MB
      I (46) boot: Enabling RNG early entropy source...
      I (52) boot: Partition Table:
      I (55) boot: ## Label            Usage          Type ST Offset   Length
      I (62) boot:  0 nvs              WiFi data        01 02 00009000 00006000
      I (70) boot:  1 phy_init         RF data          01 01 0000f000 00001000
      I (77) boot:  2 factory          factory app      00 00 00010000 00100000
      I (85) boot:  3 kernel           Unknown data     01 58 00200000 001ff000
      I (92) boot:  4 dtb              Unknown data     01 58 003ff000 00001000
      I (100) boot: End of partition table
      I (104) esp_image: segment 0: paddr=00010020 vaddr=3c020020 size=0a214h ( 41492) map
      I (119) esp_image: segment 1: paddr=0001a23c vaddr=3fc8f000 size=01a58h (  6744) load
      I (122) esp_image: segment 2: paddr=0001bc9c vaddr=40380000 size=0437ch ( 17276) load
      I (133) esp_image: segment 3: paddr=00020020 vaddr=42000020 size=163f0h ( 91120) map
      I (153) esp_image: segment 4: paddr=00036418 vaddr=4038437c size=0abfch ( 44028) load
      I (165) boot: Loaded app from partition at offset 0x10000
      I (166) boot: Disabling RNG early entropy source...
      I (177) cpu_start: Unicore app
      I (186) cpu_start: Pro cpu start user code
      I (186) cpu_start: cpu freq: 160000000 Hz
      I (186) app_init: Application information:
      I (189) app_init: Project name:     uc-rv32ima
      I (194) app_init: App version:      3e062c5-dirty
      I (199) app_init: Compile time:     Oct 11 2026 20:50:22
      I (205) app_init: ELF file SHA256:  feb37fbbd...
      I (210) app_init: ESP-IDF:          v5.3.6
      I (215) efuse_init: Min chip rev:     v0.3
      I (220) efuse_init: Max chip rev:     v1.99 
      I (225) efuse_init: Chip rev:         v1.1
      I (230) heap_init: Initializing. RAM available for dynamic allocation:
      I (237) heap_init: At 3FC92B30 len 0002D4D0 (181 KiB): RAM
      I (243) heap_init: At 3FCC0000 len 0001C710 (113 KiB): Retention RAM
      I (250) heap_init: At 3FCDC710 len 0000294C (10 KiB): Retention RAM
      I (257) heap_init: At 50000000 len 00001FE8 (7 KiB): RTCRAM
      I (264) spi_flash: detected chip: generic
      I (268) spi_flash: flash io: dio
      I (272) sleep: Configure to isolate all GPIO pins in sleep state
      I (279) sleep: Enable automatic switching of GPIO sleep configuration
      I (286) main_task: Started on CPU0
      I (286) main_task: Calling app_main()
      psram init
      I (286) gpio: GPIO[9]| InputEn: 0| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 
      SPI_HOST_ID = 1
      spi_bus_initialize = 0
      spi_bus_add_device = 0
      PSRAM ID: 0d5d46a26412
      loading kernel Image (1457036 bytes) from flash:200000 into psram:0
      RV32IMA starting
      [    0.000000] Linux version 6.9.0-rc1+ (zjs@xhacker) (riscv64-linux-gnu-gcc (Debian 13.2.0-12) 13.2.0, GNU ld (GNU Binutils for Debian) 2.42) #17 Tue Apr  2 10:40:39 CST 2024
      [    0.000000] Machine model: riscv-minimal-nommu,qemu
      [    0.000000] earlycon: uart8250 at MMIO 0x10000000 (options '1000000')
      [    0.000000] printk: legacy bootconsole [uart8250] enabled
      [    0.000000] Zone ranges:
      [    0.000000]   Normal   [mem 0x0000000080000000-0x00000000807fffff]
      [    0.000000] Movable zone start for each node
      [    0.000000] Early memory node ranges
      [    0.000000]   node   0: [mem 0x0000000080000000-0x00000000807fffff]
      [    0.000000] Initmem setup node 0 [mem 0x0000000080000000-0x00000000807fffff]
      [    0.000000] Falling back to deprecated "riscv,isa"
      [    0.000000] riscv: base ISA extensions aim
      [    0.000000] riscv: ELF capabilities aim
      [    0.000000] Kernel command line: earlycon=uart8250,mmio,0x10000000,1000000 console=ttyS0
      [    0.000000] Dentry cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
      [    0.000000] Inode-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
      [    0.000000] Built 1 zonelists, mobility grouping off.  Total pages: 2032
      [    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
      [    0.000000] Memory: 6620K/8192K available (939K kernel code, 77K rwdata, 109K rodata, 292K init, 29K bss, 1572K reserved, 0K cma-reserved)
      [    0.000000] SLUB: HWalign=64, Order=0-1, MinObjects=0, CPUs=1, Nodes=1
      [    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
      [    0.000000] riscv-intc: 32 local interrupts mapped
      [    0.000000] clint: clint@11000000: timer running at 1000000 Hz
      [    0.000000] clocksource: clint_clocksource: mask: 0xffffffffffffffff max_cycles: 0x1d854df40, max_idle_ns: 3526361616960 ns
      [    0.000000] sched_clock: 64 bits at 1000kHz, resolution 1000ns, wraps every 2199023255500ns
      [    0.017927] Calibrating delay loop (skipped), value calculated using timer frequency.. 2.00 BogoMIPS (lpj=10000)
      [    0.031068] pid_max: default: 4096 minimum: 301
      [    0.052508] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
      [    0.065767] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
      [    0.415035] devtmpfs: initialized
      [    0.760730] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
      [    0.773442] futex hash table entries: 16 (order: -5, 192 bytes, linear)
      [    1.238923] clocksource: Switched to clocksource clint_clocksource
      [    2.157118] workingset: timestamp_bits=30 max_order=11 bucket_order=0
      [    8.863810] Serial: 8250/16550 driver, 1 ports, IRQ sharing disabled
      [    9.453665] of_serial 10000000.uart: error -6: IRQ index 0 not found
      [    9.521361] printk: legacy console [ttyS0] disabled
      [    9.652317] 10000000.uart: ttyS0 at MMIO 0x10000000 (irq = 0, base_baud = 1048576) is a XR16850
      [    9.673529] printk: legacy console [ttyS0] enabled
      [    9.673529] printk: legacy console [ttyS0] enabled
      [    9.686691] printk: legacy bootconsole [uart8250] disabled
      [    9.686691] printk: legacy bootconsole [uart8250] disabled
      [   11.072719] clk: Disabling unused clocks
      [   13.545355] Warning: unable to open an initial console.
      [   13.703702] Freeing unused kernel image (initmem) memory: 292K
      [   13.714396] This architecture does not have kernel memory protection.
      [   13.723989] Run /init as init process
      starting pid 19, tty '/dev/console': '/sbin/getty -L -n -l /bin/sh console 0 vt100'
      
      ~ # 
      ~ # free
                        total        used        free      shared  buff/cache   available
          Mem:           6912        1612        4768           0         532        4268
      ~ # cat /proc/version
          Linux version 6.9.0-rc1+ (zjs@xhacker) (riscv64-linux-gnu-gcc (Debian 13.2.0-12) 13.2.0, GNU ld (GNU Binutils for Debian) 2.42) #17 Tue Apr  2 10:40:39 CST 2024
      ~ # cat /proc/cpuinfo
          processor	: 0
          hart		: 0
          isa		: rv32ima_zicntr_zicsr_zifencei_zihpm
          mmu		: none
          mvendorid	: 0xff0ff0ff
          marchid		: 0x0
          mimpid		: 0x0
          hart isa	: rv32ima_zicntr_zicsr_zifencei_zihpm
      
      发布在 爱搞机专区
      steward
      司徒
    • 回复: Gaviar Handheld (小志掌機)

      小志掌機的顯示驅動還是持續開發測試中,司徒剛好有時間來移植 FunKey-OS 裡面的 RetroFE 主介面,試試運行在小志掌機的顯示效果

      $ cd
      $ git clone https://github.com/FunKey-Project/RetroFE --depth=1
      $ git clone https://github.com/FunKey-Project/FunKey-OS --depth=1 -b DrUm78
      

      除了背景,前景圖片不要拉伸

      diff --git a/RetroFE/Source/Graphics/PageBuilder.cpp b/RetroFE/Source/Graphics/PageBuilder.cpp
      index 17451b5..ad20a97 100755
      --- a/RetroFE/Source/Graphics/PageBuilder.cpp
      +++ b/RetroFE/Source/Graphics/PageBuilder.cpp
      @@ -203,8 +203,8 @@ Page *PageBuilder::buildPage( std::string collectionName )
                       return NULL;
                   }
       
      -            scaleX_ = (float)screenWidth_ / (float)layoutWidth;
      -            scaleY_ = (float)screenHeight_ / (float)layoutHeight;
      +            scaleX_ = 1;//(float)screenWidth_ / (float)layoutWidth;^M
      +            scaleY_ = 1;//(float)screenHeight_ / (float)layoutHeight;^M
       
                   std::stringstream ss;
                   ss << layoutWidth << "x" << layoutHeight << " (scale " << scaleX_ << "x" << scaleY_ << ")";
      

      修改資源路徑

      diff --git a/RetroFE/Source/Menu/MenuMode.cpp b/RetroFE/Source/Menu/MenuMode.cpp
      index 8cce5c7..0a33358 100755
      --- a/RetroFE/Source/Menu/MenuMode.cpp
      +++ b/RetroFE/Source/Menu/MenuMode.cpp
      @@ -35,15 +35,15 @@
       #define MENU_BG_SQURE_WIDTH         180
       #define MENU_BG_SQUREE_HEIGHT       140
       
      -#define MENU_FONT_NAME_TITLE        "/usr/games/menu_resources/OpenSans-Bold.ttf"
      +#define MENU_FONT_NAME_TITLE        "/boot/RetroFE/menu_resources/OpenSans-Bold.ttf"
       #define MENU_FONT_SIZE_TITLE        22
      -#define MENU_FONT_NAME_INFO         "/usr/games/menu_resources/OpenSans-Bold.ttf"
      +#define MENU_FONT_NAME_INFO         "/boot/RetroFE/menu_resources/OpenSans-Bold.ttf"
       #define MENU_FONT_SIZE_INFO         16
      -#define MENU_FONT_NAME_SMALL_INFO   "/usr/games/menu_resources/OpenSans-Regular.ttf"
      +#define MENU_FONT_NAME_SMALL_INFO   "/boot/RetroFE/menu_resources/OpenSans-Regular.ttf"
       #define MENU_FONT_SIZE_SMALL_INFO   13
      -#define MENU_PNG_BG_PATH            "/usr/games/menu_resources/zone_bg.png"
      -#define MENU_PNG_ARROW_TOP_PATH     "/usr/games/menu_resources/arrow_top.png"
      -#define MENU_PNG_ARROW_BOTTOM_PATH  "/usr/games/menu_resources/arrow_bottom.png"
      +#define MENU_PNG_BG_PATH            "/boot/RetroFE/menu_resources/zone_bg.png"
      +#define MENU_PNG_ARROW_TOP_PATH     "/boot/RetroFE/menu_resources/arrow_top.png"
      +#define MENU_PNG_ARROW_BOTTOM_PATH  "/boot/RetroFE/menu_resources/arrow_bottom.png"
      

      關閉聲音設定

      diff --git a/RetroFE/Source/Utility/Utils.h b/RetroFE/Source/Utility/Utils.h
      index b97612b..8018e3f 100755
      --- a/RetroFE/Source/Utility/Utils.h
      +++ b/RetroFE/Source/Utility/Utils.h
      @@ -23,8 +23,8 @@
       #define SHELL_CMD_ROOTFS_RW             "rw"
       #define SHELL_CMD_ROOTFS_RO             "ro"
       #define SHELL_CMD_PID_RECORD            "pid record"
      -#define SHELL_CMD_AUDIO_AMP_ON          "audio_amp on"
      -#define SHELL_CMD_AUDIO_AMP_OFF         "audio_amp off"
      +#define SHELL_CMD_AUDIO_AMP_ON          "" //audio_amp on"^M
      +#define SHELL_CMD_AUDIO_AMP_OFF         "" //audio_amp off"^M
       #define SHELL_CMD_MAPPING_ROM           "keymap rom"
       #define SHELL_CMD_MAPPING_DEFAULT       "keymap default"
      

      編譯

      $ cd RetroFE
      $ cmake \
          RetroFE/Source \
          -BRetroFE/Build \
          -DVERSION_MAJOR=0 \
          -DVERSION_MINOR=0 \
          -DVERSION_BUILD=0 \
          -DCMAKE_TOOLCHAIN_FILE=/opt/gaviar/share/buildroot/toolchainfile.cmake
      
      $ cmake --build RetroFE/Build
      $ file RetroFE/Build/retrofe 
          RetroFE/Build/retrofe: ELF 64-bit LSB pie executable, UCB RISC-V
      

      複製到MicroSD

      $ mkdir /xxx/SDCARD/RetroFE
      $ cp RetroFE/Build/retrofe /xxx/SDCARD/RetroFE
      $ cp -a ~/FunKey-OS/FunKey/board/funkey/rootfs-overlay/usr/games/* /xxx/SDCARD/RetroFE
      

      修改設定

      $ vim /xxx/SDCARD/RetroFE/settings.conf
          horizontal = 320
          baseItemPath=/boot/roms
      

      開機後執行

      $ mount -o remount,rw /boot
      $ cd /boot/RetroFE
      $ SDL_NOMOUSE=1 SDL_VIDEODRIVER=fbcon ./retrofe
      

      完成
      1.jpg

      前景圖片沒有拉伸,看起來就是舒服~
      2.jpg
      P.S. 測試檔案 https://github.com/steward-fu/website/releases/download/gaviar/retrofe_test_20261011.img

      发布在 爱搞机专区
      steward
      司徒
    • 回复: Gaviar Handheld (小志掌機)

      @zb8321
      哈~我癡呆了,我記成 Onkyo BX407A4 機器,MBook M1 確實是 SM2231T,那就期待你的好消息~

      发布在 爱搞机专区
      steward
      司徒
    • 回复: Gaviar Handheld (小志掌機)

      @zb8321
      參考網址:https://steward-fu.github.io/website/umpc/bx407a4_usb.htm

      不好意思,我記錯,那個 SM232 SSD Firmware 就是開卡軟件,我當初有使用,但是我的機器還是無法寫入,最後我才改用 USB 開機,只是當初沒有把軟件留下來,這樣看來你可以焊接試試,我當初的機器是很悽慘的,走線被割斷很多條
      1.jpg

      所以才使用替換法試試,使用吸錫線就可以很容易焊接成功,不行的話,你只能拿去手機行
      2.jpg

      发布在 爱搞机专区
      steward
      司徒