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); }
void usb_flush(s32 chn) { char tmp; __usbgecko_exi_wait(chn); while(__usb_recvbyte(chn,&tmp)); EXI_Unlock(chn); }
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); }
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; }
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; }
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; }
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; }
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); }
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; }
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; }
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); }