MP2COD 4.02, COFF to COD File Converter Copyright (c) 2006 Microchip Technology Inc. Listing File Generated: Sat Dec 09 12:55:38 2006 Address Value Disassembly Source File ------- ------- ----------------------- ------------------------------------------------------------------------------- ----- /* $Id: c018i.c,v 1.3.14.1 2006/01/24 14:50:12 rhinec Exp $ */ C:\MCC18\src\traditional\startup\c018i.c C:\MCC18\src\traditional\startup\c018i.c /* Copyright (c)1999 Microchip Technology */ C:\MCC18\src\traditional\startup\c018i.c C:\MCC18\src\traditional\startup\c018i.c /* MPLAB-C18 startup code, including initialized data */ C:\MCC18\src\traditional\startup\c018i.c C:\MCC18\src\traditional\startup\c018i.c /* external reference to the user's main routine */ C:\MCC18\src\traditional\startup\c018i.c extern void main (void); C:\MCC18\src\traditional\startup\c018i.c /* prototype for the startup function */ C:\MCC18\src\traditional\startup\c018i.c void _entry (void); C:\MCC18\src\traditional\startup\c018i.c void _startup (void); C:\MCC18\src\traditional\startup\c018i.c /* prototype for the initialized data setup */ C:\MCC18\src\traditional\startup\c018i.c void _do_cinit (void); C:\MCC18\src\traditional\startup\c018i.c C:\MCC18\src\traditional\startup\c018i.c extern volatile near unsigned long short TBLPTR; C:\MCC18\src\traditional\startup\c018i.c extern near unsigned FSR0; C:\MCC18\src\traditional\startup\c018i.c extern near char __FPFLAGS; C:\MCC18\src\traditional\startup\c018i.c #define RND 6 C:\MCC18\src\traditional\startup\c018i.c C:\MCC18\src\traditional\startup\c018i.c #pragma code _entry_scn=0x000000 C:\MCC18\src\traditional\startup\c018i.c void C:\MCC18\src\traditional\startup\c018i.c _entry (void) C:\MCC18\src\traditional\startup\c018i.c { C:\MCC18\src\traditional\startup\c018i.c 000000 ef9a GOTO 0x734 _asm goto _startup _endasm C:\MCC18\src\traditional\startup\c018i.c 000002 f003 C:\MCC18\src\traditional\startup\c018i.c 000004 0012 RETURN 0x0 } C:\MCC18\src\traditional\startup\c018i.c #pragma code _startup_scn C:\MCC18\src\traditional\startup\c018i.c void C:\MCC18\src\traditional\startup\c018i.c _startup (void) C:\MCC18\src\traditional\startup\c018i.c { C:\MCC18\src\traditional\startup\c018i.c _asm C:\MCC18\src\traditional\startup\c018i.c // Initialize the stack pointer C:\MCC18\src\traditional\startup\c018i.c 000734 ee13 LFSR 0x1,0x300 lfsr 1, _stack C:\MCC18\src\traditional\startup\c018i.c 000736 f000 000738 ee23 LFSR 0x2,0x300 lfsr 2, _stack C:\MCC18\src\traditional\startup\c018i.c 00073a f000 C:\MCC18\src\traditional\startup\c018i.c 00073c 6af8 CLRF 0xf8,0x0 clrf TBLPTRU, 0 // 1st silicon doesn't do this on POR C:\MCC18\src\traditional\startup\c018i.c C:\MCC18\src\traditional\startup\c018i.c 00073e 9c05 BCF 0x5,0x6,0x0 bcf __FPFLAGS,RND,0 // Initialize rounding flag for floating point libs C:\MCC18\src\traditional\startup\c018i.c C:\MCC18\src\traditional\startup\c018i.c _endasm C:\MCC18\src\traditional\startup\c018i.c 000740 ec18 CALL 0x630,0x0 _do_cinit (); C:\MCC18\src\traditional\startup\c018i.c 000742 f003 C:\MCC18\src\traditional\startup\c018i.c loop: C:\MCC18\src\traditional\startup\c018i.c C:\MCC18\src\traditional\startup\c018i.c // Call the user's main routine C:\MCC18\src\traditional\startup\c018i.c 000744 ec82 CALL 0x704,0x0 main (); C:\MCC18\src\traditional\startup\c018i.c 000746 f003 C:\MCC18\src\traditional\startup\c018i.c 000748 d7fd BRA 0x744 goto loop; C:\MCC18\src\traditional\startup\c018i.c 00074a 0012 RETURN 0x0 } /* end _startup() */ C:\MCC18\src\traditional\startup\c018i.c C:\MCC18\src\traditional\startup\c018i.c /* MPLAB-C18 initialized data memory support */ C:\MCC18\src\traditional\startup\c018i.c /* The linker will populate the _cinit table */ C:\MCC18\src\traditional\startup\c018i.c extern far rom struct C:\MCC18\src\traditional\startup\c018i.c { C:\MCC18\src\traditional\startup\c018i.c unsigned short num_init; C:\MCC18\src\traditional\startup\c018i.c struct _init_entry C:\MCC18\src\traditional\startup\c018i.c { C:\MCC18\src\traditional\startup\c018i.c unsigned long from; C:\MCC18\src\traditional\startup\c018i.c unsigned long to; C:\MCC18\src\traditional\startup\c018i.c unsigned long size; C:\MCC18\src\traditional\startup\c018i.c } C:\MCC18\src\traditional\startup\c018i.c entries[]; C:\MCC18\src\traditional\startup\c018i.c } C:\MCC18\src\traditional\startup\c018i.c _cinit; C:\MCC18\src\traditional\startup\c018i.c C:\MCC18\src\traditional\startup\c018i.c #pragma code _cinit_scn C:\MCC18\src\traditional\startup\c018i.c void C:\MCC18\src\traditional\startup\c018i.c _do_cinit (void) C:\MCC18\src\traditional\startup\c018i.c { C:\MCC18\src\traditional\startup\c018i.c /* we'll make the assumption in the following code that these statics C:\MCC18\src\traditional\startup\c018i.c * will be allocated into the same bank. C:\MCC18\src\traditional\startup\c018i.c */ C:\MCC18\src\traditional\startup\c018i.c static short long prom; C:\MCC18\src\traditional\startup\c018i.c static unsigned short curr_byte; C:\MCC18\src\traditional\startup\c018i.c static unsigned short curr_entry; C:\MCC18\src\traditional\startup\c018i.c static short long data_ptr; C:\MCC18\src\traditional\startup\c018i.c C:\MCC18\src\traditional\startup\c018i.c // Initialized data... C:\MCC18\src\traditional\startup\c018i.c 000630 0e1e MOVLW 0x1e TBLPTR = (short long)&_cinit; C:\MCC18\src\traditional\startup\c018i.c 000632 6ef6 MOVWF 0xf6,0x0 000634 0e00 MOVLW 0x0 000636 6ef7 MOVWF 0xf7,0x0 000638 0e00 MOVLW 0x0 00063a 6ef8 MOVWF 0xf8,0x0 _asm C:\MCC18\src\traditional\startup\c018i.c 00063c 0100 MOVLB 0x0 movlb data_ptr C:\MCC18\src\traditional\startup\c018i.c 00063e 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 000640 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 000642 6f70 MOVWF 0x70,0x1 movwf curr_entry, 1 C:\MCC18\src\traditional\startup\c018i.c 000644 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 000646 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 000648 6f71 MOVWF 0x71,0x1 movwf curr_entry+1, 1 C:\MCC18\src\traditional\startup\c018i.c _endasm C:\MCC18\src\traditional\startup\c018i.c //while (curr_entry) C:\MCC18\src\traditional\startup\c018i.c //{ C:\MCC18\src\traditional\startup\c018i.c test: C:\MCC18\src\traditional\startup\c018i.c _asm C:\MCC18\src\traditional\startup\c018i.c 00064a e103 BNZ 0x652 bnz 3 C:\MCC18\src\traditional\startup\c018i.c 00064c 6770 TSTFSZ 0x70,0x1 tstfsz curr_entry, 1 C:\MCC18\src\traditional\startup\c018i.c 00064e d001 BRA 0x652 bra 1 C:\MCC18\src\traditional\startup\c018i.c _endasm C:\MCC18\src\traditional\startup\c018i.c 000650 d03d BRA 0x6cc goto done; C:\MCC18\src\traditional\startup\c018i.c /* Count down so we only have to look up the data in _cinit C:\MCC18\src\traditional\startup\c018i.c * once. C:\MCC18\src\traditional\startup\c018i.c * C:\MCC18\src\traditional\startup\c018i.c * At this point we know that TBLPTR points to the top of the current C:\MCC18\src\traditional\startup\c018i.c * entry in _cinit, so we can just start reading the from, to, and C:\MCC18\src\traditional\startup\c018i.c * size values. C:\MCC18\src\traditional\startup\c018i.c */ C:\MCC18\src\traditional\startup\c018i.c _asm C:\MCC18\src\traditional\startup\c018i.c /* read the source address */ C:\MCC18\src\traditional\startup\c018i.c 000652 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 000654 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 000656 6f6b MOVWF 0x6b,0x1 movwf prom, 1 C:\MCC18\src\traditional\startup\c018i.c 000658 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 00065a 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 00065c 6f6c MOVWF 0x6c,0x1 movwf prom+1, 1 C:\MCC18\src\traditional\startup\c018i.c 00065e 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 000660 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 000662 6f6d MOVWF 0x6d,0x1 movwf prom+2, 1 C:\MCC18\src\traditional\startup\c018i.c /* skip a byte since it's stored as a 32bit int */ C:\MCC18\src\traditional\startup\c018i.c 000664 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c /* read the destination address directly into FSR0 */ C:\MCC18\src\traditional\startup\c018i.c 000666 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 000668 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 00066a 6ee9 MOVWF 0xe9,0x0 movwf FSR0L, 0 C:\MCC18\src\traditional\startup\c018i.c 00066c 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 00066e 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 000670 6eea MOVWF 0xea,0x0 movwf FSR0H, 0 C:\MCC18\src\traditional\startup\c018i.c /* skip two bytes since it's stored as a 32bit int */ C:\MCC18\src\traditional\startup\c018i.c 000672 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 000674 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c /* read the destination address directly into FSR0 */ C:\MCC18\src\traditional\startup\c018i.c 000676 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 000678 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 00067a 6f6e MOVWF 0x6e,0x1 movwf curr_byte, 1 C:\MCC18\src\traditional\startup\c018i.c 00067c 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 00067e 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 000680 6f6f MOVWF 0x6f,0x1 movwf curr_byte+1, 1 C:\MCC18\src\traditional\startup\c018i.c /* skip two bytes since it's stored as a 32bit int */ C:\MCC18\src\traditional\startup\c018i.c 000682 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 000684 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c _endasm C:\MCC18\src\traditional\startup\c018i.c //prom = data_ptr->from; C:\MCC18\src\traditional\startup\c018i.c //FSR0 = data_ptr->to; C:\MCC18\src\traditional\startup\c018i.c //curr_byte = (unsigned short) data_ptr->size; C:\MCC18\src\traditional\startup\c018i.c /* the table pointer now points to the next entry. Save it C:\MCC18\src\traditional\startup\c018i.c * off since we'll be using the table pointer to do the copying C:\MCC18\src\traditional\startup\c018i.c * for the entry. C:\MCC18\src\traditional\startup\c018i.c */ C:\MCC18\src\traditional\startup\c018i.c 000686 cff6 MOVFF 0xff6,0x72 data_ptr = TBLPTR; C:\MCC18\src\traditional\startup\c018i.c 000688 f072 00068a cff7 MOVFF 0xff7,0x73 00068c f073 00068e cff8 MOVFF 0xff8,0x74 000690 f074 C:\MCC18\src\traditional\startup\c018i.c /* now assign the source address to the table pointer */ C:\MCC18\src\traditional\startup\c018i.c 000692 c06b MOVFF 0x6b,0xff6 TBLPTR = prom; C:\MCC18\src\traditional\startup\c018i.c 000694 fff6 000696 c06c MOVFF 0x6c,0xff7 000698 fff7 00069a c06d MOVFF 0x6d,0xff8 00069c fff8 C:\MCC18\src\traditional\startup\c018i.c /* do the copy loop */ C:\MCC18\src\traditional\startup\c018i.c _asm C:\MCC18\src\traditional\startup\c018i.c // determine if we have any more bytes to copy C:\MCC18\src\traditional\startup\c018i.c 00069e 0100 MOVLB 0x0 movlb curr_byte C:\MCC18\src\traditional\startup\c018i.c 0006a0 536e MOVF 0x6e,0x1,0x1 movf curr_byte, 1, 1 C:\MCC18\src\traditional\startup\c018i.c copy_loop: C:\MCC18\src\traditional\startup\c018i.c 0006a2 e102 BNZ 0x6a8 bnz 2 // copy_one_byte C:\MCC18\src\traditional\startup\c018i.c 0006a4 536f MOVF 0x6f,0x1,0x1 movf curr_byte + 1, 1, 1 C:\MCC18\src\traditional\startup\c018i.c 0006a6 e007 BZ 0x6b6 bz 7 // done_copying C:\MCC18\src\traditional\startup\c018i.c C:\MCC18\src\traditional\startup\c018i.c copy_one_byte: C:\MCC18\src\traditional\startup\c018i.c 0006a8 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 0006aa 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 0006ac 6eee MOVWF 0xee,0x0 movwf POSTINC0, 0 C:\MCC18\src\traditional\startup\c018i.c C:\MCC18\src\traditional\startup\c018i.c // decrement byte counter C:\MCC18\src\traditional\startup\c018i.c 0006ae 076e DECF 0x6e,0x1,0x1 decf curr_byte, 1, 1 C:\MCC18\src\traditional\startup\c018i.c 0006b0 e2f8 BC 0x6a2 bc -8 // copy_loop C:\MCC18\src\traditional\startup\c018i.c 0006b2 076f DECF 0x6f,0x1,0x1 decf curr_byte + 1, 1, 1 C:\MCC18\src\traditional\startup\c018i.c 0006b4 d7f9 BRA 0x6a8 bra -7 // copy_one_byte C:\MCC18\src\traditional\startup\c018i.c C:\MCC18\src\traditional\startup\c018i.c done_copying: C:\MCC18\src\traditional\startup\c018i.c C:\MCC18\src\traditional\startup\c018i.c _endasm C:\MCC18\src\traditional\startup\c018i.c /* restore the table pointer for the next entry */ C:\MCC18\src\traditional\startup\c018i.c 0006b6 c072 MOVFF 0x72,0xff6 TBLPTR = data_ptr; C:\MCC18\src\traditional\startup\c018i.c 0006b8 fff6 0006ba c073 MOVFF 0x73,0xff7 0006bc fff7 0006be c074 MOVFF 0x74,0xff8 0006c0 fff8 /* next entry... */ C:\MCC18\src\traditional\startup\c018i.c 0006c2 0100 MOVLB 0x0 curr_entry--; C:\MCC18\src\traditional\startup\c018i.c 0006c4 0770 DECF 0x70,0x1,0x1 0006c6 0e00 MOVLW 0x0 0006c8 5b71 SUBWFB 0x71,0x1,0x1 0006ca d7bf BRA 0x64a goto test; C:\MCC18\src\traditional\startup\c018i.c done: C:\MCC18\src\traditional\startup\c018i.c ; C:\MCC18\src\traditional\startup\c018i.c 0006cc 0012 RETURN 0x0 } C:\MCC18\src\traditional\startup\c018i.c /********************************************************************* C:\Projects\UBW\FW\2455\B\main.c * C:\Projects\UBW\FW\2455\B\main.c * Microchip USB Bootloader Version 1.0 C:\Projects\UBW\FW\2455\B\main.c * C:\Projects\UBW\FW\2455\B\main.c ********************************************************************* C:\Projects\UBW\FW\2455\B\main.c * FileName: main.c C:\Projects\UBW\FW\2455\B\main.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\2455\B\main.c * Processor: PIC18 C:\Projects\UBW\FW\2455\B\main.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\2455\B\main.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\2455\B\main.c * C:\Projects\UBW\FW\2455\B\main.c * Software License Agreement C:\Projects\UBW\FW\2455\B\main.c * C:\Projects\UBW\FW\2455\B\main.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\2455\B\main.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\2455\B\main.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\2455\B\main.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\2455\B\main.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\2455\B\main.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\2455\B\main.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\2455\B\main.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\2455\B\main.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\2455\B\main.c * license. C:\Projects\UBW\FW\2455\B\main.c * C:\Projects\UBW\FW\2455\B\main.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\2455\B\main.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\2455\B\main.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\2455\B\main.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\2455\B\main.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\2455\B\main.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\2455\B\main.c * C:\Projects\UBW\FW\2455\B\main.c * Author Date Comment C:\Projects\UBW\FW\2455\B\main.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\2455\B\main.c * Rawin Rojvanit 11/19/04 Original. C:\Projects\UBW\FW\2455\B\main.c ********************************************************************/ C:\Projects\UBW\FW\2455\B\main.c C:\Projects\UBW\FW\2455\B\main.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\2455\B\main.c #include C:\Projects\UBW\FW\2455\B\main.c #include "system\typedefs.h" // Required C:\Projects\UBW\FW\2455\B\main.c #include "system\usb\usb.h" // Required C:\Projects\UBW\FW\2455\B\main.c #include "io_cfg.h" // Required C:\Projects\UBW\FW\2455\B\main.c C:\Projects\UBW\FW\2455\B\main.c #include "system\usb\usb_compile_time_validation.h" // Optional C:\Projects\UBW\FW\2455\B\main.c C:\Projects\UBW\FW\2455\B\main.c /** V A R I A B L E S ********************************************************/ C:\Projects\UBW\FW\2455\B\main.c #pragma udata C:\Projects\UBW\FW\2455\B\main.c C:\Projects\UBW\FW\2455\B\main.c /** P R I V A T E P R O T O T Y P E S ***************************************/ C:\Projects\UBW\FW\2455\B\main.c C:\Projects\UBW\FW\2455\B\main.c #pragma config PLLDIV = 5, CPUDIV = OSC1_PLL2, USBDIV = 2, FOSC = HSPLL_HS C:\Projects\UBW\FW\2455\B\main.c #pragma config PWRT = ON, BOR = SOFT, BORV = 1, VREGEN = ON, WDT = OFF, MCLRE = ON C:\Projects\UBW\FW\2455\B\main.c #pragma config PBADEN = OFF, LVP = OFF C:\Projects\UBW\FW\2455\B\main.c C:\Projects\UBW\FW\2455\B\main.c /** V E C T O R R E M A P P I N G *******************************************/ C:\Projects\UBW\FW\2455\B\main.c C:\Projects\UBW\FW\2455\B\main.c #pragma code _HIGH_INTERRUPT_VECTOR = 0x000008 C:\Projects\UBW\FW\2455\B\main.c void _high_ISR (void) C:\Projects\UBW\FW\2455\B\main.c { C:\Projects\UBW\FW\2455\B\main.c 000008 ef04 GOTO 0x808 _asm goto RM_HIGH_INTERRUPT_VECTOR _endasm C:\Projects\UBW\FW\2455\B\main.c 00000a f004 00000c 0012 RETURN 0x0 } C:\Projects\UBW\FW\2455\B\main.c C:\Projects\UBW\FW\2455\B\main.c #pragma code _LOW_INTERRUPT_VECTOR = 0x000018 C:\Projects\UBW\FW\2455\B\main.c void _low_ISR (void) C:\Projects\UBW\FW\2455\B\main.c { C:\Projects\UBW\FW\2455\B\main.c 000018 ef0c GOTO 0x818 _asm goto RM_LOW_INTERRUPT_VECTOR _endasm C:\Projects\UBW\FW\2455\B\main.c 00001a f004 00001c 0012 RETURN 0x0 } C:\Projects\UBW\FW\2455\B\main.c C:\Projects\UBW\FW\2455\B\main.c #pragma code C:\Projects\UBW\FW\2455\B\main.c C:\Projects\UBW\FW\2455\B\main.c /** D E C L A R A T I O N S **************************************************/ C:\Projects\UBW\FW\2455\B\main.c #pragma code C:\Projects\UBW\FW\2455\B\main.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\main.c * Function: void main(void) C:\Projects\UBW\FW\2455\B\main.c * C:\Projects\UBW\FW\2455\B\main.c * PreCondition: None C:\Projects\UBW\FW\2455\B\main.c * C:\Projects\UBW\FW\2455\B\main.c * Input: None C:\Projects\UBW\FW\2455\B\main.c * C:\Projects\UBW\FW\2455\B\main.c * Output: None C:\Projects\UBW\FW\2455\B\main.c * C:\Projects\UBW\FW\2455\B\main.c * Side Effects: None C:\Projects\UBW\FW\2455\B\main.c * C:\Projects\UBW\FW\2455\B\main.c * Overview: Main program entry point. C:\Projects\UBW\FW\2455\B\main.c * C:\Projects\UBW\FW\2455\B\main.c * Note: None C:\Projects\UBW\FW\2455\B\main.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\main.c void main(void) C:\Projects\UBW\FW\2455\B\main.c { C:\Projects\UBW\FW\2455\B\main.c byte temp; C:\Projects\UBW\FW\2455\B\main.c 000704 cfc1 MOVFF 0xfc1,0x80 temp = ADCON1; C:\Projects\UBW\FW\2455\B\main.c 000706 f080 000708 0e0f MOVLW 0xf ADCON1 |= 0x0F; C:\Projects\UBW\FW\2455\B\main.c 00070a 12c1 IORWF 0xc1,0x1,0x0 C:\Projects\UBW\FW\2455\B\main.c //Check Bootload Mode Entry Condition C:\Projects\UBW\FW\2455\B\main.c 00070c a082 BTFSS 0x82,0x0,0x0 if(sw2 == 1) // If not pressed, User Mode C:\Projects\UBW\FW\2455\B\main.c 00070e d004 BRA 0x718 { C:\Projects\UBW\FW\2455\B\main.c 000710 c080 MOVFF 0x80,0xfc1 ADCON1 = temp; // Restore reset value C:\Projects\UBW\FW\2455\B\main.c 000712 ffc1 000714 ef00 GOTO 0x800 _asm goto RM_RESET_VECTOR _endasm C:\Projects\UBW\FW\2455\B\main.c 000716 f004 }//end if C:\Projects\UBW\FW\2455\B\main.c C:\Projects\UBW\FW\2455\B\main.c //Bootload Mode C:\Projects\UBW\FW\2455\B\main.c 000718 0efc MOVLW 0xfc mInitAllLEDs(); C:\Projects\UBW\FW\2455\B\main.c 00071a 168b ANDWF 0x8b,0x1,0x0 00071c 0efc MOVLW 0xfc 00071e 1694 ANDWF 0x94,0x1,0x0 000720 0e14 MOVLW 0x14 mInitializeUSBDriver(); // See usbdrv.h C:\Projects\UBW\FW\2455\B\main.c 000722 6e6f MOVWF 0x6f,0x0 000724 ecc3 CALL 0x586,0x0 USBCheckBusStatus(); // Modified to always enable USB module C:\Projects\UBW\FW\2455\B\main.c 000726 f002 000730 d7fb BRA 0x728 while(1) C:\Projects\UBW\FW\2455\B\main.c { C:\Projects\UBW\FW\2455\B\main.c 000728 ecce CALL 0x59c,0x0 USBDriverService(); // See usbdrv.c C:\Projects\UBW\FW\2455\B\main.c 00072a f002 00072c eca0 CALL 0x140,0x0 BootService(); // See boot.c C:\Projects\UBW\FW\2455\B\main.c 00072e f000 }//end while C:\Projects\UBW\FW\2455\B\main.c 000732 0012 RETURN 0x0 }//end main C:\Projects\UBW\FW\2455\B\main.c C:\Projects\UBW\FW\2455\B\main.c #pragma code user = RM_RESET_VECTOR C:\Projects\UBW\FW\2455\B\main.c C:\Projects\UBW\FW\2455\B\main.c /** EOF main.c ***************************************************************/ C:\Projects\UBW\FW\2455\B\main.c /********************************************************************* C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c ********************************************************************* C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * FileName: usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * Processor: PIC18 C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * Software License Agreement C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * license. C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * Author Date Comment C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * Rawin Rojvanit 11/19/04 Original. C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c ********************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * -usbmmap.c- C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * USB Memory Map C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * This file is the USB memory manager; it serves as a compile-time memory C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * allocator for the USB endpoints. It uses the compile time options passed C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * from usbcfg.h to instantiate endpoints and endpoint buffer. C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * Each endpoint requires to have a set of Buffer Descriptor registers(BDT). C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * A BDT is 4-byte long and has a specific RAM location for each endpoint. C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * The BDT for endpoint 0 out is located at address 0x400 to 0x403. C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * The BDT for endpoint 0 in is located at address 0x404 to 0x407. C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * The BDT for endpoint 1 out is located at address 0x408 to 0x40B. C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * and so on... The above allocation assumes the Ping-Pong Buffer Mode 0 is C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * used. These locations are already hard-wired in the silicon. The point C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * of doing instantiation, i.e. volatile far BDT ep0Bo;, is to provide the C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C compiler a way to address each variable directly. This is very important C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * because when a register can be accessed directly, it saves execution time C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * and reduces program size. C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * Endpoints are defined using the endpoint number and the direction C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * of transfer. For simplicity, usbmmap.c only uses the endpoint number C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * in the BDT register allocation scheme. This means if the usbcfg.h states C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * that the MAX_EP_NUMBER is number 1, then four BDTs will be C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * instantiated: one each for endpoint0 in and endpoint0 out, which must C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * always be instantiated for control transfer by default, and one each sets C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * for endpoint1 in and endpoint1 out. The naming convention for instantiating C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * BDT is C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * ep<#>B C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * where # is the endpoint number, and d is the direction of C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * transfer, which could be either or . C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * The USB memory manager uses MAX_EP_NUMBER, as defined in usbcfg.h, to define C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * the endpoints to be instantiated. This represents the highest endpoint C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * number to be allocated, not how many endpoints are used. Since the BDTs for C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * endpoints have hardware-assigned addresses in Bank 4, setting this value too C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * high may lead to inefficient use of data RAM. For example, if an application C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * uses only endpoints EP0 and EP4, then the MAX_EP_NUMBER is 4, and not 2. C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * The in-between endpoint BDTs in this example (EP1, EP2, and EP3) go unused, C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * and the 24 bytes of memory associated with them are wasted. It does not make C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * much sense to skip endpoints, but the final decision lies with the user. C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * The next step is to assign the instantiated BDTs to different C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * USB functions. The firmware framework fundamentally assumes that every USB C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * function should know which endpoint it is using, i.e., the default control C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * transfer should know that it is using endpoint 0 in and endpoint 0 out. C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * A HID class can choose which endpoint it wants to use, but once chosen, it C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * should always know the number of the endpoint. C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * The assignment of endpoints to USB functions is managed centrally C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * in usbcfg.h. This helps prevent the mistake of having more C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * than one USB function using the same endpoint. The "Endpoint Allocation" C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * section in usbcfg.h provides examples for how to map USB endpoints to USB C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * functions. C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * Quite a few things can be mapped in that section. There is no C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * one correct way to do the mapping and the user has the choice to C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * choose a method that is most suitable to the application. C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * Typically, however, a user will want to map the following for a given C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * USB interface function: C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * 1. The USB interface ID C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * 2. The endpoint control registers (UEPn) C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * 3. The BDT registers (ep<#>B) C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * 4. The endpoint size C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * Example: Assume a USB device class "foo", which uses one out endpoint C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * of size 64-byte and one in endpoint of size 64-byte, then: C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * #define FOO_INTF_ID 0x00 C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * #define FOO_UEP UEP1 C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * #define FOO_BD_OUT ep1Bo C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * #define FOO_BD_IN ep1Bi C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * #define FOO_EP_SIZE 64 C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * The mapping above has chosen class "foo" to use endpoint 1. C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * The names are arbitrary and can be anything other than FOO_??????. C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * For abstraction, the code for class "foo" should use the abstract C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * definitions of FOO_BD_OUT,FOO_BD_IN, and not ep1Bo or ep1Bi. C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * Note that the endpoint size defined in the usbcfg.h file is again C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * used in the usbmmap.c file. This shows that the relationship between C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * the two files are tightly related. C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * The endpoint buffer for each USB function must be located in the C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * dual-port RAM area and has to come after all the BDTs have been C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * instantiated. An example declaration is: C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * volatile far unsigned char[FOO_EP_SIZE] data; C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * The 'volatile' keyword tells the compiler not to perform any code C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * optimization on this variable because its content could be modified C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * by the hardware. The 'far' keyword tells the compiler that this variable C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * is not located in the Access RAM area (0x000 - 0x05F). C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * For the variable to be globally accessible by other files, it should be C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * declared in the header file usbmmap.h as an extern definition, such as C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * extern volatile far unsigned char[FOO_EP_SIZE] data; C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * Conclusion: C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * In a short summary, the dependencies between usbcfg and usbmmap can C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * be shown as: C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * usbcfg[MAX_EP_NUMBER] -> usbmmap C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * usbmmap[ep<#>B] -> usbcfg C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * usbcfg[EP size] -> usbmmap C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * usbcfg[abstract ep definitions] -> usb9/hid/cdc/etc class code C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * usbmmap[endpoint buffer variable] -> usb9/hid/cdc/etc class code C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * Data mapping provides a means for direct addressing of BDT and endpoint C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * buffer. This means less usage of pointers, which equates to a faster and C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * smaller program code. C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #include "system\typedefs.h" C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #include "system\usb\usb.h" C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c /** U S B G L O B A L V A R I A B L E S ************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #pragma udata C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c byte usb_device_state; // Device States: DETACHED, ATTACHED, ... C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c USB_DEVICE_STATUS usb_stat; // Global USB flags C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c byte usb_active_cfg; // Value of current configuration C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c byte usb_alt_intf[MAX_NUM_INT]; // Array to keep track of the current alternate C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c // setting for each interface ID C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c /** U S B F I X E D L O C A T I O N V A R I A B L E S *********************/ C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #pragma udata usbram4=0x400 //See Linker Script,usb4:0x400-0x4FF(256-byte) C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * Section A: Buffer Descriptor Table C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * - 0x400 - 0x4FF(max) C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * - MAX_EP_NUMBER is defined in autofiles\usbcfg.h C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * - BDT data type is defined in system\usb\usbmmap.h C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #if(0 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep0Bo; //Endpoint #0 BD Out C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep0Bi; //Endpoint #0 BD In C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #if(1 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep1Bo; //Endpoint #1 BD Out C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep1Bi; //Endpoint #1 BD In C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #if(2 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep2Bo; //Endpoint #2 BD Out C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep2Bi; //Endpoint #2 BD In C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #if(3 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep3Bo; //Endpoint #3 BD Out C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep3Bi; //Endpoint #3 BD In C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #if(4 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep4Bo; //Endpoint #4 BD Out C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep4Bi; //Endpoint #4 BD In C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #if(5 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep5Bo; //Endpoint #5 BD Out C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep5Bi; //Endpoint #5 BD In C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #if(6 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep6Bo; //Endpoint #6 BD Out C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep6Bi; //Endpoint #6 BD In C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #if(7 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep7Bo; //Endpoint #7 BD Out C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep7Bi; //Endpoint #7 BD In C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #if(8 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep8Bo; //Endpoint #8 BD Out C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep8Bi; //Endpoint #8 BD In C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #if(9 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep9Bo; //Endpoint #9 BD Out C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep9Bi; //Endpoint #9 BD In C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #if(10 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep10Bo; //Endpoint #10 BD Out C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep10Bi; //Endpoint #10 BD In C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #if(11 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep11Bo; //Endpoint #11 BD Out C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep11Bi; //Endpoint #11 BD In C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #if(12 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep12Bo; //Endpoint #12 BD Out C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep12Bi; //Endpoint #12 BD In C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #if(13 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep13Bo; //Endpoint #13 BD Out C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep13Bi; //Endpoint #13 BD In C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #if(14 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep14Bo; //Endpoint #14 BD Out C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep14Bi; //Endpoint #14 BD In C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #if(15 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep15Bo; //Endpoint #15 BD Out C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BDT ep15Bi; //Endpoint #15 BD In C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * Section B: EP0 Buffer Space C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c ****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * - Two buffer areas are defined: C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * A. CTRL_TRF_SETUP C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * - Size = EP0_BUFF_SIZE as defined in autofiles\usbcfg.h C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * - Detailed data structure allows direct adddressing of bits and bytes. C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * B. CTRL_TRF_DATA C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * - Size = EP0_BUFF_SIZE as defined in autofiles\usbcfg.h C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * - Data structure allows direct adddressing of the first 8 bytes. C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * - Both data types are defined in system\usb\usbdefs\usbdefs_ep0_buff.h C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far CTRL_TRF_SETUP SetupPkt; C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far CTRL_TRF_DATA CtrlTrfData; C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * Section C: Buffer C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c ****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c volatile far BOOT_DATA_PACKET dataPacket; C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c #pragma udata C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c /** EOF usbmmap.c ************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbmmap.c /********************************************************************* C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Microchip USB Bootloader Version 1.0 C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c ********************************************************************* C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * FileName: usbdrv.c C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Processor: PIC18 C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Software License Agreement C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * license. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Author Date Comment C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Rawin Rojvanit 11/19/04 Original. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c ********************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * -usbdrv.c- C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * This file contains functions that check the hardware interrupts for C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * USB events. The main function, USBDriverService(), should be called once C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * every main loop. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * This is a mini-version of the actual usbdrv.c from the Microchip USB C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Library. Many functions were removed to make the whole bootload application C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * fit under 2KB, which is the size of the boot block. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c #include C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c #include "system\typedefs.h" C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c #include "system\usb\usb.h" C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c #include "io_cfg.h" // Required for USBCheckBusStatus() C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c /** V A R I A B L E S ********************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c #pragma udata C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c /** P R I V A T E P R O T O T Y P E S ***************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c void USBModuleEnable(void); C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c void USBModuleDisable(void); C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c void USBSuspend(void); C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c void USBWakeFromSuspend(void); C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c void USBProtocolResetHandler(void); C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c void USB_SOF_Handler(void); C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c void USBStallHandler(void); C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c void USBErrorHandler(void); C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c /** D E C L A R A T I O N S **************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c #pragma code C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Function: void USBCheckBusStatus(void) C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Overview: This routine enables/disables the USB module by monitoring C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * the USB power signal. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Note: None C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c void USBCheckBusStatus(void) C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 000586 0e08 MOVLW 0x8 UCON = 0b00001000; // Enable USBEN only C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 000588 6e6d MOVWF 0x6d,0x0 /* C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * After enabling the USB module, it takes some time for the voltage C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * on the D+ or D- line to rise high enough to get out of the SE0 condition. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * The USB Reset interrupt should not be unmasked until the SE0 condition is C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * cleared. This helps preventing the firmware from misinterpreting this C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * unique event as a USB bus reset from the USB host. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 00058a ba6d BTFSC 0x6d,0x5,0x0 while(UCONbits.SE0); // Blocking loop C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 00058c d7fe BRA 0x58a 00058e 6a68 CLRF 0x68,0x0 UIR = 0; // Clear all USB interrupts C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 000590 0e11 MOVLW 0x11 UIE = 0b00010001; // Unmask RESET & IDLE interrupts only C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 000592 6e69 MOVWF 0x69,0x0 000594 0100 MOVLB 0x0 usb_device_state = POWERED_STATE; C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 000596 0e02 MOVLW 0x2 000598 6f7c MOVWF 0x7c,0x1 00059a 0012 RETURN 0x0 }//end USBCheckBusStatus C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Function: void USBDriverService(void) C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Overview: This routine is the heart of this firmware. It manages C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * all USB interrupts. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Note: Device state transitions through the following stages: C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * DETACHED -> ATTACHED -> POWERED -> DEFAULT -> C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * ADDRESS_PENDING -> ADDRESSED -> CONFIGURED -> READY C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c void USBDriverService(void) C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Task A: Service USB Activity Interrupt C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 00059c 5068 MOVF 0x68,0x0,0x0 if(UIRbits.ACTVIF && UIEbits.ACTVIE) C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 00059e 0b04 ANDLW 0x4 0005a0 e006 BZ 0x5ae 0005a2 5069 MOVF 0x69,0x0,0x0 0005a4 0b04 ANDLW 0x4 0005a6 e003 BZ 0x5ae { C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 0005a8 926d BCF 0x6d,0x1,0x0 UCONbits.SUSPND = 0; C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 0005aa 9469 BCF 0x69,0x2,0x0 UIEbits.ACTVIE = 0; C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 0005ac 9468 BCF 0x68,0x2,0x0 UIRbits.ACTVIF = 0; C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c }//end if C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Task B: Service USB Bus Reset Interrupt. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * When bus reset is received during suspend, ACTVIF will be set first, C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * once the UCONbits.SUSPND is clear, then the URSTIF bit will be asserted. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * This is why URSTIF is checked after ACTVIF. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * The USB reset flag is masked when the USB state is in C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * DETACHED_STATE or ATTACHED_STATE, and therefore cannot C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * cause a USB reset event during these two states. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 0005ae 5068 MOVF 0x68,0x0,0x0 if(UIRbits.URSTIF && UIEbits.URSTIE) USBProtocolResetHandler(); C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 0005b0 0b01 ANDLW 0x1 0005b2 e004 BZ 0x5bc 0005b4 5069 MOVF 0x69,0x0,0x0 0005b6 0b01 ANDLW 0x1 0005b8 e001 BZ 0x5bc 0005ba d827 RCALL 0x60a C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Task C: Service other USB interrupts C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 0005bc 5068 MOVF 0x68,0x0,0x0 if(UIRbits.IDLEIF && UIEbits.IDLEIE) C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 0005be 0b10 ANDLW 0x10 0005c0 e009 BZ 0x5d4 0005c2 5069 MOVF 0x69,0x0,0x0 0005c4 0b10 ANDLW 0x10 0005c6 e006 BZ 0x5d4 { C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 0005c8 8469 BSF 0x69,0x2,0x0 UIEbits.ACTVIE = 1; // Enable bus activity interrupt C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 0005ca 9868 BCF 0x68,0x4,0x0 UIRbits.IDLEIF = 0; C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 0005cc 826d BSF 0x6d,0x1,0x0 UCONbits.SUSPND = 1; // Put USB module in power conserve C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c // mode, SIE clock inactive C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c /* Now, go into power saving */ C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 0005ce 8aa0 BSF 0xa0,0x5,0x0 PIE2bits.USBIE = 1; // Set wakeup source C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 0005d0 0003 SLEEP Sleep(); C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 0005d2 9aa1 BCF 0xa1,0x5,0x0 PIR2bits.USBIF = 0; C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c }//end if C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 0005d4 5068 MOVF 0x68,0x0,0x0 if(UIRbits.STALLIF && UIEbits.STALLIE) C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 0005d6 0b20 ANDLW 0x20 0005d8 e009 BZ 0x5ec 0005da 5069 MOVF 0x69,0x0,0x0 0005dc 0b20 ANDLW 0x20 0005de e006 BZ 0x5ec { C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 0005e0 a070 BTFSS 0x70,0x0,0x0 if(UEP0bits.EPSTALL == 1) C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 0005e2 d003 BRA 0x5ea { C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 0005e4 ec4d CALL 0x49a,0x0 USBPrepareForNextSetupTrf(); // Firmware Work-Around C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 0005e6 f002 0005e8 9070 BCF 0x70,0x0,0x0 UEP0bits.EPSTALL = 0; C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c }//end if C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 0005ea 9a68 BCF 0x68,0x5,0x0 UIRbits.STALLIF = 0; C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c }//end if C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Pointless to continue servicing if the host has not sent a bus reset. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Once bus reset is received, the device transitions into the DEFAULT C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * state and is ready for communication. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 0005ec 0e03 MOVLW 0x3 if(usb_device_state < DEFAULT_STATE) return; C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 0005ee 0100 MOVLB 0x0 0005f0 5d7c SUBWF 0x7c,0x0,0x1 0005f2 e201 BC 0x5f6 0005f4 d009 BRA 0x608 C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Task D: Servicing USB Transaction Complete Interrupt C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 0005f6 5068 MOVF 0x68,0x0,0x0 if(UIRbits.TRNIF && UIEbits.TRNIE) C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 0005f8 0b08 ANDLW 0x8 0005fa e006 BZ 0x608 0005fc 5069 MOVF 0x69,0x0,0x0 0005fe 0b08 ANDLW 0x8 000600 e003 BZ 0x608 { C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * USBCtrlEPService only services transactions over EP0. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * It ignores all other EP transactions. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 000602 ec6e CALL 0x2dc,0x0 USBCtrlEPService(); C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 000604 f001 C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Other EP can be serviced later by responsible device class firmware. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Each device driver knows when an OUT or IN transaction is ready by C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * checking the buffer ownership bit. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * An OUT EP should always be owned by SIE until the data is ready. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * An IN EP should always be owned by CPU until the data is ready. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Because of this logic, it is not necessary to save the USTAT value C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * of non-EP0 transactions. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 000606 9668 BCF 0x68,0x3,0x0 UIRbits.TRNIF = 0; C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c }//end if(UIRbits.TRNIF && UIEbits.TRNIE) C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 000608 0012 RETURN 0x0 }//end USBDriverService C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Function: void USBProtocolResetHandler(void) C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * PreCondition: A USB bus reset is received from the host. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Side Effects: Currently, this routine flushes any pending USB C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * transactions. It empties out the USTAT FIFO. This action C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * might not be desirable in some applications. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Overview: Once a USB bus reset is received from the host, this C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * routine should be called. It resets the device address to C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * zero, disables all non-EP0 endpoints, initializes EP0 to C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * be ready for default communication, clears all USB C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * interrupt flags, unmasks applicable USB interrupts, and C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * reinitializes internal state-machine variables. C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c * Note: None C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c void USBProtocolResetHandler(void) C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 00060a 6a68 CLRF 0x68,0x0 UIR = 0; // Clears all USB interrupts C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 00060c 0e7b MOVLW 0x7b UIE = 0b01111011; // Enable all interrupts except ACTVIE C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 00060e 6e69 MOVWF 0x69,0x0 000610 6a6e CLRF 0x6e,0x0 UADDR = 0x00; // Reset to default address C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 000612 0e16 MOVLW 0x16 UEP0 = EP_CTRL|HSHK_EN; // Init EP0 as a Ctrl EP, see usbdrv.h C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 000614 6e70 MOVWF 0x70,0x0 000616 a668 BTFSS 0x68,0x3,0x0 while(UIRbits.TRNIF == 1) // Flush any pending transactions C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 000618 d002 BRA 0x61e 00061c d7fc BRA 0x616 00061a 9668 BCF 0x68,0x3,0x0 UIRbits.TRNIF = 0; C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 00061e 986d BCF 0x6d,0x4,0x0 UCONbits.PKTDIS = 0; // Make sure packet processing is enabled C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 000620 ec4d CALL 0x49a,0x0 USBPrepareForNextSetupTrf(); // Declared in usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 000622 f002 000624 0100 MOVLB 0x0 usb_active_cfg = 0; // Clear active configuration C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 000626 6b7e CLRF 0x7e,0x1 000628 0100 MOVLB 0x0 usb_device_state = DEFAULT_STATE; C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c 00062a 0e03 MOVLW 0x3 00062c 6f7c MOVWF 0x7c,0x1 00062e 0012 RETURN 0x0 }//end USBProtocolResetHandler C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c /** EOF usbdrv.c *************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbdrv\usbdrv.c /********************************************************************* C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c ********************************************************************* C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * FileName: usb9.c C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Processor: PIC18 C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Software License Agreement C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * license. C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Author Date Comment C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Rawin Rojvanit 11/19/04 Original. C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c ********************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * -usb9.c- C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * This main function in this file, USBCheckStdRequest() is called from the C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * usbctrltrf.c to check if a standard USB request has been received or not. C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * This is a mini-version of the actual usb9.c from the Microchip USB library. C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Many functions are commented out to make the whole bootload application fit C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * under 2KB, which is the size of the boot block. C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c #include C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c #include "system\typedefs.h" C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c #include "system\usb\usb.h" C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c #include "io_cfg.h" // Required for self_power status C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c /** V A R I A B L E S ********************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c #pragma udata C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c /** P R I V A T E P R O T O T Y P E S ***************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c void USBStdGetDscHandler(void); C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c void USBStdSetCfgHandler(void); C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c void USBStdGetStatusHandler(void); C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c void USBStdFeatureReqHandler(void); C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c /** D E C L A R A T I O N S **************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c #pragma code C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Function: void USBCheckStdRequest(void) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * PreCondition: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Input: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Output: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Side Effects: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Overview: This routine checks the setup data packet to see if it C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * knows how to handle it C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Note: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c void USBCheckStdRequest(void) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 0004ba 0104 MOVLB 0x4 if(SetupPkt.RequestType != STANDARD) return; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 0004bc 5110 MOVF 0x10,0x0,0x1 0004be 0b60 ANDLW 0x60 0004c0 42e8 RRNCF 0xe8,0x1,0x0 0004c2 42e8 RRNCF 0xe8,0x1,0x0 0004c4 42e8 RRNCF 0xe8,0x1,0x0 0004c6 42e8 RRNCF 0xe8,0x1,0x0 0004c8 42e8 RRNCF 0xe8,0x1,0x0 0004ca 0900 IORLW 0x0 0004cc e001 BZ 0x4d0 0004ce 0012 RETURN 0x0 C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 0004d0 5111 MOVF 0x11,0x0,0x1 switch(SetupPkt.bRequest) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 0004d2 0a08 XORLW 0x8 0004d4 e039 BZ 0x548 0004d6 0a01 XORLW 0x1 0004d8 e035 BZ 0x544 0004da 0a0f XORLW 0xf 0004dc e00a BZ 0x4f2 0004de 0a03 XORLW 0x3 0004e0 e001 BZ 0x4e4 0004e2 0012 RETURN 0x0 { C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c case SET_ADR: C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 0004e4 0100 MOVLB 0x0 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 0004e6 0e01 MOVLW 0x1 0004e8 6f61 MOVWF 0x61,0x1 0004ea 0100 MOVLB 0x0 usb_device_state = ADR_PENDING_STATE; // Update state only C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 0004ec 0e04 MOVLW 0x4 0004ee 6f7c MOVWF 0x7c,0x1 /* See USBCtrlTrfInHandler() in usbctrltrf.c for the next step */ C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 0004f0 0012 RETURN 0x0 break; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c case GET_DSC: C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 0004f2 0100 MOVLB 0x0 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 0004f4 0e01 MOVLW 0x1 0004f6 6f61 MOVWF 0x61,0x1 0004f8 0104 MOVLB 0x4 if(SetupPkt.bDscType == DSC_DEV) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 0004fa 0513 DECF 0x13,0x0,0x1 0004fc e107 BNZ 0x50c { C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 0004fe 0100 MOVLB 0x0 pSrc.bRom = (rom byte*)&device_dsc; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 000500 0ece MOVLW 0xce 000502 6f62 MOVWF 0x62,0x1 000504 0e06 MOVLW 0x6 000506 6f63 MOVWF 0x63,0x1 000508 0e12 MOVLW 0x12 wCount._word = sizeof(device_dsc); // Set data count C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c } C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 00050a d013 BRA 0x532 else if(SetupPkt.bDscType == DSC_CFG) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 00050c 0e02 MOVLW 0x2 00050e 5d13 SUBWF 0x13,0x0,0x1 000510 e107 BNZ 0x520 { C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 000512 0100 MOVLB 0x0 pSrc.bRom = (rom byte*)&cfg01; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 000514 0ee0 MOVLW 0xe0 000516 6f62 MOVWF 0x62,0x1 000518 0e06 MOVLW 0x6 00051a 6f63 MOVWF 0x63,0x1 00051c 0e20 MOVLW 0x20 wCount._word = sizeof(cfg01); // Set data count C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c } C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 00051e d009 BRA 0x532 else if(SetupPkt.bDscType == DSC_STR) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 000520 0e03 MOVLW 0x3 000522 5d13 SUBWF 0x13,0x0,0x1 000524 e10a BNZ 0x53a { C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 000526 0100 MOVLB 0x0 pSrc.bRom = (rom byte*)&sd000; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 000528 0e00 MOVLW 0x0 00052a 6f62 MOVWF 0x62,0x1 00052c 0e07 MOVLW 0x7 00052e 6f63 MOVWF 0x63,0x1 000530 0e04 MOVLW 0x4 wCount._word = sizeof(sd000); // Set data count C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 000532 0100 MOVLB 0x0 000534 6f66 MOVWF 0x66,0x1 000536 6b67 CLRF 0x67,0x1 } C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 000538 d002 BRA 0x53e else C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c /* C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * This is required to stall the DEVICE_QUALIFIER request C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c */ C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 00053a 0100 MOVLB 0x0 ctrl_trf_session_owner = MUID_NULL; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 00053c 6b61 CLRF 0x61,0x1 00053e 0100 MOVLB 0x0 usb_stat.ctrl_trf_mem = _ROM; // Set memory type C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 000540 837d BSF 0x7d,0x1,0x1 000542 0012 RETURN 0x0 break; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c case SET_CFG: C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 000544 efb2 GOTO 0x564 USBStdSetCfgHandler(); C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 000546 f002 break; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c case GET_CFG: C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 000548 0100 MOVLB 0x0 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 00054a 0e01 MOVLW 0x1 00054c 6f61 MOVWF 0x61,0x1 00054e 0100 MOVLB 0x0 pSrc.bRam = (byte*)&usb_active_cfg; // Set Source C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 000550 0e7e MOVLW 0x7e 000552 6f62 MOVWF 0x62,0x1 000554 0e00 MOVLW 0x0 000556 6f63 MOVWF 0x63,0x1 000558 0100 MOVLB 0x0 usb_stat.ctrl_trf_mem = _RAM; // Set memory type C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 00055a 937d BCF 0x7d,0x1,0x1 00055c 0100 MOVLB 0x0 LSB(wCount) = 1; // Set data count C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 00055e 0e01 MOVLW 0x1 000560 6f66 MOVWF 0x66,0x1 000562 0012 RETURN 0x0 break; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c //case GET_STATUS: C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // USBStdGetStatusHandler(); C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // break; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c //case CLR_FEATURE: C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c //case SET_FEATURE: C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // USBStdFeatureReqHandler(); C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // break; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c //case GET_INTF: C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // pSrc.bRam = (byte*)&usb_alt_intf+SetupPkt.bIntfID; // Set source C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // usb_stat.ctrl_trf_mem = _RAM; // Set memory type C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // LSB(wCount) = 1; // Set data count C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // break; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c //case SET_INTF: C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // usb_alt_intf[SetupPkt.bIntfID] = SetupPkt.bAltID; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // break; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c //case SET_DSC: C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c //case SYNCH_FRAME: C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c default: C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c break; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c }//end switch C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c }//end USBCheckStdRequest C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Function: void USBStdGetDscHandler(void) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * PreCondition: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Input: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Output: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Side Effects: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Overview: This routine handles the standard GET_DESCRIPTOR request. C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * It utilizes tables dynamically looks up descriptor size. C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * This routine should never have to be modified if the tables C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * in usbdsc.c are declared correctly. C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Note: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c //void USBStdGetDscHandler(void) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c //{ C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // if(SetupPkt.bmRequestType == 0x80) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // { C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // switch(SetupPkt.bDscType) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // { C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // case DSC_DEV: C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // pSrc.bRom = (rom byte*)&device_dsc; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // wCount._word = sizeof(device_dsc); // Set data count C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // break; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // case DSC_CFG: C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // pSrc.bRom = *(USB_CD_Ptr+SetupPkt.bDscIndex); C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // wCount._word = *(pSrc.wRom+1); // Set data count C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // break; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // case DSC_STR: C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // pSrc.bRom = *(USB_SD_Ptr+SetupPkt.bDscIndex); C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // wCount._word = *pSrc.bRom; // Set data count C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // break; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // }//end switch C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // usb_stat.ctrl_trf_mem = _ROM; // Set memory type C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // }//end if C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c //}//end USBStdGetDscHandler C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Function: void USBStdSetCfgHandler(void) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * PreCondition: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Input: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Output: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Side Effects: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Overview: This routine first disables all endpoints by clearing C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * UEP registers. It then configures (initializes) endpoints C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * specified in the modifiable section. C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Note: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c void USBStdSetCfgHandler(void) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 000564 0100 MOVLB 0x0 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 000566 0e01 MOVLW 0x1 000568 6f61 MOVWF 0x61,0x1 //mDisableEP1to15(); // See usbdrv.h C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c //ClearArray((byte*)&usb_alt_intf,MAX_NUM_INT); C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 00056a c412 MOVFF 0x412,0x7e usb_active_cfg = SetupPkt.bCfgValue; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 00056c f07e 00056e 0104 MOVLB 0x4 if(SetupPkt.bCfgValue == 0) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 000570 5112 MOVF 0x12,0x0,0x1 000572 e104 BNZ 0x57c 000574 0100 MOVLB 0x0 usb_device_state = ADDRESS_STATE; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 000576 0e05 MOVLW 0x5 000578 6f7c MOVWF 0x7c,0x1 00057a 0012 RETURN 0x0 else C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 00057c 0100 MOVLB 0x0 usb_device_state = CONFIGURED_STATE; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 00057e 0e06 MOVLW 0x6 000580 6f7c MOVWF 0x7c,0x1 C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c /* Modifiable Section */ C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 000582 ef10 GOTO 0x20 BootInitEP(); C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c 000584 f000 C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c /* End modifiable section */ C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c }//end if(SetupPkt.bcfgValue == 0) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c }//end USBStdSetCfgHandler C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Function: void USBStdGetStatusHandler(void) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * PreCondition: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Input: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Output: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Side Effects: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Overview: This routine handles the standard GET_STATUS request C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Note: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c //void USBStdGetStatusHandler(void) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c //{ C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // CtrlTrfData._byte0 = 0; // Initialize content C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // CtrlTrfData._byte1 = 0; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // switch(SetupPkt.Recipient) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // { C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // case RCPT_DEV: C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // /* C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // * _byte0: bit0: Self-Powered Status [0] Bus-Powered [1] Self-Powered C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // * bit1: RemoteWakeup [0] Disabled [1] Enabled C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // */ C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // if(self_power == 1) // self_power defined in io_cfg.h C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // CtrlTrfData._byte0|=0b000000001; // Set bit0 C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // if(usb_stat.RemoteWakeup == 1) // usb_stat defined in usbmmap.c C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // CtrlTrfData._byte0|=0b00000010; // Set bit1 C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // break; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // case RCPT_INTF: C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // ctrl_trf_session_owner = MUID_USB9; // No data to update C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // break; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // case RCPT_EP: C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // /* C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // * _byte0: bit0: Halt Status [0] Not Halted [1] Halted C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // */ C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // pDst.bRam = (byte*)&ep0Bo+(SetupPkt.EPNum*8)+(SetupPkt.EPDir*4); C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // if(*pDst.bRam & _BSTALL) // Use _BSTALL as a bit mask C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // CtrlTrfData._byte0=0x01;// Set bit0 C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // break; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // }//end switch C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // if(ctrl_trf_session_owner == MUID_USB9) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // { C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // pSrc.bRam = (byte*)&CtrlTrfData; // Set Source C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // usb_stat.ctrl_trf_mem = _RAM; // Set memory type C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // LSB(wCount) = 2; // Set data count C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // }//end if(...) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c //}//end USBStdGetStatusHandler C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Function: void USBStdFeatureReqHandler(void) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * PreCondition: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Input: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Output: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Side Effects: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Overview: This routine handles the standard SET & CLEAR FEATURES C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * requests C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c * Note: None C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c //void USBStdFeatureReqHandler(void) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c //{ C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // if((SetupPkt.bFeature == DEVICE_REMOTE_WAKEUP)&& C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // (SetupPkt.Recipient == RCPT_DEV)) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // { C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // if(SetupPkt.bRequest == SET_FEATURE) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // usb_stat.RemoteWakeup = 1; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // else C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // usb_stat.RemoteWakeup = 0; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // }//end if C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // if((SetupPkt.bFeature == ENDPOINT_HALT)&& C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // (SetupPkt.Recipient == RCPT_EP)&& C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // (SetupPkt.EPNum != 0)) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // { C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // /* Must do address calculation here */ C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // pDst.bRam = (byte*)&ep0Bo+(SetupPkt.EPNum*8)+(SetupPkt.EPDir*4); C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // if(SetupPkt.bRequest == SET_FEATURE) C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // *pDst.bRam = _USIE|_BSTALL; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // else C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // { C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // if(SetupPkt.EPDir == 1) // IN C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // *pDst.bRam = _UCPU; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // else C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // *pDst.bRam = _USIE|_DAT0|_DTSEN; C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // }//end if C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c // }//end if C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c //}//end USBStdFeatureReqHandler C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c /** EOF usb9.c ***************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usb9\usb9.c /********************************************************************* C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c ********************************************************************* C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * FileName: usbdsc.c C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * Processor: PIC18 C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * Software License Agreement C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * license. C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c ********************************************************************/ C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c /********************************************************************* C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * -usbdsc.c- C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * This file contains the USB descriptor information. It is used C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * in conjunction with the usbdsc.h file. When a descriptor is added C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * or removed from the main configuration descriptor, i.e. CFG01, C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * the user must also change the descriptor structure defined in C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * the usbdsc.h file. The structure is used to calculate the C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * descriptor size, i.e. sizeof(CFG01). C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * A typical configuration descriptor consists of: C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * At least one configuration descriptor (USB_CFG_DSC) C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * One or more interface descriptors (USB_INTF_DSC) C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * One or more endpoint descriptors (USB_EP_DSC) C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * Naming Convention: C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * To resolve ambiguity, the naming convention are as followed: C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * - USB_CFG_DSC type should be named cdxx, where xx is the C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * configuration number. This number should match the actual C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * index value of this configuration. C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * - USB_INTF_DSC type should be named ia, where yy is the C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * interface number and zz is the alternate interface number. C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * - USB_EP_DSC type should be named ep<##>_ia, where C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * ## is the endpoint number and d is the direction of transfer. C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * The interface name should also be listed as a suffix to identify C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * which interface does the endpoint belong to. C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * Example: C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * If a device has one configuration, two interfaces; interface 0 C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * has two endpoints (in and out), and interface 1 has one endpoint(in). C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * Then the CFG01 structure in the usbdsc.h should be: C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * #define CFG01 rom struct \ C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * { USB_CFG_DSC cd01; \ C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * USB_INTF_DSC i00a00; \ C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * USB_EP_DSC ep01o_i00a00; \ C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * USB_EP_DSC ep01i_i00a00; \ C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * USB_INTF_DSC i01a00; \ C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * USB_EP_DSC ep02i_i01a00; \ C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * } cfg01 C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * Note the hierarchy of the descriptors above, it follows the USB C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * specification requirement. All endpoints belonging to an interface C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * should be listed immediately after that interface. C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * ------------------------------------------------------------------- C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * Filling in the descriptor values in the usbdsc.c file: C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * ------------------------------------------------------------------- C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * Most items should be self-explanatory, however, a few will be C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * explained for clarification. C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * [Configuration Descriptor(USB_CFG_DSC)] C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * The configuration attribute must always have the _DEFAULT C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * definition at the minimum. Additional options can be ORed C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * to the _DEFAULT attribute. Available options are _SELF and _RWU. C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * These definitions are defined in the usbdefs_std_dsc.h file. The C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * _SELF tells the USB host that this device is self-powered. The C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * _RWU tells the USB host that this device supports Remote Wakeup. C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * [Endpoint Descriptor(USB_EP_DSC)] C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * Assume the following example: C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * sizeof(USB_EP_DSC),DSC_EP,_EP01_OUT,_BULK,64,0x00 C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * The first two parameters are self-explanatory. They specify the C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * length of this endpoint descriptor (7) and the descriptor type. C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * The next parameter identifies the endpoint, the definitions are C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * defined in usbdefs_std_dsc.h and has the following naming C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * convention: C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * _EP<##>_ C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * where ## is the endpoint number and dir is the direction of C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * transfer. The dir has the value of either 'OUT' or 'IN'. C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * The next parameter identifies the type of the endpoint. Available C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * options are _BULK, _INT, _ISO, and _CTRL. The _CTRL is not C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * typically used because the default control transfer endpoint is C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * not defined in the USB descriptors. When _ISO option is used, C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * addition options can be ORed to _ISO. Example: C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * _ISO|_AD|_FE C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * This describes the endpoint as an isochronous pipe with adaptive C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * and feedback attributes. See usbdefs_std_dsc.h and the USB C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * specification for details. The next parameter defines the size of C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * the endpoint. The last parameter in the polling interval. C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * ------------------------------------------------------------------- C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * Adding a USB String C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * ------------------------------------------------------------------- C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * A string descriptor array should have the following format: C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * rom struct{byte bLength;byte bDscType;word string[size];}sdxxx={ C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * sizeof(sdxxx),DSC_STR,}; C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * The above structure provides a means for the C compiler to C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * calculate the length of string descriptor sdxxx, where xxx is the C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * index number. The first two bytes of the descriptor are descriptor C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * length and type. The rest are string texts which must be C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * in the unicode format. The unicode format is achieved by declaring C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * each character as a word type. The whole text string is declared C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * as a word array with the number of characters equals to . C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * has to be manually counted and entered into the array C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * declaration. Let's study this through an example: C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * if the string is "USB" , then the string descriptor should be: C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * (Using index 02) C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * rom struct{byte bLength;byte bDscType;word string[3];}sd002={ C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * sizeof(sd002),DSC_STR,'U','S','B'}; C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * A USB project may have multiple strings and the firmware supports C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * the management of multiple strings through a look-up table. C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * The look-up table is defined as: C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * rom const unsigned char *rom USB_SD_Ptr[]={&sd000,&sd001,&sd002}; C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * The above declaration has 3 strings, sd000, sd001, and sd002. C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * Strings can be removed or added. sd000 is a specialized string C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * descriptor. It defines the language code, usually this is C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * US English (0x0409). The index of the string must match the index C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * position of the USB_SD_Ptr array, &sd000 must be in position C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * USB_SD_Ptr[0], &sd001 must be in position USB_SD_Ptr[1] and so on. C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * The look-up table USB_SD_Ptr is used by the get string handler C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * function in usb9.c. C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * ------------------------------------------------------------------- C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * The look-up table scheme also applies to the configuration C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * descriptor. A USB device may have multiple configuration C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * descriptors, i.e. CFG01, CFG02, etc. To add a configuration C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * descriptor, user must implement a structure similar to CFG01. C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * The next step is to add the configuration descriptor name, i.e. C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * cfg01, cfg02,.., to the look-up table USB_CD_Ptr. USB_CD_Ptr[0] C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * is a dummy place holder since configuration 0 is the un-configured C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * state according to the definition in the USB specification. C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c ********************************************************************/ C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c /********************************************************************* C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * Descriptor specific type definitions are defined in: C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * system\usb\usbdefs\usbdefs_std_dsc.h C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * Configuration information is defined in: C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c * autofiles\usbcfg.h C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c ********************************************************************/ C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c /** I N C L U D E S *************************************************/ C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c #include "system\typedefs.h" C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c #include "system\usb\usb.h" C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c /** C O N S T A N T S ************************************************/ C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c #pragma romdata C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c /* Device Descriptor */ C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c rom USB_DEV_DSC device_dsc= C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c { C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c sizeof(USB_DEV_DSC), // Size of this descriptor in bytes C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c DSC_DEV, // DEVICE descriptor type C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c 0x0200, // USB Spec Release Number in BCD format C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c 0x00, // Class Code C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c 0x00, // Subclass code C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c 0x00, // Protocol code C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c EP0_BUFF_SIZE, // Max packet size for EP0, see usbcfg.h C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c 0x04D8, // Vendor ID C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c 0x000b, // Product ID: PICDEM FS USB (Boot Mode) C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c 0x0000, // Device release number in BCD format C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c 0x00, // Manufacturer string index C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c 0x00, // Product string index C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c 0x00, // Device serial number string index C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c 0x01 // Number of possible configurations C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c }; C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c /* Configuration 1 Descriptor */ C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c CFG01= C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c { C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c /* Configuration Descriptor */ C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c sizeof(USB_CFG_DSC), // Size of this descriptor in bytes C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c DSC_CFG, // CONFIGURATION descriptor type C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c sizeof(cfg01), // Total length of data for this cfg C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c 1, // Number of interfaces in this cfg C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c 1, // Index value of this configuration C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c 0, // Configuration string index C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c _DEFAULT, // Attributes, see usbdefs_std_dsc.h C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c 50, // Max power consumption (2X mA) C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c /* Interface Descriptor */ C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c sizeof(USB_INTF_DSC), // Size of this descriptor in bytes C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c DSC_INTF, // INTERFACE descriptor type C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c 0, // Interface Number C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c 0, // Alternate Setting Number C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c 2, // Number of endpoints in this intf C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c 0x00, // Class code C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c 0x00, // Subclass code C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c 0x00, // Protocol code C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c 0, // Interface string index C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c /* Endpoint Descriptors */ C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c sizeof(USB_EP_DSC),DSC_EP,_EP01_OUT,_BULK,BOOT_EP_SIZE,0x00, C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c sizeof(USB_EP_DSC),DSC_EP,_EP01_IN,_BULK,BOOT_EP_SIZE,0x00 C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c }; C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c rom struct{byte bLength;byte bDscType;word string[1];}sd000={ C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c sizeof(sd000),DSC_STR,0x0409}; C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c #pragma code C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c /** EOF usbdsc.c ****************************************************/ C:\Projects\UBW\FW\2455\B\autofiles\usbdsc.c /********************************************************************* C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c ********************************************************************* C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * FileName: usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Processor: PIC18 C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Software License Agreement C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * license. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Author Date Comment C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Rawin Rojvanit 11/19/04 Original. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c ********************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * -usbctrltrf.c- C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * This file contains functions which handle the Control Transfer mechanism. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * The only function that is of interest to an end user is the C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * USBCtrlTrfSetupHandler(), which has a section that calls different C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * USB request handlers. A default call to the USBCheckStdRequest always C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * exist and cannot be removed. USBCheckStdRequest contains handlers C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * for the requests specified in chapter 9 of the USB specification. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * If a request cannot be serviced by USBCheckStdRequest, then it means the C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * request is a class specific request. All device class request handlers C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * in a project should be called from USBCtrlTrfSetupHandler(). C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * If no handlers in the project know how to service a request, then the C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * ctrl_trf_session_owner variable would still have the value of MUID_NULL. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * The MUID_NULL value would cause the USBCtrlEPServiceComplete() to stall C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * the control endpoint, effectively telling the USB host that the C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * request cannot be serviced. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * This is a mini-version of the actual usbctrltrf.c from the Microchip USB C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Library. Some functions were optimized to handle byte only operation instead C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * of supporting both byte and word operations. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * This helps to decrease the the bootload application size to fit C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * under 2KB, which is the size of the boot block. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c #include C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c #include "system\typedefs.h" C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c #include "system\usb\usb.h" C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /** V A R I A B L E S ********************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c #pragma udata C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c byte ctrl_trf_state; // Control Transfer State C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c byte ctrl_trf_session_owner; // Current transfer session owner C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c POINTER pSrc; // Data source pointer C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c POINTER pDst; // Data destination pointer C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c WORD wCount; // Data counter C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /** P R I V A T E P R O T O T Y P E S ***************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlTrfSetupHandler(void); C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlTrfOutHandler(void); C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlTrfInHandler(void); C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /** D E C L A R A T I O N S **************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c #pragma code C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlEPService(void) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: USTAT is loaded with a valid endpoint address. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Overview: USBCtrlEPService checks for three transaction types that C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * it knows how to service and services them: C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * 1. EP0 SETUP C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * 2. EP0 OUT C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * 3. EP0 IN C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * It ignores all other types (i.e. EP1, EP2, etc.) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Note: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlEPService(void) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0002dc 506c MOVF 0x6c,0x0,0x0 if(USTAT == EP00_OUT) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0002de e002 BZ 0x2e4 0002e0 0e00 MOVLW 0x0 0002e2 d001 BRA 0x2e6 0002e4 0e01 MOVLW 0x1 0002e6 0900 IORLW 0x0 0002e8 e00b BZ 0x300 { C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0002ea 0104 MOVLB 0x4 if(ep0Bo.Stat.PID == SETUP_TOKEN) // EP0 SETUP C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0002ec 5100 MOVF 0x0,0x0,0x1 0002ee 0b3c ANDLW 0x3c 0002f0 42e8 RRNCF 0xe8,0x1,0x0 0002f2 42e8 RRNCF 0xe8,0x1,0x0 0002f4 080d SUBLW 0xd 0002f6 e102 BNZ 0x2fc 0002f8 ef89 GOTO 0x312 USBCtrlTrfSetupHandler(); C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0002fa f001 else // EP0 OUT C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0002fc ef92 GOTO 0x324 USBCtrlTrfOutHandler(); C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0002fe f001 } C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000300 506c MOVF 0x6c,0x0,0x0 else if(USTAT == EP00_IN) // EP0 IN C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000302 e002 BZ 0x308 000304 0e00 MOVLW 0x0 000306 d001 BRA 0x30a 000308 0e01 MOVLW 0x1 00030a 0904 IORLW 0x4 00030c e001 BZ 0x310 00030e d819 RCALL 0x342 USBCtrlTrfInHandler(); C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000310 0012 RETURN 0x0 }//end USBCtrlEPService C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlTrfSetupHandler(void) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: SetupPkt buffer is loaded with valid USB Setup Data C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Overview: This routine is a task dispatcher and has 3 stages. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * 1. It initializes the control transfer state machine. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * 2. It calls on each of the module that may know how to C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * service the Setup Request from the host. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Module Example: USB9, HID, CDC, MSD, ... C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * As new classes are added, ClassReqHandler table in C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * usbdsc.c should be updated to call all available C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * class handlers. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * 3. Once each of the modules has had a chance to check if C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * it is responsible for servicing the request, stage 3 C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * then checks direction of the transfer to determine how C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * to prepare EP0 for the control transfer. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Refer to USBCtrlEPServiceComplete() for more details. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Note: Microchip USB Firmware has three different states for C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * the control transfer state machine: C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * 1. WAIT_SETUP C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * 2. CTRL_TRF_TX C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * 3. CTRL_TRF_RX C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Refer to firmware manual to find out how one state C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * is transitioned to another. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * A Control Transfer is composed of many USB transactions. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * When transferring data over multiple transactions, C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * it is important to keep track of data source, data C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * destination, and data count. These three parameters are C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * stored in pSrc,pDst, and wCount. A flag is used to C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * note if the data source is from ROM or RAM. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlTrfSetupHandler(void) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c byte i; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /* Stage 1 */ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000312 0100 MOVLB 0x0 ctrl_trf_state = WAIT_SETUP; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000314 6b60 CLRF 0x60,0x1 000316 6b61 CLRF 0x61,0x1 ctrl_trf_session_owner = MUID_NULL; // Set owner to NULL C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000318 6b66 CLRF 0x66,0x1 wCount._word = 0; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00031a 6b67 CLRF 0x67,0x1 C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /* Stage 2 */ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00031c ec5d CALL 0x4ba,0x0 USBCheckStdRequest(); // See system\usb9\usb9.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00031e f002 C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /* Modifiable Section */ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /* Insert other USB Device Class Request Handlers here */ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /* End Modifiable Section */ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /* Stage 3 */ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000320 ef14 GOTO 0x428 USBCtrlEPServiceComplete(); C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000322 f002 C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c }//end USBCtrlTrfSetupHandler C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlTrfOutHandler(void) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Overview: This routine handles an OUT transaction according to C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * which control transfer state is currently active. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Note: Note that if the the control transfer was from C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * host to device, the session owner should be notified C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * at the end of each OUT transaction to service the C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * received data. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlTrfOutHandler(void) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000324 0e02 MOVLW 0x2 if(ctrl_trf_state == CTRL_TRF_RX) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000326 0100 MOVLB 0x0 000328 5d60 SUBWF 0x60,0x0,0x1 00032a e109 BNZ 0x33e { C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00032c d85c RCALL 0x3e6 USBCtrlTrfRxService(); C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Don't have to worry about overwriting _KEEP bit C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * because if _KEEP was set, TRNIF would not have been C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * generated in the first place. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00032e 0104 MOVLB 0x4 if(ep0Bo.Stat.DTS == 0) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000330 bd00 BTFSC 0x0,0x6,0x1 000332 d002 BRA 0x338 000334 0ec8 MOVLW 0xc8 ep0Bo.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000336 d001 BRA 0x33a else C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000338 0e88 MOVLW 0x88 ep0Bo.Stat._byte = _USIE|_DAT0|_DTSEN; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00033a 6f00 MOVWF 0x0,0x1 } C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00033c 0012 RETURN 0x0 else // CTRL_TRF_TX C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00033e ef4d GOTO 0x49a USBPrepareForNextSetupTrf(); C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000340 f002 C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c }//end USBCtrlTrfOutHandler C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlTrfInHandler(void) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Overview: This routine handles an IN transaction according to C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * which control transfer state is currently active. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Note: A Set Address Request must not change the acutal address C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * of the device until the completion of the control C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * transfer. The end of the control transfer for Set Address C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Request is an IN transaction. Therefore it is necessary C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * to service this unique situation when the condition is C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * right. Macro mUSBCheckAdrPendingState is defined in C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * usb9.h and its function is to specifically service this C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * event. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlTrfInHandler(void) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000342 0e04 MOVLW 0x4 mUSBCheckAdrPendingState(); // Must check if in ADR_PENDING_STATE C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000344 0100 MOVLB 0x0 000346 5d7c SUBWF 0x7c,0x0,0x1 000348 e109 BNZ 0x35c 00034a c412 MOVFF 0x412,0xf6e 00034c ff6e 00034e 506e MOVF 0x6e,0x0,0x0 000350 0800 SUBLW 0x0 000352 e202 BC 0x358 000354 0e05 MOVLW 0x5 000356 d001 BRA 0x35a 000358 0e03 MOVLW 0x3 00035a 6f7c MOVWF 0x7c,0x1 C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00035c 0100 MOVLB 0x0 if(ctrl_trf_state == CTRL_TRF_TX) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00035e 0560 DECF 0x60,0x0,0x1 000360 e109 BNZ 0x374 { C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000362 d80a RCALL 0x378 USBCtrlTrfTxService(); C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000364 0104 MOVLB 0x4 if(ep0Bi.Stat.DTS == 0) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000366 bd04 BTFSC 0x4,0x6,0x1 000368 d002 BRA 0x36e 00036a 0ec8 MOVLW 0xc8 ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00036c d001 BRA 0x370 else C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00036e 0e88 MOVLW 0x88 ep0Bi.Stat._byte = _USIE|_DAT0|_DTSEN; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000370 6f04 MOVWF 0x4,0x1 } C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000372 0012 RETURN 0x0 else // CTRL_TRF_RX C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000374 ef4d GOTO 0x49a USBPrepareForNextSetupTrf(); C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000376 f002 C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c }//end USBCtrlTrfInHandler C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlTrfTxService(void) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: pSrc, wCount, and usb_stat.ctrl_trf_mem are setup properly. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Overview: This routine should be called from only two places. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * One from USBCtrlEPServiceComplete() and one from C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * USBCtrlTrfInHandler(). It takes care of managing a C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * transfer over multiple USB transactions. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Note: This routine works with isochronous endpoint larger than C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * 256 bytes and is shown here as an example of how to deal C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * with BC9 and BC8. In reality, a control endpoint can never C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * be larger than 64 bytes. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlTrfTxService(void) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c byte byte_to_send; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * First, have to figure out how many byte of data to send. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000378 0100 MOVLB 0x0 if(wCount._word < EP0_BUFF_SIZE) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00037a 0e08 MOVLW 0x8 00037c 5d66 SUBWF 0x66,0x0,0x1 00037e 0e00 MOVLW 0x0 000380 5967 SUBWFB 0x67,0x0,0x1 000382 e203 BC 0x38a 000384 c066 MOVFF 0x66,0x69 byte_to_send = wCount._word; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000386 f069 000388 d002 BRA 0x38e else C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00038a 0e08 MOVLW 0x8 byte_to_send = EP0_BUFF_SIZE; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00038c 6f69 MOVWF 0x69,0x1 C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00038e c069 MOVFF 0x69,0x405 ep0Bi.Cnt = byte_to_send; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000390 f405 C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Subtract the number of bytes just about to be sent from the total. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000392 5169 MOVF 0x69,0x0,0x1 wCount._word -= byte_to_send; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000394 6e00 MOVWF 0x0,0x0 000396 6a01 CLRF 0x1,0x0 000398 5000 MOVF 0x0,0x0,0x0 00039a 5f66 SUBWF 0x66,0x1,0x1 00039c 5001 MOVF 0x1,0x0,0x0 00039e 5b67 SUBWFB 0x67,0x1,0x1 C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0003a0 0e18 MOVLW 0x18 pDst.bRam = (byte*)&CtrlTrfData; // Set destination pointer C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0003a2 6f64 MOVWF 0x64,0x1 0003a4 0e04 MOVLW 0x4 0003a6 6f65 MOVWF 0x65,0x1 C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0003a8 5169 MOVF 0x69,0x0,0x1 while(byte_to_send) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0003aa e01c BZ 0x3e4 0003e2 d7e2 BRA 0x3a8 { C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0003ac 0100 MOVLB 0x0 if(usb_stat.ctrl_trf_mem == _ROM) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0003ae a37d BTFSS 0x7d,0x1,0x1 0003b0 d007 BRA 0x3c0 { C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0003b2 c062 MOVFF 0x62,0xff6 *pDst.bRam = *pSrc.bRom; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0003b4 fff6 0003b6 c063 MOVFF 0x63,0xff7 0003b8 fff7 0003ba 0008 TBLRD 0003bc 50f5 MOVF 0xf5,0x0,0x0 pSrc.bRom++; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c } C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0003be d005 BRA 0x3ca else C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0003c0 c062 MOVFF 0x62,0xfe9 *pDst.bRam = *pSrc.bRam; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0003c2 ffe9 0003c4 c063 MOVFF 0x63,0xfea 0003c6 ffea 0003c8 50ef MOVF 0xef,0x0,0x0 0003ca c064 MOVFF 0x64,0xfe9 0003cc ffe9 0003ce c065 MOVFF 0x65,0xfea 0003d0 ffea 0003d2 6eef MOVWF 0xef,0x0 0003d4 0100 MOVLB 0x0 pSrc.bRam++; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0003d6 2b62 INCF 0x62,0x1,0x1 0003d8 0e00 MOVLW 0x0 0003da 2363 ADDWFC 0x63,0x1,0x1 }//end if else C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0003dc 2b64 INCF 0x64,0x1,0x1 pDst.bRam++; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0003de 2365 ADDWFC 0x65,0x1,0x1 0003e0 0769 DECF 0x69,0x1,0x1 byte_to_send--; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c }//end while C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0003e4 0012 RETURN 0x0 }//end USBCtrlTrfTxService C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlTrfRxService(void) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: pDst and wCount are setup properly. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * pSrc is always &CtrlTrfData C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * usb_stat.ctrl_trf_mem is always _RAM. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * wCount should be set to 0 at the start of each control C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * transfer. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Overview: *** This routine is only partially complete. Check for C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * new version of the firmware. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Note: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlTrfRxService(void) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c byte byte_to_read; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0003e6 c401 MOVFF 0x401,0x6a byte_to_read = ep0Bo.Cnt; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0003e8 f06a C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Accumulate total number of bytes read C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0003ea 0100 MOVLB 0x0 wCount._word = wCount._word + byte_to_read; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0003ec 516a MOVF 0x6a,0x0,0x1 0003ee 2566 ADDWF 0x66,0x0,0x1 0003f0 6f66 MOVWF 0x66,0x1 0003f2 0e00 MOVLW 0x0 0003f4 2167 ADDWFC 0x67,0x0,0x1 0003f6 6f67 MOVWF 0x67,0x1 C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0003f8 0e18 MOVLW 0x18 pSrc.bRam = (byte*)&CtrlTrfData; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0003fa 6f62 MOVWF 0x62,0x1 0003fc 0e04 MOVLW 0x4 0003fe 6f63 MOVWF 0x63,0x1 C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000400 516a MOVF 0x6a,0x0,0x1 while(byte_to_read) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000402 e011 BZ 0x426 000424 d7ed BRA 0x400 { C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000404 c062 MOVFF 0x62,0xfe9 *pDst.bRam = *pSrc.bRam; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000406 ffe9 000408 c063 MOVFF 0x63,0xfea 00040a ffea 00040c 50ef MOVF 0xef,0x0,0x0 00040e c064 MOVFF 0x64,0xfe9 000410 ffe9 000412 c065 MOVFF 0x65,0xfea 000414 ffea 000416 6eef MOVWF 0xef,0x0 000418 2b64 INCF 0x64,0x1,0x1 pDst.bRam++; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00041a 0e00 MOVLW 0x0 00041c 2365 ADDWFC 0x65,0x1,0x1 00041e 2b62 INCF 0x62,0x1,0x1 pSrc.bRam++; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000420 2363 ADDWFC 0x63,0x1,0x1 000422 076a DECF 0x6a,0x1,0x1 byte_to_read--; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c }//end while(byte_to_read) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000426 0012 RETURN 0x0 }//end USBCtrlTrfRxService C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlEPServiceComplete(void) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Overview: This routine wrap up the ramaining tasks in servicing C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * a Setup Request. Its main task is to set the endpoint C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * controls appropriately for a given situation. See code C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * below. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * There are three main scenarios: C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * a) There was no handler for the Request, in this case C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * a STALL should be sent out. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * b) The host has requested a read control transfer, C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * endpoints are required to be setup in a specific way. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * c) The host has requested a write control transfer, or C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * a control data stage is not required, endpoints are C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * required to be setup in a specific way. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Packet processing is resumed by clearing PKTDIS bit. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Note: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlEPServiceComplete(void) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000428 0100 MOVLB 0x0 if(ctrl_trf_session_owner == MUID_NULL) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00042a 5161 MOVF 0x61,0x0,0x1 00042c e105 BNZ 0x438 { C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * If no one knows how to service this request then stall. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Must also prepare EP0 to receive the next SETUP transaction. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00042e d83d RCALL 0x4aa ep0Bo.Cnt = EP0_BUFF_SIZE; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c ep0Bo.ADR = (byte*)&SetupPkt; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000430 0e84 MOVLW 0x84 ep0Bo.Stat._byte = _USIE|_BSTALL; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000432 6f00 MOVWF 0x0,0x1 000434 0104 MOVLB 0x4 ep0Bi.Stat._byte = _USIE|_BSTALL; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c } C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000436 d01d BRA 0x472 else // A module has claimed ownership of the control transfer session. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000438 0104 MOVLB 0x4 if(SetupPkt.DataDir == DEV_TO_HOST) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00043a af10 BTFSS 0x10,0x7,0x1 00043c d01c BRA 0x476 { C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00043e 0100 MOVLB 0x0 if(SetupPkt.wLength < wCount._word) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000440 5166 MOVF 0x66,0x0,0x1 000442 0104 MOVLB 0x4 000444 5d16 SUBWF 0x16,0x0,0x1 000446 0100 MOVLB 0x0 000448 5167 MOVF 0x67,0x0,0x1 00044a 0104 MOVLB 0x4 00044c 5917 SUBWFB 0x17,0x0,0x1 00044e e204 BC 0x458 000450 c416 MOVFF 0x416,0x66 wCount._word = SetupPkt.wLength; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000452 f066 000454 c417 MOVFF 0x417,0x67 000456 f067 000458 df8f RCALL 0x378 USBCtrlTrfTxService(); C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00045a 0100 MOVLB 0x0 ctrl_trf_state = CTRL_TRF_TX; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00045c 0e01 MOVLW 0x1 00045e 6f60 MOVWF 0x60,0x1 /* C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Control Read: C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * ... | C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * 1. Prepare OUT EP to respond to early termination C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * NOTE: C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * If something went wrong during the control transfer, C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * the last status stage may not be sent by the host. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * When this happens, two different things could happen C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * depending on the host. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * a) The host could send out a RESET. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * b) The host could send out a new SETUP transaction C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * without sending a RESET first. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * To properly handle case (b), the OUT EP must be setup C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * to receive either a zero length OUT transaction, or a C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * new SETUP transaction. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Since the SETUP transaction requires the DTS bit to be C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * DAT0 while the zero length OUT status requires the DTS C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * bit to be DAT1, the DTS bit check by the hardware should C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * be disabled. This way the SIE could accept either of C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * the two transactions. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Furthermore, the Cnt byte should be set to prepare for C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * the SETUP data (8-byte or more), and the buffer address C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * should be pointed to SetupPkt. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000460 d824 RCALL 0x4aa ep0Bo.Cnt = EP0_BUFF_SIZE; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c ep0Bo.ADR = (byte*)&SetupPkt; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000462 0e80 MOVLW 0x80 ep0Bo.Stat._byte = _USIE; // Note: DTSEN is 0! C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000464 6f00 MOVWF 0x0,0x1 C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * 2. Prepare IN EP to transfer data, Cnt should have C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * been initialized by responsible request owner. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000466 0104 MOVLB 0x4 ep0Bi.ADR = (byte*)&CtrlTrfData; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000468 0e18 MOVLW 0x18 00046a 6f06 MOVWF 0x6,0x1 00046c 0e04 MOVLW 0x4 00046e 6f07 MOVWF 0x7,0x1 000470 0ec8 MOVLW 0xc8 ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000472 6f04 MOVWF 0x4,0x1 } C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000474 d010 BRA 0x496 else // (SetupPkt.DataDir == HOST_TO_DEV) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000476 0100 MOVLB 0x0 ctrl_trf_state = CTRL_TRF_RX; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000478 0e02 MOVLW 0x2 00047a 6f60 MOVWF 0x60,0x1 /* C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Control Write: C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * ... | C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * 1. Prepare IN EP to respond to early termination C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * This is the same as a Zero Length Packet Response C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * for control transfer without a data stage C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00047c 0104 MOVLB 0x4 ep0Bi.Cnt = 0; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00047e 6b05 CLRF 0x5,0x1 000480 0ec8 MOVLW 0xc8 ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000482 6f04 MOVWF 0x4,0x1 C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * 2. Prepare OUT EP to receive data. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000484 0104 MOVLB 0x4 ep0Bo.Cnt = EP0_BUFF_SIZE; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000486 0e08 MOVLW 0x8 000488 6f01 MOVWF 0x1,0x1 00048a 0e18 MOVLW 0x18 ep0Bo.ADR = (byte*)&CtrlTrfData; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00048c 6f02 MOVWF 0x2,0x1 00048e 0e04 MOVLW 0x4 000490 6f03 MOVWF 0x3,0x1 000492 0ec8 MOVLW 0xc8 ep0Bo.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000494 6f00 MOVWF 0x0,0x1 }//end if(SetupPkt.DataDir == DEV_TO_HOST) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c }//end if(ctrl_trf_session_owner == MUID_NULL) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * PKTDIS bit is set when a Setup Transaction is received. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Clear to resume packet processing. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000496 986d BCF 0x6d,0x4,0x0 UCONbits.PKTDIS = 0; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 000498 0012 RETURN 0x0 }//end USBCtrlEPServiceComplete C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBPrepareForNextSetupTrf(void) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Overview: The routine forces EP0 OUT to be ready for a new Setup C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * transaction, and forces EP0 IN to be owned by CPU. C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c * Note: None C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c void USBPrepareForNextSetupTrf(void) C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00049a 0100 MOVLB 0x0 ctrl_trf_state = WAIT_SETUP; // See usbctrltrf.h C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 00049c 6b60 CLRF 0x60,0x1 00049e d805 RCALL 0x4aa ep0Bo.Cnt = EP0_BUFF_SIZE; // Defined in usbcfg.h C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0004aa 0104 MOVLB 0x4 0004ac 0e08 MOVLW 0x8 0004ae 6f01 MOVWF 0x1,0x1 0004b0 0e10 MOVLW 0x10 ep0Bo.ADR = (byte*)&SetupPkt; C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0004b2 6f02 MOVWF 0x2,0x1 0004b4 0e04 MOVLW 0x4 0004b6 6f03 MOVWF 0x3,0x1 0004b8 0012 RETURN 0x0 0004a0 0e88 MOVLW 0x88 ep0Bo.Stat._byte = _USIE|_DAT0|_DTSEN; // EP0 buff dsc init, see usbmmap.h C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0004a2 6f00 MOVWF 0x0,0x1 0004a4 0104 MOVLB 0x4 ep0Bi.Stat._byte = _UCPU; // EP0 IN buffer initialization C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c 0004a6 6b04 CLRF 0x4,0x1 0004a8 0012 RETURN 0x0 }//end USBPrepareForNextSetupTrf C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /** EOF usbctrltrf.c *********************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\usbctrltrf\usbctrltrf.c /********************************************************************* C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * Microchip USB C18 Firmware - USB Bootloader Version 1.00 C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c ********************************************************************* C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * FileName: boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * Processor: PIC18 C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * Software License Agreement C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * license. C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * Author Date Comment C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * Rawin Rojvanit 11/19/04 Original. USB Bootloader C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c ********************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * -boot.c- C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * This file contains functions necessary to carry out bootloading tasks. C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * The only 2 USB specific functions are BootInitEP() and BootService(). C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * All other functions can be reused with other communication methods. C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c #include C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c #include "system\typedefs.h" C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c #include "system\usb\usb.h" C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c #include "io_cfg.h" C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c /** V A R I A B L E S ********************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c #pragma udata C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c byte counter; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c byte byteTemp; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c byte trf_state; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c word big_counter; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c /** P R I V A T E P R O T O T Y P E S ***************************************/ C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c void BlinkUSBStatus(void); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c /** D E C L A R A T I O N S **************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c #pragma code C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c /** C L A S S S P E C I F I C R E Q ****************************************/ C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c /** U S E R A P I ***********************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * Function: void BootInitEP(void) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * PreCondition: None C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * Input: None C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * Output: None C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * Side Effects: None C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * Overview: BootInitEP initializes bootloader endpoints, buffer C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * descriptors, internal state-machine, and variables. C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * It should be called after the USB host has sent out a C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * SET_CONFIGURATION request. C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * See USBStdSetCfgHandler() in usb9.c for examples. C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * Note: None C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c void BootInitEP(void) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000020 0100 MOVLB 0x0 trf_state = WAIT_FOR_CMD; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000022 6b77 CLRF 0x77,0x1 000024 0e1e MOVLW 0x1e BOOT_UEP = EP_OUT_IN|HSHK_EN; // Enable 2 data pipes C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000026 6e71 MOVWF 0x71,0x0 C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c /* C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * Do not have to init Cnt of IN pipes here. C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * Reason: Number of bytes to send to the host C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * varies from one transaction to C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * another. Cnt should equal the exact C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * number of bytes to transmit for C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * a given IN transaction. C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * This number of bytes will only C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * be known right before the data is C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * sent. C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c */ C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000028 0104 MOVLB 0x4 BOOT_BD_OUT.Cnt = sizeof(dataPacket); // Set buffer size C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00002a 0e40 MOVLW 0x40 00002c 6f09 MOVWF 0x9,0x1 00002e 0e20 MOVLW 0x20 BOOT_BD_OUT.ADR = (byte*)&dataPacket; // Set buffer address C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000030 6f0a MOVWF 0xa,0x1 000032 0e04 MOVLW 0x4 000034 6f0b MOVWF 0xb,0x1 000036 0e88 MOVLW 0x88 BOOT_BD_OUT.Stat._byte = _USIE|_DAT0|_DTSEN;// Set status C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000038 6f08 MOVWF 0x8,0x1 C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00003a 0104 MOVLB 0x4 BOOT_BD_IN.ADR = (byte*)&dataPacket; // Set buffer address C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00003c 0e20 MOVLW 0x20 00003e 6f0e MOVWF 0xe,0x1 000040 0e04 MOVLW 0x4 000042 6f0f MOVWF 0xf,0x1 000044 0e40 MOVLW 0x40 BOOT_BD_IN.Stat._byte = _UCPU|_DAT1; // Set buffer status C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000046 6f0c MOVWF 0xc,0x1 C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000048 0012 RETURN 0x0 }//end BootInitEP C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c void StartWrite(void) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c /* C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * A write command can be prematurely terminated by MCLR or WDT reset C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c */ C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00004a 0e55 MOVLW 0x55 EECON2 = 0x55; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00004c 6ea7 MOVWF 0xa7,0x0 00004e 0eaa MOVLW 0xaa EECON2 = 0xAA; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000050 6ea7 MOVWF 0xa7,0x0 000052 82a6 BSF 0xa6,0x1,0x0 EECON1_WR = 1; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000054 0012 RETURN 0x0 }//end StartWrite C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c void ReadVersion(void) //TESTED: Passed C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000056 0104 MOVLB 0x4 dataPacket._byte[2] = MINOR_VERSION; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000058 6b22 CLRF 0x22,0x1 00005a 0e01 MOVLW 0x1 dataPacket._byte[3] = MAJOR_VERSION; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00005c 6f23 MOVWF 0x23,0x1 00005e 0012 RETURN 0x0 }//end ReadVersion C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c void ReadProgMem(void) //TESTED: Passed C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000060 0100 MOVLB 0x0 for (counter = 0; counter < dataPacket.len; counter++) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000062 6b75 CLRF 0x75,0x1 000064 d928 RCALL 0x2b6 000066 e20a BC 0x7c 000078 2b75 INCF 0x75,0x1,0x1 00007a d7f4 BRA 0x64 { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c //2 separate inst prevents compiler from using RAM stack C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000068 d933 RCALL 0x2d0 byteTemp = *((dataPacket.ADR.pAdr)+counter); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00006a 0008 TBLRD 00006c cff5 MOVFF 0xff5,0x76 00006e f076 0002d0 c075 MOVFF 0x75,0x0 0002d2 f000 0002d4 6a01 CLRF 0x1,0x0 0002d6 6a02 CLRF 0x2,0x0 0002d8 ef45 GOTO 0x28a 0002da f001 000070 0100 MOVLB 0x0 dataPacket.data[counter] = byteTemp; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000072 d91a RCALL 0x2a8 000074 c076 MOVFF 0x76,0xfef 000076 ffef }//end for C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00007c 6af8 CLRF 0xf8,0x0 TBLPTRU = 0x00; // forces upper byte back to 0x00 C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // optional fix is to set large code model C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00007e 0012 RETURN 0x0 }//end ReadProgMem C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c void WriteProgMem(void) //TESTED: Passed C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c /* C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * The write holding register for the 18F4550 family is C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * actually 32-byte. The code below only tries to write C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * 16-byte because the GUI program only sends out 16-byte C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * at a time. C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * This limitation will be fixed in the future version. C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c */ C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000080 0ef0 MOVLW 0xf0 dataPacket.ADR.low &= 0b11110000; //Force 16-byte boundary C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000082 0104 MOVLB 0x4 000084 1722 ANDWF 0x22,0x1,0x1 000086 0e84 MOVLW 0x84 EECON1 = 0b10000100; //Setup writes: EEPGD=1,WREN=1 C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000088 6ea6 MOVWF 0xa6,0x0 C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c //LEN = # of byte to write C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00008a 0100 MOVLB 0x0 for (counter = 0; counter < (dataPacket.len); counter++) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00008c 6b75 CLRF 0x75,0x1 00008e d913 RCALL 0x2b6 000090 e20a BC 0xa6 0000a0 0100 MOVLB 0x0 0000a2 2b75 INCF 0x75,0x1,0x1 0000a4 d7f4 BRA 0x8e { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000092 d916 RCALL 0x2c0 *((dataPacket.ADR.pAdr)+counter) = \ C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0002c0 dff3 RCALL 0x2a8 0002c2 cfef MOVFF 0xfef,0x3 0002c4 f003 0002c6 d804 RCALL 0x2d0 0002c8 c003 MOVFF 0x3,0xff5 0002ca fff5 0002cc 000c TBLWT 0002ce 0012 RETURN 0x0 dataPacket.data[counter]; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000094 0e0f MOVLW 0xf if ((counter & 0b00001111) == 0b00001111) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000096 0100 MOVLB 0x0 000098 1575 ANDWF 0x75,0x0,0x1 00009a 080f SUBLW 0xf 00009c e101 BNZ 0xa0 { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00009e dfd5 RCALL 0x4a StartWrite(); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c }//end if C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c }//end for C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0000a6 0012 RETURN 0x0 }//end WriteProgMem C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c void EraseProgMem(void) //TESTED: Passed C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c //The most significant 16 bits of the address pointer points to the block C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c //being erased. Bits5:0 are ignored. (In hardware). C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c //LEN = # of 64-byte block to erase C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0000a8 0e94 MOVLW 0x94 EECON1 = 0b10010100; //Setup writes: EEPGD=1,FREE=1,WREN=1 C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0000aa 6ea6 MOVWF 0xa6,0x0 0000ac 0100 MOVLB 0x0 for(counter=0; counter < dataPacket.len; counter++) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0000ae 6b75 CLRF 0x75,0x1 0000b0 d902 RCALL 0x2b6 0000b2 e211 BC 0xd6 0000d0 0100 MOVLB 0x0 0000d2 2b75 INCF 0x75,0x1,0x1 0000d4 d7ed BRA 0xb0 { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0000b4 5175 MOVF 0x75,0x0,0x1 *(dataPacket.ADR.pAdr+(((int)counter) << 6)); //Load TBLPTR C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0000b6 6e00 MOVWF 0x0,0x0 0000b8 6a01 CLRF 0x1,0x0 0000ba 0e06 MOVLW 0x6 0000bc 90d8 BCF 0xd8,0x0,0x0 0000be 3600 RLCF 0x0,0x1,0x0 0000c0 3601 RLCF 0x1,0x1,0x0 0000c2 04e8 DECF 0xe8,0x0,0x0 0000c4 e1fb BNZ 0xbc 0000c6 6a02 CLRF 0x2,0x0 0000c8 be01 BTFSC 0x1,0x7,0x0 0000ca 6802 SETF 0x2,0x0 0000cc d8de RCALL 0x28a 0000ce dfbd RCALL 0x4a StartWrite(); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c }//end for C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0000d6 6af8 CLRF 0xf8,0x0 TBLPTRU = 0; // forces upper byte back to 0x00 C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // optional fix is to set large code model C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // (for USER ID 0x20 0x00 0x00) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0000d8 0012 RETURN 0x0 }//end EraseProgMem C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c void ReadEE(void) //TESTED: Passed C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0000da 6aa6 CLRF 0xa6,0x0 EECON1 = 0x00; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0000dc 0100 MOVLB 0x0 for(counter=0; counter < dataPacket.len; counter++) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0000de 6b75 CLRF 0x75,0x1 0000e0 d8ea RCALL 0x2b6 0000e2 e20b BC 0xfa 0000f6 2b75 INCF 0x75,0x1,0x1 0000f8 d7f3 BRA 0xe0 { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0000e4 0104 MOVLB 0x4 EEADR = (byte)dataPacket.ADR.pAdr + counter; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0000e6 5122 MOVF 0x22,0x0,0x1 0000e8 0100 MOVLB 0x0 0000ea 2575 ADDWF 0x75,0x0,0x1 0000ec 6ea9 MOVWF 0xa9,0x0 //EEADRH = (BYTE)(((int)dataPacket.FIELD.ADDR.POINTER + counter) >> 8); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0000ee 80a6 BSF 0xa6,0x0,0x0 EECON1_RD = 1; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0000f0 d8db RCALL 0x2a8 dataPacket.data[counter] = EEDATA; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0000f2 cfa8 MOVFF 0xfa8,0xfef 0000f4 ffef }//end for C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0000fa 0012 RETURN 0x0 }//end ReadEE C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c void WriteEE(void) //TESTED: Passed C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0000fc 0100 MOVLB 0x0 for(counter=0; counter < dataPacket.len; counter++) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0000fe 6b75 CLRF 0x75,0x1 000100 d8da RCALL 0x2b6 000102 e210 BC 0x124 00011e 0100 MOVLB 0x0 000120 2b75 INCF 0x75,0x1,0x1 000122 d7ee BRA 0x100 { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000104 0104 MOVLB 0x4 EEADR = (byte)dataPacket.ADR.pAdr + counter; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000106 5122 MOVF 0x22,0x0,0x1 000108 0100 MOVLB 0x0 00010a 2575 ADDWF 0x75,0x0,0x1 00010c 6ea9 MOVWF 0xa9,0x0 //EEADRH = (BYTE)(((int)dataPacket.FIELD.ADDR.POINTER + counter) >> 8); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00010e d8cc RCALL 0x2a8 EEDATA = dataPacket.data[counter]; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000110 50ef MOVF 0xef,0x0,0x0 000112 6ea8 MOVWF 0xa8,0x0 000114 0e04 MOVLW 0x4 EECON1 = 0b00000100; //Setup writes: EEPGD=0,WREN=1 C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000116 6ea6 MOVWF 0xa6,0x0 000118 df98 RCALL 0x4a StartWrite(); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00011a b2a6 BTFSC 0xa6,0x1,0x0 while(EECON1_WR); //Wait till WR bit is clear C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00011c d7fe BRA 0x11a }//end for C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000124 0012 RETURN 0x0 }//end WriteEE C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c //WriteConfig is different from WriteProgMem b/c it can write a byte C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c void WriteConfig(void) //TESTED: Passed C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000126 0ec4 MOVLW 0xc4 EECON1 = 0b11000100; //Setup writes: EEPGD=1,CFGS=1,WREN=1 C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000128 6ea6 MOVWF 0xa6,0x0 00012a 0100 MOVLB 0x0 for (counter = 0; counter < dataPacket.len; counter++) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00012c 6b75 CLRF 0x75,0x1 00012e d8c3 RCALL 0x2b6 000130 e205 BC 0x13c 000136 0100 MOVLB 0x0 000138 2b75 INCF 0x75,0x1,0x1 00013a d7f9 BRA 0x12e 0002b6 0104 MOVLB 0x4 0002b8 5121 MOVF 0x21,0x0,0x1 0002ba 0100 MOVLB 0x0 0002bc 5d75 SUBWF 0x75,0x0,0x1 0002be 0012 RETURN 0x0 { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000132 d8c6 RCALL 0x2c0 *((dataPacket.ADR.pAdr)+counter) = \ C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00028a 0104 MOVLB 0x4 00028c 5122 MOVF 0x22,0x0,0x1 00028e 2400 ADDWF 0x0,0x0,0x0 000290 6ef3 MOVWF 0xf3,0x0 000292 5123 MOVF 0x23,0x0,0x1 000294 2001 ADDWFC 0x1,0x0,0x0 000296 6ef4 MOVWF 0xf4,0x0 000298 5124 MOVF 0x24,0x0,0x1 00029a 2002 ADDWFC 0x2,0x0,0x0 00029c 6ef8 MOVWF 0xf8,0x0 00029e cff4 MOVFF 0xff4,0xff7 0002a0 fff7 0002a2 cff3 MOVFF 0xff3,0xff6 0002a4 fff6 0002a6 0012 RETURN 0x0 0002a8 5175 MOVF 0x75,0x0,0x1 0002aa 6aea CLRF 0xea,0x0 0002ac 0f25 ADDLW 0x25 0002ae 6ee9 MOVWF 0xe9,0x0 0002b0 0e04 MOVLW 0x4 0002b2 22ea ADDWFC 0xea,0x1,0x0 0002b4 0012 RETURN 0x0 dataPacket.data[counter]; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000134 df8a RCALL 0x4a StartWrite(); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c }//end for C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00013c 6af8 CLRF 0xf8,0x0 TBLPTRU = 0x00; // forces upper byte back to 0x00 C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // optional fix is to set large code model C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00013e 0012 RETURN 0x0 }//end WriteConfig C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c void BootService(void) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000140 d88b RCALL 0x258 BlinkUSBStatus(); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000142 0e06 MOVLW 0x6 if((usb_device_state < CONFIGURED_STATE)||(UCONbits.SUSPND==1)) return; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000144 0100 MOVLB 0x0 000146 5d7c SUBWF 0x7c,0x0,0x1 000148 e303 BNC 0x150 00014a 506d MOVF 0x6d,0x0,0x0 00014c 0b02 ANDLW 0x2 00014e e001 BZ 0x152 000150 d082 BRA 0x256 C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000152 0100 MOVLB 0x0 if(trf_state == SENDING_RESP) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000154 0577 DECF 0x77,0x0,0x1 000156 e111 BNZ 0x17a { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000158 0104 MOVLB 0x4 if(!mBootTxIsBusy()) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00015a bf0c BTFSC 0xc,0x7,0x1 00015c d00d BRA 0x178 { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00015e 0104 MOVLB 0x4 BOOT_BD_OUT.Cnt = sizeof(dataPacket); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000160 0e40 MOVLW 0x40 000162 6f09 MOVWF 0x9,0x1 000164 0e40 MOVLW 0x40 mUSBBufferReady(BOOT_BD_OUT); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000166 0104 MOVLB 0x4 000168 1708 ANDWF 0x8,0x1,0x1 00016a 0104 MOVLB 0x4 00016c 7d08 BTG 0x8,0x6,0x1 00016e 0e88 MOVLW 0x88 000170 0104 MOVLB 0x4 000172 1308 IORWF 0x8,0x1,0x1 000174 0100 MOVLB 0x0 trf_state = WAIT_FOR_CMD; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000176 6b77 CLRF 0x77,0x1 }//end if C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000178 d06e BRA 0x256 return; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c }//end if C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00017a 0104 MOVLB 0x4 if(!mBootRxIsBusy()) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00017c bf08 BTFSC 0x8,0x7,0x1 00017e d06b BRA 0x256 { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000180 0100 MOVLB 0x0 counter = 0; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000182 6b75 CLRF 0x75,0x1 000184 0104 MOVLB 0x4 switch(dataPacket.CMD) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000186 5120 MOVF 0x20,0x0,0x1 000188 0a32 XORLW 0x32 00018a e045 BZ 0x216 00018c 0acd XORLW 0xcd 00018e e034 BZ 0x1f8 000190 0af8 XORLW 0xf8 000192 e02d BZ 0x1ee 000194 0a02 XORLW 0x2 000196 e026 BZ 0x1e4 000198 0a01 XORLW 0x1 00019a e01f BZ 0x1da 00019c 0a07 XORLW 0x7 00019e e018 BZ 0x1d0 0001a0 0a01 XORLW 0x1 0001a2 e011 BZ 0x1c6 0001a4 0a03 XORLW 0x3 0001a6 e00a BZ 0x1bc 0001a8 0a07 XORLW 0x7 0001aa e008 BZ 0x1bc 0001ac 0a06 XORLW 0x6 0001ae e001 BZ 0x1b2 0001b0 d041 BRA 0x234 { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c case READ_VERSION: C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0001b2 df51 RCALL 0x56 ReadVersion(); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0001b4 0100 MOVLB 0x0 counter=0x04; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0001b6 0e04 MOVLW 0x4 0001b8 6f75 MOVWF 0x75,0x1 0001ba d03d BRA 0x236 break; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c case READ_FLASH: C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c case READ_CONFIG: C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0001bc df51 RCALL 0x60 ReadProgMem(); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0001be 0e05 MOVLW 0x5 counter+=0x05; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0001c0 0100 MOVLB 0x0 0001c2 2775 ADDWF 0x75,0x1,0x1 0001c4 d038 BRA 0x236 break; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c case WRITE_FLASH: C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0001c6 df5c RCALL 0x80 WriteProgMem(); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0001c8 0100 MOVLB 0x0 counter=0x01; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0001ca 0e01 MOVLW 0x1 0001cc 6f75 MOVWF 0x75,0x1 0001ce d033 BRA 0x236 break; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c case ERASE_FLASH: C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0001d0 df6b RCALL 0xa8 EraseProgMem(); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0001d2 0100 MOVLB 0x0 counter=0x01; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0001d4 0e01 MOVLW 0x1 0001d6 6f75 MOVWF 0x75,0x1 0001d8 d02e BRA 0x236 break; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c case READ_EEDATA: C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0001da df7f RCALL 0xda ReadEE(); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0001dc 0e05 MOVLW 0x5 counter+=0x05; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0001de 0100 MOVLB 0x0 0001e0 2775 ADDWF 0x75,0x1,0x1 0001e2 d029 BRA 0x236 break; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c case WRITE_EEDATA: C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0001e4 df8b RCALL 0xfc WriteEE(); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0001e6 0100 MOVLB 0x0 counter=0x01; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0001e8 0e01 MOVLW 0x1 0001ea 6f75 MOVWF 0x75,0x1 0001ec d024 BRA 0x236 break; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c case WRITE_CONFIG: C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0001ee df9b RCALL 0x126 WriteConfig(); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0001f0 0100 MOVLB 0x0 counter=0x01; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0001f2 0e01 MOVLW 0x1 0001f4 6f75 MOVWF 0x75,0x1 0001f6 d01f BRA 0x236 break; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c case RESET: C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c //When resetting, make sure to drop the device off the bus C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c //for a period of time. Helps when the device is suspended. C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0001f8 966d BCF 0x6d,0x3,0x0 UCONbits.USBEN = 0; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0001fa 0100 MOVLB 0x0 big_counter = 0; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 0001fc 6b78 CLRF 0x78,0x1 0001fe 6b79 CLRF 0x79,0x1 000200 0100 MOVLB 0x0 while(--big_counter); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000202 0778 DECF 0x78,0x1,0x1 000204 0e00 MOVLW 0x0 000206 5b79 SUBWFB 0x79,0x1,0x1 000208 0100 MOVLB 0x0 00020a 5178 MOVF 0x78,0x0,0x1 00020c 1179 IORWF 0x79,0x0,0x1 00020e e001 BZ 0x212 000210 d7f7 BRA 0x200 C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000212 00ff RESET Reset(); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000214 d010 BRA 0x236 break; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c case UPDATE_LED: C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000216 0e03 MOVLW 0x3 if(dataPacket.led_num == 3) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000218 0104 MOVLB 0x4 00021a 5d21 SUBWF 0x21,0x0,0x1 00021c e103 BNZ 0x224 { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // mLED_3 = dataPacket.led_status; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00021e 0100 MOVLB 0x0 counter = 0x01; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000220 0e01 MOVLW 0x1 000222 6f75 MOVWF 0x75,0x1 }//end if C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000224 0e04 MOVLW 0x4 if(dataPacket.led_num == 4) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000226 0104 MOVLB 0x4 000228 5d21 SUBWF 0x21,0x0,0x1 00022a e103 BNZ 0x232 { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // mLED_4 = dataPacket.led_status; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00022c 0100 MOVLB 0x0 counter = 0x01; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00022e 0e01 MOVLW 0x1 000230 6f75 MOVWF 0x75,0x1 }//end if C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000232 d001 BRA 0x236 break; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c default: C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000234 d000 BRA 0x236 break; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c }//end switch() C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000236 0100 MOVLB 0x0 trf_state = SENDING_RESP; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000238 0e01 MOVLW 0x1 00023a 6f77 MOVWF 0x77,0x1 00023c 0100 MOVLB 0x0 if(counter != 0) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00023e 5175 MOVF 0x75,0x0,0x1 000240 e00a BZ 0x256 { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000242 c075 MOVFF 0x75,0x40d BOOT_BD_IN.Cnt = counter; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000244 f40d 000246 0e40 MOVLW 0x40 mUSBBufferReady(BOOT_BD_IN); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000248 0104 MOVLB 0x4 00024a 170c ANDWF 0xc,0x1,0x1 00024c 0104 MOVLB 0x4 00024e 7d0c BTG 0xc,0x6,0x1 000250 0e88 MOVLW 0x88 000252 0104 MOVLB 0x4 000254 130c IORWF 0xc,0x1,0x1 }//end if C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c }//end if C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000256 0012 RETURN 0x0 }//end BootService C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c /****************************************************************************** C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * Function: void BlinkUSBStatus(void) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * PreCondition: None C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * Input: None C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * Output: None C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * Side Effects: None C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * Overview: BlinkUSBStatus turns on and off LEDs corresponding to C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * the USB device state. C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * Note: mLED macros can be found in io_cfg.h C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * usb_device_state is declared in usbmmap.c and is modified C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c * in usbdrv.c, usbctrltrf.c, and usb9.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c *****************************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c void BlinkUSBStatus(void) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c static word led_count; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000258 0e06 MOVLW 0x6 if(usb_device_state == CONFIGURED_STATE) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00025a 0100 MOVLB 0x0 00025c 5d7c SUBWF 0x7c,0x0,0x1 00025e e110 BNZ 0x280 { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000260 0100 MOVLB 0x0 if(led_count == 0) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000262 517a MOVF 0x7a,0x0,0x1 000264 117b IORWF 0x7b,0x0,0x1 000266 e105 BNZ 0x272 { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000268 828b BSF 0x8b,0x1,0x0 mLED_2 = 1; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00026a 0e20 MOVLW 0x20 led_count = 20000; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00026c 6f7a MOVWF 0x7a,0x1 00026e 0e4e MOVLW 0x4e 000270 6f7b MOVWF 0x7b,0x1 } C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000272 0e88 MOVLW 0x88 if(led_count == 5000) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000274 197a XORWF 0x7a,0x0,0x1 000276 e104 BNZ 0x280 000278 0e13 MOVLW 0x13 00027a 197b XORWF 0x7b,0x0,0x1 00027c e101 BNZ 0x280 { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 00027e 928b BCF 0x8b,0x1,0x0 mLED_2 = 0; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c } C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c } C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000280 0100 MOVLB 0x0 led_count--; C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000282 077a DECF 0x7a,0x1,0x1 000284 0e00 MOVLW 0x0 000286 5b7b SUBWFB 0x7b,0x1,0x1 C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // if(UCONbits.SUSPND == 1) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // if(led_count==0) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // mLED_1_Toggle(); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // mLED_2 = mLED_1; // Both blink at the same time C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // }//end if C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // } C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // else C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // if(usb_device_state == DETACHED_STATE) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // mLED_Both_Off(); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // } C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // else if(usb_device_state == ATTACHED_STATE) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // mLED_Both_On(); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // } C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // else if(usb_device_state == POWERED_STATE) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // mLED_Only_1_On(); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // } C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // else if(usb_device_state == DEFAULT_STATE) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // mLED_Only_2_On(); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // } C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // else if(usb_device_state == ADDRESS_STATE) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // if(led_count == 0) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // mLED_1_Toggle(); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // mLED_2_Off(); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // }//end if C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // } C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // else if(usb_device_state == CONFIGURED_STATE) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // if(usb_device_state == CONFIGURED_STATE && led_count == 0) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // if(led_count==0) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // { C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // mLED_1_Toggle(); C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // mLED_2 = !mLED_1; // Alternate blink C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // }//end if C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // }//end if(...) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // }//end if(UCONbits.SUSPND...) C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c // C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c 000288 0012 RETURN 0x0 }//end BlinkUSBStatus C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c /** EOF boot.c ***************************************************************/ C:\Projects\UBW\FW\2455\B\system\usb\class\boot\boot.c LIST P=18F2455 C:\MCC18\SRC\TRADIT~1\PROC\p18f2455.asm LIST C:\MCC18\SRC\TRADIT~1\PROC\p18f2455.asm END C:\MCC18\SRC\TRADIT~1\PROC\p18f2455.asm ; RCS Header $Id: cmath18.asm,v 1.4.12.1 2006/01/13 04:11:25 nairnj Exp $ C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm ; CMATH18 DATA DEFINITION FILE C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm ;******************************************************************************* C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm ; VARIABLE ALLOCATION - Core math library routines C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm ;******************************************************************************* C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm MATH_DATA UDATA_ACS C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm SIGN RES 1 ; save location for sign in MSB C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm __FPFLAGSbits C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm __FPFLAGS RES 1 ; floating point library exception flags C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm GLOBAL SIGN, __FPFLAGS, __FPFLAGSbits C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm END C:\MCC18\SRC\TRADIT~1\MATH\cmath18.asm