int callofw(char *name, int numargs, int numres, ...) { va_list ap; u32 argarray[MAXARGS+3]; int argnum = 3; int retval; int *intp; unsigned long flags; argarray[0] = (u32)name; argarray[1] = numargs; argarray[2] = numres; if ((numargs + numres) > MAXARGS) return -1; va_start(ap, numres); while (numargs--) argarray[argnum++] = va_arg(ap, int); retval = call_firmware(argarray); if (retval == 0) { while (numres--) { intp = va_arg(ap, int *); *intp = argarray[argnum++]; } } va_end(ap); return retval; }
VOID OFEnter( VOID ) { ULONG argarray[] = { (ULONG)"enter",0,0}; call_firmware(argarray); }
int main (void) { boot_up(); //Initialize USB port pins and set up the UART rprintf("Boot up complete\n"); if(IOPIN0 & (1<<23)) //Check to see if the USB cable is plugged in { main_msc(); //If so, run the USB device driver. } else{ rprintf("No USB Detected\n"); } //Init SD if(sd_raw_init()) //Initialize the SD card { openroot(); //Open the root directory on the SD card rprintf("Root open\n"); if(root_file_exists(FW_FILE)) //Check to see if the firmware file is residing in the root directory { rprintf("New firmware found\n"); load_fw(FW_FILE); //If we found the firmware file, then program it's contents into memory. rprintf("New firmware loaded\n"); } } else{ //Didn't find a card to initialize rprintf("No SD Card Detected\n"); delay_ms(250); } rprintf("Boot Done. Calling firmware...\n"); call_firmware(); //Run the new code! while(1); }
ULONG OFMilliseconds( VOID ) { ULONG argarray[] = { (ULONG)"milliseconds",0,1,0}; if (call_firmware(argarray) != 0) { return (ULONG)0; } return (argarray[CIF_HANDLER_IN+0]); }
long OFBoot( char *bootspec ) { ULONG argarray[] = { (ULONG)"boot",1,0,0}; argarray[CIF_HANDLER_IN+0] = (ULONG)bootspec; call_firmware(argarray); }
/* volatile VOID */ VOID OFExit( VOID ) { #ifdef DEBUG ULONG argarray[] = { (ULONG)"enter",0,0}; #else ULONG argarray[] = { (ULONG)"exit",0,0}; #endif call_firmware(argarray); }
void (*OFSetCallback(void (*func)(void)))(void) { ULONG argarray[] = { (ULONG)"set-callback",1,1,0,0}; argarray[CIF_HANDLER_IN+0] = (ULONG)func; if (call_firmware(argarray) != 0) { return (NULL); } return ((void (*)(void))argarray[CIF_HANDLER_IN+1]); }
phandle OFParent(phandle device_id) { ULONG argarray[] = { (ULONG)"parent",1,1,0,0}; argarray[CIF_HANDLER_IN+0] = device_id; if (call_firmware(argarray) != 0) { return (phandle)0; } return ((phandle)argarray[CIF_HANDLER_IN+1]); }
VOID OFRelease( char *addr, ULONG size ) { ULONG argarray[] = { (ULONG)"release",2,0,0,0}; argarray[CIF_HANDLER_IN+0] = (ULONG)addr; argarray[CIF_HANDLER_IN+1] = size; call_firmware(argarray); }
ihandle OFOpen( char *devicename) { ULONG argarray[] = { (ULONG)"open",1,1,0,0}; argarray[CIF_HANDLER_IN+0] = (long)devicename; if (call_firmware(argarray) != 0) { return (ihandle)0; } return ((ihandle) argarray[CIF_HANDLER_IN+1]); }
phandle OFFinddevice( char *devicename) { ULONG argarray[] = { (ULONG)"finddevice",1,1,0,0}; argarray[CIF_HANDLER_IN+0] = (long)devicename; if (call_firmware(argarray) != 0) { return (phandle)0; } return ((phandle) argarray[CIF_HANDLER_IN+1]); }
phandle OFInstanceToPackage(ihandle ih) { ULONG argarray[] = { (ULONG)"instance-to-package",1,1,0,0}; argarray[CIF_HANDLER_IN+0] = (ULONG)ih; if (call_firmware(argarray) != 0) { return (-1); } return ((LONG)argarray[CIF_HANDLER_IN+1]); }
void OFClose(ihandle id) { ULONG argarray[] = { (ULONG)"close",1,1,0,0}; argarray[CIF_HANDLER_IN+0] = (long)id; if (call_firmware(argarray) != 0) { #ifdef notdef warn("OFClose(%x) failed\n", id); #endif } }
long OFInterpret0( char *cmd ) { ULONG argarray[] = { (ULONG)"interpret",1,1,0,0}; argarray[CIF_HANDLER_IN+0] = (ULONG)cmd; if (call_firmware(argarray) != 0) { return (-1); } return ((LONG)argarray[CIF_HANDLER_IN+1]); }
phandle OFParent(phandle device_id) { #ifdef CIF64 ULONG argarray[] = { 0,(ULONG)"parent", 0,1, 0,1, 0,0, 0,0}; #else cell_t argarray[] = { (cell_t)"parent", 1,1,0,0}; #endif argarray[CIF_HANDLER_IN+LOW(0)] = device_id; if (call_firmware(argarray) != 0) { return (phandle)0; } return ((phandle)argarray[CIF_HANDLER_IN+LOW(1)]); }
VOID OFRelease( char *addr, ULONG size ) { #ifdef CIF64 ULONG argarray[] = { 0,(ULONG)"release", 0,2, 0,0, 0,0, 0,0}; #else cell_t argarray[] = { (cell_t)"release", 2,0,0,0}; #endif argarray[CIF_HANDLER_IN+LOW(0)] = (cell_t)addr; argarray[CIF_HANDLER_IN+LOW(1)] = size; call_firmware(argarray); }
long OFGetproplen( phandle device_id, char *name ) { ULONG argarray[] = { (ULONG)"getproplen",2,1,0,0,0}; argarray[CIF_HANDLER_IN+0] = (long)device_id; argarray[CIF_HANDLER_IN+1] = (long)name; if (call_firmware(argarray) != 0) { return (-1); } return (argarray[CIF_HANDLER_IN+2]); }
phandle OFInstanceToPackage(ihandle ih) { #ifdef CIF64 ULONG argarray[] = { 0,(ULONG)"instance-to-package", 0,1, 0,1, 0,0, 0,0}; #else cell_t argarray[] = { (cell_t)"instance-to-package", 1,1,0,0}; #endif argarray[CIF_HANDLER_IN+LOW(0)] = (cell_t)ih; if (call_firmware(argarray) != 0) { return (-1); } return ((LONG)argarray[CIF_HANDLER_IN+LOW(1)]); }
/* FirmWorks extension */ ihandle OFCreate( char *devicename) { #ifdef CIF64 ULONG argarray[] = { 0,(ULONG)"firmworks,create", 0,1, 0,1, 0,0, 0,0}; #else cell_t argarray[] = { (cell_t)"firmworks,create", 1,1,0,0}; #endif argarray[CIF_HANDLER_IN+LOW(0)] = (long)devicename; if (call_firmware(argarray) != 0) { return (ihandle)0; } return ((ihandle) argarray[CIF_HANDLER_IN+LOW(1)]); }
void OFClose(ihandle id) { #ifdef CIF64 ULONG argarray[] = { 0,(ULONG)"close", 0,1, 0,1, 0,0, 0,0}; #else cell_t argarray[] = { (cell_t)"close", 1,1,0,0}; #endif argarray[CIF_HANDLER_IN+LOW(0)] = (long)id; if (call_firmware(argarray) != 0) { #ifdef notdef warn("OFClose(%x) failed\n", id); #endif } }
long OFNextprop( phandle device_id, char *name, char *buf ) { ULONG argarray[] = { (ULONG)"nextprop",3,1,0,0,0,0}; argarray[CIF_HANDLER_IN+0] = (long)device_id; argarray[CIF_HANDLER_IN+1] = (long)name; argarray[CIF_HANDLER_IN+2] = (long)buf; if (call_firmware(argarray) != 0) { return (-1); } return (argarray[CIF_HANDLER_IN+3]); }
long OFSeek( ihandle instance_id, ULONG poshi, ULONG poslo ) { ULONG argarray[] = { (ULONG)"seek",3,1,0,0,0,0}; argarray[CIF_HANDLER_IN+0] = (long) instance_id; argarray[CIF_HANDLER_IN+1] = poshi; argarray[CIF_HANDLER_IN+2] = poslo; if (call_firmware(argarray) != 0) { return (-1); } return (argarray[CIF_HANDLER_IN+3]); }
long OFWrite( ihandle instance_id, char *addr, ULONG len ) { ULONG argarray[] = { (ULONG)"write",3,1,0,0,0,0}; argarray[CIF_HANDLER_IN+0] = (long) instance_id; argarray[CIF_HANDLER_IN+1] = (ULONG)addr; argarray[CIF_HANDLER_IN+2] = len; if (call_firmware(argarray) != 0) { return (-1); } return (argarray[CIF_HANDLER_IN+3]); }
long OFCallMethod( char *method, ihandle id, ULONG arg ) { ULONG argarray[] = { (ULONG)"call-method",3,1,0,0,0,0}; argarray[CIF_HANDLER_IN+0] = (ULONG)method; argarray[CIF_HANDLER_IN+1] = (ULONG)id; argarray[CIF_HANDLER_IN+2] = arg; if (call_firmware(argarray) != 0) { return (-1); } return ((LONG)argarray[CIF_HANDLER_IN+3]); }
long OFPackageToPath( phandle device_id, char *addr, ULONG buflen ) { ULONG argarray[] = { (ULONG)"package-to-path",3,1,0,0,0,0}; argarray[CIF_HANDLER_IN+0] = (ULONG)device_id; argarray[CIF_HANDLER_IN+1] = (ULONG)addr; argarray[CIF_HANDLER_IN+2] = buflen; if (call_firmware(argarray) != 0) { return (-1); } return ((LONG)argarray[CIF_HANDLER_IN+3]); }
ULONG OFClaim( char *addr, ULONG size, ULONG align ) { ULONG argarray[] = { (ULONG)"claim",3,1,0,0,0,0}; argarray[CIF_HANDLER_IN+0] = (ULONG)addr; argarray[CIF_HANDLER_IN+1] = size; argarray[CIF_HANDLER_IN+2] = align; if (call_firmware(argarray) != 0) { return (ULONG)0; } return (argarray[CIF_HANDLER_IN+3]); }
long OFGetproplen( phandle device_id, char *name ) { #ifdef CIF64 ULONG argarray[] = { 0,(ULONG)"getproplen", 0,2, 0,1, 0,0, 0,0, 0,0}; #else cell_t argarray[] = { (cell_t)"getproplen", 2,1,0,0,0}; #endif argarray[CIF_HANDLER_IN+LOW(0)] = (long)device_id; argarray[CIF_HANDLER_IN+LOW(1)] = (long)name; if (call_firmware(argarray) != 0) { return (-1); } return (argarray[CIF_HANDLER_IN+LOW(2)]); }
long OFCallMethodV( char *method, ihandle id, int numargs, int numres, ... ) { #ifdef CIF64 ULONG argarray[(MAXARGS+6)*2] = { 0 }; #else cell_t argarray[MAXARGS+6] = { 0 }; #endif va_list ap; int retval; int *intp; int argnum = 0; unsigned long flags; argarray[LOW(argnum++)] = (cell_t)"call-method"; argarray[LOW(argnum++)] = (cell_t)numargs+2; argarray[LOW(argnum++)] = (cell_t)numres+1; argarray[LOW(argnum++)] = (cell_t)method; argarray[LOW(argnum++)] = (cell_t)id; if ((numargs + numres) > MAXARGS) return -1; va_start(ap, numres); while (numargs--) argarray[LOW(argnum++)] = va_arg(ap, int); retval = call_firmware(argarray); if (retval == 0) { retval = argarray[LOW(argnum++)]; // Catch result if (retval == 0) { while (numres--) { intp = va_arg(ap, int *); *intp = argarray[LOW(argnum++)]; } } }
long OFSetprop( phandle device_id, char *name, char *buf, ULONG buflen ) { ULONG argarray[] = { (ULONG)"setprop",4,1,0,0,0,0,0}; argarray[CIF_HANDLER_IN+0] = (long)device_id; argarray[CIF_HANDLER_IN+1] = (long)name; argarray[CIF_HANDLER_IN+2] = (long)buf; argarray[CIF_HANDLER_IN+3] = buflen; if (call_firmware(argarray) != 0) { return (-1); } return (argarray[CIF_HANDLER_IN+4]); }
long OFSeek( ihandle instance_id, ULONG poshi, ULONG poslo ) { #ifdef CIF64 ULONG argarray[] = { 0,(ULONG)"seek", 0,3, 0,1, 0,0, 0,0, 0,0, 0,0}; #else cell_t argarray[] = { (cell_t)"seek", 3,1,0,0,0,0}; #endif argarray[CIF_HANDLER_IN+LOW(0)] = (long) instance_id; argarray[CIF_HANDLER_IN+LOW(1)] = poshi; argarray[CIF_HANDLER_IN+LOW(2)] = poslo; if (call_firmware(argarray) != 0) { return (-1); } return (argarray[CIF_HANDLER_IN+LOW(3)]); }