00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
#include "config.h"
00020
#include "usb_drv.h"
00021
00022
00023
00024
00025
00052 U8 usb_config_ep(U8 config0, U8 config1)
00053 {
00054
Usb_enable_endpoint();
00055
Usb_set_cfg0(config0);
00056
Usb_set_cfg1(config1);
00057 UEPCONX =
MSK_EPEN | (config0>>6) | ((config0 & 0x01)<<2);
00058
Usb_allocate_memory();
00059
return (
TRUE);
00060 }
00061
00074 U8 usb_select_enpoint_interrupt(
void)
00075 {
00076
U8 interrupt_flags;
00077
U8 ep_num;
00078
00079
ep_num = 0;
00080 interrupt_flags =
Usb_interrupt_flags();
00081
00082
while(
ep_num < 9)
00083 {
00084
if (interrupt_flags & 1)
00085 {
00086
return (
ep_num);
00087 }
00088
else
00089 {
00090
ep_num++;
00091 interrupt_flags = interrupt_flags >> 1;
00092 }
00093 }
00094
return 0;
00095 }
00096
00118 U8 usb_send_packet(U8 ep_num, U8* tbuf, U8 data_length)
00119 {
00120
U8 remaining_length;
00121
00122 remaining_length = data_length;
00123
Usb_select_endpoint(
ep_num);
00124
while(
Is_usb_write_enabled() && (0 != remaining_length))
00125 {
00126
Usb_write_byte(*tbuf);
00127 remaining_length--;
00128 tbuf++;
00129 }
00130
Usb_send_control_in();
00131
return remaining_length;
00132 }
00133
00155 U8 usb_read_packet(U8 ep_num, U8* rbuf, U8 data_length)
00156 {
00157
U8 remaining_length;
00158
00159 remaining_length = data_length;
00160
Usb_select_endpoint(
ep_num);
00161
00162
while(
Is_usb_read_enabled() && (0 != remaining_length))
00163 {
00164 *rbuf =
Usb_read_byte();
00165 remaining_length--;
00166 rbuf++;
00167 }
00168
return remaining_length;
00169 }
00170
00183
00184
00185
00186
00187
00188
00200 U8 usb_init_device (
void)
00201 {
00202
usb_configure_endpoint(
EP_CONTROL, \
00203
TYPE_CONTROL, \
00204
DIRECTION_OUT, \
00205
SIZE_64, \
00206
ONE_BANK, \
00207
NYET_DISABLED);
00208
return TRUE;
00209 }
00210
00235 void usb_generate_clock(
void)
00236 {
00237
#if FOSC == 3000
00238
Pll_set_div(
PLL_3MHz);
00239
Pll_enable();
00240
#endif
00241
00242
#if FOSC == 4000
00243
Pll_set_div(
PLL_4MHz);
00244
Pll_enable();
00245
#endif
00246
00247
#if FOSC == 6000
00248
Pll_set_div(
PLL_6MHz);
00249
Pll_enable();
00250
#endif
00251
00252
#if FOSC == 8000
00253
Pll_set_div(
PLL_8MHz);
00254
Pll_enable();
00255
#endif
00256
00257
#if FOSC == 12000
00258
Pll_set_div(
PLL_12MHz);
00259
Pll_enable();
00260
#endif
00261
00262
#if FOSC == 16000
00263
Pll_set_div(
PLL_16MHz);
00264
Pll_enable();
00265
#endif
00266
00267
#if FOSC == 18000
00268
Pll_set_div(
PLL_18MHz);
00269
Pll_enable();
00270
#endif
00271
00272
#if FOSC == 20000
00273
Pll_set_div(
PLL_20MHz);
00274
Pll_enable();
00275
#endif
00276
00277
#if FOSC == 24000
00278
Pll_set_div(
PLL_24MHz);
00279
Pll_enable();
00280
#endif
00281
00282
#if FOSC == 32000
00283
Pll_set_div(
PLL_32MHz);
00284
Pll_enable();
00285
#endif
00286
00287
#if FOSC == 40000
00288
Pll_set_div(
PLL_40MHz);
00289
Pll_enable();
00290
#endif
00291
00292
#if FOSC == 48000
00293
Usb_set_EXT48();
00294
#endif
00295
00296
#if FOSC == 0000
00297
00298
Uchar i;
00299
Uchar reload;
00300
00301 PLLCON = 0x00;
00302
00303
if (CKCON0 &
MSK_X2)
00304 {
00305 CKCON0 |=
MSK_T0X2;
00306 reload = 6;
00307 }
00308
else
00309 {
00310 CKCON0 &= ~
MSK_T0X2;
00311 reload = 9;
00312 }
00313
00314 TMOD = 0x01;
00315 USBINT = 0x00;
00316 i=reload;
00317
00318
while (!(USBINT &
MSK_SOFINT))
00319 {
00320
if (i==9)
00321 {
00322
Pll_stop();
00323 Usb_set_EXT48();
00324 }
00325
else
00326 {
00327 Usb_clear_EXT48();
00328
Pll_set_div(pll_value[i]);
00329
Pll_enable();
00330 }
00331 TH0 = TH0_value[i];
00332 TL0 = TL0_value[i];
00333 TCON |= 0x10;
00334
while(((TCON & 0x20) != 0x20));
00335 TCON &= ~(0x30);
00336
if (i==0)
00337 {
00338 i=reload;
00339 }
00340
else
00341 {
00342 i--;
00343 }
00344 }
00345
00346 TH0 = 0;
00347 TL0 = 0;
00348 TCON = 0;
00349 TMOD = 0;
00350
#endif
00351
}
00352
00353
00354