拿到 AI Passport 之后,没有先去装现成玩法,第一想法是把它改成一台真正能听歌的设备。原因很简单,它该有的都有:彩屏、扬声器、麦克风、三颗实体键、电池,还有一颗专门跑网络的芯片,唯独官方固件里没有"放歌"这件事。好在官方把整套固件开源在了 GitHub 上(FoloToy/ai-passport),屏幕驱动、按键、配网这些底子都能直接复用,于是拿它当骨架,把应用层整个改写成了音乐播放器:网络拉歌单、在线流媒体解码、电台风格的界面,都是在这个基础上长出来的。
现在它是这样一台设备:开机自动连上家里的 WiFi,拉取云音乐的指定歌单,扬声器直接开唱。深色近黑的屏底、琥珀黄的字体,看起来像一台老式收音机,只是"调台"换的是歌。给它起了个名字叫 TY MUSIC(TY其实是汤圆),烧录的时候顺手把开机热点也改成了 TYMusic 开头,从里到外都算是自己的东西了。
界面是全部重画过的。左上角 TY MUSIC 的呼号,右上角是真实时间、WiFi 信号格和电池电量,时间和时区是从网络对时的,电量读的是板上电量计芯片的实际数值,不是装样子。中间一行大字显示当前歌名,太长会自己左右滚动,不滚的时候规规矩矩居中;下面一排小竖条,每根对应歌单里的一首歌,播到哪根,哪根变红,一眼就能看出歌单的位置。歌名上方是 CH 01 / 21 这样的台号,切歌时数字跟着跳,有点在调频的感觉。暂停的时候两根白色的小竖条会变暗,状态行显示"已暂停",细节不多,但都对着参考图一点一点抠过。
操作只有三颗实体键。上、下换曲,按一下确定键暂停,长按呼出菜单。菜单里放了歌单列表、音乐设置、音量、屏幕亮度和重置入口。歌单列表一行一首,显示歌名加歌手,选中哪行哪行滚动;音乐设置里可以在顺序播放和随机播放之间切,也能决定开机是自动开唱还是等手按一下再响,随机模式换曲的时候专门避开正在播的这首,不会出现"随机到原曲"的尴尬。这些设置直接写进设备存储,断电也不会跑。音量和亮度都是即调即生效,不用确认。
第一次使用不用连电脑。设备自己开热点,手机连上去会弹出配网页,页面里能直接搜索周围的 WiFi,点一下列表就把名字填进输入框,输个密码保存,设备重启后就自己连上了。歌单填云音乐的歌单 ID 就行,换歌源也不用重新刷机,配网页里选一下就好。
真正花时间的都是看不见的地方。这块板子只认 2.4G WiFi,家里 5G 频段死活连不上,设备每隔二十秒超时一次又回到配网页,一开始还以为是配置没存住。在线听歌要走加密连接,芯片的内存本来就紧,默认配置下歌单拉到一半就断,日志里全是内存分配失败,最后是关掉证书校验、把加密从硬件引擎换成软件实现、再砍掉暂时的封面歌词下载,才把整条链路稳下来。最玄学的是声音:开机提示音震天响,一放歌却一点动静没有。为了查这个问题做过一个能自检的固件,开机先播固定音量的正弦音,再播用户设置音量的,又写了个一边放音一边录音的回环测试来量化扬声器到底响没响,最后发现是音频总线配置里一个通道掩码写法不对,驱动按单声道开了时钟,和功放芯片的时序对不上,改一个参数就全好了。
屏幕固件还有个隐蔽的限制:存放程序的分区只有三兆,而屏幕要显示中文就得把字库打包进固件,一整套二十像素的中文字库根本塞不下。最后的办法是只把三千多个常用字打成大号字库,生僻字自动回退到十六像素的小字库,肉眼基本看不出差别,固件体积刚好卡在分区上限下面。

整个界面不是直接在设备上改出来的。先在浏览器里用 HTML 画了一个 1:1 的网页模拟器,屏幕尺寸、配色、每一张卡片的位置都和真机一一对应,歌名滚动的速度、切歌时红色格子怎么跳、暂停状态怎么变化,全在浏览器里调顺,再照着翻成屏幕固件代码。这个过程省掉了无数遍"烧录-盯着看-再改"的循环,也正因为是在 TRAE 里一轮一轮对话磨出来的,模拟器和真机最终几乎一模一样。
现在整套东西已经能日常用了,刷好固件、配一次网就能听,固件和烧录说明都整理在仓库里。下一步打算把歌词和封面捡回来——之前为了保播放稳定先砍掉了,恢复的路径其实测试过,难点还是在内存调度上;再往后想加个睡眠定时,让它能陪着入睡后自己安静下来,或者接一个更大的音箱听。一张小胸牌,改成一台随身的网络电台,这个玩法应该还有不少空间。我把制作好的固件已经上传到官方应用商店了 直接插上设备安装就行了 。







