PSPx форум

PSPx форум (https://www.pspx.ru/forum/index.php)
-   Программирование для PSP (https://www.pspx.ru/forum/forumdisplay.php?f=101)
-   -   NAND Flash (https://www.pspx.ru/forum/showthread.php?t=44077)

pspowner 28.05.2007 12:43

NAND Flash
 
Приветствую всех.

Решил сегодня накатать програмку а-ля Version Changer, только чтобы работала на 3.40ОЕ.
Ну изначально мне показалось всё довольно просто. Прочитать строчку из файлика - без проблем, а вот с записью её обратно возникли проблемы.

Вобщем отрабатывает нормально, но ничего никуда не записывается.
Если добавляю PSP_MAIN_THREAD_ATTR(0) и sceNandSetWriteProtect(true);
то просто тупо виснет, проичём виснет даже не доходя до записи.

Народ, если кто где встречал, или может сам знает как правильно писать во flash0, то буду благодарен за разъяснения или ссылку.
Брикеров обещаю не клепать ;)

Вот как выглядит у меня.

Код:

int main(int argc, char *argv[])
{
    int cnt, fd, pos=0;
    char buff[18];
    SceCtrlData pad;
  sceCtrlSetSamplingCycle(0);
  sceCtrlSetSamplingMode(PSP_CTRL_MODE_DIGITAL);
  pspDebugScreenInit();
    printf ("This will try to read version info!\n");
    fd = sceIoOpen("flash0:/kn/vshctrl.prx", PSP_O_RDONLY, 0777);
    sceIoLseek(fd, 0x3D70, PSP_SEEK_SET);
    sceIoRead(fd, &buff, 18);
    sceIoClose(fd);
    printf("Data read:[");
    for (cnt=0; cnt<=18; cnt+=2)  printf("%c",buff[cnt]);
    printf("]");
  pspDebugScreenSetXY(11+(pos/2),1);
  pad.Buttons=0;
    while(1) {
    sceDisplayWaitVblankStart();
    sceKernelDelayThread(100000);
    sceCtrlReadBufferPositive(&pad, 1);   
    switch (pad.Buttons) {
                    case PSP_CTRL_START: sceKernelExitGame();
                                                            break;
                    case PSP_CTRL_LEFT: pos-=2;
                                                            if (pos<0) pos = 0;
                                                            pspDebugScreenSetXY(11+(pos/2),1);
                                                            break;
                    case PSP_CTRL_RIGHT: pos+=2;
                                                            if (pos>18) pos= 18;
                                                            pspDebugScreenSetXY(11+(pos/2),1);
                                                            break;
                    case PSP_CTRL_UP:  buff[pos]+=1;
                                                            printf("%c", buff[pos]);
                                                            pspDebugScreenSetXY(11+(pos/2),1);
                                                            break;
                    case PSP_CTRL_DOWN: buff[pos]-=1;
                                                            printf("%c", buff[pos]);
                                                          pspDebugScreenSetXY(11+(pos/2),1);                                                           
                                                            break;
                    case PSP_CTRL_CROSS: buff[pos]-=1;
                                                            printf("\n\n\n Writing value to flash0...");
                                                            sceNandSetWriteProtect(true);
                                                            fd = sceIoOpen("flash0:/kn/vshctrl.prx", PSP_O_WRONLY, 0777);
                                                            if (!fd) printf ("/n Failed to open file for writing! /n");
                                                            sceIoLseek(fd, 0x3D70, PSP_SEEK_SET);
                                                            int res;
                                                            res=sceIoWrite(fd, &buff, 18);
                                                            sceIoClose(fd);
                                                            printf("\n\n\n %i bytes written. DONE... Exiting...", res);
                                                            sceNandSetWriteProtect(false);
                                                            sceKernelDelayThread(10*1000*1000);
                                                            sceKernelExitGame();
                                                            break;
                                                           
    }
  pad.Buttons=0;   
}
   
   
    sceKernelDelayThread(10*1000*1000);
    sceKernelExitGame();
    return 0;
    }


Mortem 28.05.2007 14:51

Может быть тут есть то, что тебе нужно...
http://forums.ps2dev.org/viewtopic.p...t=write+flash0

Или ищи "write flash0" тут:
http://forums.ps2dev.org/search.php

pspowner 28.05.2007 17:28

Ага, спасибо.
Поиск использовал, но видимо каким-то чудом прощёлкал этот исходник.

Ну вобщем сделал, остались мелкие глюки приводящие к брику (шутка).
Надо просто немножко подправить, а то почему-то отображаемая в свойствах системы версия прошивки на 1 меньше выставленной, но этого жука я убью.

Почему-то когда выставляю PSP_MAIN_THREAD_ATTR(0)
- перестаёт работать блок switch { } - это меня глючит или PSP? :dash:

Также расстроила меня невозможность писать в файл по смещению -

Код:

sceIoLseek(fd, 0x3D70, PSP_SEEK_SET);
sceIoWrite(fd, &buff, 18);

Т.е. приходится считывать файл полностью в память, там его изменять, старый транкейтить, а потом снова целиком записывать...


Текущее время: 15:19. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2025, vBulletin Solutions, Inc. Перевод: zCarot
PSPx Forum - Сообщество фанатов игровых консолей.