00001
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #include "config.h"
00047 #include "conf_usb.h"
00048 #include "usb_drv.h"
00049
00050
00051
00052
00053
00054 #if (USB_DEVICE_FEATURE==DISABLED && USB_HOST_FEATURE==DISABLED)
00055 #error at least one of USB_DEVICE_FEATURE or USB_HOST_FEATURE should be unabled
00056 #endif
00057
00058 #if (USB_DEVICE_FEATURE == ENABLED)
00059
00070 U8 usb_config_ep(U8 config0, U8 config1)
00071 {
00072 Usb_enable_endpoint();
00073 UECFG0X = config0;
00074 UECFG1X = (UECFG1X & (1<<ALLOC)) | config1;
00075 Usb_allocate_memory();
00076 return (Is_endpoint_configured());
00077 }
00078
00090 U8 usb_select_enpoint_interrupt(void)
00091 {
00092 U8 interrupt_flags;
00093 U8 ep_num;
00094
00095 ep_num = 0;
00096 interrupt_flags = Usb_interrupt_flags();
00097
00098 while(ep_num < MAX_EP_NB)
00099 {
00100 if (interrupt_flags & 1)
00101 {
00102 return (ep_num);
00103 }
00104 else
00105 {
00106 ep_num++;
00107 interrupt_flags = interrupt_flags >> 1;
00108 }
00109 }
00110 return 0;
00111 }
00112
00133 U8 usb_send_packet(U8 ep_num, U8* tbuf, U8 data_length)
00134 {
00135 U8 remaining_length;
00136
00137 remaining_length = data_length;
00138 Usb_select_endpoint(ep_num);
00139 while(Is_usb_write_enabled() && (0 != remaining_length))
00140 {
00141 Usb_write_byte(*tbuf);
00142 remaining_length--;
00143 tbuf++;
00144 }
00145 return remaining_length;
00146 }
00147
00168 U8 usb_read_packet(U8 ep_num, U8* rbuf, U8 data_length)
00169 {
00170 U8 remaining_length;
00171
00172 remaining_length = data_length;
00173 Usb_select_endpoint(ep_num);
00174
00175 while(Is_usb_read_enabled() && (0 != remaining_length))
00176 {
00177 *rbuf = Usb_read_byte();
00178 remaining_length--;
00179 rbuf++;
00180 }
00181 return remaining_length;
00182 }
00183
00194 void usb_halt_endpoint (U8 ep_num)
00195 {
00196 Usb_select_endpoint(ep_num);
00197 Usb_enable_stall_handshake();
00198 }
00199
00210 U8 usb_init_device (void)
00211 {
00212 Usb_select_device();
00213 if(Is_usb_id_device())
00214 {
00215 Usb_select_endpoint(EP_CONTROL);
00216 if(!Is_usb_endpoint_enabled())
00217 {
00218 #if (USB_LOW_SPEED_DEVICE==DISABLE)
00219 return usb_configure_endpoint(EP_CONTROL, \
00220 TYPE_CONTROL, \
00221 DIRECTION_OUT, \
00222 SIZE_64, \
00223 ONE_BANK, \
00224 NYET_DISABLED);
00225 #else
00226 return usb_configure_endpoint(EP_CONTROL, \
00227 TYPE_CONTROL, \
00228 DIRECTION_OUT, \
00229 SIZE_8, \
00230 ONE_BANK, \
00231 NYET_DISABLED);
00232 #endif
00233 }
00234 }
00235 return FALSE;
00236 }
00237
00238 #endif
00239
00243
00244 #if (USB_HOST_FEATURE == ENABLED)
00245
00255 U8 host_config_pipe(U8 config0, U8 config1)
00256 {
00257 Host_enable_pipe();
00258 UPCFG0X = config0;
00259 UPCFG1X = config1;
00260 Host_allocate_memory();
00261 return (Is_pipe_configured());
00262 }
00263
00271 U8 host_determine_pipe_size(U16 size)
00272 {
00273 if(size <= 8 ) {return (SIZE_8 );}
00274 else if(size <= 16 ) {return (SIZE_16 );}
00275 else if(size <= 32 ) {return (SIZE_32 );}
00276 else if(size <= 64 ) {return (SIZE_64 );}
00277 else if(size <= 128) {return (SIZE_128 );}
00278 else if(size <= 256) {return (SIZE_256 );}
00279 else if(size <= 512) {return (SIZE_512 );}
00280 else {return (SIZE_1024);}
00281
00282 }
00283
00291 void host_disable_all_pipe(void)
00292 {
00293 U8 i;
00294 for (i=0;i<7;i++)
00295 {
00296 Host_reset_pipe(i);
00297 Host_select_pipe(i);
00298 Host_unallocate_memory();
00299 Host_disable_pipe();
00300 }
00301 }
00302
00312 U8 usb_get_nb_pipe_interrupt(void)
00313 {
00314 U8 interrupt_flags;
00315 U8 i;
00316
00317 interrupt_flags = Host_get_pipe_interrupt();
00318 for(i=0;i< MAX_EP_NB;i++)
00319 {
00320 if (interrupt_flags & (1<<i))
00321 {
00322 return (i);
00323 }
00324 }
00325
00326 return MAX_EP_NB+1;
00327 }
00328
00329
00330 #endif // USB_HOST_FEATURE == ENABLED
00331
00332