Сегодня у нас статья Егора Баранова о разработке для Sony PlayStation Portable.

Больше полугода назад у меня появилась игровая консоль Sony Playstation Portable (или просто PSP). Надо сказать, что игры на ней отменные, консоль можно взять в любую поездку и приятно скоротать время в дороге. Как разработчику мне всегда было интересно, как же писать приложения для PSP, я видел множество свободнораспространяющихся приложений, таких как PSP WiFile Transfer, Bookr и даже порты OpenSource игр, например OpenTTD, а недавно у меня появилось немного свободного времени, чтобы заняться вопросом разработки для PSP более подробно, поэтому я поискал информацию по данному вопросу и, как оказалось, программировать для PSP не так уж и сложно.

Итак, в данной статье мы рассмотрим настройку среды разработки для PSP на языках программирования Си и Си++ и написание простейшей классической программы Hello world.

Что же мы имеем изначально:

  1. дистрибутив Ubuntu 9.04
  2. доступ в интернет (придется скачивать исходные коды библиотек, необходимых для разработки PSP программ)
  3. свободное время порядка 3 — 4 часов (библиотеки собираются из исходных кодов, поэтому компиляция занимает несколько часов)

Первое что нам потребуется — установить subversion:

sudo aptitude install subversion

Теперь можно получить последние исходные коды psptoolchain (кросскомпилятора для PSP)

svn co svn://svn.ps2dev.org/psp/trunk/psptoolchain

В полученной папке есть readme файл для всех и специально для дистрибутива Ubuntu (замечу, что psptoolchain можно собрать в любом linux дистрибутиве, а так же cygwin-е). В readme файле для дистрибутива Ubuntu написано что для сборки psptoolchain необходимо удовлетворить зависимости с помощью следующей команды:

sudo apt-get install build-essential autoconf automake bison flex \

libncurses5-dev libreadline-dev libusb-dev texinfo libgmp3-dev \

libmpfr-dev subversion gcc-4.2

что мы и сделаем. После этого нам нужно определить несколько переменных окружения. Добавим следующие строки в файл ~/.bashrc:

export PSPDEV=”/usr/local/pspdev”

export PSPSDK=”$PSPDEV/psp/sdk”

export PATH=”$PATH:$PSPDEV/bin:$PSPSDK/bin”

и выполним команду:

source ~/.bashrc

Теперь можно приступить непосредственно к сборке среды разработки:

cd psptoolchain

sudo ./toolchain-sudo.sh

После этого необходимо получить дополнительные библиотеки для разработки (zlib, SDL и т.п.). Для этого сначала получим набор скриптов из SVN с помощью следующей команды:

svn co svn://svn.ps2dev.org/psp/trunk/psplibraries psplibraries

К сожалению в скриптах установки дополнительных библиотек есть ошибка, для того чтобы ее исправить необходимо сделать следующее: открваем файл psplibraries/scripts/003-freetype.sh и заменяем его содержимое на следующий текст:

#!/bin/sh
# freetype.sh by Dan Peori (danpeori@oopo.net)
## Download the latest source code.

if test ! -d "freetype"; then
svn checkout svn://svn.ps2dev.org/psp/trunk/freetype || { exit 1; }
else
svn update freetype || { exit 1; }
fi

## Enter the source directory.
cd freetype || { exit 1; }
cd builds/unix
automake --add-missing
cd ../..

## Bootstrap the source.
sh autogen.sh || { exit 1; }

## Configure the build.
LDFLAGS="-L$(psp-config --pspsdk-path)/lib -lc -lpspuser" ./configure --host psp --prefix=$(psp-config --psp-prefix) || { exit 1; }

## Compile and install.
make clean && make -j2 && make install && make clean || { exit 1; }

После этого установим одну зависимость:

sudo aptitude install libtool

и запускаем компиляцию библиотек:

sudo ./libraries-sudo.sh

После данных махинаций мы имеем кросскомпилятор и набор библиотек для разработки программ для PSP на Си и Си++. Давайте напишем нашу первую программу.

#include <pspkernel.h>
#include <pspdebug.h>

PSP_MODULE_INFO("Hello World", 0, 1, 1);
#define printf pspDebugScreenPrintf

/* Exit callback */
int exit_callback(int arg1, int arg2, void *common) {
    sceKernelExitGame();
    return 0;
}

/* Callback thread */
int CallbackThread(SceSize args, void *argp) {
    int cbid;
    cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL);
    sceKernelRegisterExitCallback(cbid);
    sceKernelSleepThreadCB();
    return 0;
}

/* Sets up the callback thread and returns its thread id */
int SetupCallbacks(void) {
    int thid = 0;
    thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0);
    if(thid >= 0) {
        sceKernelStartThread(thid, 0, 0);
    }
    return thid;
}

int main() {
    pspDebugScreenInit();
    SetupCallbacks();
    printf("Hello World");
    sceKernelSleepThread();
    return 0;
}

Итак, с помощью макроса PSP_MODULE_INFO мы определяем задаем информацию о нашей программе и ее версии, далее опредяем несколько стандартных callback-ов и соотвественно главную функцию нашей программы main — которая устанавливает заданные нами callback-и и печатает на экране заветную строку «Hello world».

Теперь напишем Makefile для того чтобы собрать наш код.

TARGET = hello
OBJS = main.o
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = Hello world
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak

Скомпилируем нашу программу командой make. Полученный файл EBOOT.PBP поместим на консоль в папку psp/game/hello. Вот и все. В следующей статье мы рассмотрим, как контролировать нажатия клавиш.

Оригинал статьи.

Previous ArticleNext Article
Технический директор IT-Dimension, компании-разработчика кросс-платформенного программного обеспечения

This post has 5 Comments

5
  1. Как-то сложно все, хотя и достаточно интересно. А это все принципиально из убунты делается?

  2. Спасибо за подробную и хорошую статью.
    Но вот проблема. Застываю в самом конце. На команде make – кричит “make: psp-config: Команда не найдена
    Makefile:9: /lib/build.mak: No such file or directory
    make: *** Нет правила для сборки цели `/lib/build.mak’. Останов.”

    Посоветуйте как побороть проблему?

  3. а что у вас выдает если сделать

    sudo updatedb
    locate psp-config
    
  4. На это выдает следующее:
    “locate psp-config

    /home/spiritfan/psptoolchain/build/pspsdk/tools/psp-config.c
    /home/spiritfan/psptoolchain/build/pspsdk/tools/.deps/psp-config.Po
    /home/spiritfan/psptoolchain/build/pspsdk/tools/.svn/prop-base/psp-config.c.svn-base
    /home/spiritfan/psptoolchain/build/pspsdk/tools/.svn/text-base/psp-config.c.svn-base
    /usr/local/pspdev/bin/psp-config”

  5. Сделал все сначала.
    Заработало.

    Спасибо еще раз за статью.

    С нетерпением жду продолжения.

Leave a Reply

Your email address will not be published. Required fields are marked *

У.

Установка Ubuntu Jaunty на Nokia N800/N810

Дмитрий Халин любезно предоставил нам руководство по установке Ubuntu Jaunty на Nokia N800/N810.

Вступление

Предлагаю вашему вниманию перевод этой инструкции по установке Ubuntu Jaunty на Nokia N800/N810.
Что работает:

  • Dsme
  • Hal (частично)
  • Screen diming
  • Xserver-xorg
  • Простые эффекты Compiz
  • Управление питанием
  • Usbnet emergency talend
  • Powersave
  • Bluetooth
  • Right click
  • Беспроводная сеть
  • keymapping (аппаратные клавиши и виртуальная клавиатура)

Ubuntu Jaunty на Nokia N800/N810
Подробности под катом.
Что не работает:

  • Usplash (не запускается, возможно наше ядро его не поддерживает?)
  • Звук (закрытый исходный код)


Установочный процесс потребует наличия следующего:

  • easyroot / rootsh / becomeroot
  • debootstrap
  • базовые знания командной строки
  • e2fsprogs
  • 2-4Гб карта mmc — 4 Гб+ если вы планируете установить ubuntu-desktop.
  • Bootmenu form deblet
  • binutils

Шаг первый: подготовка карты памяти

Для этого выполним следующее в терминале под root’ом (Я использую 4GB mmc с 356мб fat16 разделом и 3.6гб для linux83 — нашим корневым разделом)

umount /dev/mmcblk0p1
sfdisk -uM /dev/mmcblk0
356,6
,,L
,,
,,

Шаг второй: форматирование разделов

umount /dev/mmcblk0p1
mkdosfs /dev/mmcblk0p1
mkfs.ext3 /dev/mmcblk0p2

Шаг третий: переход в свежеустанавливаемую систему

Создадим директорию, куда будем устанавливать систему:

mkdir -p /mnt/jaunty

Далее скачаем скрипт bootstrap-script.tar.gz, уберем симлинк

rm -f /usr/share/debootstrap/scripts/jaunty

и распакуем наш скрипт в /usr/share/debootstrap/scripts под пользователем root.

Далее мы должны добавить md5sum в наш /bin каталог для правильной работы debootstrap. Скачаем md5sum и распакуем в /bin под пользователем root.

Далее смонтируем наш ubuntu раздел в /mnt/jaunty и начнём установку(это может занять много времени):

insmod /mnt/initfs/lib/modules/`uname -r`/mbcache.ko
insmod /mnt/initfs/lib/modules/`uname -r`/ext2.ko
insmod /mnt/initfs/lib/modules/`uname -r`/jbd.ko
insmod /mnt/initfs/lib/modules/`uname -r`/ext3.ko
mount /dev/mmcblk0p2 /mnt/jaunty -o noatime
debootstrap --include="language-pack-en,language-pack-en-base,dmsetup,cryptsetup,hashalot,nano,sudo" --components=main,multiverse,universe,restricted --verbose --arch=armel jaunty /mnt/jaunty http://ports.ubuntu.com/ /usr/share/debootstrap/scripts/jaunty

И, наконец, chroot’имся в установленную систему и создаём устройства консоли:

mount /proc /mnt/jaunty/proc
mount /sys /mnt/jaunty/sys
chroot /mnt/jaunty
cd /dev; /sbin/MAKEDEV fb0 fb1 fb2 fb3 fb4 fb5 fb6 fb7
exit

Шаг четвертый: подготовка базовой системы к загрузке

Примонтируем нужные каталоги:

mount /dev /mnt/jaunty/dev
mount /dev/pts /mnt/jaunty/dev/pts
mount /tmp /mnt/jaunty/tmp
chroot /mnt/jaunty
export LC_ALL=C

Добавим пароль пользователя root:

passwd root

Настроим репозиторий, изменив файл /etc/apt/sorces.lst:

#Ubuntu jaunty alpha
deb http://ports.ubuntu.com jaunty main restricted universe multiverse
deb-src http://ports.ubuntu.com jaunty main restricted universe multiverse

#Mer alpha
deb http://repository.mer.tspre.org/ alpha contrib main non-free
deb-src http://repository.mer.tspre.org/ alpha contrib main non-free

#Deblet sid
deb http://packages.tspre.org/ sid main contrib non-free
deb-src http://packages.tspre.org/ sid main contrib non-free

#Ubuntu N8x0
deb http://www.bman.maemobox.org/repository alpha contrib main non-free
deb-src http://www.bman.maemobox.org/repository alpha contrib main non-free
Далее настроим apt-get:
touch /etc/apt/preferences

Добавим следующее в /etc/apt/preferences:

Package: *
Pin: release a=jaunty
Pin-Priority: 900

Package: *
Pin: release a=alpha
Pin-Priority: 340

Package: *
Pin: release a=sid
Pin-Priority: 300
Установим базовую систему:
wget http://packages.tspre.org/repo.key
apt-key add repo.key
apt-get update
apt-get -t alpha install cx3110x-module cx3110x-umac-module ke-recv-l10n-public kernel-diablo-modules-fbcon kernel-diablo mce-dummy nokia-n8x0-firmware nokia-tablets-pointercal omap-fb-console omap-fb-tools usbnet-emergency-telnetd utelnetd xresponse-visualize tablet-wireless xserver-xorg-video-omapfb synaptic aptitude console-tools
apt-get install ubuntu-rescue-menu ubuntu-omap-fb-splash nit-bootmenu-compat
apt-get install xserver-xorg-input-tslib=0.0.5-1mer7
apt-get remove xserver-xorg-input-all xserver-xorg-input-synaptics

Установим файл boottime.kmap.gz для работы клавиатуры:

cp /path/to/boottime.kmap.gz /mnt/jaunty/etc/

Далее отредактируем ряд файлов:
/etc/X11/xorg.conf

# xorg.conf (X.Org X Window System server configuration file)
#
# This file was generated by dexconf, the Debian X Configuration tool, using
# values from the debconf database.
#
# Edit this file with caution, and see the xorg.conf manual page.
# (Type "man xorg.conf" at the shell prompt.)
#
# This file is automatically updated on xserver-xorg package upgrades *only*
# if it has not been modified since the last upgrade of the xserver-xorg
# package.
#
# If you have edited this file but would like it to be automatically updated
# again, run the following command:
# sudo dpkg-reconfigure -phigh xserver-xorg

Section "InputDevice"
Identifier "Generic Keyboard"
Driver "kbd"
Option "XkbRules" "xorg"
Option "XkbModel" "pc104"
Option "XkbLayout" "us"
EndSection

Section "InputDevice"
Identifier "tslib"
Driver "tslib"
Option "ScreenNumber" "0"
Option "Width" "800"
Option "Height" "480"
Option "Rotate" "NONE"
Option "TslibDevice" "/dev/input/event3"
Option "CorePointer"
EndSection

Section "Device"
Identifier "Configured Video Device"
# Option "UseFBDev" "true"
Driver "omapfb"
Option "fb" "/dev/fb0"
EndSection

Section "Monitor"
Identifier "Configured Monitor"
EndSection

Section "Screen"
Identifier "Default Screen"
Monitor "Configured Monitor"
EndSection

/etc/rc.local

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
/sbin/fb_update_mode auto
exit 0

/etc/fstab

rootfs / rootfs defaults,errors=remount-ro,noatime,nodiratime 0 1
proc /proc proc defaults 0 0
/dev/mtdblock4 /mnt/rootfs jffs2 defaults 0 0
/dev/mmcblk0p1 swap swap defaults 0 0
/dev/mmcblk1p1 /media/mmc1 vfat defaults 0 0

/etc/X11/Xwrapper.config

# Xwrapper.config (Debian X Window System server wrapper configuration file)
#
# This file was generated by the post-installation script of the x11-common
# package using values from the debconf database.
#
# See the Xwrapper.config(5) manual page for more information.
#
# This file is automatically updated on upgrades of the x11-common package
# *only* if it has not been modified since the last upgrade of that package.
#
# If you have edited this file but would like it to be automatically updated
# again, run the following command as root:
# dpkg-reconfigure x11-common
allowed_users=anybody
nice_value=-1

В файле /etc/init.d/hwclock.sh HWCLOCKPARS= изменим на HWCLOCKPARS="--directisa" и добавим это в /etc/default/rcS:

echo 'HWCLOCKPARS=--directisa' << /etc/default/rcS
&#91;/sourcecode&#93;
Уменьшим время загрузки:
&#91;sourcecode language="js"&#93;
apt-get install insserv
echo 'CONCURRENCY=shell' << /etc/default/rcS
&#91;/sourcecode&#93;
Если вы не заинтересованы в установке ubuntu-desktop то можете выполнить следующее и сразу перейти к шагу 7.
&#91;sourcecode language="js"&#93;
exit
exit
umount /mnt/jaunty/dev/pts
umount /mnt/jaunty/dev
umount /mnt/jaunty/proc
umount /mnt/jaunty/sys
umount /mnt/jaunty/tmp
fuser -m /mnt/jaunty -k
umount /mnt/jaunty
&#91;/sourcecode&#93;
<h4>Шаг пятый: установка ubuntu-desktop</h4>
Выполните следующее в терминале, это может занять несколько часов:

apt-get install ubuntu-desktop matchbox-keyboard
apt-get clean

Поправим файл /etc/gdm/gdm.conf-costom для автоматического логина:

[daemon]
# Automatic login, if true the first attached screen will automatically logged
# in as user as set with AutomaticLogin key.
AutomaticLoginEnable=true
AutomaticLogin=user

Шаг шестой: активация файла подкачки

Выполним следующее в терминале:

mkswap /dev/mmcblk1p3

Добавим в /etc/fstab следующую строку:

/dev/mmcblk1p3 swap swap defaults 0 0

Шаг седьмой: создание меню загрузки

Создайте файл /etc/bootmenu.d/ubuntu.item и добавьте туда следующее(в случае раздела Ubuntu в /dev/mmcblk0p2):

ITEM_NAME="Ubuntu on mmcblk0p2"
ITEM_ID="Ubuntu on mmcblk0p2"
ITEM_DEVICE="mmcblk0p2"
ITEM_MODULES="mbcache jbd ext3"
ITEM_FSTYPE="ext3"
ITEM_FSOPTIONS="noatime,ro"
ITEM_LINUXRC="linuxrc"

И выполните следующую команду в терминале:

refresh_bootmenu.d

Всё, теперь у вас есть установленная система Ubuntu Jaunty!
Скриншоты можно посмотреть здесь.

Оригинал статьи находится здесь.

В.

Вышел Maemo 5 alpha SDK

Сегодня компания Nokia аноносировала Maemo 5 alpha SDK с новой UI-библиотекой и API для разработки приложений. разработчики теперь могут использовать аппаратное 3D ускорение для приложений с WVGA разрешением.

Рабочий стол в Maemo 5 alpha

Т.к. SDK находится в стадии Alpha-тестирования, то возможны изменения в API, но разработчики, которые хотят ознакомиться с возможностями или начать портирование приложений для платформы Maemo уже могут начать его использование.

В SDK есть поддержка:

  • Location API
  • City Information
  • Time management.
  • Vibra service.
  • Device orientation.

Остальные программные интерфейсы остались те же что и в Maemo 4 SDK, но для них были выполнены доработки.

Более детально об изменениях в новой версии можно узнать, ознакомившись с Maemo 5 SDK Release Notes.

Узнать больше об изменениях в UI для Maemo 5.

MaemoPad - Пример из SDK

Скачать исходный код Maemo 5 alpha SDK.