欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

移植InfoNES到imx6ull(一)

程序员文章站 2022-05-22 19:19:57
...

移植InfoNES到imx6ull

1 - 查找方案

  最近有不少小伙伴询问我如何在imx6ull开发板上玩InfoNES,俺就抽空将这个移植过程记录下来啦。
  作为程序猿,要开始做一个东西之前,最好是先github上找一下,有没有案例。在github上搜索InfoNES,可以很容易找到如下几个项目:
移植InfoNES到imx6ull(一)
  从上图上看,第一个项目就是在arm linux上使用的工程,跟我们的需求比较符合,就进去瞧一瞧。
arm-NES-linux项目链接

移植InfoNES到imx6ull(一)
  上图是项目的README文件,使用平台为树莓派、arm-linux或ubuntu,操作方式是直接操作/dev/fb0。后面的编译细节就到我们编译时候在详细讲解吧。

  既然这个项目如此符合我们的心意,那还等什么,直接clone下来呀。

使用如下命令clone工程。

git clone https://github.com/nejidev/arm-NES-linux.git

2 - 了解工程

移植InfoNES到imx6ull(一)

2.1 - doc文件夹

  doc文件夹存放一些文档,文档内容是日文的,使用Google翻译翻译一下:
移植InfoNES到imx6ull(一)
  右边的汉语各位小伙伴应该都能明白,俺就不多嘴啦。

2.2 - joypad文件夹

  这里面是一个游戏手柄的驱动和测试程序。笔者手上没有原始的游戏手柄,只有USB接口的游戏手柄,就不用理会这个文件夹了。

2.3 - linux文件夹

  这里面有2个CPP文件和1个Makefile。之前README.md有描述到,最后是在这个目录进行编译的,所以这个Makefile就是我们编译时使用的Makefile文件,非常重要。

CC = arm-linux-gcc
TARBALL = InfoNES08J

# InfoNES
.CFILES =	./../K6502.cpp \
		./../InfoNES.cpp \
		./../InfoNES_Mapper.cpp \
		./../InfoNES_pAPU.cpp \
		./InfoNES_System_Linux.cpp joypad_input.cpp

.OFILES	=	$(.CFILES:.cpp=.o)

CCFLAGS =  -O2 -fsigned-char 
LDFILGS = -lstdc++		# gcc3.x.x

all:
	InfoNES

InfoNES: $(.OFILES)
	$(CC) $(INCLUDES) -o aaa@qq.com $(.OFILES) $(LDFILGS) -lm -lz -lpthread -lasound

.cpp.o:
	$(CC) $(INCLUDES) -c $(CCFLAGS) $*.cpp  -o aaa@qq.com

clean:
	rm -f $(.OFILES) ../*~ ../*/*~ core

cleanall:
	rm -f $(.OFILES) ../*~ ../*/*~ core InfoNES

release:
	clean all

tar:
	( cd ..; \
	tar cvf $(TARBALL).tar ./*; \
	gzip $(TARBALL).tar \
	)

install:
	install ./InfoNES /usr/local/bin
	

  简单阅读下这个文件。

$CC = arm-linux-gcc

  表示使用的交叉工具链为arm-linux-gcc,笔者的工具链为arm-poky-linux-gnueabi-gcc。但是现在仅仅是先浏览代码,不要修改代码,防止待会自己都不清楚自己改了什么。或者是使用git工具管理代码。

# InfoNES
.CFILES =	./../K6502.cpp \
		./../InfoNES.cpp \
		./../InfoNES_Mapper.cpp \
		./../InfoNES_pAPU.cpp \
		./InfoNES_System_Linux.cpp joypad_input.cpp

  这部分指定编译中使用到的文件有“K6502.cpp、InfoNES.cpp、InfoNES_Mapper.cpp、InfoNES_pAPU.cpp、InfoNES_System_Linux.cpp、joypad_input.cpp”,后面我们可以重点关注下这些文件

all:
	InfoNES
	
InfoNES: $(.OFILES)
	$(CC) $(INCLUDES) -o aaa@qq.com $(.OFILES) $(LDFILGS) -lm -lz -lpthread -lasound

  这几句表示,当我们执行make时,会执行$(CC) $(INCLUDES) -o aaa@qq.com $(.OFILES) $(LDFILGS) -lm -lz -lpthread -lasound。后面的-lm -lz -lpthread -lasound表示需要使用到的库,编译此工程前,我们需要先交叉编译下这几个库。笔者使用的工具链中已经包含这些库了,所以就不需要交叉编译这些库了。

2.4 - mapper文件夹

  里面是一堆mapper文件,看得人很蒙。不过不用纠结这个,因为我们的目的是移植,有些文件我们根本是不用修改的,所以暂且略过。

2.5 - ppc2002 ppc2003

  里面存在文件InfoNES_System_ppc之类的文件,而之前linux文件夹中存在InfoNES_System_linux.cpp文件。且Makefile中包含了InfoNES_System_linux.cpp而没有包含InfoNES_System_ppc文件。
  我们可以大胆猜测,ppc2002和ppc2003是类似linux的一种平台,既然我们要移植的是linux平台,所以这个文件夹可以直接跳过,甚至粗暴点,可以直接删除这个文件夹。

2.6 - win32

  win32目录下面是移植到windows平台需要的文件,也与此次目标无关,可以忽略。

2.7 - 项目目录

  项目目录下文件一般都是所有平台都需要使用的文件。

欢迎加QQ群:105335490 一起交流噢。