예제 #1
0
void SIO2_TransferInit4 ( void ) {

 SetEventFlag ( s_EventFlag, 0x00000100 );
 WaitEventFlag ( s_EventFlag, 0x00000200, 0, NULL );
 ClearEventFlag ( s_EventFlag, ~0x00000200 );

}  /* end SIO2_TransferInit4 */
예제 #2
0
void SIO2_TransferInit1 ( void ) {

 SetEventFlag ( s_EventFlag, 0x00000004 );
 WaitEventFlag ( s_EventFlag, 0x00000008, 0, NULL );
 ClearEventFlag ( s_EventFlag, ~0x00000008 );

}  /* end SIO2_TransferInit1 */
예제 #3
0
void SIO2_TransferInit3 ( void ) {

 SetEventFlag ( s_EventFlag, 0x00000040 );
 WaitEventFlag ( s_EventFlag, 0x00000080, 0, NULL );
 ClearEventFlag ( s_EventFlag, ~0x00000080 );

}  /* end SIO2_TransferInit3 */
예제 #4
0
파일: sio2man.c 프로젝트: sp193/ps2sdk
/* 48 */
void sio2_mtap_transfer_init()
{
	SetEventFlag(event_flag, EF_MTAP_TRANSFER_INIT);

	WaitEventFlag(event_flag, EF_MTAP_TRANSFER_READY, 0, NULL);
	ClearEventFlag(event_flag, ~EF_MTAP_TRANSFER_READY);
}
예제 #5
0
void SIO2_TransferInit0 ( void ) {

 SetEventFlag ( s_EventFlag, 0x00000001 );
 WaitEventFlag ( s_EventFlag, 0x00000002, 0, NULL );
 ClearEventFlag ( s_EventFlag, ~0x00000002 );

}  /* end SIO2_TransferInit0 */
예제 #6
0
파일: sio2man.c 프로젝트: sp193/ps2sdk
/* 25 */
int sio2_transfer(sio2_transfer_data_t *td)
{
	transfer_data = td;
	SetEventFlag(event_flag, EF_TRANSFER_START);

	WaitEventFlag(event_flag, EF_TRANSFER_FINISH, 0, NULL);
	ClearEventFlag(event_flag, ~EF_TRANSFER_FINISH);
	return 1;
}
예제 #7
0
int SIO2_Transfer ( SIO2_TransferData* apData ) {

 s_pTransferData = apData;

 SetEventFlag ( s_EventFlag, 0x00000400 );
 WaitEventFlag ( s_EventFlag, 0x00000800, 0, NULL );
 ClearEventFlag ( s_EventFlag, ~0x00000800 );

 return 1;

}  /* end SIO2_Transfer */
예제 #8
0
void UBUFThread(void *arg){
	void (*RequestResponseHandler)(unsigned int header, volatile unsigned int *buffer, unsigned int nQuads);
	unsigned int data, DataBufferLevel;
	u32 ef_bits;

	while(1){
		WaitEventFlag(IntrEventFlag, iLinkEventBusReset|iLinkEventURx, WEF_OR, &ef_bits);
		ClearEventFlag(IntrEventFlag, ~(iLinkEventBusReset|iLinkEventURx));

		while((DataBufferLevel=ILINKRegisterBase->ubufReceiveLevel)>0){
			data=ILINKRegisterBase->ubufReceive;
			iDEBUG_PRINTF("Handling UBUF data... handler: 0x%02lx.\n", (data>>4)&0xF);
			RequestResponseHandler=RequestHandlers[(data>>4)&0xF];
			RequestResponseHandler(data, (volatile unsigned int *)&ILINKRegisterBase->ubufReceive, DataBufferLevel-1);
		}
	}
}
예제 #9
0
static void read_thread(void *arg)
{
	USE_SPD_REGS;
	volatile iop_dmac_chan_t *dev9_chan = (volatile iop_dmac_chan_t *)DEV9_DMAC_BASE;
	struct eng_args *args = (struct eng_args *)arg;
	ata_dma_transfer_t *t = &dma_transfer;
	u32 res;

	while (1) {
		while (SleepThread() || WaitSema(args->semid))
			;

		ClearEventFlag(args->evflg, 0);

		dma_setup(0);
		EnableIntr(IOP_IRQ_DMA_DEV9);

	}
}
예제 #10
0
static void write_thread(void *arg)
{
	USE_SPD_REGS;
	volatile iop_dmac_chan_t *dev9_chan = (volatile iop_dmac_chan_t *)DEV9_DMAC_BASE;
	struct eng_args *args = (struct eng_args *)arg;
	ata_dma_transfer_t *t = &dma_transfer;
	u32 res;

	while (1) {
		while (SleepThread() || WaitSema(args->semid))
			;

		ClearEventFlag(args->evflg, 0);

		dma_setup(1);
		EnableIntr(IOP_IRQ_DMA_DEV9);

		/* Initiate the DMA transfer.  */
		dev9_chan->madr = (u32)dma_buffer;
		dev9_chan->bcr  = ((t->size / 128) << 16) | 32;
		dev9_chan->chcr = 0x01000201;

		SPD_REG8(0x4e) = t->command;	/* ATA command register.  */
		SPD_REG8(SPD_R_PIO_DIR) = 1;
		SPD_REG8(SPD_R_PIO_DATA) = 0;
		SPD_REG8(SPD_R_XFR_CTRL) |= 0x80;

		WaitEventFlag(args->evflg, (EF_DMA_DONE|EF_ATA_DONE), 0x11, &res);

		SPD_REG8(SPD_R_XFR_CTRL) &= 0x7f;

		DisableIntr(IOP_IRQ_DMA_DEV9, NULL);

		/* If we got the ATA end signal, force stop the transfer.  */
		if (res & EF_ATA_DONE)
			dma_stop(1);

		SignalSema(args->semid);
	}
}
예제 #11
0
파일: netman.c 프로젝트: ps2dev/ps2sdk
int NetManSetLinkMode(int mode){
	int result, evfid;

	WaitSema(NetManIOSemaID);

	if(MainNetIF!=NULL){
		evfid = MainNetIF->EventFlagID;

		ClearEventFlag(evfid, ~NETMAN_NETIF_EVF_DOWN);
		result = MainNetIF->ioctl(NETMAN_NETIF_IOCTL_ETH_SET_LINK_MODE, &mode, sizeof(mode), NULL, 0);
	}
	else{
		evfid = -1;
		result = -1;
	}

	SignalSema(NetManIOSemaID);

	if(result == 0  && evfid >= 0)
		WaitEventFlag(evfid, NETMAN_NETIF_EVF_DOWN, WEF_OR, NULL);	//Wait for the IF to go down.

	return result;
}
예제 #12
0
파일: netman.c 프로젝트: ps2dev/ps2sdk
void NetManToggleNetIFLinkState(int NetIFID, unsigned char state){
	struct NetManNetIF *pNetIF;

	WaitSema(NetManIOSemaID);

	if((NetIFID&0xFF)<NETMAN_MAX_NETIF_COUNT && NetIFID==NetIFs[NetIFID&0xFF].id && (NetIFs[NetIFID&0xFF].flags&NETMAN_NETIF_IN_USE)){
		pNetIF = &NetIFs[NetIFID&0xFF];

		ClearEventFlag(pNetIF->EventFlagID, ~(NETMAN_NETIF_EVF_UP|NETMAN_NETIF_EVF_DOWN));

		if(state){
			pNetIF->flags|=NETMAN_NETIF_LINK_UP;
			SetEventFlag(pNetIF->EventFlagID, NETMAN_NETIF_EVF_UP);
		}
		else{
			pNetIF->flags&=~NETMAN_NETIF_LINK_UP;
			SetEventFlag(pNetIF->EventFlagID, NETMAN_NETIF_EVF_DOWN);
		}

		UpdateNetIFStatus();
	}

	SignalSema(NetManIOSemaID);
}
예제 #13
0
static void _MainThread ( void* apParam ) {

 u32 lBits[ 4 ];
 u32 lEventFlag;

 while ( 1 ) {

  WaitEventFlag ( s_EventFlag, 0x00000155, 1, lBits );

  if ( lBits[ 0 ] & 0x00000001 ) {         /* SIO2_TransferInit0 */

   ClearEventFlag ( s_EventFlag, ~0x00000001 );
   lEventFlag = 0x00000002;

  } else if ( lBits[ 0 ] & 0x00000004 ) {  /* SIO2_TransferInit1 */

   ClearEventFlag ( s_EventFlag, ~0x00000004 );
   lEventFlag = 0x00000008;

  } else if ( lBits[ 0 ] & 0x00000010 ) {  /* SIO2_TransferInit2 */

   ClearEventFlag ( s_EventFlag, ~0x00000010 );
   lEventFlag = 0x00000020;

  } else if ( lBits[ 0 ] & 0x00000040 ) {  /* SIO2_TransferInit3 */

   ClearEventFlag ( s_EventFlag, ~0x00000040 );
   lEventFlag = 0x00000080;

  } else if ( lBits[ 0 ] & 0x00000100 ) {  /* SIO2_TransferInit4 */

   ClearEventFlag ( s_EventFlag, ~0x00000100 );
   lEventFlag = 0x00000200;

  } else break;
loop:
  SetEventFlag ( s_EventFlag, lEventFlag );

  WaitEventFlag ( s_EventFlag, 0x00001400, 1, lBits );  /* SIO2_Transfer or SIO2_TransferReset */

  if ( lBits[ 0 ] & 0x00001000 ) {  /* SIO2_TransferReset */

   ClearEventFlag ( s_EventFlag, ~0x00001000 );
   continue;

  }  /* end if */

  ClearEventFlag ( s_EventFlag, ~0x00000400 );  /* SIO2_Transfer */

  SIO2_SwitchCtrlC ();
  _Send ( s_pTransferData );
  SIO2_SwitchCtrl1 ();

  WaitEventFlag ( s_EventFlag, 0x00002000, 0, NULL );
  ClearEventFlag ( s_EventFlag, ~0x00002000 );

  _Recv ( s_pTransferData );
  lEventFlag = 0x00000800;

  goto loop;

 }  /* end while */

}  /* end _MainThread */
예제 #14
0
파일: sio2man.c 프로젝트: sp193/ps2sdk
void main_thread(void *unused)
{
	u32 resbits[4];

	while (1) {
	#ifndef XSIO2MAN
		log_flush(0);
	#endif
		WaitEventFlag(event_flag, EF_PAD_TRANSFER_INIT |
				EF_MC_TRANSFER_INIT | EF_MTAP_TRANSFER_INIT,
				1, resbits);

		if (resbits[0] & EF_PAD_TRANSFER_INIT) {
			ClearEventFlag(event_flag, ~EF_PAD_TRANSFER_INIT);
			SetEventFlag(event_flag, EF_PAD_TRANSFER_READY);
#ifndef XSIO2MAN
			log_default(LOG_PAD_READY);
#endif
		} else if (resbits[0] & EF_MC_TRANSFER_INIT) {
			ClearEventFlag(event_flag, ~EF_MC_TRANSFER_INIT);
			SetEventFlag(event_flag, EF_MC_TRANSFER_READY);
#ifndef XSIO2MAN
			log_default(LOG_MC_READY);
#endif
		} else if (resbits[0] & EF_MTAP_TRANSFER_INIT) {
			ClearEventFlag(event_flag, ~EF_MTAP_TRANSFER_INIT);
			SetEventFlag(event_flag, EF_MTAP_TRANSFER_READY);
#ifndef XSIO2MAN
			log_default(LOG_MTAP_READY);
#endif
		} else {
			EPRINTF("Unknown event %08lx. Exiting.\n", resbits[0]);
			return;
		}

transfer_loop:
		WaitEventFlag(event_flag, EF_TRANSFER_START | EF_TRANSFER_RESET, 1, resbits);

		if (resbits[0] & EF_TRANSFER_RESET) {
			ClearEventFlag(event_flag, ~EF_TRANSFER_RESET);
#ifndef XSIO2MAN
			log_default(LOG_RESET);
#endif
			continue;
		}

		ClearEventFlag(event_flag, ~EF_TRANSFER_START);

		sio2_ctrl_set(sio2_ctrl_get() | 0xc);
		send_td(transfer_data);
		sio2_ctrl_set(sio2_ctrl_get() | 1);

		WaitEventFlag(event_flag, EF_SIO2_INTR_COMPLETE, 0, NULL);
		ClearEventFlag(event_flag, ~EF_SIO2_INTR_COMPLETE);

		recv_td(transfer_data);
		SetEventFlag(event_flag, EF_TRANSFER_FINISH);

		/* Bah... this is needed to get the initial dump from XMCMAN,
		   but it will kill the IOP when XPADMAN is spamming...

		   TODO
		   I guess the correct solution is to do all logging in a
		   dedicated thread.  */
//		log_flush(1);

		goto transfer_loop;
	}
}