感谢司徒开源精神,提供了硬件的可玩性!
借chatgpt东风,利用小长假把几年前的FC3000掌机用户空间挪到imx28上;应该不算移植,只是用户空间重复利用。
不然这imx28-EVK还是要继续吃灰,与F1c100s同为arm9核,454MiB,128MiB DDR2
没办法就在挖坑网挖坟,只能根据自己掌握的资料对FC3000进行复现;FC3000项目的耦合度很高,内核驱动对外围很多硬编码,LCD/按键。。
我在f1c100s测试时发现内置DAC驱动不能工作,表现为插上耳机即会硬件复位;
而且也没有usbhid支持;
如此切入点就直接把uboot+kernel都平替了,uboot2018.01+kernel4.19.88
挪机测试目的很简单,音频通道走了sgtl5000(个人觉得音质不错),内核开usbhid用通用电脑USB键盘;
EVK上LCD是RGB 800x480,直接居中映射320x240,没有拉伸和倍数放大;显示上只是别扭了点(800x480显示320x240效果极其精致!)
fbdev驱动chatgpt给了一版,算是正常工作起来。(这对话模型确实为一些想法提供了可能)
系统引导日志如下,改日上图。
Starting kernel ...
Booting Linux on physical CPU 0x0
Linux version 4.19.88 (test@test-desktop) (gcc version 7.3.0 (Buildroot 2018.02.9)) #50 PREEMPT Thu Oct 8 16:21:11 CEST 2026
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=0005317f
CPU: VIVT data cache, VIVT instruction cache
OF: fdt: Machine model: Freescale i.MX28 Evaluation Kit
Memory policy: Data cache writeback
random: get_random_bytes called from start_kernel+0x80/0x44c with crng_init=0
Built 1 zonelists, mobility grouping on. Total pages: 32512
Kernel command line: console=ttyAMA0,115200 root=/dev/mmcblk0p2 rw rootwait init=/mininit
Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
Memory: 121384K/131072K available (5893K kernel code, 406K rwdata, 1476K rodata, 336K init, 128K bss, 968 8K reserved, 0K cma-reserved)
Virtual kernel memory layout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xffc00000 - 0xfff00000 (3072 kB)
vmalloc : 0xc8800000 - 0xff800000 ( 880 MB)
lowmem : 0xc0000000 - 0xc8000000 ( 128 MB)
modules : 0xbf000000 - 0xc0000000 ( 16 MB)
.text : 0x(ptrval) - 0x(ptrval) (5895 kB)
.init : 0x(ptrval) - 0x(ptrval) ( 336 kB)
.data : 0x(ptrval) - 0x(ptrval) ( 407 kB)
.bss : 0x(ptrval) - 0x(ptrval) ( 129 kB)
rcu: Preemptible hierarchical RCU implementation.
Tasks RCU enabled.
NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16
clocksource: mxs_timer: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 79635851949 ns
sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 89478484971ns
Console: colour dummy device 80x30
Calibrating delay loop... 226.09 BogoMIPS (lpj=1130496)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
CPU: Testing write buffer coherency: ok
Setting up static identity map for 0x40008400 - 0x4000847c
rcu: Hierarchical SRCU implementation.
devtmpfs: initialized
clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
futex hash table entries: 256 (order: -1, 3072 bytes)
pinctrl core: initialized pinctrl subsystem
NET: Registered protocol family 16
DMA: preallocated 256 KiB pool for atomic coherent allocations
Serial: AMBA PL011 UART driver
80074000.serial: ttyAMA0 at MMIO 0x80074000 (irq = 234, base_baud = 0) is a PL011 rev2
console [ttyAMA0] enabled
mxs-dma 80004000.dma-apbh: initialized
mxs-dma 80024000.dma-apbx: initialized
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
videodev: Linux video capture interface: v2.00
pps_core: LinuxPPS API ver. 1 registered
pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
PTP clock support registered
Advanced Linux Sound Architecture Driver Initialized.
clocksource: Switched to clocksource mxs_timer
NET: Registered protocol family 2
tcp_listen_portaddr_hash hash table entries: 512 (order: 0, 4096 bytes)
TCP established hash table entries: 1024 (order: 0, 4096 bytes)
TCP bind hash table entries: 1024 (order: 0, 4096 bytes)
TCP: Hash tables configured (established 1024 bind 1024)
UDP hash table entries: 256 (order: 0, 4096 bytes)
UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
NET: Registered protocol family 1
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
workingset: timestamp_bits=30 max_order=15 bucket_order=0
squashfs: version 4.0 (2009/01/31) Phillip Lougher
io scheduler noop registered (default)
io scheduler mq-deadline registered
io scheduler kyber registered
pwm-backlight backlight: Linked as a consumer to regulator.8
pwm-backlight backlight: FORCE BACKLIGHT ON: brightness=7 power=0 fb_blank=0 state=0x0
backlight backlight: UPDATE STATUS: brightness=7 power=0 fb_blank=0 state=0x0 enabled=0
pwm-backlight backlight: BL POWER ON: enter enabled=0 pwm=(ptrval) power_supply=(ptrval)
pwm-backlight backlight: BL POWER ON: enabling regulator
pwm-backlight backlight: BL POWER ON: regulator_enable() ret=0
pwm-backlight backlight: BL POWER ON: enable_gpio is NULL
pwm-backlight backlight: BL POWER ON: calling pwm_enable()
pwm-backlight backlight: BL POWER ON: pwm_enable() returned
pwm-backlight backlight: BL POWER ON: DONE enabled=1
mxsfb 80030000.lcdif: Linked as a consumer to regulator.6
Console: switching to colour frame buffer device 40x30
mxsfb 80030000.lcdif: initialized
loop: module loaded
libphy: Fixed MDIO Bus: probed
fec 800f0000.ethernet: Linked as a consumer to regulator.3
libphy: fec_enet_mii_bus: probed
fec 800f4000.ethernet: 800f4000.ethernet supply phy not found, using dummy regulator
fec 800f4000.ethernet: Linked as a consumer to regulator.0
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
ehci-mxc: Freescale On-Chip EHCI Host driver
usbcore: registered new interface driver usb-storage
imx_usb 80080000.usb: Linked as a consumer to regulator.4
imx_usb 80090000.usb: Linked as a consumer to regulator.5
ci_hdrc ci_hdrc.1: EHCI Host Controller
ci_hdrc ci_hdrc.1: new USB bus registered, assigned bus number 1
ci_hdrc ci_hdrc.1: USB 2.0 started, EHCI 1.00
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 1 port detected
stmp3xxx-rtc 80056000.rtc: rtc core: registered 80056000.rtc as rtc0
i2c /dev entries driver
Driver for 1-wire Dallas network protocol.
mxs-mmc 80010000.ssp: Linked as a consumer to regulator.2
mxs-mmc 80010000.ssp: Got WP GPIO
mxs-mmc 80010000.ssp: initialized
random: fast init done
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
sdhci-pltfm: SDHCI platform and OF driver helper
hidraw: raw HID events driver (C) Jiri Kosina
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
sgtl5000 0-000a: Linked as a consumer to regulator.1
mxs-sgtl5000 sound: ASoC: CODEC DAI sgtl5000 not registered
oprofile: no performance counters
oprofile: using timer interrupt.
NET: Registered protocol family 17
sgtl5000 0-000a: sgtl5000 revision 0x11
sgtl5000 0-000a: Using internal LDO instead of VDDD: check ER1 erratum
mmc0: new high speed SDHC card at address aaaa
mxs-sgtl5000 sound: sgtl5000 <-> 80042000.saif mapping ok
mmcblk0: mmc0:aaaa SU04G 3.69 GiB
mxs-sgtl5000 sound: sgtl5000 <-> 80046000.saif mapping ok
mmcblk0: p1 p2 p3
stmp3xxx-rtc 80056000.rtc: setting system clock to 2019-08-27 17:07:15 UTC (1566925635)
ALSA device list:
#0: mxs_sgtl5000
uart-pl011 80074000.serial: no DMA platform data
usb 1-1: new low-speed USB device number 2 using ci_hdrc
VFS: Mounted root (vfat filesystem) on device 179:2.
devtmpfs: mounted
Freeing unused kernel memory: 336K
This architecture does not have kernel memory protection.
Run /mininit as init process
input: Logitech USB Keyboard as /devices/soc0/80080000.ahb/80090000.usb/ci_hdrc.1/usb1/1-1/1-1:1.0/0003:0 46D:C31C.0001/input/input0
hid-generic 0003:046D:C31C.0001: input,hidraw0: USB HID v1.10 Keyboard [Logitech USB Keyboard] on usb-ci_ hdrc.1-1/input0
input: Logitech USB Keyboard Consumer Control as /devices/soc0/80080000.ahb/80090000.usb/ci_hdrc.1/usb1/1 -1/1-1:1.1/0003:046D:C31C.0002/input/input1
input: Logitech USB Keyboard System Control as /devices/soc0/80080000.ahb/80090000.usb/ci_hdrc.1/usb1/1-1 /1-1:1.1/0003:046D:C31C.0002/input/input2
hid-generic 0003:046D:C31C.0002: input,hiddev96,hidraw1: USB HID v1.10 Device [Logitech USB Keyboard] on usb-ci_hdrc.1-1/input1
Adding 262140k swap on /mnt/.swap.img. Priority:-2 extents:1 across:262140k SS
Starting logging: OK
read-only file system detected...done
Starting system message bus: random: dbus-uuidgen: uninitialized urandom read (12 bytes read)
random: dbus-uuidgen: uninitialized urandom read (8 bytes read)
random: dbus-daemon: uninitialized urandom read (12 bytes read)
done
Starting network: OK
Welcome to Miyoo
miyoo login: can-3v3: disabling
random: crng init done
random: 1 urandom warning(s) missed due to ratelimiting
Welcome to Miyoo
miyoo login:
离线
我还有个周立功的i.mx287开发板,吃灰很多年了。
离线
我也想玩一下移植,坐等楼主发图
离线
套件总览
皮肤





最近编辑记录 yofa2008 (2026-10-12 21:25:24)
离线
各路模拟器
名场面优先!





















文件管理器计算器之类 就不一一上图

最近编辑记录 yofa2008 (2026-10-12 21:59:39)
离线
DOS模拟器启动很慢;


shell模拟器带虚拟键盘



mplay播放92cc(暴露年纪了)
离线
毫无违和感,撒花!
离线
很强,分辨率做缩放的话就相当麻烦了吧
离线
geekchun 说:
很强,分辨率做缩放的话就相当麻烦了吧
对的。只对FC3000的那套用户空间测试
离线
司徒 说:
相當好的分享~感謝
感谢司徒分享才能有这场测试。如果方便的话,另外有两个问题想问一下:
1。fc3000那套内核您还有继续在维护吗?是否有DAC和usb-hid的patch方便提供,我也有在做那套系统搬到开发板的测试;但发现硬件上深度绑定的东西太多,如果能解决这两点问题,测试进度会快很多;
2。关于草食系统是否还有经继续开发,后续有没有考虑添加多核平台支援(比如四核A7/A9);如果buildroot有arm-buildroot-linux-musleabi-的支持,可玩性会增加很多;
如上两个问题,提前感谢!
离线
Q1: fc3000 那套内核您还有继续在维护吗?是否有 DAC 和 usb-hid 的 patch 方便提供 ?
那套系統我沒有在維護了, 因為 DAC 和 USB-HID 會跟晶片有關係, 當初的 FC3000 是沒有這兩個部分, 所以沒有 Patch, 如果你是想移植到 F1C200S 同類型的晶片, DAC 的部分可以參考 Game Gear Micro
(GGM) 的 Kernel, 裡面我有做 DAC 驅動: https://github.com/steward-fu/website/releases/download/ggm/src_kernel_20220821.tar.gz, 因為 GGM 的音量控制是使用 DAC 調整, 你可以參考 sound/soc/suniv/dac.c, 不過好奇, 你是想移植到哪個開發板上 ?
Q2: 关于草食系统是否还有经继续开发,后续有没有考虑添加多核平台支援(比如四核A7/A9)?
哈~我聽到"草食系统", 我就知道你是資深玩家, 當初因為沒有找美工協助, 所以草食系统就沒有繼續製作, 不過, 現在有 AI 輔助, 我在找找時間來把它完成, 哈, 你說到一個重要的點, 就是多核支持, 現在的模擬器或者系統, 基本上還是使用早期單核心居多, 這個建議我再想想, 目前沒有太多想法~哈~
Q3: 如果 buildroot 有 arm-buildroot-linux-musleabi- 的支持,可玩性会增加很多
musleabi 是比較新的設計, 不過如果要可以跑一些, 像 X.org 相容的東西, 例如: WINE, glibc 可能會比較適合, 不過目前一樣沒有太多想法, 哈~
另外, 我翻了一下 i.MX28 手冊, 裡面有一個 Pixel Pipeline 是可以做硬件縮放, 你可以讓 AI 移植到 fbdev 上, 不過, 使用軟件做縮放也是可以, 一步一步慢慢來, 加油~

离线
@司徒
感谢厘清并提供了f1c100的思路!我只有开发板级的套件用于测试,好处是资料齐,没有商业风险;但更多是没有逆向现成产品的实力。等f1c100s能有进展,也会向imx28evk一样分享;
imx28的测试只是开始,但个人并不看好这类的单核,它更适合像rockbox这种noneOS小型系统,简洁的需求和用户应用场景。个人认为当前fc3000的系统状态(用户空间上)已经接近完整,有编辑器、终端和计算器等OS级工具,加上各路模拟器应用;只是用户按键映射有点乱(这个应该是主要问题),个别模拟器的声音没有完整适配;然后gmenu2x的UI框架加持下基本上已经可以构成一个极简的单机OS(甚至可以加上网络),虽然这部分retroarch有做,但个人觉得它并不是那么简单易用。
榨干硬件性能是一种极致的玩法,需要极高的技术功底;但作为开源这条赛道应该笼络更多人一起加入进来玩耍,实打实的可玩性很重要,不能直接劝退那些想要有点兴趣的朋友。
现在市面上多核的平台的普及,硬件都满天飞。本着专业的人干专业的事,不用重复造轮子的前提,如果未来草食系统能够完善,基于较新6.x内核并支持多核平台,单核+32/64MiB DRAM硬件规格扩展到多核+256/512MiB DRAM或更多,有没有搞头?可能buildroot并不需要像安卓这类系统的硬件规格?
在fc3000的框架上解耦uboot和内核;只做用户态,把内核驱动下放到玩家自己匹配;不再关心底层硬件,玩家可以根据自己的需求配制是HDMI或者mipi LCD,是否使用单独的codec,要不要自己定制的手柄,是否支持蓝牙。。
驱动都托管给linux内核兜底,而用户态只负责更新应用,彻底脱离硬件底层;
优点:
1.打破掌机只能单人游戏的限制,甚至有了联网可能
2.大屏幕电视HDMI直出到小屏幕mipi均能覆盖
3.提升操作体验,甚至可以根据个人需要集成现成的高端游戏手柄(比如xbox)
缺点:
1.逆向现成产品的难度直线上升,基本上都是在操作一些跟安卓启动链和厂商brom加密启动等
想毕司徒应该也有预见到甚至可能看得更远。不知道有没有描述清楚我想表达的意思。
离线
"開源"的宗旨就是希望可以更多人一起來開發或者討論, 當然也是希望可以不要重複造輪子, 不過硬件的差異, 多少還是需要修改一些東西~
硬件的規格越來越好, 不管單核或者多核, 32MB 或者 512MB, Buildroot 或者安卓, 其實應該回歸到, 做這個系統或者遊戲機的目的是什麼 ? 這個可能要先定義好~
用戶管理系統跟底層切開, 其實"天馬"或者 Retroarch 都是可以做到的, 因為硬件會越來越好, 這些都是可以跑的~
那回歸到你這個貼子, 你當初做的動機是什麼 ? 這個可能只有你自己會知道, 基於這個初衷出發, 你才會知道目標在哪~
我的意思是, 如果你想要的是一個用戶軟件跟內核隔離的系統, 我想你的目標會是在 Retroarch 或者天馬系統 ~
离线
司徒您说得很对,此系统要有定义那个“初衷”;我想传递的可能它是一个娱乐终端,有模拟器那些可玩的游戏、高清影音解码回放、常用的软件工具,主流的系统又太"重"了,商业护城河也太高;所以才要定制个人的系统;这也是我回过头来测试fc3000的那套用户空间前端,其实gmenu2x的UI框架已经足够,系统功能也基本完整,那套12宫格4标签页就很合适,也是想看是否有可能移植到多核平台。
前期目标很明确:
一个便携式硬件组态,LCD;本地按键;音频;
一个HDMI输出1080到55电视;网络;蓝牙键盘(手柄);手机app控制??
共用一套用户空间的计划,是想看看drm做原生320x240缩放后的处理是否真的差异性很大。也有做一些简单的retroarch下模拟器在大屏电视的测试(如dosbox/fceumm/genesis+),仍然痛点还是键盘映射,模拟器性能优化等,模拟器终究只是模拟,并不能完全媲美原生;
缺点嘛还有就是:主线驱动支援,可能需要BSP驱动移植;
草食系统如果后续有考量的话,想必也许能提高一些可玩性。
最近编辑记录 yofa2008 (2026-10-17 04:05:50)
离线