Tuesday 13 September 2011

Installing mupen64plus on Pandaboard ( OMAP4 )

Well, here is my first more or less tutorial.

PURPOSE:
To install and configure mupen64plus and gles2n64 plug-in  on Pandaboard.

ASSUMPTIONS:
- You are running Linux on Pandaboard ( or perhaps any other OMAP4 board )
- You have a working Internet connection
- You have installed all GPU drivers ( GLES1, GLES2, EGL, OpenVG, DRI etc ) and they are working
- You are running everything in GUI
- You have a working native toolchain ( GCC, G++, Make, etc )

WHAT DO I USE ?
OS: Ubuntu Linux ( Maverick - 10.10 )
Kernel: 2.6.35-980-omap4
All OMAP add-ons ( which contain GPU drivers ) have been installed using apt-get from TI OMAP trunk PPA
HDMI Ready TV is used as video output
Video input: 1080p
Video output: 1080i

INSTALLING AND CONFIGURING MUPEN64PLUS
( This is not the only method of course, but it does work, at least for me. )

1) Install mupen64plus from your repo. On Ubuntu it would be:
sudo apt-get install mupen64plus

( This is the best way to make sure that you will be able to use your ARM+GLES2 optimised mupen64plus when you have installed and configured it. )

2) Run it and choose some ROM to test:
mupen64plus
or
cd /usr/games && ./mupen64plus
or
cd /usr/local/bin && ./mupen64plus
( This is needed to see if your ROMs actually work with a standard build of mupen64plus. Because if they don't, there is no point trying to get them to work with an ARM optimized version of an emulator.  )

3) Now lets get our hands on a working binary of mupen64plus with an ARM Dynamic Recompiler. The easiest way to get one is by downloading a PND made for Pandora console. ( A lot of thanks to OpenPandora team and all developers ! )
 http://sebt3.openpandora.org/pnd/?f=mupen.pnd
( Thanks to sebt3 for providing the pnd. )
Run:
 wget http://sebt3.openpandora.org/pnd/mupen.pnd

4) To extract the pnd we will need to use the "unsquashfs" program.
Download, extract and make it executable by running:
wget http://zx81.zx81.free.fr/public/pandora/hack/unsquashfs.gz && gzip -d unsquashfs.gz && chmod +x unsquashfs
Run this to extract the contents of the pnd:
 ./unsquashfs mupen.pnd
NOTE: The result will be a folder named "squashfs-root" in the current directory.
NOTE2: If you want to use pnds in the future, it would be smart to install the unsquashfs binary. Run:
sudo cp unsquashfs /usr/bin
or
su &&  cp unsquashfs /usr/bin
Now you can just use "unsquashfs (pnd name)" to extract a pnd.

5) Install the binary of this mupen64plus. On Ubuntu you would copy it to /usr/games, so that you will be able to run it from a menu.
sudo cp -f squashfs-root/mupen64plus /usr/games
Lets also install all of the plugins, some of which may be handy. ( Like a built gles2n64 driver. ) Run:
 sudo cp -f -r squashfs-root/plugins /usr/share/mupen64plus

6) Now, lets build the gles2n64 driver from source. Download it: ( You will need the subversion client for this. )
 svn checkout http://gles2n64.googlecode.com/svn/trunk/ gles2n64-read-only
 The default Makefile is not going to work for anyone, except the author :D ( All directories listed in the makefile are for Windows and specifically  for his Windows box.  ) So, you will need to edit it. Firstly, modify this part:
else

COMPILER_DIR = C:/CS2010q1
SO_EXTENSION = so
CXX = $(COMPILER_DIR)/bin/arm-none-linux-gnueabi-g++
LD = $(COMPILER_DIR)/bin/arm-none-linux-gnueabi-g++
INCLUDE = C:/Users/jim/Desktop/Lachlan/Pandora/include
CFLAGS += -I$(INCLUDE)/libpng12
CFLAGS += -I$(INCLUDE)/SDL
CFLAGS += -I$(INCLUDE)
CFLAGS += -I$(COMPILER_DIR)/arm-none-linux-gnueabi/libc/lib
CFLAGS  += -march=armv7-a -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=softfp -ffast-math \
    -fsingle-precision-constant  -ftree-vectorize -fexpensive-optimizations -fomit-frame-pointer
 so that it looks like this:
else

COMPILER_DIR = /usr
SO_EXTENSION = so
CXX = $(COMPILER_DIR)/bin/g++
LD = $(COMPILER_DIR)/bin/g++
INCLUDE = /usr/include
CFLAGS += -I$(INCLUDE)/libpng12
CFLAGS += -I$(INCLUDE)/SDL
CFLAGS += -I$(INCLUDE)
CFLAGS += -I$(COMPILER_DIR)/arm-none-linux-gnueabi/libc/lib
CFLAGS += -march=armv7-a -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=softfp -ffast-math -fsingle-precision-constant -ftree-vectorize -fexpensive-optimizations -fomit-frame-pointer
Next, edit this part:
ifeq ($(OS), LINUX)
CFLAGS += -Wall -D__LINUX__ -fPIC
LDFLAGS += -LC:/Users/jim/Desktop/Lachlan/Pandora/OS/20101302-pandora-xfce/usr/lib
LDFLAGS += -lEGL -lGLESv2 -lsrv_um -lSDL-1.2 -lpng12 -lz -lIMGegl
LDFLAGS += -lX11 -lts-1.0 -lXau -lXdmcp -shared
else
CFLAGS += -Wall
LDFLAGS +=  -LC:/MinGW/lib/PVR -lSDLmain -lSDL -lpng -lGLESv2
endif
to this:
ifeq ($(OS), LINUX)
CFLAGS += -Wall -D__LINUX__ -fPIC
LDFLAGS += -LC:/usr/lib
LDFLAGS += -lEGL -lGLESv2 -lsrv_um -lSDL -lpng12 -lz -lIMGegl
LDFLAGS += -lX11 -lXau -lXdmcp -shared
else
CFLAGS += -Wall
LDFLAGS += -lSDLmain -lSDL -lpng -lGLESv2
endif
Now our Makefile is ready to work. Apart from directories I have also changed "-mtune=cortex-a8" to "-mtune=cortex-a9" to gain some optimizations for Cortex A9 CPU. Also, I have removed -lts-1.0 CFLAG, because ld failed to load a library that doesn't even exist. ( Why I didn't install it you want to ask ? Because I don't know what on earth is the name of this library. Google was so useless trying to find a library using three characters ... ). Finally I edited some CFLAGS and LDFLAGS.
Next we will modify two other files. Edit OpenGL.h. This is the part we need:
#ifndef OPENGL_H
#define OPENGL_H

#include <EGL/egl.h>
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <GLES2/gl2extimg.h>
#include "winlnxdefs.h"
#include "SDL.h"
#include "gSP.h"
Remove or comment out ( add // at the start of the line ) "#include <GLES2/gl2extimg.h>". We don't have this header. ( At least in Maverick's PPA. )
Now modify the file OpenGL.cpp. Remove this part: ( shold be at line 490 )
                case GL_FRAMEBUFFER_INCOMPLETE_FORMATS:
                    printf("Incomplete Formats. \n"); break;
Ye, I know it is a dirty and unrecommended way of dealing with a problem related to source files. There must be a cleaner and smarter way. But it does work. ( With these two lines in place the compilation always failed. I am not a programmer, so I had to rely on logic alone.)

Before you can run make you will need to install SDL headers. On Ubuntu it would be:
 sudo apt-get install libsdl1.2-dev
Build:
cd gles2n64-read-only && make all && cd ..
You should end up with a "gles2n64.so" shared library. Copy it into your plugin directory:
 sudo cp -f gles2n64-read-only/gles2n64.so /usr/share/mupen64plus/plugins
Now you can use a newly created gles2n64 driver :D

7) Start your new mupen64plus:
cd /usr/games && ./mupen64plus
( No rom is needed. ) Go to your home directory, make hidden files visible and see if you have a folder named .mupen64plus. In that folder there should be a file named gles2n64.conf. Edit it:
"window enable x11" should be 1
"window centre" should be 1
"window fullscreen" should be 0
"framebuffer enable" must be 0 ( otherwise you will have no output )

"screen width" "screen height" "window width" "window height" control the dimensions of the gles2n64 output. If your Pandaboard outputs 1080p, I would recommend using about 1810 for width and 970 for height.
There also should be a file named mupen64plus.conf in the same directory. We will point mupen to required plugins. Modify:
Gfx Plugin = gles2n64.so ( we will use this of course )
Audio Plugin = jttl_audio.so ( there is also plugin by Notaz, but it requires OSS I think )
Input Plugin = which one you prefer ( I use blight_input.so )
anything else you would want.

That's all. You would also probably need to configure your controller. ( I use SixAxis. ) Enjoy your games !

SCREENSHOTS
I made them quickly ...

Turok 2 Seeds of Evil

Star Fox 64





ROMS I HAVE TRIED
( All roms are PAL. Played all games nearly at 1080p. All plug-ins except gfx are standard. Mupen64plus uses one core. Frequency = 1GHz )

Turok 2 Seeds of Evil - works perfectly, certainly playable, some minor graphics glitches. FPS = 12 - 26

Turok Dinosaur Hunter - same as Turok 2

Star Fox 64 - excellent, very little graphics bugs. Sound playback is not that good, but ok. FPS = 12 - 30

Resident Evil 2 - doesn't work at all ( errors related to dynamic recompiler )

Quake 64 - not so fast as I would expect it to be, major graphics glitches, sound delays, not enjoyable to play. FPS = 11 -20

Monday 27 June 2011

How to install Angstrom Linux on Pandaboard ( no serial cable )

Background
This tutorial assumes that you want to easily install Angstrom on Panda, without using serial cable connection, i.e you want to simply have all of your output to be displayed on your TV/Monitor via HDMI/DVI.

What do you need
- Pandaboard ( obviously working one )
- SD card ( if you want GUI you would want to get at least 512 MB one )
- TV/Monitor ( connected via HDMI/DVI )
- Keyboard
- Mouse
- Recommended powersupply for Panda ( 5V, 3.6 - 4A )
- Host Linux PC with Internet connection
- Internal/External SD drive

Building Angstrom rootfs
Go on to the following site:
http://narcissus.angstrom-distribution.org/
( This is an online tool to create Angstrom filesystem )
Configure your rootfs:

Base settings:
- Machine type = omap4430-panda/pandaboard ( both work, but I have no idea about the difference )
- Image name = anything you want
- Complexity = simple/advanced

Advanced settings: ( if chosen )
- Release = stable ( I recommend to choose stable, as it will at least work. Next-glibc is probably nice, but it is intended more towards developers and I have never tried it. If one is willing to try it, please tell me results. )
- Base system = extended ( more drivers = better, I think )
- /dev manager = udev ( maybe I should try kernel one ? )
- init manager = sysvinit
- type of image = tar.gz ( works fine )
- Software manifest = yes/no
- SDK type = none ( why would we need it ? oh, I guess its just me - my host POWER5+ machine would not do the job anyhow )

User environment selection:
Environment = X11 ( we want GUI )
X11 Desktop Environment = Enlightenment ( this one works for me )
Note: For some reason Narcissus failed to include Gnome in the rootfs. I wonder will it work now. Also XFCE seems to install fine, but it didn't work for me and there was absolutely nothing to suggest the existance of Xorg/X11 in the rootfs. Bug ?

Additional packages:
Choose what you want. ( I suggest to include all kernel modules, Bluez, Alsa utils, Toolchain, SDK, Midori, Git, etc )

Now hit "Build me!" button and wait. Don't press refresh button. The build time depends on the server.
When it has finished building, a link of your new rootfs will appear. Just download it.

SD card setup and installation process
Now go to:
http://www.angstrom-distribution.org/demo/pandaboard/
and download mkcard.txt, MLO, u-boot.bin. Thanks goes to the author for providing these files.
Allow the mkcard.txt script to be executable.
Insert your SD card in your host PC. Find out its name with:
dmesg
Now open Terminal, gain root privileges  and cd into directory with the script. Run:
./mkcard.txt /dev/(your card)
 Caution: Be careful here, so you don't end up wiping out your HDD.
You should get two partitions, one is FAT32, labeled "boot", and the other one is EXT3, labeled "Angstrom".
With root privileges extract your rootfs to the "Angstrom" partition of the SD. This will take a while. Then copy MLO, u-boot.bin to the "boot" partition. Finally go to your "Angstrom" partition and copy the uImage-2.6.XX.... ( this is the kernel ) from the /boot folder to the "boot" partition of your SD. Rename it to uImage. Our SD setup is complete. You can unmount your card.
Note: Ensure that you copy your active kernel, i.e the one to which uImage in the /boot directory of the rootfs is linked to.

Booting up
Insert your SD card into Panda. Connect your TV/Monitor, keyboard, mouse. Now connect you power supply. Turn on your Panda.

You will not see anything on your TV/Monitor during this long ( about 10 - 15 min ) boot up most likely ( but you must get a video signal though ).  Then you should see the Angstrom setup window ( assuming you have GUI of course ). Complete the setup. Your Angstrom is ready to be used :D

Finally my Pandaboard gets a usable OS !

Background
I had to spent a hell a lot of time trying to get my OMAP4430 dev board to boot a usable Linux. By "usable" I mean a Linux which has a practical value to me. Just to say I am neither a developer nor a programmer. I am just a hobbyist :D
I needed to have a Linux which:
a) Works and works well
b) Has a GUI and doesn't need a Serial cable + a PC connected to it
c) Runs fast enough

Ubuntu
Most tutorials assumed that I have a serial cable and know how to use it. But I don't and don't need one, I am not a dev. So initially my idea was to simply install Ubuntu. http://www.omappedia.org/wiki/OMAP_Ubuntu_Main
... Well, I tried both Maverick and Natty ... HDMI video out works, bluetooth & wifi & GPU acceleration work after installing OMAP 4 addons, etc ... But the speed is ... amazingly horrible. I can't believe, but it is even worth than running Linux on PS3 as OtherOS. ( And that thing didn't even had GPU access - unless someone hacked it of course. BTW you can compare PS3 Linux to high end G4 without 3d staff or some old 800 MHz Intel PC. ) I doubt this speed is only due running OS on a SD card. After all some OSs fly on Panda with 4 - 6 Class SDHC. I think it is the system itself. Ubuntu was never a Linux that you should run on embedded or old machines. I didn't expect it to use > 200 MB of RAM ( well, the high-end GUI gets what it deserves ). The CPU usage is strange - about 50 % for both A9 cores when doing anything in GUI without POWERVR drivers. ( My system must be fast enough even when running with bare frame buffer. ) That's a lot of wasted performance for moving windows or opening System Monitor. Sometimes the CPU load on one core goes to 100 %. What about SGX drivers ? Well, I can barely feel a little bit of insignificant acceleration when browsing menus. Everything is still slow, too slow with constant late responses. And how on earth apt-get ended up using 680 MB of RAM ? Is DDR2 that slow ? I guess not, it is just the OS. So in the end, I must say that Ubuntu is certainly not for Panda, unless you have a spare external HDD. But even then the performance wouldn't be that great.

Angstrom
Then, I have installed Angstrom. And it gave to me awesome performance. It is fast even at 300 MHz. The E17 ( or is it E18 ) GUI is incredible, moving/resizing/minimising/etc windows is easy and quick. All I can say is that it is much much faster then Ubuntu. Thanks to Angstrom developers for bringing up such a useful system !

Some Angstrom notes
( I will make a tutorial  sooner or later on installing Angstrom )
- I have used an online builder Narcissus to build rootfs
- Both pandaboard and omap4430-panda configs work
- I have chosen Enlightenment for GUI
- uImage = kernel from rootfs ( rename uImage-X.XX.X... to uImage )
- Both MLO and u-boot.bin were downloaded from here:
http://www.angstrom-distribution.org/demo/pandaboard/
- SD card setup with mkcard script from the above link
- OS works fast and boots fast ( first boot is long )
- I don't have boot.scr ( highmem is enabled )
- SMP is working
- USB devices work ( mouse, keyboard and USB Thumb drive are verified to work )
- USB storage devices are mounted correctly ( had yet to see how external HDD will work )
- Temp indicator seems to work
- Power management is working ( at the first glance )
- You can change frequency of CPU: 300/600/800/1000 MHz
- Default mode: 1GHz
- I am not able to log-out or turn off the system with a GUI method when running as user. "Turn off" in GUI works when logging in as root.
EDIT:
- External HDD works and is mounted correctly ( but, damn, I have a hard time trying to unmount it )
- SD card used: LEXAR 8 GB SDHC 100x Class 6
- I can change power management settings only when running system as root.