Main Page | File List | Globals | Related Pages

usb.c

Go to the documentation of this file.
00001 /* 00002 * $Id: usb.c,v 1.1 2004/01/02 04:03:21 troth Exp $ 00003 * 00004 **************************************************************************** 00005 * 00006 * simulavr - A simulator for the Atmel AVR family of microcontrollers. 00007 * Copyright (C) 2003 Keith Gudger 00008 * 00009 * This program is free software; you can redistribute it and/or modify 00010 * it under the terms of the GNU General Public License as published by 00011 * the Free Software Foundation; either version 2 of the License, or 00012 * (at your option) any later version. 00013 * 00014 * This program is distributed in the hope that it will be useful, 00015 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00017 * GNU General Public License for more details. 00018 * 00019 * You should have received a copy of the GNU General Public License 00020 * along with this program; if not, write to the Free Software 00021 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00022 * 00023 **************************************************************************** 00024 */ 00025 00026 /** 00027 * \file usb.c 00028 * \brief Module to simulate the AVR's USB module. 00029 */ 00030 00031 #include <config.h> 00032 00033 #include <stdio.h> 00034 #include <stdlib.h> 00035 00036 #include "avrerror.h" 00037 #include "avrmalloc.h" 00038 #include "avrclass.h" 00039 #include "utils.h" 00040 #include "callback.h" 00041 #include "op_names.h" 00042 00043 #include "storage.h" 00044 #include "flash.h" 00045 00046 #include "vdevs.h" 00047 #include "memory.h" 00048 #include "stack.h" 00049 #include "register.h" 00050 #include "sram.h" 00051 #include "usb.h" 00052 00053 #include "intvects.h" 00054 00055 void usb_port_wr (char *name, uint8_t val); 00056 uint8_t usb_port_rd (char *name); 00057 00058 /*****************************************************************************\ 00059 * 00060 * USB Interrupts 00061 * 00062 \*****************************************************************************/ 00063 00064 static uint8_t usb_intr_read (VDevice *dev, int addr); 00065 static void usb_intr_write (VDevice *dev, int addr, uint8_t val); 00066 static void usb_intr_reset (VDevice *dev); 00067 static char *usb_intr_reg_name (VDevice *dev, int addr); 00068 00069 /** \brief Allocate a new USB interrupt */ 00070 00071 USBInter_T * 00072 usb_intr_new (uint8_t func_mask) 00073 { 00074 USBInter_T *usb; 00075 00076 usb = avr_new (USBInter_T, 1); 00077 usb_intr_construct (usb, func_mask); 00078 class_overload_destroy ((AvrClass *)usb, usb_intr_destroy); 00079 00080 return usb; 00081 } 00082 00083 /** \brief Constructor for usb interrupt object. */ 00084 00085 void 00086 usb_intr_construct (USBInter_T *usb, uint8_t func_mask) 00087 { 00088 char *name = "USBIntr"; 00089 00090 if (usb == NULL) 00091 avr_error ("passed null ptr"); 00092 00093 vdev_construct ((VDevice *)usb, name, USB_INTR_BASE, USB_INTR_SIZE, 00094 usb_intr_read, usb_intr_write, usb_intr_reset, 00095 usb_intr_reg_name); 00096 00097 usb->func_mask = func_mask; 00098 00099 usb_intr_reset ((VDevice *)usb); 00100 } 00101 00102 /** \brief Destructor for usb interrupt object. */ 00103 00104 void 00105 usb_intr_destroy (void *usb) 00106 { 00107 if (usb == NULL) 00108 return; 00109 00110 vdev_destroy (usb); 00111 } 00112 00113 static uint8_t 00114 usb_intr_read (VDevice *dev, int addr) 00115 { 00116 USBInter_T *usb = (USBInter_T *)dev; 00117 00118 switch (addr - vdev_get_base (dev)) 00119 { 00120 case USB_INTR_ENABLE_ADDR: 00121 return (usb->uier); 00122 case USB_INTR_MASK_ADDR: 00123 return (usb->uimsk); 00124 case USB_INTR_STATUS_ADDR: 00125 return (usb->uisr = 00126 usb_port_rd (usb_intr_reg_name ((VDevice *)usb, addr))); 00127 case USB_INTR_SPRSIE_ADDR: 00128 return (usb->sprsie); 00129 00130 case USB_INTR_SPRSR_ADDR: 00131 return (usb->sprsr = 00132 usb_port_rd (usb_intr_reg_name ((VDevice *)usb, addr))); 00133 case USB_GLB_STATE_ADDR: 00134 return (usb->glb_state); 00135 case USB_FRM_NUM_L_ADDR: 00136 return (usb->frm_num_l); 00137 case USB_FRM_NUM_H_ADDR: 00138 return (usb->frm_num_h); 00139 case USB_INTR_SPRSMSK_ADDR: 00140 return (usb->sprsmsk); 00141 case USB_INTR_ACK_ADDR: 00142 case USB_INTR_UNUSED_ADDR: 00143 default: 00144 avr_error ("Bad address: 0x%04x", addr); 00145 } 00146 return 0; /* will never get here */ 00147 } 00148 00149 static void 00150 usb_intr_write (VDevice *dev, int addr, uint8_t val) 00151 { 00152 USBInter_T *usb = (USBInter_T *)dev; 00153 00154 switch (addr - vdev_get_base (dev)) 00155 { 00156 case USB_INTR_ENABLE_ADDR: 00157 (usb->uier = val); 00158 break; 00159 case USB_INTR_MASK_ADDR: 00160 (usb->uimsk = val); 00161 break; 00162 case USB_INTR_SPRSMSK_ADDR: 00163 (usb->sprsmsk = val); 00164 break; 00165 case USB_INTR_SPRSIE_ADDR: 00166 (usb->sprsie = val); 00167 break; 00168 case USB_INTR_ACK_ADDR: 00169 (usb->uiar = val); 00170 break; 00171 case USB_GLB_STATE_ADDR: 00172 (usb->glb_state = val); 00173 break; 00174 case USB_FRM_NUM_L_ADDR: 00175 (usb->frm_num_l = val); 00176 break; 00177 case USB_FRM_NUM_H_ADDR: 00178 (usb->frm_num_h = val); 00179 break; 00180 case USB_INTR_STATUS_ADDR: 00181 case USB_INTR_SPRSR_ADDR: 00182 case USB_INTR_UNUSED_ADDR: 00183 default: 00184 avr_error ("Bad address: 0x%04x", addr); 00185 } 00186 } 00187 00188 static void 00189 usb_intr_reset (VDevice *dev) 00190 { 00191 USBInter_T *usb = (USBInter_T *)dev; 00192 00193 usb->sprsr = 0; 00194 usb->uisr = 0; 00195 } 00196 00197 static char * 00198 usb_intr_reg_name (VDevice *dev, int addr) 00199 { 00200 switch (addr - vdev_get_base (dev)) 00201 { 00202 case USB_INTR_ENABLE_ADDR: 00203 return ("UIER"); 00204 case USB_INTR_MASK_ADDR: 00205 return ("UIMSK"); 00206 case USB_INTR_STATUS_ADDR: 00207 return ("UISR"); 00208 case USB_INTR_SPRSIE_ADDR: 00209 return ("SPRSIE"); 00210 case USB_INTR_SPRSR_ADDR: 00211 return ("SPRSR"); 00212 case USB_GLB_STATE_ADDR: 00213 return ("GLB_STATE"); 00214 case USB_FRM_NUM_L_ADDR: 00215 return ("FRM_NUM_L"); 00216 case USB_FRM_NUM_H_ADDR: 00217 return ("FRM_NUM_H"); 00218 case USB_INTR_SPRSMSK_ADDR: 00219 return ("SPRSMSK"); 00220 case USB_INTR_ACK_ADDR: 00221 return ("UIAR"); 00222 case USB_INTR_UNUSED_ADDR: 00223 return ("UNUSED"); 00224 default: 00225 avr_error ("Bad address: 0x%04x", addr); 00226 } 00227 return NULL; /* will never get here */ 00228 } 00229 00230 /*****************************************************************************\ 00231 * 00232 * USB 00233 * 00234 \*****************************************************************************/ 00235 00236 static uint8_t usb_read (VDevice *dev, int addr); 00237 static void usb_write (VDevice *dev, int addr, uint8_t val); 00238 static void usb_reset (VDevice *dev); 00239 static char *usb_reg_name (VDevice *dev, int addr); 00240 00241 /** \brief Allocate a new USB structure. */ 00242 00243 USB_T * 00244 usb_new (void) 00245 { 00246 USB_T *usb; 00247 00248 usb = avr_new (USB_T, 1); 00249 usb_construct (usb); 00250 class_overload_destroy ((AvrClass *)usb, usb_destroy); 00251 00252 return usb; 00253 } 00254 00255 /** \brief Constructor for new USB object. */ 00256 00257 void 00258 usb_construct (USB_T *usb) 00259 { 00260 char *name = "USB"; 00261 00262 if (usb == NULL) 00263 avr_error ("passed null ptr"); 00264 00265 vdev_construct ((VDevice *)usb, name, USB_BASE, USB_SIZE, usb_read, 00266 usb_write, usb_reset, usb_reg_name); 00267 00268 usb_reset ((VDevice *)usb); 00269 } 00270 00271 /** \brief Destructor for USB object. */ 00272 00273 void 00274 usb_destroy (void *usb) 00275 { 00276 if (usb == NULL) 00277 return; 00278 00279 vdev_destroy (usb); 00280 } 00281 00282 static uint8_t 00283 usb_read (VDevice *dev, int addr) 00284 { 00285 USB_T *usb = (USB_T *)dev; 00286 00287 switch (addr - vdev_get_base (dev)) 00288 { 00289 case USB_UOVCER_ADDR: 00290 return usb->uovcer; 00291 case USB_HADDR_ADDR: 00292 return usb->haddr; 00293 case USB_FADDR_ADDR: 00294 return usb->faddr; 00295 case USB_HSTR_ADDR: 00296 return usb->hstr; 00297 case USB_HPCON_ADDR: 00298 return usb->hpcon; 00299 case USB_ICSR_ADDR: 00300 return usb->icsr; 00301 case USB_FENDP5_CNTR_ADDR: 00302 return usb->fendp5_cntr; 00303 case USB_FENDP4_CNTR_ADDR: 00304 return usb->fendp4_cntr; 00305 case USB_FENDP3_CNTR_ADDR: 00306 return usb->fendp3_cntr; 00307 case USB_FENDP2_CNTR_ADDR: 00308 return usb->fendp2_cntr; 00309 case USB_FENDP1_CNTR_ADDR: 00310 return usb->fendp1_cntr; 00311 case USB_FENDP0_CNTR_ADDR: 00312 return usb->fendp0_cntr; 00313 case USB_HENDP1_CNTR_ADDR: 00314 return usb->hendp1_cntr; 00315 case USB_HENDP0_CNTR_ADDR: 00316 return usb->hendp0_cntr; 00317 case USB_FCSR5_ADDR: 00318 return usb->fcsr5 = 00319 usb_port_rd (usb_reg_name ((VDevice *)usb, addr)); 00320 case USB_FCSR4_ADDR: 00321 return usb->fcsr4 = 00322 usb_port_rd (usb_reg_name ((VDevice *)usb, addr)); 00323 case USB_FCSR3_ADDR: 00324 return usb->fcsr3 = 00325 usb_port_rd (usb_reg_name ((VDevice *)usb, addr)); 00326 case USB_FCSR2_ADDR: 00327 return usb->fcsr2 = 00328 usb_port_rd (usb_reg_name ((VDevice *)usb, addr)); 00329 case USB_FCSR1_ADDR: 00330 return usb->fcsr1 = 00331 usb_port_rd (usb_reg_name ((VDevice *)usb, addr)); 00332 case USB_FCSR0_ADDR: 00333 usb->fcsr0 = usb_port_rd (usb_reg_name ((VDevice *)usb, addr)); 00334 if (usb->fcsr0 & RX_SETUP) 00335 usb->fbyte_cnt0 = 10; 00336 return usb->fcsr0; 00337 case USB_HCSR0_ADDR: 00338 usb->hcsr0 = usb_port_rd (usb_reg_name ((VDevice *)usb, addr)); 00339 if (usb->hcsr0 & RX_SETUP) 00340 usb->hbyte_cnt0 = 10; 00341 return usb->hcsr0; 00342 case USB_FCAR5_ADDR: 00343 return usb->fcar5; 00344 case USB_FCAR4_ADDR: 00345 return usb->fcar4; 00346 case USB_FCAR3_ADDR: 00347 return usb->fcar3; 00348 case USB_FCAR2_ADDR: 00349 return usb->fcar2; 00350 case USB_FCAR1_ADDR: 00351 return usb->fcar1; 00352 case USB_FCAR0_ADDR: 00353 return usb->fcar0; 00354 case USB_HCAR0_ADDR: 00355 return usb->hcar0; 00356 case USB_HPSTAT1_ADDR: 00357 return usb->hpstat1; 00358 case USB_HPSTAT2_ADDR: 00359 return usb->hpstat2; 00360 case USB_HPSTAT3_ADDR: 00361 return usb->hpstat3; 00362 case USB_HPSTAT4_ADDR: 00363 return usb->hpstat4; 00364 case USB_HPSTAT5_ADDR: 00365 return usb->hpstat5; 00366 case USB_HPSTAT6_ADDR: 00367 return usb->hpstat6; 00368 case USB_HPSTAT7_ADDR: 00369 return usb->hpstat7; 00370 case USB_HPSTAT8_ADDR: 00371 return usb->hpstat8; 00372 case USB_PSTATE1_ADDR: 00373 return usb->pstate1; 00374 case USB_PSTATE2_ADDR: 00375 return usb->pstate2; 00376 case USB_PSTATE3_ADDR: 00377 return usb->pstate3; 00378 case USB_PSTATE4_ADDR: 00379 return usb->pstate4; 00380 case USB_PSTATE5_ADDR: 00381 return usb->pstate5; 00382 case USB_PSTATE6_ADDR: 00383 return usb->pstate6; 00384 case USB_PSTATE7_ADDR: 00385 return usb->pstate7; 00386 case USB_PSTATE8_ADDR: 00387 return usb->pstate8; 00388 case USB_HPSCR1_ADDR: 00389 return usb->hpscr1; 00390 case USB_HPSCR2_ADDR: 00391 return usb->hpscr2; 00392 case USB_HPSCR3_ADDR: 00393 return usb->hpscr3; 00394 case USB_HPSCR4_ADDR: 00395 return usb->hpscr4; 00396 case USB_HPSCR5_ADDR: 00397 return usb->hpscr5; 00398 case USB_HPSCR6_ADDR: 00399 return usb->hpscr6; 00400 case USB_HPSCR7_ADDR: 00401 return usb->hpscr7; 00402 case USB_HPSCR8_ADDR: 00403 return usb->hpscr8; 00404 case USB_FBYTE_CNT5_ADDR: 00405 return usb->fbyte_cnt5; 00406 case USB_FBYTE_CNT4_ADDR: 00407 return usb->fbyte_cnt4; 00408 case USB_FBYTE_CNT3_ADDR: 00409 return usb->fbyte_cnt3; 00410 case USB_FBYTE_CNT2_ADDR: 00411 return usb->fbyte_cnt2; 00412 case USB_FBYTE_CNT1_ADDR: 00413 return usb->fbyte_cnt1; 00414 case USB_FBYTE_CNT0_ADDR: 00415 return usb->fbyte_cnt0; 00416 case USB_HBYTE_CNT0_ADDR: 00417 return usb->hbyte_cnt0; 00418 case USB_FDR5_ADDR: 00419 return usb->fdr5 = 00420 usb_port_rd (usb_reg_name ((VDevice *)usb, addr)); 00421 case USB_FDR4_ADDR: 00422 return usb->fdr4 = 00423 usb_port_rd (usb_reg_name ((VDevice *)usb, addr)); 00424 case USB_FDR3_ADDR: 00425 return usb->fdr3 = 00426 usb_port_rd (usb_reg_name ((VDevice *)usb, addr)); 00427 case USB_FDR2_ADDR: 00428 return usb->fdr2 = 00429 usb_port_rd (usb_reg_name ((VDevice *)usb, addr)); 00430 case USB_FDR1_ADDR: 00431 return usb->fdr1 = 00432 usb_port_rd (usb_reg_name ((VDevice *)usb, addr)); 00433 case USB_FDR0_ADDR: 00434 return usb->fdr0 = 00435 usb_port_rd (usb_reg_name ((VDevice *)usb, addr)); 00436 case USB_HDR0_ADDR: 00437 return usb->hdr0 = 00438 usb_port_rd (usb_reg_name ((VDevice *)usb, addr)); 00439 default: 00440 avr_error ("Bad address: 0x%04x", addr); 00441 } 00442 return 0; /* will never get here */ 00443 } 00444 00445 static void 00446 usb_write (VDevice *dev, int addr, uint8_t val) 00447 { 00448 USB_T *usb = (USB_T *)dev; 00449 00450 switch (addr - vdev_get_base (dev)) 00451 { 00452 case USB_UOVCER_ADDR: 00453 (usb->uovcer = val); 00454 break; 00455 case USB_HADDR_ADDR: 00456 (usb->haddr = val); 00457 break; 00458 case USB_FADDR_ADDR: 00459 (usb->faddr = val); 00460 break; 00461 case USB_HSTR_ADDR: 00462 (usb->hstr = val); 00463 break; 00464 case USB_HPCON_ADDR: 00465 (usb->hpcon = val); 00466 break; 00467 case USB_FENDP5_CNTR_ADDR: 00468 usb->fendp5_cntr = val; 00469 break; 00470 case USB_FENDP4_CNTR_ADDR: 00471 usb->fendp4_cntr = val; 00472 break; 00473 case USB_FENDP3_CNTR_ADDR: 00474 usb->fendp3_cntr = val; 00475 break; 00476 case USB_FENDP2_CNTR_ADDR: 00477 usb->fendp2_cntr = val; 00478 break; 00479 case USB_FENDP1_CNTR_ADDR: 00480 usb->fendp1_cntr = val; 00481 break; 00482 case USB_FENDP0_CNTR_ADDR: 00483 usb->fendp0_cntr = val; 00484 break; 00485 case USB_HENDP1_CNTR_ADDR: 00486 usb->hendp1_cntr = val; 00487 break; 00488 case USB_HENDP0_CNTR_ADDR: 00489 usb->hendp0_cntr = val; 00490 break; 00491 case USB_FCAR5_ADDR: 00492 usb->fcar5 = val; 00493 usb->fcsr5 &= ~val; 00494 (usb->fbyte_cnt5) = 0; 00495 break; 00496 case USB_FCAR4_ADDR: 00497 usb->fcar4 = val; 00498 usb->fcsr4 &= ~val; 00499 (usb->fbyte_cnt4) = 0; 00500 break; 00501 case USB_FCAR3_ADDR: 00502 usb->fcar3 = val; 00503 usb->fcsr3 &= ~val; 00504 (usb->fbyte_cnt3) = 0; 00505 break; 00506 case USB_FCAR2_ADDR: 00507 usb->fcar2 = val; 00508 usb->fcsr2 &= ~val; 00509 (usb->fbyte_cnt2) = 0; 00510 break; 00511 case USB_FCAR1_ADDR: 00512 usb->fcar1 = val; 00513 usb->fcsr1 &= ~val; 00514 (usb->fbyte_cnt1) = 0; 00515 break; 00516 case USB_FCAR0_ADDR: 00517 usb->fcar0 = val; 00518 usb->fcsr0 &= ~val; 00519 (usb->fbyte_cnt0) = 0; 00520 break; 00521 case USB_HCAR0_ADDR: 00522 usb->hcar0 = val; 00523 usb->hcsr0 &= ~val; 00524 (usb->hbyte_cnt0) = 0; 00525 break; 00526 case USB_FDR5_ADDR: 00527 usb->fdr5 = val; 00528 (usb->fbyte_cnt5)++; 00529 usb_port_wr (usb_reg_name ((VDevice *)usb, addr), val); 00530 break; 00531 case USB_FDR4_ADDR: 00532 usb->fdr4 = val; 00533 (usb->fbyte_cnt4)++; 00534 usb_port_wr (usb_reg_name ((VDevice *)usb, addr), val); 00535 break; 00536 case USB_FDR3_ADDR: 00537 usb->fdr3 = val; 00538 (usb->fbyte_cnt3)++; 00539 usb_port_wr (usb_reg_name ((VDevice *)usb, addr), val); 00540 break; 00541 case USB_FDR2_ADDR: 00542 usb->fdr2 = val; 00543 (usb->fbyte_cnt2)++; 00544 usb_port_wr (usb_reg_name ((VDevice *)usb, addr), val); 00545 break; 00546 case USB_FDR1_ADDR: 00547 usb->fdr1 = val; 00548 (usb->fbyte_cnt1)++; 00549 usb_port_wr (usb_reg_name ((VDevice *)usb, addr), val); 00550 break; 00551 case USB_FDR0_ADDR: 00552 usb->fdr0 = val; 00553 (usb->fbyte_cnt0)++; 00554 usb_port_wr (usb_reg_name ((VDevice *)usb, addr), val); 00555 break; 00556 case USB_HDR0_ADDR: 00557 usb->hdr0 = val; 00558 (usb->hbyte_cnt0)++; 00559 usb_port_wr (usb_reg_name ((VDevice *)usb, addr), val); 00560 break; 00561 default: 00562 avr_error ("Bad address: 0x%04x", addr); 00563 } 00564 } 00565 00566 static void 00567 usb_reset (VDevice *dev) 00568 { 00569 USB_T *usb = (USB_T *)dev; 00570 00571 usb->haddr = 0; 00572 usb->faddr = 0; 00573 00574 usb->hstr = 0; 00575 usb->hpcon = 0; 00576 00577 usb->uovcer = 0; 00578 } 00579 00580 static char * 00581 usb_reg_name (VDevice *dev, int addr) 00582 { 00583 switch (addr - vdev_get_base (dev)) 00584 { 00585 case USB_FCAR5_ADDR: 00586 return "FCAR5"; 00587 case USB_FCAR4_ADDR: 00588 return "FCAR4"; 00589 case USB_FCAR3_ADDR: 00590 return "FCAR3"; 00591 case USB_FCAR2_ADDR: 00592 return "FCAR2"; 00593 case USB_FCAR1_ADDR: 00594 return "FCAR1"; 00595 case USB_FCAR0_ADDR: 00596 return "FCAR0"; 00597 case USB_HCAR0_ADDR: 00598 return "HCAR0"; 00599 case USB_PSTATE1_ADDR: 00600 return "PSTATE1"; 00601 case USB_PSTATE2_ADDR: 00602 return "PSTATE2"; 00603 case USB_PSTATE3_ADDR: 00604 return "PSTATE3"; 00605 case USB_PSTATE4_ADDR: 00606 return "PSTATE4"; 00607 case USB_PSTATE5_ADDR: 00608 return "PSTATE5"; 00609 case USB_PSTATE6_ADDR: 00610 return "PSTATE6"; 00611 case USB_PSTATE7_ADDR: 00612 return "PSTATE7"; 00613 case USB_PSTATE8_ADDR: 00614 return "PSTATE8"; 00615 case USB_HPSCR1_ADDR: 00616 return "HPSCR1"; 00617 case USB_HPSCR2_ADDR: 00618 return "HPSCR2"; 00619 case USB_HPSCR3_ADDR: 00620 return "HPSCR3"; 00621 case USB_HPSCR4_ADDR: 00622 return "HPSCR4"; 00623 case USB_HPSCR5_ADDR: 00624 return "HPSCR5"; 00625 case USB_HPSCR6_ADDR: 00626 return "HPSCR6"; 00627 case USB_HPSCR7_ADDR: 00628 return "HPSCR7"; 00629 case USB_HPSCR8_ADDR: 00630 return "HPSCR8"; 00631 case USB_HPSTAT1_ADDR: 00632 return "HPSTAT1"; 00633 case USB_HPSTAT2_ADDR: 00634 return "HPSTAT2"; 00635 case USB_HPSTAT3_ADDR: 00636 return "HPSTAT3"; 00637 case USB_HPSTAT4_ADDR: 00638 return "HPSTAT4"; 00639 case USB_HPSTAT5_ADDR: 00640 return "HPSTAT5"; 00641 case USB_HPSTAT6_ADDR: 00642 return "HPSTAT6"; 00643 case USB_HPSTAT7_ADDR: 00644 return "HPSTAT7"; 00645 case USB_HPSTAT8_ADDR: 00646 return "HPSTAT8"; 00647 case USB_HPCON_ADDR: 00648 return "HPCON"; 00649 case USB_HSTR_ADDR: 00650 return "HSTR"; 00651 case USB_FBYTE_CNT5_ADDR: 00652 return "FBYTE_CNT5"; 00653 case USB_FBYTE_CNT4_ADDR: 00654 return "FBYTE_CNT4"; 00655 case USB_FBYTE_CNT3_ADDR: 00656 return "FBYTE_CNT3"; 00657 case USB_FBYTE_CNT2_ADDR: 00658 return "FBYTE_CNT2"; 00659 case USB_FBYTE_CNT1_ADDR: 00660 return "FBYTE_CNT1"; 00661 case USB_FBYTE_CNT0_ADDR: 00662 return "FBYTE_CNT0"; 00663 case USB_HBYTE_CNT0_ADDR: 00664 return "HBYTE_CNT0"; 00665 case USB_FDR5_ADDR: 00666 return "FDR5"; 00667 case USB_FDR4_ADDR: 00668 return "FDR4"; 00669 case USB_FDR3_ADDR: 00670 return "FDR3"; 00671 case USB_FDR2_ADDR: 00672 return "FDR2"; 00673 case USB_FDR1_ADDR: 00674 return "FDR1"; 00675 case USB_FDR0_ADDR: 00676 return "FDR0"; 00677 case USB_HDR0_ADDR: 00678 return "HDR0"; 00679 case USB_FCSR5_ADDR: 00680 return "FCSR5"; 00681 case USB_FCSR4_ADDR: 00682 return "FCSR4"; 00683 case USB_FCSR3_ADDR: 00684 return "FCSR3"; 00685 case USB_FCSR2_ADDR: 00686 return "FCSR2"; 00687 case USB_FCSR1_ADDR: 00688 return "FCSR1"; 00689 case USB_FCSR0_ADDR: 00690 return "FCSR0"; 00691 case USB_HCSR0_ADDR: 00692 return "HCSR0"; 00693 case USB_FENDP5_CNTR_ADDR: 00694 return "FENDP5_CNTR"; 00695 case USB_FENDP4_CNTR_ADDR: 00696 return "FENDP4_CNTR"; 00697 case USB_FENDP3_CNTR_ADDR: 00698 return "FENDP3_CNTR"; 00699 case USB_FENDP2_CNTR_ADDR: 00700 return "FENDP2_CNTR"; 00701 case USB_FENDP1_CNTR_ADDR: 00702 return "FENDP1_CNTR"; 00703 case USB_FENDP0_CNTR_ADDR: 00704 return "FENDP0_CNTR"; 00705 case USB_HENDP1_CNTR_ADDR: 00706 return "HENDP1_CNTR"; 00707 case USB_HENDP0_CNTR_ADDR: 00708 return "HENDP0_CNTR"; 00709 case USB_FADDR_ADDR: 00710 return "FADDR"; 00711 case USB_HADDR_ADDR: 00712 return "HADDR"; 00713 case USB_ICSR_ADDR: 00714 return "ICSR"; 00715 case USB_UOVCER_ADDR: 00716 return "UOVCER"; 00717 default: 00718 avr_error ("Bad address: 0x%04x", addr); 00719 } 00720 return NULL; 00721 } 00722 00723 uint8_t 00724 usb_port_rd (char *name) 00725 { 00726 int data; 00727 char line[80]; 00728 00729 while (1) 00730 { 00731 fprintf (stderr, "\nEnter a byte of hex data to read into %s: ", 00732 name); 00733 00734 /* try to read in a line of input */ 00735 if (fgets (line, sizeof (line), stdin) == NULL) 00736 continue; 00737 00738 /* try to parse the line for a byte of data */ 00739 if (sscanf (line, "%x\n", &data) != 1) 00740 continue; 00741 00742 break; 00743 } 00744 return (uint8_t) (data & 0xff); 00745 } 00746 00747 void 00748 usb_port_wr (char *name, uint8_t val) 00749 { 00750 fprintf (stderr, "wrote 0x%02x to %s\n", val, name); 00751 }

Automatically generated by Doxygen 1.3.8 on 11 Aug 2004.