예제 #1
0
파일: usbgecko.c 프로젝트: Alcaro/RetroArch
int usb_sendbuffer_safe_ex(s32 chn,const void *buffer,int size, int retries)
{
	s32 ret;
	s32 left = size;
	char *ptr = (char*)buffer;

	__usbgecko_exi_wait(chn);
	while(left>0) {
		if(__usb_checksend(chn)) {
			ret = __usb_sendbyte(chn,*ptr);
			if(ret==0) break;

			ptr++;
			left--;
		}

		if (retries >= 0) {
			retries--;
			if (retries == 0)
				break;
		}
	}
	EXI_Unlock(chn);

	return (size - left);
}
예제 #2
0
파일: usbgecko.c 프로젝트: Alcaro/RetroArch
void usb_flush(s32 chn)
{
	char tmp;

	__usbgecko_exi_wait(chn);
	while(__usb_recvbyte(chn,&tmp));
	EXI_Unlock(chn);
}
예제 #3
0
static void __usb_flush(s32 chn)
{
	char tmp;

	if(!EXI_Lock(chn,EXI_DEVICE_0,NULL)) return;

	while(__usb_recvbyte(chn,&tmp));

	EXI_Unlock(chn);
}
예제 #4
0
파일: usbgecko.c 프로젝트: Alcaro/RetroArch
int usb_flashread(s32 chn, u32 offset, void *buffer, size_t length)
{
	s32 ret=1;
	u8 *data = (u8*)buffer;

	__usbgecko_exi_wait(chn);
	while (ret && length--)
		ret = __flashreadcommand(chn, offset++, data++);

	EXI_Unlock(chn);

	return ret;
}
예제 #5
0
static int __usb_isgeckoalive(s32 chn)
{
	s32 ret;
	u16 val;

	if(!EXI_Lock(chn,EXI_DEVICE_0,NULL)) return 0;

	val = 0x9000;
	ret = __send_command(chn,&val);
	if(ret==1 && !(val&0x0470)) ret = 0;

	EXI_Unlock(chn);
	return ret;
}
예제 #6
0
파일: usbgecko.c 프로젝트: Alcaro/RetroArch
int usb_flashverify(s32 chn)
{
	u8 id[2];
	s32 ret=0;

	__usbgecko_exi_wait(chn);

	if (__flashsoftwareid_entry(chn) &&__flashreadcommand(chn, 0, id+0) &&
	    __flashreadcommand(chn, 1, id+1) &&	id[0] == 0xBF && id[1] == 0xD7 &&
	    __flashsoftwareid_exit(chn))
		ret = 1;

	EXI_Unlock(chn);

	return ret;
}
예제 #7
0
static __inline__ int __send_command1(s32 chn,u16 *cmd)
{
	s32 ret;

	ret = 0;
	if(EXI_Lock(chn,EXI_DEVICE_0,NULL)) {
		if(!EXI_Select(chn,EXI_DEVICE_0,EXI_SPEED32MHZ)) ret |= 0x01;
		if(!EXI_Imm(chn,cmd,sizeof(u16),EXI_READWRITE,NULL)) ret |= 0x02;
		if(!EXI_Sync(chn)) ret |= 0x04;
		if(!EXI_Deselect(chn)) ret |= 0x08;
		if(!EXI_Unlock(chn)) ret |= 0x10;

		if(ret) ret = 0;
		else ret = 1;
	}
	return ret;
}
예제 #8
0
static int __usb_sendbuffer(s32 chn,const void *buffer,int size)
{
	s32 ret;
	s32 left = size;
	char *ptr = (char*)buffer;

	if(!EXI_Lock(chn,EXI_DEVICE_0,NULL)) return 0;

	while(left>0) {
		if(__usb_checksend(chn)) {
			ret = __usb_sendbyte(chn,*ptr);
			if(ret==0) break;

			ptr++;
			left--;
		}
	}

	EXI_Unlock(chn);
	return (size - left);
}
예제 #9
0
파일: usbgecko.c 프로젝트: Alcaro/RetroArch
int usb_isgeckoalive(s32 chn)
{
	u32 id = 0;
	s32 ret;
	u16 val;

	if (EXI_GetID(chn, EXI_DEVICE_0, &id) == 0)
		return 0;

	if (id != 0)
		return 0;

	__usbgecko_exi_wait(chn);

	val = 0x9000;
	ret = __send_command(chn,&val);
	if(ret==1 && !(val&0x0470)) ret = 0;

	EXI_Unlock(chn);

	return ret;
}
예제 #10
0
파일: usbgecko.c 프로젝트: Alcaro/RetroArch
int usb_flashwrite(s32 chn, u32 offset, const void *buffer, size_t length)
{
	s32 ret=1;
	const u8 *data = (const u8*)buffer;
	u8 verify;

	__usbgecko_exi_wait(chn);
	while (ret && length--)
	{
		if (!__flashwritecommand(chn, 0x5555, 0xAA) || !__flashwritecommand(chn, 0x2AAA, 0x55) ||
		    !__flashwritecommand(chn, 0x5555, 0xA0) || !__flashwritecommand(chn, offset, *data))
			ret = 0;
		else
		{
			usleep(20);
			if (!__flashreadcommand(chn, offset++, &verify) || verify != *data++)
				ret = 0;
		}
	}
	EXI_Unlock(chn);

	return ret;
}
예제 #11
0
파일: usbgecko.c 프로젝트: Alcaro/RetroArch
int usb_recvbuffer_ex(s32 chn,void *buffer,int size, int retries)
{
	s32 ret;
	s32 left = size;
	char *ptr = (char*)buffer;

	__usbgecko_exi_wait(chn);
	while(left>0) {
		ret = __usb_recvbyte(chn,ptr);
		if(ret==0) break;

		ptr++;
		left--;

		if (retries >= 0) {
			retries--;
			if (retries == 0)
				break;
		}
	}
	EXI_Unlock(chn);

	return (size - left);
}