s32 padInit(void * ee_addr) { iop_thread_t thread; int intr_state; iop_event_t event; if(padman_init == 1) { M_PRINTF("Refresh request from EE\n."); padEnd(); } vblankData.padEnd = 0; vblankData.init = 0; vblankData.stopTransfer = 1; pad_ee_addr = ee_addr; pad_port = 0; pad_slot = 0; mainThreadCount2 = 0; pad_portdata[0] = 0; pad_portdata[1] = 0; sif_buffer[0] = 0; sio2cmdReset(); sio2cmdInitFindPads(); sio2cmdInitMouse(); sio2cmdInitNegicon(); sio2cmdInitKonamiGun(); sio2cmdInitDigital(); sio2cmdInitJoystick(); sio2cmdInitNamcoGun(); sio2cmdInitAnalog(); sio2cmdInitJogcon(); sio2cmdInitConfig(); pdReset(); openSlots[0] = 0; openSlots[1] = 0; event.attr = EA_MULTI; event.bits = 0; vblankData.eventflag = CreateEventFlag(&event); if( vblankData.eventflag == 0) { M_PRINTF("padInit: CreateEventFlag failed (%d).\n", vblankData.eventflag); return 0; } thread.attr = TH_C; thread.thread = &TransferThread; thread.stacksize = 0x800; thread.priority = thpri_hi; vblankData.tid_2 = CreateThread(&thread); if(vblankData.tid_2 == 0) { M_PRINTF("padInit: CreateThread TransferThread failed (%d)\n.", vblankData.tid_2); return 0; } StartThread(vblankData.tid_2, NULL); thread.attr = TH_C; thread.thread = MainThread; thread.stacksize = 0x1000; thread.priority = thpri_lo; vblankData.tid_1 = CreateThread(&thread); if(vblankData.tid_1 == 0) { M_PRINTF("padInit: CreateThread MainThread failed (%d)\n.", vblankData.tid_1); return 0; } StartThread(vblankData.tid_1, NULL); CpuSuspendIntr(&intr_state); RegisterVblankHandler(0, 16, &VblankStart, (void*)&vblankData); RegisterVblankHandler(1, 16, &VblankEnd, (void*)&vblankData); CpuResumeIntr(intr_state); //Original BUG: was originally a call to CpuEnableIntr with intr_state as an argument vblankData.init = 1; padman_init = 1; return 1; }
void DmaSendEE() { s32 dma_stat; dma_stat = sceSifDmaStat(sifdma_id); if(dma_stat >= 0) { if( (frame_count % 30) == 0) { // These are actually kprintfs M_PRINTF("DMA Busy, ID = 0x%08X, dma_stat = %i\n", (int)sifdma_id, (int)dma_stat); M_PRINTF(" SB_STAT = 0x%08X\n", (int)SB_STAT); } } else { u32 port, slot; u32 sifdma_count = 1; /* This is where the 128*2 bytes of 'garbage' gets sent to EE. I believe that only 16 bytes should have been sent, used for checking which ports/slots are open on the EE (padGetConnection). However someone made a mistake and sent 128 bytes instead :-) Its the first 112 (128-16) bytes of padState[0][0] which gets sent along with the sif_buffer, which I think clearly indicates that sending 128 bytes is an error. - Lukasz */ sif_buffer[0]++; sif_buffer[1] = pad_portdata[0]; sif_buffer[2] = pad_portdata[1]; if( (sif_buffer[0] % 30) == 0) sifdma_td[0].dest = pad_ee_addr + 128; else sifdma_td[0].dest = pad_ee_addr; sifdma_td[0].src = sif_buffer; sifdma_td[0].size = 128; sifdma_td[0].attr = 0; for(port=0; port < 2; port++) { for(slot=0; slot < 4; slot++) { if( (openSlots[port] >> slot) & 1 ) { padState_t *p = &padState[port][slot]; // Setup EE pad data p->ee_pdata.frame = p->frame; p->ee_pdata.findPadRetries = p->findPadRetries; p->ee_pdata.modeConfig = p->modeConfig; p->ee_pdata.modeCurId = p->modeCurId; p->ee_pdata.model = p->model; p->ee_pdata.buttonDataReady = p->buttonDataReady; p->ee_pdata.nrOfModes = p->numModes; p->ee_pdata.modeCurOffs = p->modeCurOffs; p->ee_pdata.nrOfActuators = p->numActuators; p->ee_pdata.numActComb = p->numActComb; p->ee_pdata.val_c6 = p->val_c6; p->ee_pdata.mode = p->mode; p->ee_pdata.lock = p->lock; p->ee_pdata.actDirSize = p->ee_actDirectSize; p->ee_pdata.state = p->state; p->ee_pdata.reqState = p->reqState; p->ee_pdata.currentTask = p->currentTask; p->frame++; p->ee_pdata.runTask = p->runTask; p->ee_pdata.actDirData[0] = *(u32*)&p->ee_actDirectData[0]; p->ee_pdata.actDirData[1] = *(u32*)&p->ee_actDirectData[4]; p->ee_pdata.actAlignData[0] = *(u32*)&p->ee_actAlignData[0]; p->ee_pdata.actAlignData[1] = *(u32*)&p->ee_actAlignData[4]; p->ee_pdata.actData[0] = p->actData[0]; p->ee_pdata.actData[1] = p->actData[1]; p->ee_pdata.actData[2] = p->actData[2]; p->ee_pdata.actData[3] = p->actData[3]; p->ee_pdata.actData[4] = p->actData[4]; p->ee_pdata.actData[5] = p->actData[5]; p->ee_pdata.actData[6] = p->actData[6]; p->ee_pdata.actData[7] = p->actData[7]; p->ee_pdata.modeTable[0] = p->modeTable[0]; p->ee_pdata.modeTable[1] = p->modeTable[1]; p->ee_pdata.stat70bit = p->stat70bit; if( p->buttonDataReady == 1) { p->ee_pdata.length = setupEEButtonData(port, slot, p); } else { p->ee_pdata.length = 0; } if( (p->frame & 1) == 0) sifdma_td[sifdma_count].dest = (void*)p->padarea_ee_addr; else sifdma_td[sifdma_count].dest = (void*)(p->padarea_ee_addr + 128); sifdma_td[sifdma_count].src = &p->ee_pdata; sifdma_td[sifdma_count].size = 128; sifdma_td[sifdma_count].attr = 0; sifdma_count++; } } } if(sifdma_count != 0) { int intr_state; CpuSuspendIntr(&intr_state); sifdma_id = sceSifSetDma( sifdma_td, sifdma_count); CpuResumeIntr(intr_state); } } }
s32 padInit(void * ee_addr) { iop_event_t event; if(freepad_init == 1) { M_PRINTF("Refresh request from EE\n."); padEnd(); } vblankData.padEnd = 0; vblankData.init = 0; vblankData.stopTransfer = 0; pad_ee_addr = ee_addr; pad_port = 0; pad_slot = 0; mainThreadCount2 = 0; pad_portdata[0] = 0; pad_portdata[1] = 0; sif_buffer[0] = 0; sio2cmdReset(); sio2cmdInitFindPads(); sio2cmdInitMouse(); sio2cmdInitNegicon(); sio2cmdInitKonamiGun(); sio2cmdInitDigital(); sio2cmdInitJoystick(); sio2cmdInitNamcoGun(); sio2cmdInitAnalog(); sio2cmdInitJogcon(); sio2cmdInitConfig(); pdReset(); openSlots[0] = 0; openSlots[1] = 0; event.attr = 2; event.bits = 0; vblankData.eventflag = CreateEventFlag(&event); if( vblankData.eventflag == 0) M_PRINTF("padInit: CreateEventFlag failed (%i).\n", (int)vblankData.eventflag); if(vblankData.eventflag != 0) { iop_thread_t thread; int intr_state; thread.attr = TH_C; thread.thread = TransferThread; thread.stacksize = 0x800; thread.priority = 20; vblankData.tid_2 = CreateThread(&thread); if(vblankData.tid_2 == 0) { M_PRINTF("padInit: CreateThread TransferThread failed (%i)\n.", (int)vblankData.tid_2); return 0; } StartThread(vblankData.tid_2, 0); thread.attr = TH_C; thread.thread = MainThread; thread.stacksize = 0x1000; thread.priority = 46; vblankData.tid_1 = CreateThread(&thread); if(vblankData.tid_1 == 0) { M_PRINTF("padInit: CreateThread MainThread failed (%i)\n.", (int)vblankData.tid_1); return 0; } StartThread(vblankData.tid_1, 0); CpuSuspendIntr(&intr_state); RegisterVblankHandler(0, 16, (void*)VblankStart, (void*)&vblankData); RegisterVblankHandler(1, 16, (void*)VblankEnd, (void*)&vblankData); CpuResumeIntr(intr_state); vblankData.init = 1; freepad_init = 1; D_PRINTF("padInit: Success\n"); return 1; } D_PRINTF("padInit: Failed\n"); return 0; }
s32 _start(char **argv, int argc) { iop_event_t event; iop_thread_t thread; u32 i; printf(BANNER,VERSION); if(RegisterLibraryEntries(&_exp_mtapman) != 0) { M_PRINTF("RegisterLibraryEntries failed.\n"); return 1; } if(InitRpcServers() == 0) { M_PRINTF("Failed to setup RPC Servers.\n"); return 1; } event.attr = 2; event.bits = 0; event_flag = CreateEventFlag(&event); if(event_flag < 0) { M_PRINTF("Could not create event flag (%i)\n.", (int)event_flag); return 1; } thread.attr = TH_C; thread.thread = update_slot_numbers_thread; thread.stacksize = 0x800; thread.priority = 32; threadid_main = CreateThread(&thread); if(threadid_main < 0) { M_PRINTF("Could not create thread (%i)\n.", (int)threadid_main); return 1; } StartThread(threadid_main, 0); for(i=0; i < 4; i++) { state_open[i] = 0; state_getcon[i] = 0; state_slots[i] = 0; } sio2_mtap_change_slot_set(change_slot); sio2_mtap_get_slot_max_set(get_slots1); sio2_mtap_get_slot_max_set2(get_slots2); sio2_mtap_update_slots_set(update_slot_numbers); td.in = in_buffer; td.out = out_buffer; return 0; }
int devfs_getstat(iop_file_t *file, const char *name, iox_stat_t *stat) #endif { devfs_device_t *dev; int fn_offset = 0; if(name == NULL) { return -1; } if((name[0] == '\\') || (name[0] == '/')) { fn_offset = 1; } if(stat == NULL) { return -1; } dev = devfs_find_devicename(name + fn_offset); if(dev != NULL) { char *endp; int subdev; int name_len; name_len = strlen(dev->node.name); if(name_len == strlen(name)) /* If this is has not got a subnumber */ { M_PRINTF("getstat: No subdevice number in filename %s\n", name); return -1; } subdev = strtoul(&name[name_len + fn_offset], &endp, 10); if(((subdev == 0) && (name[name_len + fn_offset] != '0')) || (subdev >= DEVFS_MAX_SUBDEVS)) /* Invalid number */ { M_PRINTF("getstat: Invalid subdev number %d\n", subdev); return -1; } if(*endp) /* Extra charactes after filename */ { M_PRINTF("getstat: Invalid filename\n"); return -1; } if(!dev->subdevs[subdev].valid) { M_PRINTF("getstat: No subdev registered\n"); return -1; } #ifdef USE_IOMAN memset(stat, 0, sizeof(fio_stat_t)); #else memset(stat, 0, sizeof(iox_stat_t)); #endif stat->size = dev->subdevs[subdev].extent.loc32[0]; stat->hisize = dev->subdevs[subdev].extent.loc32[1]; stat->mode = FIO_S_IFREG; if(dev->subdevs[subdev].mode & DEVFS_MODE_R) { stat->mode |= FIO_S_IRUSR; } if(dev->subdevs[subdev].mode & DEVFS_MODE_W) { stat->mode |= FIO_S_IWUSR; } } return 0; }
int devfs_open(iop_file_t *file, const char *name, int mode, int unused) #endif { devfs_device_t *dev; int loop; int fn_offset = 0; //printf("devfs_open file=%p name=%s mode=%d\n", file, name, mode); if(name == NULL) { M_PRINTF("open: Name is NULL\n"); return -1; } if((name[0] == '\\') || (name[0] == '/')) { fn_offset = 1; } dev = devfs_find_devicename(name + fn_offset); if(dev != NULL) { char *endp; int subdev; int name_len; name_len = strlen(dev->node.name); if(name_len == strlen(name)) /* If this is has not got a subnumber */ { M_PRINTF("open: No subdevice number in filename %s\n", name); return -1; } subdev = strtoul(&name[name_len + fn_offset], &endp, 10); if(((subdev == 0) && (name[name_len + fn_offset] != '0')) || (subdev >= DEVFS_MAX_SUBDEVS)) /* Invalid number */ { M_PRINTF("open: Invalid subdev number %d\n", subdev); return -1; } if(*endp) /* Extra charactes after filename */ { M_PRINTF("open: Invalid filename\n"); return -1; } if(!dev->subdevs[subdev].valid) /* No subdev */ { M_PRINTF("open: No subdev registered\n"); return -1; } if((dev->subdevs[subdev].mode & DEVFS_MODE_EX) && (dev->subdevs[subdev].open_refcount > 0)) /* Already opened in exclusive mode */ { M_PRINTF("open: Exclusive subdevice already opened\n"); return -1; } if(dev->subdevs[subdev].open_refcount == MAX_OPENFILES) { M_PRINTF("open: Reached open file limit for sub device\n"); } /* Tried to open read but not allowed */ if(((mode & O_RDONLY) || ((mode & O_RDWR) == O_RDWR)) && !(dev->subdevs[subdev].mode & DEVFS_MODE_R)) { M_PRINTF("open: Read mode requested but not permitted\n"); return -1; } if(((mode & O_WRONLY) || ((mode & O_RDWR) == O_RDWR)) && !(dev->subdevs[subdev].mode & DEVFS_MODE_W)) { M_PRINTF("open: Write mode requested but not permitted\n"); return -1; } file->privdata = AllocSysMemory(ALLOC_FIRST, sizeof(ioman_data_t), NULL); if(file->privdata == NULL) { M_PRINTF("open: Allocation failure\n"); return -1; } ((ioman_data_t *) file->privdata)->hDev = dev->hDev; ((ioman_data_t *) file->privdata)->subdev = subdev; ((ioman_data_t *) file->privdata)->loc.loc64 = 0; ((ioman_data_t *) file->privdata)->dev = dev; ((ioman_data_t *) file->privdata)->mode = mode; dev->subdevs[subdev].open_refcount++; loop = 0; while((loop < MAX_OPENFILES) && (dev->subdevs[subdev].open_files[loop])) { loop++; } if(loop == MAX_OPENFILES) { FreeSysMemory(file->privdata); M_PRINTF("open: Inconsistency between number of open files and available slot\n"); return -1; } dev->subdevs[subdev].open_files[loop] = file->privdata; dev->open_refcount++; M_PRINTF("open: Opened device %s subdev %d\n", dev->node.name, subdev); } else { M_PRINTF("open: Couldn't find the device\n"); return -1; } return 0; }