mass_rpc.c

来自「索尼公司著名游戏机PS2使用的引导工具文件源代码,这是爱好者自编的工具,可以使用」· C语言 代码 · 共 109 行

C
109
字号
/* * mass_rpc.c - USB Mass storage driver for PS2 * * (C) 2004, Marek Olejnik (ole00@post.cz) * * functions for communication with the irx * * See the file LICENSE included with this distribution for licensing terms. */#include <kernel.h>#include <sifrpc.h>#include "mass_rpc.h"#define	MASS_USB_ID	0x500C0F1static SifRpcClientData_t client __attribute__((aligned(64)));static unsigned char rpcBuffer[1024] __attribute__((aligned(64)));/*void dumpBuffer() {	int i;	printf("ee buf: ");	for (i = 0; i < 20; i++) {		printf("%02X ", rpcBuffer[i]);	}	printf("\n");}*/int usb_mass_bindRpc() {                           	int ret;	int retryCount = 0x1000;	while(retryCount--) {	        ret = SifBindRpc( &client, MASS_USB_ID, 0);        	if ( ret  < 0)  {	           return -1;	        }	        if (client.server != 0) break;	        // short delay 	      	ret = 0x10000;	    	while(ret--) asm("nop\nnop\nnop\nnop");	}	return retryCount;}int usb_mass_getFirstDirentry(char* dirName, fat_dir_record* record) {        int i;        int* ret;        for (i = 0; dirName[i] != 0; i++) {		rpcBuffer[i+4] = dirName[i];        }        rpcBuffer[i+4] = 0;			SifCallRpc(&client,1,0,(void*)(&rpcBuffer[0]),1024,(void*)(&rpcBuffer[0]),1024,0,0);	ret = (int*) rpcBuffer;	if (*ret > 0) {		memcpy(record, rpcBuffer + 4, sizeof(fat_dir_record));	}	return *ret;}int usb_mass_getNextDirentry(fat_dir_record* record) {        int* ret;	SifCallRpc(&client,2,0,(void*)(&rpcBuffer[0]),1024,(void*)(&rpcBuffer[0]),1024,0,0);	ret = (int*) rpcBuffer;	if (*ret > 0) {		memcpy(record, rpcBuffer + 4, sizeof(fat_dir_record));	}	return *ret;}int usb_mass_dumpSystemInfo() {        int* ret;	SifCallRpc(&client,4,0,(void*)(&rpcBuffer[0]), 0,(void*)(&rpcBuffer[0]),256,0,0);	ret = (int*) rpcBuffer;	return *ret;}int usb_mass_dumpDiskContent(unsigned int startSector, unsigned int sectorCount, char* fname) {        int* ret;        unsigned int * nums;        int i;	for (i = 0; fname[i] != 0; i++) {		rpcBuffer[i+8] = fname[i];        }        rpcBuffer[i+8] = 0;       	nums = (unsigned int*) rpcBuffer;       	nums[0] = startSector;       	nums[1] = sectorCount;	SifCallRpc(&client,3,0,(void*)(&rpcBuffer[0]), 256,(void*)(&rpcBuffer[0]),256,0,0);	ret = (int*) rpcBuffer;	return *ret;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?