diff options
author | David-John Willis | 2011-04-12 12:05:56 +0100 |
---|---|---|
committer | David-John Willis | 2011-04-13 08:01:15 +0100 |
commit | cb3e3e7125274dba4437f0beb35b461405eb3442 (patch) | |
tree | bf414509142fe8e02593f77c8e5188974ee964cc /backends/platform/gph | |
parent | 65fc72e30a885f6adca99505ee869e010f94c1c3 (diff) | |
download | scummvm-rg350-cb3e3e7125274dba4437f0beb35b461405eb3442.tar.gz scummvm-rg350-cb3e3e7125274dba4437f0beb35b461405eb3442.tar.bz2 scummvm-rg350-cb3e3e7125274dba4437f0beb35b461405eb3442.zip |
GP2X: Move build support files into the GPH backend.
Diffstat (limited to 'backends/platform/gph')
-rw-r--r-- | backends/platform/gph/build/gp2x-build.sh | 20 | ||||
-rw-r--r-- | backends/platform/gph/build/gp2x-bundle.sh | 19 | ||||
-rw-r--r-- | backends/platform/gph/build/gp2x-config-alleng.sh | 23 | ||||
-rw-r--r-- | backends/platform/gph/build/gp2x-config.sh | 24 | ||||
-rw-r--r-- | backends/platform/gph/devices/gp2x/mmuhack/Makefile | 11 | ||||
-rw-r--r-- | backends/platform/gph/devices/gp2x/mmuhack/flush_uppermem_cache.h | 11 | ||||
-rw-r--r-- | backends/platform/gph/devices/gp2x/mmuhack/flush_uppermem_cache.s | 6 | ||||
-rw-r--r-- | backends/platform/gph/devices/gp2x/mmuhack/mmuhack.c | 129 | ||||
-rw-r--r-- | backends/platform/gph/devices/gp2x/mmuhack/mmuhack.o | bin | 0 -> 1720 bytes | |||
-rw-r--r-- | backends/platform/gph/devices/gp2x/mmuhack/readme.txt | 110 | ||||
-rw-r--r-- | backends/platform/gph/devices/gp2x/scummvm.gpe | 18 | ||||
-rw-r--r-- | backends/platform/gph/gp2x-bundle.mk | 16 |
12 files changed, 379 insertions, 8 deletions
diff --git a/backends/platform/gph/build/gp2x-build.sh b/backends/platform/gph/build/gp2x-build.sh new file mode 100644 index 0000000000..1ea77f4937 --- /dev/null +++ b/backends/platform/gph/build/gp2x-build.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +echo Quick script to make building all the time less painful. + +# Set the paths up here to support the build. + +export PATH=/opt/open2x/gcc-4.1.1-glibc-2.3.6/arm-open2x-linux/bin:$PATH +export PATH=/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin:$PATH +export CXX=arm-open2x-linux-g++ +export CC=arm-open2x-linux-gcc +export CXXFLAGS=-march=armv4t +export LDFLAGS=-static +export ASFLAGS=-mfloat-abi=soft + +cd ../../../.. + +echo Building ScummVM for GP2X. +make + +echo Build for GP2X - SDL - complete - Please check build logs. diff --git a/backends/platform/gph/build/gp2x-bundle.sh b/backends/platform/gph/build/gp2x-bundle.sh new file mode 100644 index 0000000000..c4fe63ed9e --- /dev/null +++ b/backends/platform/gph/build/gp2x-bundle.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +echo Quick script to make building a distribution of the GP2X port more consistent. + +# Set the paths up here to support the build. + +export PATH=/opt/open2x/gcc-4.1.1-glibc-2.3.6/arm-open2x-linux/bin:$PATH +export PATH=/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin:$PATH +export CXX=arm-open2x-linux-g++ +export CC=arm-open2x-linux-gcc +export CXXFLAGS=-march=armv4t +export LDFLAGS=-static +export ASFLAGS=-mfloat-abi=soft + +cd ../../../.. + +echo Building ScummVM for GP2X Wiz. + +make gp2x-bundle diff --git a/backends/platform/gph/build/gp2x-config-alleng.sh b/backends/platform/gph/build/gp2x-config-alleng.sh new file mode 100644 index 0000000000..4a3526d50c --- /dev/null +++ b/backends/platform/gph/build/gp2x-config-alleng.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +echo Quick script to make running configure all the time less painful +echo and let all the build work be done from the backend/build folder. + +# Set the paths up here to generate the config. + +PATH=/opt/open2x/gcc-4.1.1-glibc-2.3.6/arm-open2x-linux/bin:$PATH +PATH=/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin:$PATH + +# Export the tool names for cross-compiling +export CXX=arm-open2x-linux-g++ +export CXXFLAGS=-march=armv4t +export CPPFLAGS=-I/opt/open2x/gcc-4.1.1-glibc-2.3.6/include +export LDFLAGS=-L/opt/open2x/gcc-4.1.1-glibc-2.3.6/lib +export DEFINES=-DNDEBUG + +# Edit the configure line to suit. +cd ../../../.. +./configure --backend=gp2x --disable-mt32emu --host=gp2x --disable-flac --disable-nasm --disable-hq-scalers --with-sdl-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin --with-mpeg2-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 --enable-tremor --with-tremor-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 --enable-zlib --with-zlib-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 --enable-mad --with-mad-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 --enable-all-engines --enable-vkeybd +#--enable-plugins --default-dynamic + +echo Generating config for GP2X complete. Check for errors. diff --git a/backends/platform/gph/build/gp2x-config.sh b/backends/platform/gph/build/gp2x-config.sh new file mode 100644 index 0000000000..9092b0b1ea --- /dev/null +++ b/backends/platform/gph/build/gp2x-config.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +echo Quick script to make running configure all the time less painful +echo and let all the build work be done from the backend/build folder. + +# Set the paths up here to generate the config. + +PATH=/opt/open2x/gcc-4.1.1-glibc-2.3.6/arm-open2x-linux/bin:$PATH +PATH=/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin:$PATH + +# Export the tool names for cross-compiling +export CXX=arm-open2x-linux-g++ +export CXXFLAGS=-march=armv4t +export CPPFLAGS=-I/opt/open2x/gcc-4.1.1-glibc-2.3.6/include +export LDFLAGS=-L/opt/open2x/gcc-4.1.1-glibc-2.3.6/lib +export DEFINES=-DNDEBUG + +# Edit the configure line to suit. +cd ../../../.. +./configure --backend=gp2x --disable-mt32emu --host=gp2x --disable-flac --disable-nasm --disable-hq-scalers --with-sdl-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin --with-mpeg2-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 --enable-tremor --with-tremor-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 --enable-zlib --with-zlib-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 --enable-mad --with-mad-prefix=/opt/open2x/gcc-4.1.1-glibc-2.3.6 --enable-vkeybd --enable-plugins --default-dynamic +# --disable-release --enable-debug +# --enable-plugins --default-dynamic + +echo Generating config for GP2X complete. Check for errors. diff --git a/backends/platform/gph/devices/gp2x/mmuhack/Makefile b/backends/platform/gph/devices/gp2x/mmuhack/Makefile new file mode 100644 index 0000000000..a35d5c2a98 --- /dev/null +++ b/backends/platform/gph/devices/gp2x/mmuhack/Makefile @@ -0,0 +1,11 @@ +TARGET = mmuhack +INCLUDE = -I/opt/gcc-3.4.4-glibc-2.3.6/arm-open2x-linux/sys-include +CFLAGS = -O2 -DMODULE -D__KERNEL__ ${INCLUDE} +CC = arm-open2x-linux-gcc + +all: ${TARGET}.o + +${TARGET}.o: ${TARGET}.c + +clean: + rm -rf ${TARGET}.o diff --git a/backends/platform/gph/devices/gp2x/mmuhack/flush_uppermem_cache.h b/backends/platform/gph/devices/gp2x/mmuhack/flush_uppermem_cache.h new file mode 100644 index 0000000000..520841ace7 --- /dev/null +++ b/backends/platform/gph/devices/gp2x/mmuhack/flush_uppermem_cache.h @@ -0,0 +1,11 @@ +#ifdef __cplusplus +extern "C" +{ +#endif + +void flush_uppermem_cache(void *start_address, void *end_address, int flags); + +#ifdef __cplusplus +} +#endif + diff --git a/backends/platform/gph/devices/gp2x/mmuhack/flush_uppermem_cache.s b/backends/platform/gph/devices/gp2x/mmuhack/flush_uppermem_cache.s new file mode 100644 index 0000000000..17628c156a --- /dev/null +++ b/backends/platform/gph/devices/gp2x/mmuhack/flush_uppermem_cache.s @@ -0,0 +1,6 @@ +.global flush_uppermem_cache @ void *start_address, void *end_address, int flags + +flush_uppermem_cache: + swi #0x9f0002 + bx lr + diff --git a/backends/platform/gph/devices/gp2x/mmuhack/mmuhack.c b/backends/platform/gph/devices/gp2x/mmuhack/mmuhack.c new file mode 100644 index 0000000000..7e27262e5f --- /dev/null +++ b/backends/platform/gph/devices/gp2x/mmuhack/mmuhack.c @@ -0,0 +1,129 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + * + */ + +#include <linux/config.h> +#include <linux/module.h> +#include <linux/kernel.h> +#include <linux/init.h> +#include <linux/miscdevice.h> +#include <asm/memory.h> + +#define MMUHACK_MINOR 225 +#define DEVICE_NAME "mmuhack" + +#if __GNUC__ == 3 +#include <linux/version.h> +static const char __module_kernel_version_gcc3[] __attribute__((__used__)) __attribute__((section(".modinfo"))) = +"kernel_version=" UTS_RELEASE; +#endif + +static ssize_t mmuhack_open(struct inode *inode, struct file *filp) +{ + unsigned int *pgtable; + unsigned int *cpt; + int i, j; + int ttb; + int ret = -EFAULT; + + // get the pointer to the translation table base... + asm volatile( + "stmdb sp!, {r0}\n\t" + "mrc p15, 0, r0, c2, c0, 0\n\t" + "mov %0, r0\n\t" + "ldmia sp!, {r0}\n\t": "=r"(ttb) + ); + + pgtable = __va(ttb); + + for (i = 0; i < 4096; i ++) if ( (pgtable[i] & 3) == 1 ) { + cpt = __va(pgtable[i] & 0xfffffc00); + + for (j = 0; j < 256; j ++) {/* + if ( (cpt[j] & 0xfe00000f) == 0x02000002 ) { + // set C and B bits in upper 32MB memory area... + printk("Set C&B bits %08x\n",cpt[j]); + cpt[j] |= 0xFFC; + ret = 0; + } + */ + if (((cpt[j] & 0xff000000) == 0x02000000) && ((cpt[j] & 12)==0) ) + { + //printk("Set C&B bits %08x\n",cpt[j]); + cpt[j] |= 0xFFC; + } + //if ((a>=0x31 && a<=0x36) && ((cpt[i] & 12)==0)) + if (((cpt[j] & 0xff000000) == 0x03000000) && ((cpt[j] & 12)==0)) + { + //printk("Set C&B bits %08x\n",cpt[j]); + //printf("SDL c and b bits not set, overwriting\n"); + cpt[j] |= 0xFFC; + } + } + } + + // drain the write buffer and flush the tlb caches... + asm volatile( + "stmdb sp!, {r0}\n\t" + "mov r0, #0\n\t" + "mcr 15, 0, r0, cr7, cr10, 4\n\t" + "mcr 15, 0, r0, cr8, cr7, 0\n\t" + "ldmia sp!, {r0}\n\t" + ); + + if (ret == 0) + printk("MMU hack applied.\n"); + + return 0; +} + +static struct file_operations mmuhack_fops = { + owner: THIS_MODULE, + open: mmuhack_open, +}; + + +static struct miscdevice mmuhack = { + MMUHACK_MINOR, DEVICE_NAME, &mmuhack_fops +}; + +static int __init mmuhack_init(void) +{ + misc_register(&mmuhack); +/* + printk("MMSP2 MMU Hack module.\n"); +*/ + return 0; +} + +static void __exit mmuhack_exit(void) +{ + misc_deregister(&mmuhack); +/* + printk(KERN_ALERT "MMU Hack module removed.\n"); +*/ +} + +module_init(mmuhack_init); +module_exit(mmuhack_exit); diff --git a/backends/platform/gph/devices/gp2x/mmuhack/mmuhack.o b/backends/platform/gph/devices/gp2x/mmuhack/mmuhack.o Binary files differnew file mode 100644 index 0000000000..475f4a54ae --- /dev/null +++ b/backends/platform/gph/devices/gp2x/mmuhack/mmuhack.o diff --git a/backends/platform/gph/devices/gp2x/mmuhack/readme.txt b/backends/platform/gph/devices/gp2x/mmuhack/readme.txt new file mode 100644 index 0000000000..bea49d7d6d --- /dev/null +++ b/backends/platform/gph/devices/gp2x/mmuhack/readme.txt @@ -0,0 +1,110 @@ +About +----- + +This is a module for GP2X 2.4 based Linux kernel, created for developers to use in their +programs. + +Normally the upper 32MB is uncached. This means that reads/writes on the memory +are always done via the physical memory modules rather than the much faster +memory built into the processor (called 'cache'). Access to the upper 32MB can +be sped up by Squidge's MMU hack. The easiest way to use the MMU hack is to add +and load the MMU hack kernel module into your program. + +Note: Building this module requries a GP2X 'kernel' toolchain (i.e. GCC 2.95.* +for the GP2X stock, 3.* for Open2X). + +You can't build this module with the GCC 4 based application toolchains. + +Operation +--------- + +When loaded into kernel, this module creates /dev/mmuhack device. Whenever +a program opens that device using open() call, the module traverses all +memory, which was allocated in 0x02000000-0x03ffffff range by the program via +using mmap() system call. While doing that, it marks all encountered memory +as bufferable and cacheable. + +The most common use of this is to remove the framebuffer access bottleneck. +Note that, however, by making the framebuffer cacheable you can cause display +artifacts. This can happen because parts of your framebuffer may stay in CPU +cache and not to be written back to the physical memory. The display +controller only fetches data from the physical memory, so you get incomplete +image (the memory will most likely contain data from previous frame, so these +artifacts are better visible during fade effects). The easy way to fix this +is by using a special ARM Linux system call, which flushes the cache (forces +the CPU to write data in cache to the physical memory (see section "Flushing +the cache")). + +Using this module affects the whole upper memory area. But in some situations +this may be not desirable, for example when using ARM940 core in your program +(ether using 940 libraries like ogg940 and gpu940, or using your custom code, +which needs uncacheable memory for communication and such). If you need part +of your upper memory to be cached, and other part not, you should mmap() that +memory (which you want to be uncached) _after_ doing open("/dev/mmuhack"). +Another way is to modify mmuhack.c to suit your needs and rebuild the module. + + +Usage +----- + +The very first thing to do is to load the kernel module (mmuhack.o) into the +running kernel. But before that you should try to unload mmuhack module, +because other program might have left a different version loaded with +different memory configuration, which may not suit your program. + +system("/sbin/rmmod mmuhack"); +system("/sbin/insmod mmuhack.o"); + +Now you can assume the module is loaded into kernel and open /dev/mmuhack +device. You don't need to worry about previous calls failing, because in that +case open() will simply fail and nothing bad will happen. + +IMPORTANT: you _must_ do the open() call _after_ you initialize your graphics +library or allocate your memory, because it can only work with memory which is +already allocated, it won't affect memory you or your lib allocates after the +open() call. + +int mmufd = open("/dev/mmuhack", O_RDWR); +if(mmufd < 0) +{ + printf("MMU hack failed"); +} +else +{ + printf("MMU hack loaded"); + close(mmufd); +} + +If the above call succeeded, you are all done. +I recommend to unload the module when your program exits, because the other +program may want to load a different mmuhack.o and may fail, because you left +your mmuhack.o loaded (it does not get unloaded automatically on exit). + +system("/sbin/rmmod mmuhack"); + + +Flushing the cache +------------------ + +If using mmuhack.o causes your program to display artifacts (see "Operation" +section for explanation), you will need to flush the CPU cache. This should +be done after finishing every frame and just before flipping your display +buffer/surface. You will need to add flush_uppermem_cache.s file to your +Makefile/project and add a call to flush_uppermem_cache() just before final +framebuffer flip or blit. + +flush_uppermem_cache() has 3 parameters. First param is the start address, +second param is the end address, third one should always be 0. The addresses +should be virtual ones (most often pointers to the start/end of your +framebuffer). Example: + +flush_uppermem_cache(screen_surface->pixels, screen_surface->pixels + 320*240, 0); + + +Credits +------- + +Original idea/implementation: Squidge (this whole thing is also known as squidgehack) +Kernel module: NK +Documentation: notaz + diff --git a/backends/platform/gph/devices/gp2x/scummvm.gpe b/backends/platform/gph/devices/gp2x/scummvm.gpe new file mode 100644 index 0000000000..e8983aa2ce --- /dev/null +++ b/backends/platform/gph/devices/gp2x/scummvm.gpe @@ -0,0 +1,18 @@ +#!/bin/bash + +# Remount SD with forced Sync, does this really work? +mount -o sync,remount /dev/mmcsd/disc0/part1 /mnt/sd/ + +# Export the location of any libs ScummVM depends on +# (to avoid installing to the NAND and overwriting the broken ones there). +export LD_LIBRARY_PATH=`pwd`/lib:$LD_LIBRARY_PATH + +# Run ScummVM, important this bit. +./scummvm.gph + +# Sync the SD card to check that everything is written. +sync + +# Return to the GPH menu screen +cd /usr/gp2x +exec /usr/gp2x/gp2xmenu diff --git a/backends/platform/gph/gp2x-bundle.mk b/backends/platform/gph/gp2x-bundle.mk index 18c1483aba..810ff8b8f0 100644 --- a/backends/platform/gph/gp2x-bundle.mk +++ b/backends/platform/gph/gp2x-bundle.mk @@ -12,10 +12,10 @@ gp2x-bundle: $(EXECUTABLE) echo "Please put your save games in this dir" >> "$(bundle_name)/saves/PUT_SAVES_IN_THIS_DIR" - $(CP) $(srcdir)/backends/platform/gp2x/build/scummvm.gpe $(bundle_name)/ - $(CP) $(srcdir)/backends/platform/gp2x/build/scummvm.png $(bundle_name)/ - $(CP) $(srcdir)/backends/platform/gp2x/build/README-GP2X $(bundle_name)/ - $(CP) $(srcdir)/backends/platform/gp2x/build/mmuhack.o $(bundle_name)/ + $(CP) $(srcdir)/backends/platform/gph/devices/gp2x/scummvm.gpe $(bundle_name)/ + $(CP) $(srcdir)/backends/platform/gph/devices/common/scummvm.png $(bundle_name)/ + $(CP) $(srcdir)/backends/platform/gph/devices/common/README-GPH $(bundle_name)/ + $(CP) $(srcdir)/backends/platform/gph/devices/gp2x/mmuhack/mmuhack.o $(bundle_name)/ $(INSTALL) -c -m 644 $(DIST_FILES_DOCS) $(bundle_name)/ $(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(bundle_name)/ @@ -42,10 +42,10 @@ gp2x-bundle-debug: $(EXECUTABLE) echo "Please put your save games in this dir" >> "$(bundle_name)/saves/PUT_SAVES_IN_THIS_DIR" - $(CP) $(srcdir)/backends/platform/gp2x/build/scummvm.gpe $(bundle_name)/ - $(CP) $(srcdir)/backends/platform/gp2x/build/scummvm.png $(bundle_name)/ - $(CP) $(srcdir)/backends/platform/gp2x/build/README-GP2X $(bundle_name)/ - $(CP) $(srcdir)/backends/platform/gp2x/build/mmuhack.o $(bundle_name)/ + $(CP) $(srcdir)/backends/platform/gph/devices/gp2x/scummvm.gpe $(bundle_name)/ + $(CP) $(srcdir)/backends/platform/gph/devices/common/scummvm.png $(bundle_name)/ + $(CP) $(srcdir)/backends/platform/gph/devices/common/README-GPH $(bundle_name)/ + $(CP) $(srcdir)/backends/platform/gph/devices/gp2x/mmuhack/mmuhack.o $(bundle_name)/ $(INSTALL) -c -m 644 $(DIST_FILES_DOCS) $(bundle_name)/ $(INSTALL) -c -m 644 $(DIST_FILES_THEMES) $(bundle_name)/ |