当前位置: 首页 > news >正文

使用F1C200S从零制作掌机之debian文件系统完善NES

一、模拟器源码

源码:https://files.cnblogs.com/files/twzy/arm-NES-linux-master.zip

二、文件系统

文件系统:debian bullseye

使用builtroot2018构建的文件系统,使用InfoNES模拟器存在bug,搞不定,所以放弃,改用debian。

三、编译

在debian文件系统下编译,在f1c200s开发板执行

解压源码进入Linux目录,不用做修改执行make编译。

编译后在f1c200s开发板执行,屏幕可见画面。

启动debian模拟器

mount_debian.sh

#/bin/bash
cd rootfs
sudo mount --bind /dev dev/
sudo mount --bind /sys sys/
sudo mount --bind /proc proc/
sudo mount --bind /dev/pts dev/pts/
sudo cp /usr/bin/qemu-arm-static  usr/bin/
cd ..
sudo LC_ALL=C LANGUAGE=C LANG=C chroot rootfs

编译:

cd /home/arm-NES-linux/linux && make

退出debian模拟器

unmount_debian.sh

sudo rm rootfs/usr/bin/qemu-arm-static #删除之前拷贝的文件
cd rootfs
sudo umount   dev/pts/ # 一定要在/dev前面umount
sudo umount   dev/
sudo umount   sys/
sudo umount   proc/

四、适配遥控

builtroot制作的文件系统下调试驱动。

在debian系统下使用:evtest命令

这里使用无线手柄:

在命令行执行:evtest,操作无线手柄可发现有按键事件上报。

image-20240709202212982

修改NES模拟器源码linux目录下的joypad_input.cpp,使其适配自己的无线手柄。

修改一

int InitJoypadInput(void)
{int iErr = 0;//iErr = RegisterJoypadInput(&joypadInput);iErr = RegisterJoypadInput(&usbJoypadInput);    // 只注册这个输入return iErr;
}

修改二

static int USBjoypadGet(void)
{/*** FC手柄 bit 键位对应关系 真实手柄中有一个定时器,处理 连A  连B * 0  1   2       3       4    5      6     7* A  B   Select  Start  Up   Down   Left  Right*///因为 USB 手柄每次只能读到一位键值 所以要有静态变量保存上一次的值static unsigned char joypad = 0;struct input_event e;if(0 < read (USBjoypad_fd, &e, sizeof(e))){if(0x3 == e.type){/*上:value:0x8001 type:0x2 number:0x5value:0x0 type:0x2 number:0x5*/if(17 == e.code && -1 == e.value){joypad |= 1<<4;}/*下:value:0x7fff type:0x2 number:0x5value:0x0 type:0x2 number:0x5*/if(17 == e.code && 1 == e.value){joypad |= 1<<5;}//松开if(17 == e.code && 0 == e.value){joypad &= ~(1<<4 | 1<<5);}/*左:value:0x8001 type:0x2 number:0x4value:0x0 type:0x2 number:0x4*/if(16 == e.code && -1 == e.value){joypad |= 1<<6;}/*右:value:0x7fff type:0x2 number:0x4value:0x0 type:0x2 number:0x4*/if(16 == e.code && 1 == e.value){joypad |= 1<<7;}//松开if(16 == e.code && 0 == e.value){joypad &= ~(1<<6 | 1<<7);}}if(0x1 == e.type){/*选择:value:0x1 type:0x1 number:0xavalue:0x0 type:0x1 number:0xa*/if(314 == e.code && 1 == e.value){joypad |= 1<<2;}if(314 == e.code && 0 == e.value){joypad &= ~(1<<2);}/*开始value:0x1 type:0x1 number:0xbvalue:0x0 type:0x1 number:0xb*/if(315 == e.code && 1 == e.value){joypad |= 1<<3;}if(315 == e.code && 0 == e.value){joypad &= ~(1<<3);}/*Avalue:0x1 type:0x1 number:0x0value:0x0 type:0x1 number:0x0*/if(304 == e.code && 1 == e.value){joypad |= 1<<0;}if(304 == e.code && 0 == e.value){joypad &= ~(1<<0);}/*Bvalue:0x1 type:0x1 number:0x1value:0x0 type:0x1 number:0x1*/if(305 == e.code && 1 == e.value){joypad |= 1<<1;}if(305 == e.code && 0 == e.value){joypad &= ~(1<<1);}/*Xvalue:0x1 type:0x1 number:0x3value:0x0 type:0x1 number:0x3*/if(307 == e.code && 1 == e.value){joypad |= 1<<0;}if(307 == e.code && 0 == e.value){joypad &= ~(1<<0);}/*Yvalue:0x1 type:0x1 number:0x4value:0x0 type:0x1 number:0x4*/if(308 == e.code && 1 == e.value){joypad |= 1<<1;}if(308 == e.code && 0 == e.value){joypad &= ~(1<<1);}}return joypad;}return -1;
}

修改三

static void *InputEventTreadFunction(void *pVoid)
{/* 定义函数指针 */int (*GetJoypad)(void);GetJoypad = (int (*)(void))pVoid;while (1){//因为有阻塞所以没有输入时是休眠//g_InputEvent = GetJoypad();int data = GetJoypad();if (data == -1){continue;}else{g_InputEvent = data;}//有数据时唤醒pthread_mutex_lock(&g_tMutex);//因为有阻塞所以没有输入时是休眠pthread_cond_signal(&g_tConVar);pthread_mutex_unlock(&g_tMutex);}
}

五、测试游戏是否可以正常玩耍

可以无声音畅玩了。

image-20240708200227768

六、先解决debian系统下的语音播放

检查声卡

cat /proc/asound/cards

默认声卡配置

vi /etc/asound.conf

defaults.ctl.card 0
defaults.pcm.card 0
defaults.timer.card 0
amixer controls 用于查看音频系统提供的操作接口
amixer contents 用于查看接口配置参数
amixer cget + 接口函数
amixer cset + 接口函数 + 设置值amixer cget numid=14,iface=MIXER,name='ADC Mixer Mic Capture Switch'
amixer cset numid=14,iface=MIXER,name='ADC Mixer Mic Capture Switch' on
打开之后才可以录音
arecord out.wav
root@wang-virtual-machine:~# arecord out.wav
Recording WAVE 'out.wav' : Unsigned 8 bit, Rate 8000 Hz, Mono
^CAborted by signal Interrupt...
root@wang-virtual-machine:~#
root@wang-virtual-machine:~#
root@wang-virtual-machine:~# aplay out.wav
Playing WAVE 'out.wav' : Unsigned 8 bit, Rate 8000 Hz, Mono
^CAborted by signal Interrupt...

七、解决NES模拟器的声音

启动游戏会出现乱七八糟的声音,也不知道对不对。在NES中是通过一些PCM的API操作音频的,具体的看代码吧。

八、mplayer播放音频

mplayer -ao alsa out.wav 特别慢有声音

mplayer -ao alsa test.wav

mplayer -ao alsa test.mp3

root@wang-virtual-machine:/home# mplayer -ao alsa test.mp3
MPlayer 1.4 (Debian), built with gcc-10 (C) 2000-2019 MPlayer Team
do_connect: could not connect to socket
connect: No such file or directory
Failed to open LIRC support. You will not be able to use your remote control.Playing test.mp3.
libavformat version 58.45.100 (external)
Audio only file format detected.
Load subtitles in ./
==========================================================================
Opening audio decoder: [mpg123] MPEG 1.0/2.0/2.5 layers I, II, III
AUDIO: 16000 Hz, 2 ch, s16le, 16.0 kbit/3.12% (ratio: 2000->64000)
Selected audio codec: [mpg123] afm: mpg123 (MPEG 1.0/2.0/2.5 layers I, II, III)
==========================================================================
AO: [alsa] 16000Hz 2ch s16le (2 bytes per sample)
Video: no video
Starting playback...
A:   3.1 (03.0) of 3.0 (03.0) 12.7%Exiting... (End of file)

有办法去掉connect to socket吗?

是遥控器,通过配置去掉。

vi /etc/mplayer/mplayer.conf
lirc=no

但依然还是很慢。能正常使用。

九、参考

https://zhuanlan.zhihu.com/p/670785159

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 电压反馈型运算放大器的增益和带宽
  • Delta的最新更新可让iPad用户同时模拟多款游戏
  • Redis6.2.1版本集群新加副本
  • Ubuntu 修改~/.bashrc终端选择是否使用annconda环境
  • 介绍一款数据准实时复制(CDC)中间件 `Debezium`
  • 绘画平台小程序的设计
  • mysql笔记1
  • 内存对齐的定义以及它的重要性
  • 路径:/EtherCATInfo/Descriptions/Devices/Device/Type/@ShowHideableSubDevices
  • 路由协议的优先级,以及管理距离 AD 和 metric 的区别
  • P6. 对局列表和排行榜功能
  • 【框架】ABP(ASP.NET Boilerplate Project)
  • 24/7/12总结
  • CentOS7二进制安装和YUM安装mongodb,服务器无法安装5.0以上的 mongodb 数据库报错 Illegal instruction
  • asp.netWebForm(.netFramework) CSRF漏洞
  • 【React系列】如何构建React应用程序
  • Android开源项目规范总结
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • es6(二):字符串的扩展
  • JS学习笔记——闭包
  • PermissionScope Swift4 兼容问题
  • Python socket服务器端、客户端传送信息
  • springboot_database项目介绍
  • vue:响应原理
  • vuex 学习笔记 01
  • 技术胖1-4季视频复习— (看视频笔记)
  • 普通函数和构造函数的区别
  • 深度学习中的信息论知识详解
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 责任链模式的两种实现
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • UI设计初学者应该如何入门?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ​业务双活的数据切换思路设计(下)
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • #{} 和 ${}区别
  • #android不同版本废弃api,新api。
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (苍穹外卖)day03菜品管理
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (十六)Flask之蓝图
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (转)http-server应用
  • *算法训练(leetcode)第四十天 | 647. 回文子串、516. 最长回文子序列
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .net 后台导出excel ,word
  • .net 提取注释生成API文档 帮助文档
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .net中我喜欢的两种验证码