Example #1
0
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;
}
Example #2
0
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);

        }
    }
}
Example #3
0
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;
}
Example #4
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;
}
Example #5
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;
}
Example #6
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;
}