Habe ein kleines Problem beim Abfragen der Fernbedienung (PSP 3004).
Kann zwar (mit C und psphprm.h) problemlos Play/Pause, Forward, Back und Hold abfragen, aber leider
nicht PSP_HPRM_VOL_UP und PSP_HPRM_VOL_DOWN.
Woran liegt das, kennt sich jemand aus?
Kannst du einen Beispielscode posten plus der "LIBS" line von der Makefile?
Kann mir höchstens vorstellen das man für PSP_HPRM_VOL_UP/DOWN Kernelmode benötigt oder ähnliches!
Hi dx3m, habe schon alles mögliche getestet. Nur die VOL_UP/DOWN Tasten wollen nicht funktionieren. Hier ein Code-Beispiel:
#include <pspuser.h>
#include <pspdebug.h>
#include <pspdisplay.h>
#include <pspsdk.h>
#include <pspctrl.h>
#include <psphprm.h>
#include <string.h>
PSP_MODULE_INFO("Remote Sample", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER);
#define printf pspDebugScreenPrintf
int main(void) {
u32 key_new, key_old = 0; int err = 0;
pspDebugScreenInit();
sceCtrlSetSamplingCycle(0);
sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);
while(1) {
SceCtrlData pad; key_new = 0; err = 0;
sceCtrlReadBufferPositive(&pad, 1);
if (pad.Buttons & PSP_CTRL_CROSS) {
break;
}
if (sceHprmIsRemoteExist()) {
err = sceHprmPeekCurrentKey(&key_new);
if ((key_new > 0) && (key_new != key_old)) {
if (key_new == PSP_HPRM_PLAYPAUSE) printf("Play-Pause button pressed\n");
if (key_new == PSP_HPRM_FORWARD) printf("Forward button pressed\n");
if (key_new == PSP_HPRM_BACK) printf("Back button pressed\n");
if (key_new == PSP_HPRM_HOLD) printf("Hold button pressed\n");
if (key_new == PSP_HPRM_VOL_UP) printf("Volume Up button pressed\n");
if (key_new == PSP_HPRM_VOL_DOWN) printf("Volume Down button pressed\n");
}
}
key_old = key_new;
sceDisplayWaitVblankStart();
}
sceKernelExitGame();
return 0;
}
Makefile:
TARGET = remote
OBJS = main.o
USE_PSPSDK_LIBC = 1
INCDIR =
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
LIBS = -lpsphprm
LIBDIR =
LDFLAGS =
EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = Remote Control Sample
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak
Das ganze schonmal im Kernel Mode probiert?
Wenn nein, Probier es mal. Aber "-lpsphprm" ersetzt du dann mit "-lpsphprm_driver" wenn du das im Kernel Mode testest.
Leider funzt es auch im Kernel Mode (0x1000) mit lpsphprm_driver nicht. Nach dem Starten der Eboot kommt nur die langweilige Fehlermeldung: Das Spiel konnte nicht gestartet werden. (80020148)
Du kannst keine Kernel Mode programme vom XMB aus starten.
Da musst du ein Module schreiben das im Kernel Mode läuft und sozusagen eine Bridge zwischen Kernel- und Usermode erzeugt.
Die Usermode Anwendung läd dann die "Bridge" in den Kernel worauf dann deine Anwendung selbst zugreifen und Funktionen vom Kernel nutzen kann.
Also:
Usermode <-> "Bridge" <-> Kernel.
Habe jetzt mal einen simplen MP3-Code mit den obigen Remote-Funktionen (PSP_HPRM) getestet. Und siehe da, während des Abspielens funktionieren alle Tasten, sogar Laut und Leise, lassen sich auch anzeigen, außer VOL_UP/DOWN. Irgendwie komisch, hardwaremäßig funzt alles, aber (mit C) abfragen kann man die beiden Tasten nicht.
Kann es vielleicht sein, das die Werte (für VOL_UP = 0x10 und VOL_DOWN = 0x20) nur für die PSP 1000 und nicht mehr für die 2000/3000er kompatibel sind?
Problem gelöst!!! Kann jetzt mit der PSP 3000 alle Tasten der Fernbedienung (auch VOL_UP und VOL_DOWN) im Usermode + PRX abfragen.
Usermode
main.c
//HPRM-Buttons-Tester for PSP 3000 by Knopper
#include <pspctrl.h>
#include <pspdebug.h>
#include <pspsdk.h>
#include <pspsysmem.h>
#include <pspuser.h>
#include <string.h>
#define printf pspDebugScreenPrintf
PSP_MODULE_INFO("HPRM-Buttons_Tester", 0, 1, 0); //Usermode
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER);
PSP_HEAP_SIZE_KB(2500);
//Headphones buttons
int PLAYPAUSE = 769;
int FORWARD = 772;
int BACK = 776;
int VOL_UP = 784;
int VOL_DOWN = 800;
int HOLD = 896;
//Functions-Import von prx
int getHPRM(void);
int main(void){
pspDebugScreenInit();
sceCtrlSetSamplingCycle(0);
sceCtrlSetSamplingMode(PSP_CTRL_MODE_ANALOG);
SceUID modid;
pspDebugScreenInit();
pspDebugScreenPrintf("HPRM-Buttons-Tester. Press X for quit!\n\n");
modid = pspSdkLoadStartModule("myLib.prx", PSP_MEMORY_PARTITION_KERNEL);
if (modid < 0){
pspDebugScreenPrintf("Error 0x%08X loading/starting myLib.prx.\n", modid);
sceKernelDelayThread(5*1000*1000);
return -1;
}
pspDebugScreenPrintf("Press Headphones-Buttons...\n\n");
SceCtrlData pad;
while(1){
int key;
sceCtrlReadBufferPositive(&pad, 1);
if (pad.Buttons & PSP_CTRL_CROSS){
break;
}
key = getHPRM();
if (key > 0) {
if (key == PLAYPAUSE) {printf("PLAY/PAUSE button pressed\n");}
if (key == FORWARD) {printf("FORWARD button pressed\n");}
if (key == BACK) {printf("BACK button pressed\n");}
if (key == VOL_UP){printf("VOLUME_UP button pressed\n");}
if (key == VOL_DOWN){printf("VOLUME DOWN button pressed\n");}
if (key == HOLD) {printf("HOLD button pressed\n");}
}
}
sceKernelExitGame();
return 0;
}
myLib.S
.set noreorder
#include "pspstub.s"
STUB_START "myLib",0x40090000,0x00010005
STUB_FUNC 0x5AC51B78,getHPRM
STUB_END
Makefile
TARGET = HPRMButtonsTester
OBJS = main.o myLib.o
INCDIR =
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
BUILD_PRX = 1
LIBDIR =
LDFLAGS =
LIBS =
EXTRA_TARGETS = EBOOT.PBP
PSP_EBOOT_TITLE = HPRM_Buttons_Tester
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak
PRX
main.c
#include <pspdebug.h>
#include <psphprm.h>
#include <pspkernel.h>
#include <pspsdk.h>
PSP_MODULE_INFO("myLib", 0x1006, 1, 0); //Kernelmode
PSP_MAIN_THREAD_ATTR(0);
int getHPRM(){
int HPRMsignal = 0;
u32 k1;
k1 = pspSdkSetK1(0);
sceHprmPeekCurrentKey(&HPRMsignal);
pspSdkSetK1(k1);
return HPRMsignal;
}
int module_start(SceSize args, void *argp)
{
return 0;
}
int module_stop()
{
return 0;
}
mylib.exp
PSP_BEGIN_EXPORTS
PSP_EXPORT_START(syslib, 0, 0x8000)
PSP_EXPORT_FUNC_HASH(module_start)
PSP_EXPORT_VAR_HASH(module_info)
PSP_EXPORT_END
#Export our function
PSP_EXPORT_START(myLib, 0, 0x4001)
PSP_EXPORT_FUNC(getHPRM)
PSP_EXPORT_END
PSP_END_EXPORTS
Makefile
TARGET = mylib
OBJS = main.o
INCDIR =
CFLAGS = -O2 -G0 -Wall
CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
ASFLAGS = $(CFLAGS)
PSP_FW_VERSION = 500
BUILD_PRX = 1
PRX_EXPORTS = mylib.exp
USE_KERNEL_LIBC=1
USE_KERNEL_LIBS=1
LIBDIR =
LDFLAGS = -mno-crt0 -nostartfiles
LIBS = -lpsphprm_driver
PSPSDK=$(shell psp-config --pspsdk-path)
include $(PSPSDK)/lib/build.mak
Wer sich für weitere Infos interessiert:
http://forums.pspslimhacks.com/threads/module-exports-imports.6327/