移植InfoNES到imx6ull(一)


目录

  • 移植InfoNES到imx6ull
    • 1 - 查找方案
    • 2 - 了解工程
      • 2.1 - doc文件夹
      • 2.2 - joypad文件夹
      • 2.3 - linux文件夹
      • 2.4 - mapper文件夹
      • 2.5 - ppc2002 ppc2003
      • 2.6 - win32
      • 2.7 - 项目目录

移植InfoNES到imx6ull

1 - 查找方案

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

在这里插入图片描述
??上图是项目的README文件,使用平台为树莓派、arm-linux或ubuntu,操作方式是直接操作/dev/fb0。后面的编译细节就到我们编译时候在详细讲解吧。

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

使用如下命令clone工程。

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

2 - 了解工程

在这里插入图片描述

2.1 - doc文件夹

??doc文件夹存放一些文档,文档内容是日文的,使用Google翻译翻译一下:
在这里插入图片描述
??右边的汉语各位小伙伴应该都能明白,俺就不多嘴啦。

2.2 - joypad文件夹

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

2.3 - linux文件夹

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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 $@ $(.OFILES) $(LDFILGS) -lm -lz -lpthread -lasound

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

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工具管理代码。

1
2
3
4
5
6
# 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”,后面我们可以重点关注下这些文件

1
2
3
4
5
all:
    InfoNES
   
InfoNES: $(.OFILES)
    $(CC) $(INCLUDES) -o $@ $(.OFILES) $(LDFILGS) -lm -lz -lpthread -lasound

??这几句表示,当我们执行make时,会执行$(CC) $(INCLUDES) -o $@ $(.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 一起交流噢。