00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include <config.h>
00032
00033 #include <stdio.h>
00034 #include <stdlib.h>
00035 #include <string.h>
00036
00037 #include "avrerror.h"
00038 #include "avrmalloc.h"
00039 #include "avrclass.h"
00040 #include "utils.h"
00041 #include "callback.h"
00042 #include "op_names.h"
00043
00044 #include "storage.h"
00045 #include "flash.h"
00046
00047 #include "vdevs.h"
00048 #include "memory.h"
00049 #include "stack.h"
00050 #include "register.h"
00051 #include "sram.h"
00052 #include "usb.h"
00053
00054 #include "intvects.h"
00055
00056 void usb_port_wr (char *name, uint8_t val);
00057 uint8_t usb_port_rd (char *name);
00058
00059
00060
00061
00062
00063
00064
00065 static void usbi_add_addr (VDevice *vdev, int addr, char *name, int rel_addr,
00066 void *data);
00067 static uint8_t usb_intr_read (VDevice *dev, int addr);
00068 static void usb_intr_write (VDevice *dev, int addr, uint8_t val);
00069 static void usb_intr_reset (VDevice *dev);
00070 static char *usb_intr_reg_name (VDevice *dev, int addr);
00071
00072
00073
00074
00075
00076
00077 VDevice *
00078 usbi_create (int addr, char *name, int rel_addr, void *data)
00079 {
00080 uint8_t *data_ptr = (uint8_t *) data;
00081 if (data)
00082 return (VDevice *)usb_intr_new (addr, name, (uint8_t) * data_ptr);
00083 else
00084 avr_error ("Attempted USB interrupt create with NULL data pointer");
00085 return 0;
00086 }
00087
00088 USBInter_T *
00089 usb_intr_new (int addr, char *name, uint8_t func_mask)
00090 {
00091 USBInter_T *usb;
00092
00093 usb = avr_new (USBInter_T, 1);
00094 usb_intr_construct (usb, addr, name, func_mask);
00095 class_overload_destroy ((AvrClass *)usb, usb_intr_destroy);
00096
00097 return usb;
00098 }
00099
00100
00101
00102 void
00103 usb_intr_construct (USBInter_T *usb, int addr, char *name, uint8_t func_mask)
00104 {
00105 if (usb == NULL)
00106 avr_error ("passed null ptr");
00107
00108 vdev_construct ((VDevice *)usb, usb_intr_read, usb_intr_write,
00109 usb_intr_reset, usbi_add_addr);
00110
00111 usb->func_mask = func_mask;
00112 usbi_add_addr ((VDevice *)usb, addr, name, 0, NULL);
00113 usb_intr_reset ((VDevice *)usb);
00114 }
00115
00116 static void
00117 usbi_add_addr (VDevice *vdev, int addr, char *name, int rel_addr, void *data)
00118 {
00119 USBInter_T *usb = (USBInter_T *)vdev;
00120
00121 if (strncmp ("UIER", name, 4) == 0)
00122 {
00123 usb->uier_addr = addr;
00124 }
00125
00126 else if (strncmp ("UIAR", name, 4) == 0)
00127 {
00128 usb->uiar_addr = addr;
00129 }
00130
00131 else if (strncmp ("UIMSK", name, 5) == 0)
00132 {
00133 usb->uimsk_addr = addr;
00134 }
00135
00136 else if (strncmp ("UISR", name, 4) == 0)
00137 {
00138 usb->uisr_addr = addr;
00139 }
00140
00141 else if (strncmp ("SPRSMSK", name, 7) == 0)
00142 {
00143 usb->sprsmsk_addr = addr;
00144 }
00145
00146 else if (strncmp ("SPRSIE", name, 6) == 0)
00147 {
00148 usb->sprsie_addr = addr;
00149 }
00150
00151 else if (strncmp ("SPRSR", name, 5) == 0)
00152 {
00153 usb->sprsr_addr = addr;
00154 }
00155
00156 else if (strncmp ("GLB_STATE", name, 9) == 0)
00157 {
00158 usb->glb_state_addr = addr;
00159 }
00160
00161 else if (strncmp ("FRM_NUM_L", name, 9) == 0)
00162 {
00163 usb->frm_num_l_addr = addr;
00164 }
00165
00166 else if (strncmp ("FRM_NUM_H", name, 9) == 0)
00167 {
00168 usb->frm_num_h_addr = addr;
00169 }
00170
00171 else
00172 {
00173 avr_error ("invalid USB Int register name: '%s' @ 0x%04x", name,
00174 addr);
00175 }
00176 }
00177
00178
00179
00180 void
00181 usb_intr_destroy (void *usb)
00182 {
00183 if (usb == NULL)
00184 return;
00185
00186 vdev_destroy (usb);
00187 }
00188
00189 static uint8_t
00190 usb_intr_read (VDevice *dev, int addr)
00191 {
00192 USBInter_T *usb = (USBInter_T *)dev;
00193
00194 if (addr == usb->uier_addr)
00195 return (usb->uier);
00196 else if (addr == usb->uimsk_addr)
00197 return (usb->uimsk);
00198 else if (addr == usb->uisr_addr)
00199 return (usb->uisr =
00200 usb_port_rd (usb_intr_reg_name ((VDevice *)usb, addr)));
00201 else if (addr == usb->sprsie_addr)
00202 return (usb->sprsie);
00203 else if (addr == usb->sprsr_addr)
00204 return (usb->sprsr =
00205 usb_port_rd (usb_intr_reg_name ((VDevice *)usb, addr)));
00206 else if (addr == usb->glb_state_addr)
00207 return (usb->glb_state);
00208 else if (addr == usb->frm_num_l_addr)
00209 return (usb->frm_num_l);
00210 else if (addr == usb->frm_num_h_addr)
00211 return (usb->frm_num_h);
00212 else if (addr == usb->sprsmsk_addr)
00213 return (usb->sprsmsk);
00214 else
00215 avr_error ("Bad address: 0x%04x", addr);
00216
00217 return 0;
00218 }
00219
00220 static void
00221 usb_intr_write (VDevice *dev, int addr, uint8_t val)
00222 {
00223 USBInter_T *usb = (USBInter_T *)dev;
00224
00225 if (addr == usb->uier_addr)
00226 (usb->uier = val);
00227 else if (addr == usb->uimsk_addr)
00228 (usb->uimsk = val);
00229 else if (addr == usb->sprsmsk_addr)
00230 (usb->sprsmsk = val);
00231 else if (addr == usb->sprsie_addr)
00232 (usb->sprsie = val);
00233 else if (addr == usb->uiar_addr)
00234 (usb->uiar = val);
00235 else if (addr == usb->glb_state_addr)
00236 (usb->glb_state = val);
00237 else if (addr == usb->frm_num_l_addr)
00238 (usb->frm_num_l = val);
00239 else if (addr == usb->frm_num_h_addr)
00240 (usb->frm_num_h = val);
00241 else
00242 avr_error ("Bad address: 0x%04x", addr);
00243 }
00244
00245 static void
00246 usb_intr_reset (VDevice *dev)
00247 {
00248 USBInter_T *usb = (USBInter_T *)dev;
00249
00250 usb->sprsr = 0;
00251 usb->uisr = 0;
00252 }
00253
00254 static char *
00255 usb_intr_reg_name (VDevice *dev, int addr)
00256 {
00257 USBInter_T *usb = (USBInter_T *)dev;
00258
00259 if (addr == usb->uier_addr)
00260 return ("UIER");
00261 else if (addr == usb->uimsk_addr)
00262 return ("UIMSK");
00263 else if (addr == usb->uisr_addr)
00264 return ("UISR");
00265 else if (addr == usb->sprsie_addr)
00266 return ("SPRSIE");
00267 else if (addr == usb->sprsr_addr)
00268 return ("SPRSR");
00269 else if (addr == usb->glb_state_addr)
00270 return ("GLB_STATE");
00271 else if (addr == usb->frm_num_l_addr)
00272 return ("FRM_NUM_L");
00273 else if (addr == usb->frm_num_h_addr)
00274 return ("FRM_NUM_H");
00275 else if (addr == usb->sprsmsk_addr)
00276 return ("SPRSMSK");
00277 else if (addr == usb->uiar_addr)
00278 return ("UIAR");
00279 else
00280 avr_error ("Bad address: 0x%04x", addr);
00281
00282 return NULL;
00283 }
00284
00285
00286
00287
00288
00289
00290
00291 static void usb_add_addr (VDevice *vdev, int addr, char *name, int rel_addr,
00292 void *data);
00293 static uint8_t usb_read (VDevice *dev, int addr);
00294 static void usb_write (VDevice *dev, int addr, uint8_t val);
00295 static void usb_reset (VDevice *dev);
00296 static char *usb_reg_name (VDevice *dev, int addr);
00297
00298
00299
00300 VDevice *
00301 usb_create (int addr, char *name, int rel_addr, void *data)
00302 {
00303 return (VDevice *)usb_new (addr, name);
00304 }
00305
00306 USB_T *
00307 usb_new (int addr, char *name)
00308 {
00309 USB_T *usb;
00310
00311 usb = avr_new (USB_T, 1);
00312 usb_construct (usb, addr, name);
00313 class_overload_destroy ((AvrClass *)usb, usb_destroy);
00314
00315 return usb;
00316 }
00317
00318
00319
00320 void
00321 usb_construct (USB_T *usb, int addr, char *name)
00322 {
00323 if (usb == NULL)
00324 avr_error ("passed null ptr");
00325
00326 vdev_construct ((VDevice *)usb, usb_read, usb_write, usb_reset,
00327 usb_add_addr);
00328
00329 usb_add_addr ((VDevice *)usb, addr, name, 0, NULL);
00330 usb_reset ((VDevice *)usb);
00331 }
00332
00333 static void
00334 usb_add_addr (VDevice *vdev, int addr, char *name, int rel_addr, void *data)
00335 {
00336 USB_T *usb = (USB_T *)vdev;
00337
00338 if (strncmp ("FCAR5", name, 5) == 0)
00339 usb->fcar5_addr = addr;
00340 else if (strncmp ("FCAR4", name, 5) == 0)
00341 usb->fcar4_addr = addr;
00342 else if (strncmp ("FCAR3", name, 5) == 0)
00343 usb->fcar3_addr = addr;
00344 else if (strncmp ("FCAR2", name, 5) == 0)
00345 usb->fcar2_addr = addr;
00346 else if (strncmp ("FCAR1", name, 5) == 0)
00347 usb->fcar1_addr = addr;
00348 else if (strncmp ("FCAR0", name, 5) == 0)
00349 usb->fcar0_addr = addr;
00350 else if (strncmp ("HCAR0", name, 5) == 0)
00351 usb->hcar0_addr = addr;
00352 else if (strncmp ("PSTATE1", name, 7) == 0)
00353 usb->pstate1_addr = addr;
00354 else if (strncmp ("PSTATE2", name, 7) == 0)
00355 usb->pstate2_addr = addr;
00356 else if (strncmp ("PSTATE3", name, 7) == 0)
00357 usb->pstate3_addr = addr;
00358 else if (strncmp ("PSTATE4", name, 7) == 0)
00359 usb->pstate4_addr = addr;
00360 else if (strncmp ("PSTATE5", name, 7) == 0)
00361 usb->pstate5_addr = addr;
00362 else if (strncmp ("PSTATE6", name, 7) == 0)
00363 usb->pstate6_addr = addr;
00364 else if (strncmp ("PSTATE7", name, 7) == 0)
00365 usb->pstate7_addr = addr;
00366 else if (strncmp ("PSTATE8", name, 7) == 0)
00367 usb->pstate8_addr = addr;
00368 else if (strncmp ("HPSCR1", name, 6) == 0)
00369 usb->hpscr1_addr = addr;
00370 else if (strncmp ("HPSCR2", name, 6) == 0)
00371 usb->hpscr2_addr = addr;
00372 else if (strncmp ("HPSCR3", name, 6) == 0)
00373 usb->hpscr3_addr = addr;
00374 else if (strncmp ("HPSCR4", name, 6) == 0)
00375 usb->hpscr4_addr = addr;
00376 else if (strncmp ("HPSCR5", name, 6) == 0)
00377 usb->hpscr5_addr = addr;
00378 else if (strncmp ("HPSCR6", name, 6) == 0)
00379 usb->hpscr6_addr = addr;
00380 else if (strncmp ("HPSCR7", name, 6) == 0)
00381 usb->hpscr7_addr = addr;
00382 else if (strncmp ("HPSCR8", name, 6) == 0)
00383 usb->hpscr8_addr = addr;
00384 else if (strncmp ("HPSTAT1", name, 7) == 0)
00385 usb->hpstat1_addr = addr;
00386 else if (strncmp ("HPSTAT2", name, 7) == 0)
00387 usb->hpstat2_addr = addr;
00388 else if (strncmp ("HPSTAT3", name, 7) == 0)
00389 usb->hpstat3_addr = addr;
00390 else if (strncmp ("HPSTAT4", name, 7) == 0)
00391 usb->hpstat4_addr = addr;
00392 else if (strncmp ("HPSTAT5", name, 7) == 0)
00393 usb->hpstat5_addr = addr;
00394 else if (strncmp ("HPSTAT6", name, 7) == 0)
00395 usb->hpstat6_addr = addr;
00396 else if (strncmp ("HPSTAT7", name, 7) == 0)
00397 usb->hpstat7_addr = addr;
00398 else if (strncmp ("HPSTAT8", name, 7) == 0)
00399 usb->hpstat8_addr = addr;
00400 else if (strncmp ("HPCON", name, 5) == 0)
00401 usb->hpcon_addr = addr;
00402 else if (strncmp ("HSTR", name, 4) == 0)
00403 usb->hstr_addr = addr;
00404 else if (strncmp ("FBYTE_CNT5", name, 10) == 0)
00405 usb->fbyte_cnt5_addr = addr;
00406 else if (strncmp ("FBYTE_CNT4", name, 10) == 0)
00407 usb->fbyte_cnt4_addr = addr;
00408 else if (strncmp ("FBYTE_CNT3", name, 10) == 0)
00409 usb->fbyte_cnt3_addr = addr;
00410 else if (strncmp ("FBYTE_CNT2", name, 10) == 0)
00411 usb->fbyte_cnt2_addr = addr;
00412 else if (strncmp ("FBYTE_CNT1", name, 10) == 0)
00413 usb->fbyte_cnt1_addr = addr;
00414 else if (strncmp ("FBYTE_CNT0", name, 10) == 0)
00415 usb->fbyte_cnt0_addr = addr;
00416 else if (strncmp ("HBYTE_CNT0", name, 10) == 0)
00417 usb->hbyte_cnt0_addr = addr;
00418 else if (strncmp ("FDR5", name, 4) == 0)
00419 usb->fdr5_addr = addr;
00420 else if (strncmp ("FDR4", name, 4) == 0)
00421 usb->fdr4_addr = addr;
00422 else if (strncmp ("FDR3", name, 4) == 0)
00423 usb->fdr3_addr = addr;
00424 else if (strncmp ("FDR2", name, 4) == 0)
00425 usb->fdr2_addr = addr;
00426 else if (strncmp ("FDR1", name, 4) == 0)
00427 usb->fdr1_addr = addr;
00428 else if (strncmp ("FDR0", name, 4) == 0)
00429 usb->fdr0_addr = addr;
00430 else if (strncmp ("HDR0", name, 4) == 0)
00431 usb->hdr0_addr = addr;
00432 else if (strncmp ("FCSR5", name, 5) == 0)
00433 usb->fcsr5_addr = addr;
00434 else if (strncmp ("FCSR4", name, 5) == 0)
00435 usb->fcsr4_addr = addr;
00436 else if (strncmp ("FCSR3", name, 5) == 0)
00437 usb->fcsr3_addr = addr;
00438 else if (strncmp ("FCSR2", name, 5) == 0)
00439 usb->fcsr2_addr = addr;
00440 else if (strncmp ("FCSR1", name, 5) == 0)
00441 usb->fcsr1_addr = addr;
00442 else if (strncmp ("FCSR0", name, 5) == 0)
00443 usb->fcsr0_addr = addr;
00444 else if (strncmp ("HCSR0", name, 5) == 0)
00445 usb->hcsr0_addr = addr;
00446 else if (strncmp ("FENDP5_CNTR", name, 11) == 0)
00447 usb->fendp5_cntr_addr = addr;
00448 else if (strncmp ("FENDP4_CNTR", name, 11) == 0)
00449 usb->fendp4_cntr_addr = addr;
00450 else if (strncmp ("FENDP3_CNTR", name, 11) == 0)
00451 usb->fendp3_cntr_addr = addr;
00452 else if (strncmp ("FENDP2_CNTR", name, 11) == 0)
00453 usb->fendp2_cntr_addr = addr;
00454 else if (strncmp ("FENDP1_CNTR", name, 11) == 0)
00455 usb->fendp1_cntr_addr = addr;
00456 else if (strncmp ("FENDP0_CNTR", name, 11) == 0)
00457 usb->fendp0_cntr_addr = addr;
00458 else if (strncmp ("HENDP1_CNTR", name, 11) == 0)
00459 usb->hendp1_cntr_addr = addr;
00460 else if (strncmp ("HENDP0_CNTR", name, 11) == 0)
00461 usb->hendp0_cntr_addr = addr;
00462 else if (strncmp ("FADDR", name, 5) == 0)
00463 usb->faddr_addr = addr;
00464 else if (strncmp ("HADDR", name, 5) == 0)
00465 usb->haddr_addr = addr;
00466 else if (strncmp ("ISCR", name, 4) == 0)
00467 usb->iscr_addr = addr;
00468 else if (strncmp ("UOVCER", name, 6) == 0)
00469 usb->uovcer_addr = addr;
00470 else
00471 {
00472 avr_error ("invalid USB Int register name: '%s' @ 0x%04x", name,
00473 addr);
00474 }
00475 }
00476
00477
00478
00479 void
00480 usb_destroy (void *usb)
00481 {
00482 if (usb == NULL)
00483 return;
00484
00485 vdev_destroy (usb);
00486 }
00487
00488 static uint8_t
00489 usb_read (VDevice *dev, int addr)
00490 {
00491 USB_T *usb = (USB_T *)dev;
00492
00493 if (addr == usb->uovcer_addr)
00494 return usb->uovcer;
00495 else if (addr == usb->haddr_addr)
00496 return usb->haddr;
00497 else if (addr == usb->faddr_addr)
00498 return usb->faddr;
00499 else if (addr == usb->hstr_addr)
00500 return usb->hstr;
00501 else if (addr == usb->hpcon_addr)
00502 return usb->hpcon;
00503 else if (addr == usb->iscr_addr)
00504 return usb->iscr;
00505 else if (addr == usb->fendp5_cntr_addr)
00506 return usb->fendp5_cntr;
00507 else if (addr == usb->fendp4_cntr_addr)
00508 return usb->fendp4_cntr;
00509 else if (addr == usb->fendp3_cntr_addr)
00510 return usb->fendp3_cntr;
00511 else if (addr == usb->fendp2_cntr_addr)
00512 return usb->fendp2_cntr;
00513 else if (addr == usb->fendp1_cntr_addr)
00514 return usb->fendp1_cntr;
00515 else if (addr == usb->fendp0_cntr_addr)
00516 return usb->fendp0_cntr;
00517 else if (addr == usb->hendp1_cntr_addr)
00518 return usb->hendp1_cntr;
00519 else if (addr == usb->hendp0_cntr_addr)
00520 return usb->hendp0_cntr;
00521 else if (addr == usb->fcsr5_addr)
00522 return usb->fcsr5 = usb_port_rd (usb_reg_name ((VDevice *)usb, addr));
00523 else if (addr == usb->fcsr4_addr)
00524 return usb->fcsr4 = usb_port_rd (usb_reg_name ((VDevice *)usb, addr));
00525 else if (addr == usb->fcsr3_addr)
00526 return usb->fcsr3 = usb_port_rd (usb_reg_name ((VDevice *)usb, addr));
00527 else if (addr == usb->fcsr2_addr)
00528 return usb->fcsr2 = usb_port_rd (usb_reg_name ((VDevice *)usb, addr));
00529 else if (addr == usb->fcsr1_addr)
00530 return usb->fcsr1 = usb_port_rd (usb_reg_name ((VDevice *)usb, addr));
00531 else if (addr == usb->fcsr0_addr)
00532 {
00533 usb->fcsr0 = usb_port_rd (usb_reg_name ((VDevice *)usb, addr));
00534 if (usb->fcsr0 & RX_SETUP)
00535 usb->fbyte_cnt0 = 10;
00536 return usb->fcsr0;
00537 }
00538 else if (addr == usb->hcsr0_addr)
00539 {
00540 usb->hcsr0 = usb_port_rd (usb_reg_name ((VDevice *)usb, addr));
00541 if (usb->hcsr0 & RX_SETUP)
00542 usb->hbyte_cnt0 = 10;
00543 return usb->hcsr0;
00544 }
00545 else if (addr == usb->fcar5_addr)
00546 return usb->fcar5;
00547 else if (addr == usb->fcar4_addr)
00548 return usb->fcar4;
00549 else if (addr == usb->fcar3_addr)
00550 return usb->fcar3;
00551 else if (addr == usb->fcar2_addr)
00552 return usb->fcar2;
00553 else if (addr == usb->fcar1_addr)
00554 return usb->fcar1;
00555 else if (addr == usb->fcar0_addr)
00556 return usb->fcar0;
00557 else if (addr == usb->hcar0_addr)
00558 return usb->hcar0;
00559 else if (addr == usb->hpstat1_addr)
00560 return usb->hpstat1;
00561 else if (addr == usb->hpstat2_addr)
00562 return usb->hpstat2;
00563 else if (addr == usb->hpstat3_addr)
00564 return usb->hpstat3;
00565 else if (addr == usb->hpstat4_addr)
00566 return usb->hpstat4;
00567 else if (addr == usb->hpstat5_addr)
00568 return usb->hpstat5;
00569 else if (addr == usb->hpstat6_addr)
00570 return usb->hpstat6;
00571 else if (addr == usb->hpstat7_addr)
00572 return usb->hpstat7;
00573 else if (addr == usb->hpstat8_addr)
00574 return usb->hpstat8;
00575 else if (addr == usb->pstate1_addr)
00576 return usb->pstate1;
00577 else if (addr == usb->pstate2_addr)
00578 return usb->pstate2;
00579 else if (addr == usb->pstate3_addr)
00580 return usb->pstate3;
00581 else if (addr == usb->pstate4_addr)
00582 return usb->pstate4;
00583 else if (addr == usb->pstate5_addr)
00584 return usb->pstate5;
00585 else if (addr == usb->pstate6_addr)
00586 return usb->pstate6;
00587 else if (addr == usb->pstate7_addr)
00588 return usb->pstate7;
00589 else if (addr == usb->pstate8_addr)
00590 return usb->pstate8;
00591 else if (addr == usb->hpscr1_addr)
00592 return usb->hpscr1;
00593 else if (addr == usb->hpscr2_addr)
00594 return usb->hpscr2;
00595 else if (addr == usb->hpscr3_addr)
00596 return usb->hpscr3;
00597 else if (addr == usb->hpscr4_addr)
00598 return usb->hpscr4;
00599 else if (addr == usb->hpscr5_addr)
00600 return usb->hpscr5;
00601 else if (addr == usb->hpscr6_addr)
00602 return usb->hpscr6;
00603 else if (addr == usb->hpscr7_addr)
00604 return usb->hpscr7;
00605 else if (addr == usb->hpscr8_addr)
00606 return usb->hpscr8;
00607 else if (addr == usb->fbyte_cnt5_addr)
00608 return usb->fbyte_cnt5;
00609 else if (addr == usb->fbyte_cnt4_addr)
00610 return usb->fbyte_cnt4;
00611 else if (addr == usb->fbyte_cnt3_addr)
00612 return usb->fbyte_cnt3;
00613 else if (addr == usb->fbyte_cnt2_addr)
00614 return usb->fbyte_cnt2;
00615 else if (addr == usb->fbyte_cnt1_addr)
00616 return usb->fbyte_cnt1;
00617 else if (addr == usb->fbyte_cnt0_addr)
00618 return usb->fbyte_cnt0;
00619 else if (addr == usb->hbyte_cnt0_addr)
00620 return usb->hbyte_cnt0;
00621 else if (addr == usb->fdr5_addr)
00622 return usb->fdr5 = usb_port_rd (usb_reg_name ((VDevice *)usb, addr));
00623 else if (addr == usb->fdr4_addr)
00624 return usb->fdr4 = usb_port_rd (usb_reg_name ((VDevice *)usb, addr));
00625 else if (addr == usb->fdr3_addr)
00626 return usb->fdr3 = usb_port_rd (usb_reg_name ((VDevice *)usb, addr));
00627 else if (addr == usb->fdr2_addr)
00628 return usb->fdr2 = usb_port_rd (usb_reg_name ((VDevice *)usb, addr));
00629 else if (addr == usb->fdr1_addr)
00630 return usb->fdr1 = usb_port_rd (usb_reg_name ((VDevice *)usb, addr));
00631 else if (addr == usb->fdr0_addr)
00632 return usb->fdr0 = usb_port_rd (usb_reg_name ((VDevice *)usb, addr));
00633 else if (addr == usb->hdr0_addr)
00634 return usb->hdr0 = usb_port_rd (usb_reg_name ((VDevice *)usb, addr));
00635 else
00636 avr_error ("Bad address: 0x%04x", addr);
00637 return 0;
00638 }
00639
00640 static void
00641 usb_write (VDevice *dev, int addr, uint8_t val)
00642 {
00643 USB_T *usb = (USB_T *)dev;
00644
00645 if (addr == usb->uovcer_addr)
00646 (usb->uovcer = val);
00647 else if (addr == usb->haddr_addr)
00648 (usb->haddr = val);
00649 else if (addr == usb->faddr_addr)
00650 (usb->faddr = val);
00651 else if (addr == usb->hstr_addr)
00652 (usb->hstr = val);
00653 else if (addr == usb->hpcon_addr)
00654 (usb->hpcon = val);
00655 else if (addr == usb->fendp5_cntr_addr)
00656 usb->fendp5_cntr = val;
00657 else if (addr == usb->fendp4_cntr_addr)
00658 usb->fendp4_cntr = val;
00659 else if (addr == usb->fendp3_cntr_addr)
00660 usb->fendp3_cntr = val;
00661 else if (addr == usb->fendp2_cntr_addr)
00662 usb->fendp2_cntr = val;
00663 else if (addr == usb->fendp1_cntr_addr)
00664 usb->fendp1_cntr = val;
00665 else if (addr == usb->fendp0_cntr_addr)
00666 usb->fendp0_cntr = val;
00667 else if (addr == usb->hendp1_cntr_addr)
00668 usb->hendp1_cntr = val;
00669 else if (addr == usb->hendp0_cntr_addr)
00670 usb->hendp0_cntr = val;
00671 else if (addr == usb->fcar5_addr)
00672 {
00673 usb->fcar5 = val;
00674 usb->fcsr5 &= ~val;
00675 (usb->fbyte_cnt5) = 0;
00676 }
00677 else if (addr == usb->fcar4_addr)
00678 {
00679 usb->fcar4 = val;
00680 usb->fcsr4 &= ~val;
00681 (usb->fbyte_cnt4) = 0;
00682 }
00683 else if (addr == usb->fcar3_addr)
00684 {
00685 usb->fcar3 = val;
00686 usb->fcsr3 &= ~val;
00687 (usb->fbyte_cnt3) = 0;
00688 }
00689 else if (addr == usb->fcar2_addr)
00690 {
00691 usb->fcar2 = val;
00692 usb->fcsr2 &= ~val;
00693 (usb->fbyte_cnt2) = 0;
00694 }
00695 else if (addr == usb->fcar1_addr)
00696 {
00697 usb->fcar1 = val;
00698 usb->fcsr1 &= ~val;
00699 (usb->fbyte_cnt1) = 0;
00700 }
00701 else if (addr == usb->fcar0_addr)
00702 {
00703 usb->fcar0 = val;
00704 usb->fcsr0 &= ~val;
00705 (usb->fbyte_cnt0) = 0;
00706 }
00707 else if (addr == usb->hcar0_addr)
00708 {
00709 usb->hcar0 = val;
00710 usb->hcsr0 &= ~val;
00711 (usb->hbyte_cnt0) = 0;
00712 }
00713 else if (addr == usb->fdr5_addr)
00714 {
00715 usb->fdr5 = val;
00716 (usb->fbyte_cnt5)++;
00717 usb_port_wr (usb_reg_name ((VDevice *)usb, addr), val);
00718 }
00719 else if (addr == usb->fdr4_addr)
00720 {
00721 usb->fdr4 = val;
00722 (usb->fbyte_cnt4)++;
00723 usb_port_wr (usb_reg_name ((VDevice *)usb, addr), val);
00724 }
00725 else if (addr == usb->fdr3_addr)
00726 {
00727 usb->fdr3 = val;
00728 (usb->fbyte_cnt3)++;
00729 usb_port_wr (usb_reg_name ((VDevice *)usb, addr), val);
00730 }
00731 else if (addr == usb->fdr2_addr)
00732 {
00733 usb->fdr2 = val;
00734 (usb->fbyte_cnt2)++;
00735 usb_port_wr (usb_reg_name ((VDevice *)usb, addr), val);
00736 }
00737 else if (addr == usb->fdr1_addr)
00738 {
00739 usb->fdr1 = val;
00740 (usb->fbyte_cnt1)++;
00741 usb_port_wr (usb_reg_name ((VDevice *)usb, addr), val);
00742 }
00743 else if (addr == usb->fdr0_addr)
00744 {
00745 usb->fdr0 = val;
00746 (usb->fbyte_cnt0)++;
00747 usb_port_wr (usb_reg_name ((VDevice *)usb, addr), val);
00748 }
00749 else if (addr == usb->hdr0_addr)
00750 {
00751 usb->hdr0 = val;
00752 (usb->hbyte_cnt0)++;
00753 usb_port_wr (usb_reg_name ((VDevice *)usb, addr), val);
00754 }
00755 else
00756 avr_error ("Bad address: 0x%04x", addr);
00757 }
00758
00759 static void
00760 usb_reset (VDevice *dev)
00761 {
00762 USB_T *usb = (USB_T *)dev;
00763
00764 usb->haddr = 0;
00765 usb->faddr = 0;
00766
00767 usb->hstr = 0;
00768 usb->hpcon = 0;
00769
00770 usb->uovcer = 0;
00771 }
00772
00773 static char *
00774 usb_reg_name (VDevice *dev, int addr)
00775 {
00776 USB_T *usb = (USB_T *)dev;
00777
00778 if (addr == usb->fcar5_addr)
00779 return "FCAR5";
00780 else if (addr == usb->fcar4_addr)
00781 return "FCAR4";
00782 else if (addr == usb->fcar3_addr)
00783 return "FCAR3";
00784 else if (addr == usb->fcar2_addr)
00785 return "FCAR2";
00786 else if (addr == usb->fcar1_addr)
00787 return "FCAR1";
00788 else if (addr == usb->fcar0_addr)
00789 return "FCAR0";
00790 else if (addr == usb->hcar0_addr)
00791 return "HCAR0";
00792 else if (addr == usb->pstate1_addr)
00793 return "PSTATE1";
00794 else if (addr == usb->pstate2_addr)
00795 return "PSTATE2";
00796 else if (addr == usb->pstate3_addr)
00797 return "PSTATE3";
00798 else if (addr == usb->pstate4_addr)
00799 return "PSTATE4";
00800 else if (addr == usb->pstate5_addr)
00801 return "PSTATE5";
00802 else if (addr == usb->pstate6_addr)
00803 return "PSTATE6";
00804 else if (addr == usb->pstate7_addr)
00805 return "PSTATE7";
00806 else if (addr == usb->pstate8_addr)
00807 return "PSTATE8";
00808 else if (addr == usb->hpscr1_addr)
00809 return "HPSCR1";
00810 else if (addr == usb->hpscr2_addr)
00811 return "HPSCR2";
00812 else if (addr == usb->hpscr3_addr)
00813 return "HPSCR3";
00814 else if (addr == usb->hpscr4_addr)
00815 return "HPSCR4";
00816 else if (addr == usb->hpscr5_addr)
00817 return "HPSCR5";
00818 else if (addr == usb->hpscr6_addr)
00819 return "HPSCR6";
00820 else if (addr == usb->hpscr7_addr)
00821 return "HPSCR7";
00822 else if (addr == usb->hpscr8_addr)
00823 return "HPSCR8";
00824 else if (addr == usb->hpstat1_addr)
00825 return "HPSTAT1";
00826 else if (addr == usb->hpstat2_addr)
00827 return "HPSTAT2";
00828 else if (addr == usb->hpstat3_addr)
00829 return "HPSTAT3";
00830 else if (addr == usb->hpstat4_addr)
00831 return "HPSTAT4";
00832 else if (addr == usb->hpstat5_addr)
00833 return "HPSTAT5";
00834 else if (addr == usb->hpstat6_addr)
00835 return "HPSTAT6";
00836 else if (addr == usb->hpstat7_addr)
00837 return "HPSTAT7";
00838 else if (addr == usb->hpstat8_addr)
00839 return "HPSTAT8";
00840 else if (addr == usb->hpcon_addr)
00841 return "HPCON";
00842 else if (addr == usb->hstr_addr)
00843 return "HSTR";
00844 else if (addr == usb->fbyte_cnt5_addr)
00845 return "FBYTE_CNT5";
00846 else if (addr == usb->fbyte_cnt4_addr)
00847 return "FBYTE_CNT4";
00848 else if (addr == usb->fbyte_cnt3_addr)
00849 return "FBYTE_CNT3";
00850 else if (addr == usb->fbyte_cnt2_addr)
00851 return "FBYTE_CNT2";
00852 else if (addr == usb->fbyte_cnt1_addr)
00853 return "FBYTE_CNT1";
00854 else if (addr == usb->fbyte_cnt0_addr)
00855 return "FBYTE_CNT0";
00856 else if (addr == usb->hbyte_cnt0_addr)
00857 return "HBYTE_CNT0";
00858 else if (addr == usb->fdr5_addr)
00859 return "FDR5";
00860 else if (addr == usb->fdr4_addr)
00861 return "FDR4";
00862 else if (addr == usb->fdr3_addr)
00863 return "FDR3";
00864 else if (addr == usb->fdr2_addr)
00865 return "FDR2";
00866 else if (addr == usb->fdr1_addr)
00867 return "FDR1";
00868 else if (addr == usb->fdr0_addr)
00869 return "FDR0";
00870 else if (addr == usb->hdr0_addr)
00871 return "HDR0";
00872 else if (addr == usb->fcsr5_addr)
00873 return "FCSR5";
00874 else if (addr == usb->fcsr4_addr)
00875 return "FCSR4";
00876 else if (addr == usb->fcsr3_addr)
00877 return "FCSR3";
00878 else if (addr == usb->fcsr2_addr)
00879 return "FCSR2";
00880 else if (addr == usb->fcsr1_addr)
00881 return "FCSR1";
00882 else if (addr == usb->fcsr0_addr)
00883 return "FCSR0";
00884 else if (addr == usb->hcsr0_addr)
00885 return "HCSR0";
00886 else if (addr == usb->fendp5_cntr_addr)
00887 return "FENDP5_CNTR";
00888 else if (addr == usb->fendp4_cntr_addr)
00889 return "FENDP4_CNTR";
00890 else if (addr == usb->fendp3_cntr_addr)
00891 return "FENDP3_CNTR";
00892 else if (addr == usb->fendp2_cntr_addr)
00893 return "FENDP2_CNTR";
00894 else if (addr == usb->fendp1_cntr_addr)
00895 return "FENDP1_CNTR";
00896 else if (addr == usb->fendp0_cntr_addr)
00897 return "FENDP0_CNTR";
00898 else if (addr == usb->hendp1_cntr_addr)
00899 return "HENDP1_CNTR";
00900 else if (addr == usb->hendp0_cntr_addr)
00901 return "HENDP0_CNTR";
00902 else if (addr == usb->faddr_addr)
00903 return "FADDR";
00904 else if (addr == usb->haddr_addr)
00905 return "HADDR";
00906 else if (addr == usb->iscr_addr)
00907 return "ISCR";
00908 else if (addr == usb->uovcer_addr)
00909 return "UOVCER";
00910 else
00911 avr_error ("Bad address: 0x%04x", addr);
00912 return NULL;
00913 }
00914
00915 uint8_t
00916 usb_port_rd (char *name)
00917 {
00918 int data;
00919 char line[80];
00920
00921 while (1)
00922 {
00923 fprintf (stderr, "\nEnter a byte of hex data to read into %s: ",
00924 name);
00925
00926
00927 if (fgets (line, sizeof (line), stdin) == NULL)
00928 continue;
00929
00930
00931 if (sscanf (line, "%x\n", &data) != 1)
00932 continue;
00933
00934 break;
00935 }
00936 return (uint8_t) (data & 0xff);
00937 }
00938
00939 void
00940 usb_port_wr (char *name, uint8_t val)
00941 {
00942 fprintf (stderr, "wrote 0x%02x to %s\n", val, name);
00943 }