7 #include <machine/processor.h>
11 #define _SHIFTL(v, s, w) \
12 ((u32) (((u32)(v) & ((0x01 << (w)) - 1)) << (s)))
13 #define _SHIFTR(v, s, w) \
14 ((u32)(((u32)(v) >> (s)) & ((0x01 << (w)) - 1)))
17 static u32 usbgecko_inited
= 0;
18 static lwpq_t wait_exi_queue
[2];
20 static s32
__usbgecko_exi_unlock(s32 chan
,s32 dev
)
22 LWP_ThreadBroadcast(wait_exi_queue
[chan
]);
26 static void __usbgecko_init()
30 for(i
=0;i
<EXI_CHANNEL_2
;i
++) {
31 LWP_InitQueue(&wait_exi_queue
[i
]);
36 static __inline__
void __usbgecko_exi_wait(s32 chn
)
40 _CPU_ISR_Disable(level
);
41 if(!usbgecko_inited
) __usbgecko_init();
42 while(EXI_Lock(chn
,EXI_DEVICE_0
,__usbgecko_exi_unlock
)==0) {
43 LWP_ThreadSleep(wait_exi_queue
[chn
]);
45 _CPU_ISR_Restore(level
);
48 static __inline__
int __send_command(s32 chn
,u16
*cmd
)
52 if(!EXI_Select(chn
,EXI_DEVICE_0
,EXI_SPEED32MHZ
)) ret
|= 0x01;
53 if(!EXI_Imm(chn
,cmd
,sizeof(u16
),EXI_READWRITE
,NULL
)) ret
|= 0x02;
54 if(!EXI_Sync(chn
)) ret
|= 0x04;
55 if(!EXI_Deselect(chn
)) ret
|= 0x08;
61 static int __usb_sendbyte(s32 chn
,char ch
)
66 val
= (0xB000|_SHIFTL(ch
,4,8));
67 ret
= __send_command(chn
,&val
);
68 if(ret
==1 && !(val
&0x0400)) ret
= 0;
73 static int __usb_recvbyte(s32 chn
,char *ch
)
80 ret
= __send_command(chn
,&val
);
81 if(ret
==1 && !(val
&0x0800)) ret
= 0;
82 else if(ret
==1) *ch
= (val
&0xff);
87 int __usb_checksend(s32 chn
)
93 ret
= __send_command(chn
,&val
);
94 if(ret
==1 && !(val
&0x0400)) ret
= 0;
99 int __usb_checkrecv(s32 chn
)
105 ret
= __send_command(chn
,&val
);
106 if(ret
==1 && !(val
&0x0400)) ret
= 0;
111 void usb_flush(s32 chn
)
115 __usbgecko_exi_wait(chn
);
116 while(__usb_recvbyte(chn
,&tmp
));
120 int usb_isgeckoalive(s32 chn
)
126 if(EXI_GetID(chn
,EXI_DEVICE_0
,&id
)==0) return 0;
129 __usbgecko_exi_wait(chn
);
132 ret
= __send_command(chn
,&val
);
133 if(ret
==1 && !(val
&0x0470)) ret
= 0;
140 int usb_recvbuffer(s32 chn
,void *buffer
,int size
)
144 char *ptr
= (char*)buffer
;
146 __usbgecko_exi_wait(chn
);
148 ret
= __usb_recvbyte(chn
,ptr
);
156 return (size
- left
);
159 int usb_sendbuffer(s32 chn
,const void *buffer
,int size
)
163 char *ptr
= (char*)buffer
;
165 __usbgecko_exi_wait(chn
);
167 ret
= __usb_sendbyte(chn
,*ptr
);
175 return (size
- left
);
178 int usb_recvbuffer_safe(s32 chn
,void *buffer
,int size
)
182 char *ptr
= (char*)buffer
;
184 __usbgecko_exi_wait(chn
);
186 if(__usb_checkrecv(chn
)) {
187 ret
= __usb_recvbyte(chn
,ptr
);
196 return (size
- left
);
199 int usb_sendbuffer_safe(s32 chn
,const void *buffer
,int size
)
203 char *ptr
= (char*)buffer
;
205 __usbgecko_exi_wait(chn
);
207 if(__usb_checksend(chn
)) {
208 ret
= __usb_sendbyte(chn
,*ptr
);
217 return (size
- left
);