MP2COD 4.02, COFF to COD File Converter Copyright (c) 2006 Microchip Technology Inc. Listing File Generated: Thu Aug 17 23:27:32 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 ef7a GOTO 0x3ef4 _asm goto _startup _endasm C:\MCC18\src\traditional\startup\c018i.c 000002 f01f 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 003ef4 ee13 LFSR 0x1,0x300 lfsr 1, _stack C:\MCC18\src\traditional\startup\c018i.c 003ef6 f000 003ef8 ee23 LFSR 0x2,0x300 lfsr 2, _stack C:\MCC18\src\traditional\startup\c018i.c 003efa f000 C:\MCC18\src\traditional\startup\c018i.c 003efc 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 003efe 9c01 BCF 0x1,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 003f00 ecf7 CALL 0x3bee,0x0 _do_cinit (); C:\MCC18\src\traditional\startup\c018i.c 003f02 f01d 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 003f04 ec33 CALL 0x3e66,0x0 main (); C:\MCC18\src\traditional\startup\c018i.c 003f06 f01f C:\MCC18\src\traditional\startup\c018i.c 003f08 d7fd BRA 0x3f04 goto loop; C:\MCC18\src\traditional\startup\c018i.c 003f0a 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 003bee 0e2a MOVLW 0x2a TBLPTR = (short long)&_cinit; C:\MCC18\src\traditional\startup\c018i.c 003bf0 6ef6 MOVWF 0xf6,0x0 003bf2 0e08 MOVLW 0x8 003bf4 6ef7 MOVWF 0xf7,0x0 003bf6 0e00 MOVLW 0x0 003bf8 6ef8 MOVWF 0xf8,0x0 _asm C:\MCC18\src\traditional\startup\c018i.c 003bfa 0100 MOVLB 0x0 movlb data_ptr C:\MCC18\src\traditional\startup\c018i.c 003bfc 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 003bfe 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 003c00 6ff7 MOVWF 0xf7,0x1 movwf curr_entry, 1 C:\MCC18\src\traditional\startup\c018i.c 003c02 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 003c04 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 003c06 6ff8 MOVWF 0xf8,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 003c08 e103 BNZ 0x3c10 bnz 3 C:\MCC18\src\traditional\startup\c018i.c 003c0a 67f7 TSTFSZ 0xf7,0x1 tstfsz curr_entry, 1 C:\MCC18\src\traditional\startup\c018i.c 003c0c d001 BRA 0x3c10 bra 1 C:\MCC18\src\traditional\startup\c018i.c _endasm C:\MCC18\src\traditional\startup\c018i.c 003c0e d03d BRA 0x3c8a 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 003c10 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 003c12 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 003c14 6ff2 MOVWF 0xf2,0x1 movwf prom, 1 C:\MCC18\src\traditional\startup\c018i.c 003c16 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 003c18 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 003c1a 6ff3 MOVWF 0xf3,0x1 movwf prom+1, 1 C:\MCC18\src\traditional\startup\c018i.c 003c1c 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 003c1e 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 003c20 6ff4 MOVWF 0xf4,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 003c22 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c /* read the destination address directly into FSR0 */ C:\MCC18\src\traditional\startup\c018i.c 003c24 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 003c26 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 003c28 6ee9 MOVWF 0xe9,0x0 movwf FSR0L, 0 C:\MCC18\src\traditional\startup\c018i.c 003c2a 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 003c2c 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 003c2e 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 003c30 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 003c32 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c /* read the destination address directly into FSR0 */ C:\MCC18\src\traditional\startup\c018i.c 003c34 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 003c36 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 003c38 6ff5 MOVWF 0xf5,0x1 movwf curr_byte, 1 C:\MCC18\src\traditional\startup\c018i.c 003c3a 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 003c3c 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 003c3e 6ff6 MOVWF 0xf6,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 003c40 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 003c42 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 003c44 cff6 MOVFF 0xff6,0xf9 data_ptr = TBLPTR; C:\MCC18\src\traditional\startup\c018i.c 003c46 f0f9 003c48 cff7 MOVFF 0xff7,0xfa 003c4a f0fa 003c4c cff8 MOVFF 0xff8,0xfb 003c4e f0fb C:\MCC18\src\traditional\startup\c018i.c /* now assign the source address to the table pointer */ C:\MCC18\src\traditional\startup\c018i.c 003c50 c0f2 MOVFF 0xf2,0xff6 TBLPTR = prom; C:\MCC18\src\traditional\startup\c018i.c 003c52 fff6 003c54 c0f3 MOVFF 0xf3,0xff7 003c56 fff7 003c58 c0f4 MOVFF 0xf4,0xff8 003c5a 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 003c5c 0100 MOVLB 0x0 movlb curr_byte C:\MCC18\src\traditional\startup\c018i.c 003c5e 53f5 MOVF 0xf5,0x1,0x1 movf curr_byte, 1, 1 C:\MCC18\src\traditional\startup\c018i.c copy_loop: C:\MCC18\src\traditional\startup\c018i.c 003c60 e102 BNZ 0x3c66 bnz 2 // copy_one_byte C:\MCC18\src\traditional\startup\c018i.c 003c62 53f6 MOVF 0xf6,0x1,0x1 movf curr_byte + 1, 1, 1 C:\MCC18\src\traditional\startup\c018i.c 003c64 e007 BZ 0x3c74 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 003c66 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 003c68 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 003c6a 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 003c6c 07f5 DECF 0xf5,0x1,0x1 decf curr_byte, 1, 1 C:\MCC18\src\traditional\startup\c018i.c 003c6e e2f8 BC 0x3c60 bc -8 // copy_loop C:\MCC18\src\traditional\startup\c018i.c 003c70 07f6 DECF 0xf6,0x1,0x1 decf curr_byte + 1, 1, 1 C:\MCC18\src\traditional\startup\c018i.c 003c72 d7f9 BRA 0x3c66 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 003c74 c0f9 MOVFF 0xf9,0xff6 TBLPTR = data_ptr; C:\MCC18\src\traditional\startup\c018i.c 003c76 fff6 003c78 c0fa MOVFF 0xfa,0xff7 003c7a fff7 003c7c c0fb MOVFF 0xfb,0xff8 003c7e fff8 /* next entry... */ C:\MCC18\src\traditional\startup\c018i.c 003c80 0100 MOVLB 0x0 curr_entry--; C:\MCC18\src\traditional\startup\c018i.c 003c82 07f7 DECF 0xf7,0x1,0x1 003c84 0e00 MOVLW 0x0 003c86 5bf8 SUBWFB 0xf8,0x1,0x1 003c88 d7bf BRA 0x3c08 goto test; C:\MCC18\src\traditional\startup\c018i.c done: C:\MCC18\src\traditional\startup\c018i.c ; C:\MCC18\src\traditional\startup\c018i.c 003c8a 0012 RETURN 0x0 } C:\MCC18\src\traditional\startup\c018i.c /********************************************************************* C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c ********************************************************************* C:\Projects\UBW\FW\2455\D\main.c * FileName: main.c C:\Projects\UBW\FW\2455\D\main.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\2455\D\main.c * Processor: PIC18 C:\Projects\UBW\FW\2455\D\main.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\2455\D\main.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c * Software License Agreement C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\2455\D\main.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\2455\D\main.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\2455\D\main.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\2455\D\main.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\2455\D\main.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\2455\D\main.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\2455\D\main.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\2455\D\main.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\2455\D\main.c * license. C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\2455\D\main.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\2455\D\main.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\2455\D\main.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\2455\D\main.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\2455\D\main.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c * Author Date Comment C:\Projects\UBW\FW\2455\D\main.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\2455\D\main.c * Rawin Rojvanit 11/19/04 Original. C:\Projects\UBW\FW\2455\D\main.c ********************************************************************/ C:\Projects\UBW\FW\2455\D\main.c C:\Projects\UBW\FW\2455\D\main.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\2455\D\main.c #include C:\Projects\UBW\FW\2455\D\main.c #include "system\typedefs.h" // Required C:\Projects\UBW\FW\2455\D\main.c #include "system\usb\usb.h" // Required C:\Projects\UBW\FW\2455\D\main.c #include "io_cfg.h" // Required C:\Projects\UBW\FW\2455\D\main.c C:\Projects\UBW\FW\2455\D\main.c #include "system\usb\usb_compile_time_validation.h" // Optional C:\Projects\UBW\FW\2455\D\main.c #include "user\user.h" // Modifiable C:\Projects\UBW\FW\2455\D\main.c C:\Projects\UBW\FW\2455\D\main.c /** V A R I A B L E S ********************************************************/ C:\Projects\UBW\FW\2455\D\main.c #pragma udata C:\Projects\UBW\FW\2455\D\main.c C:\Projects\UBW\FW\2455\D\main.c /** P R I V A T E P R O T O T Y P E S ***************************************/ C:\Projects\UBW\FW\2455\D\main.c static void InitializeSystem(void); C:\Projects\UBW\FW\2455\D\main.c void USBTasks(void); C:\Projects\UBW\FW\2455\D\main.c C:\Projects\UBW\FW\2455\D\main.c /** V E C T O R R E M A P P I N G *******************************************/ C:\Projects\UBW\FW\2455\D\main.c C:\Projects\UBW\FW\2455\D\main.c extern void _startup (void); // See c018i.c in your C18 compiler dir C:\Projects\UBW\FW\2455\D\main.c #pragma code _RESET_INTERRUPT_VECTOR = 0x000800 C:\Projects\UBW\FW\2455\D\main.c void _reset (void) C:\Projects\UBW\FW\2455\D\main.c { C:\Projects\UBW\FW\2455\D\main.c 000800 ef7a GOTO 0x3ef4 _asm goto _startup _endasm C:\Projects\UBW\FW\2455\D\main.c 000802 f01f 000804 0012 RETURN 0x0 } C:\Projects\UBW\FW\2455\D\main.c #pragma code high_vector_section = 0x000808 C:\Projects\UBW\FW\2455\D\main.c void high_vector (void) C:\Projects\UBW\FW\2455\D\main.c { C:\Projects\UBW\FW\2455\D\main.c 000808 eff8 GOTO 0x9f0 _asm goto HighISR _endasm C:\Projects\UBW\FW\2455\D\main.c 00080a f004 00080c 0012 RETURN 0x0 } C:\Projects\UBW\FW\2455\D\main.c #pragma code low_vector_section = 0x000818 C:\Projects\UBW\FW\2455\D\main.c void low_vector (void) C:\Projects\UBW\FW\2455\D\main.c { C:\Projects\UBW\FW\2455\D\main.c 000818 ef1c GOTO 0x838 _asm goto LowISR _endasm C:\Projects\UBW\FW\2455\D\main.c 00081a f004 00081c 0012 RETURN 0x0 } C:\Projects\UBW\FW\2455\D\main.c #pragma code C:\Projects\UBW\FW\2455\D\main.c C:\Projects\UBW\FW\2455\D\main.c /** D E C L A R A T I O N S **************************************************/ C:\Projects\UBW\FW\2455\D\main.c #pragma code C:\Projects\UBW\FW\2455\D\main.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\main.c * Function: void main(void) C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c * PreCondition: None C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c * Input: None C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c * Output: None C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c * Side Effects: None C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c * Overview: Main program entry point. C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c * Note: None C:\Projects\UBW\FW\2455\D\main.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\main.c void main(void) C:\Projects\UBW\FW\2455\D\main.c { C:\Projects\UBW\FW\2455\D\main.c 003e66 d805 RCALL 0x3e72 InitializeSystem(); C:\Projects\UBW\FW\2455\D\main.c 003e6e d7fc BRA 0x3e68 while(1) C:\Projects\UBW\FW\2455\D\main.c { C:\Projects\UBW\FW\2455\D\main.c 003e68 d810 RCALL 0x3e8a USBTasks(); // USB Tasks C:\Projects\UBW\FW\2455\D\main.c 003e6a ec93 CALL 0xb26,0x0 ProcessIO(); // See user\user.c & .h C:\Projects\UBW\FW\2455\D\main.c 003e6c f005 }//end while C:\Projects\UBW\FW\2455\D\main.c 003e70 0012 RETURN 0x0 }//end main C:\Projects\UBW\FW\2455\D\main.c C:\Projects\UBW\FW\2455\D\main.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\main.c * Function: static void InitializeSystem(void) C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c * PreCondition: None C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c * Input: None C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c * Output: None C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c * Side Effects: None C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c * Overview: InitializeSystem is a centralize initialization routine. C:\Projects\UBW\FW\2455\D\main.c * All required USB initialization routines are called from C:\Projects\UBW\FW\2455\D\main.c * here. C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c * User application initialization routine should also be C:\Projects\UBW\FW\2455\D\main.c * called from here. C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c * Note: None C:\Projects\UBW\FW\2455\D\main.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\main.c static void InitializeSystem(void) C:\Projects\UBW\FW\2455\D\main.c { C:\Projects\UBW\FW\2455\D\main.c 003e72 0e0f MOVLW 0xf ADCON1 |= 0x0F; // Default all pins to digital C:\Projects\UBW\FW\2455\D\main.c 003e74 12c1 IORWF 0xc1,0x1,0x0 C:\Projects\UBW\FW\2455\D\main.c 003e76 0e14 MOVLW 0x14 mInitializeUSBDriver(); // See usbdrv.h C:\Projects\UBW\FW\2455\D\main.c 003e78 6e6f MOVWF 0x6f,0x0 003e7a 0100 MOVLB 0x0 003e7c 6bfc CLRF 0xfc,0x1 003e7e 0100 MOVLB 0x0 003e80 6bfd CLRF 0xfd,0x1 003e82 0100 MOVLB 0x0 003e84 6bfe CLRF 0xfe,0x1 C:\Projects\UBW\FW\2455\D\main.c 003e86 ef01 GOTO 0xa02 UserInit(); // See user.c & .h C:\Projects\UBW\FW\2455\D\main.c 003e88 f005 C:\Projects\UBW\FW\2455\D\main.c }//end InitializeSystem C:\Projects\UBW\FW\2455\D\main.c C:\Projects\UBW\FW\2455\D\main.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\main.c * Function: void USBTasks(void) C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c * PreCondition: InitializeSystem has been called. C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c * Input: None C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c * Output: None C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c * Side Effects: None C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c * Overview: Service loop for USB tasks. C:\Projects\UBW\FW\2455\D\main.c * C:\Projects\UBW\FW\2455\D\main.c * Note: None C:\Projects\UBW\FW\2455\D\main.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\main.c void USBTasks(void) C:\Projects\UBW\FW\2455\D\main.c { C:\Projects\UBW\FW\2455\D\main.c /* C:\Projects\UBW\FW\2455\D\main.c * Servicing Hardware C:\Projects\UBW\FW\2455\D\main.c */ C:\Projects\UBW\FW\2455\D\main.c 003e8a ec06 CALL 0x380c,0x0 USBCheckBusStatus(); // Must use polling method C:\Projects\UBW\FW\2455\D\main.c 003e8c f01c 003e8e be6f BTFSC 0x6f,0x7,0x0 if(UCFGbits.UTEYE!=1) C:\Projects\UBW\FW\2455\D\main.c 003e90 d002 BRA 0x3e96 003e92 ec25 CALL 0x384a,0x0 USBDriverService(); // Interrupt or polling method C:\Projects\UBW\FW\2455\D\main.c 003e94 f01c C:\Projects\UBW\FW\2455\D\main.c #if defined(USB_USE_CDC) C:\Projects\UBW\FW\2455\D\main.c 003e96 ef8d GOTO 0x311a CDCTxService(); C:\Projects\UBW\FW\2455\D\main.c 003e98 f018 #endif C:\Projects\UBW\FW\2455\D\main.c C:\Projects\UBW\FW\2455\D\main.c }// end USBTasks C:\Projects\UBW\FW\2455\D\main.c C:\Projects\UBW\FW\2455\D\main.c /** EOF main.c ***************************************************************/ C:\Projects\UBW\FW\2455\D\main.c /********************************************************************* C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c ********************************************************************* C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * FileName: usbmmap.c C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * Processor: PIC18 C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * Software License Agreement C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * license. C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * Author Date Comment C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * Rawin Rojvanit 11/19/04 Original. C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c ********************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * -usbmmap.c- C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * USB Memory Map C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * This file is the USB memory manager; it serves as a compile-time memory C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * allocator for the USB endpoints. It uses the compile time options passed C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * from usbcfg.h to instantiate endpoints and endpoint buffer. C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * Each endpoint requires to have a set of Buffer Descriptor registers(BDT). C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * A BDT is 4-byte long and has a specific RAM location for each endpoint. C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * The BDT for endpoint 0 out is located at address 0x400 to 0x403. C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * The BDT for endpoint 0 in is located at address 0x404 to 0x407. C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * The BDT for endpoint 1 out is located at address 0x408 to 0x40B. C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * and so on... The above allocation assumes the Ping-Pong Buffer Mode 0 is C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * used. These locations are already hard-wired in the silicon. The point C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * of doing instantiation, i.e. volatile far BDT ep0Bo;, is to provide the C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C compiler a way to address each variable directly. This is very important C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * because when a register can be accessed directly, it saves execution time C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * and reduces program size. C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * Endpoints are defined using the endpoint number and the direction C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * of transfer. For simplicity, usbmmap.c only uses the endpoint number C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * in the BDT register allocation scheme. This means if the usbcfg.h states C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * that the MAX_EP_NUMBER is number 1, then four BDTs will be C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * instantiated: one each for endpoint0 in and endpoint0 out, which must C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * always be instantiated for control transfer by default, and one each sets C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * for endpoint1 in and endpoint1 out. The naming convention for instantiating C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * BDT is C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * ep<#>B C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * where # is the endpoint number, and d is the direction of C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * transfer, which could be either or . C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * The USB memory manager uses MAX_EP_NUMBER, as defined in usbcfg.h, to define C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * the endpoints to be instantiated. This represents the highest endpoint C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * number to be allocated, not how many endpoints are used. Since the BDTs for C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * endpoints have hardware-assigned addresses in Bank 4, setting this value too C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * high may lead to inefficient use of data RAM. For example, if an application C:\Projects\UBW\FW\2455\D\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\D\system\usb\usbmmap.c * The in-between endpoint BDTs in this example (EP1, EP2, and EP3) go unused, C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * and the 24 bytes of memory associated with them are wasted. It does not make C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * much sense to skip endpoints, but the final decision lies with the user. C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * The next step is to assign the instantiated BDTs to different C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * USB functions. The firmware framework fundamentally assumes that every USB C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * function should know which endpoint it is using, i.e., the default control C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * transfer should know that it is using endpoint 0 in and endpoint 0 out. C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * A HID class can choose which endpoint it wants to use, but once chosen, it C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * should always know the number of the endpoint. C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * The assignment of endpoints to USB functions is managed centrally C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * in usbcfg.h. This helps prevent the mistake of having more C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * than one USB function using the same endpoint. The "Endpoint Allocation" C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * section in usbcfg.h provides examples for how to map USB endpoints to USB C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * functions. C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * Quite a few things can be mapped in that section. There is no C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * one correct way to do the mapping and the user has the choice to C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * choose a method that is most suitable to the application. C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * Typically, however, a user will want to map the following for a given C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * USB interface function: C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * 1. The USB interface ID C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * 2. The endpoint control registers (UEPn) C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * 3. The BDT registers (ep<#>B) C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * 4. The endpoint size C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * Example: Assume a USB device class "foo", which uses one out endpoint C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * of size 64-byte and one in endpoint of size 64-byte, then: C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * #define FOO_INTF_ID 0x00 C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * #define FOO_UEP UEP1 C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * #define FOO_BD_OUT ep1Bo C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * #define FOO_BD_IN ep1Bi C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * #define FOO_EP_SIZE 64 C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * The mapping above has chosen class "foo" to use endpoint 1. C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * The names are arbitrary and can be anything other than FOO_??????. C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * For abstraction, the code for class "foo" should use the abstract C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * definitions of FOO_BD_OUT,FOO_BD_IN, and not ep1Bo or ep1Bi. C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * Note that the endpoint size defined in the usbcfg.h file is again C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * used in the usbmmap.c file. This shows that the relationship between C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * the two files are tightly related. C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * The endpoint buffer for each USB function must be located in the C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * dual-port RAM area and has to come after all the BDTs have been C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * instantiated. An example declaration is: C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * volatile far unsigned char[FOO_EP_SIZE] data; C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * The 'volatile' keyword tells the compiler not to perform any code C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * optimization on this variable because its content could be modified C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * by the hardware. The 'far' keyword tells the compiler that this variable C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * is not located in the Access RAM area (0x000 - 0x05F). C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * For the variable to be globally accessible by other files, it should be C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * declared in the header file usbmmap.h as an extern definition, such as C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * extern volatile far unsigned char[FOO_EP_SIZE] data; C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * Conclusion: C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * In a short summary, the dependencies between usbcfg and usbmmap can C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * be shown as: C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * usbcfg[MAX_EP_NUMBER] -> usbmmap C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * usbmmap[ep<#>B] -> usbcfg C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * usbcfg[EP size] -> usbmmap C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * usbcfg[abstract ep definitions] -> usb9/hid/cdc/etc class code C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * usbmmap[endpoint buffer variable] -> usb9/hid/cdc/etc class code C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * Data mapping provides a means for direct addressing of BDT and endpoint C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * buffer. This means less usage of pointers, which equates to a faster and C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * smaller program code. C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #include "system\typedefs.h" C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #include "system\usb\usb.h" C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\D\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\D\system\usb\usbmmap.c #pragma udata C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c byte usb_device_state; // Device States: DETACHED, ATTACHED, ... C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c USB_DEVICE_STATUS usb_stat; // Global USB flags C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c byte usb_active_cfg; // Value of current configuration C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c byte usb_alt_intf[MAX_NUM_INT]; // Array to keep track of the current alternate C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c // setting for each interface ID C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\D\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\D\system\usb\usbmmap.c #pragma udata usbram4=0x400 //See Linker Script,usb4:0x400-0x4FF(256-byte) C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * Section A: Buffer Descriptor Table C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * - 0x400 - 0x4FF(max) C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * - MAX_EP_NUMBER is defined in autofiles\usbcfg.h C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * - BDT data type is defined in system\usb\usbmmap.h C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #if(0 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep0Bo; //Endpoint #0 BD Out C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep0Bi; //Endpoint #0 BD In C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #if(1 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep1Bo; //Endpoint #1 BD Out C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep1Bi; //Endpoint #1 BD In C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #if(2 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep2Bo; //Endpoint #2 BD Out C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep2Bi; //Endpoint #2 BD In C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #if(3 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep3Bo; //Endpoint #3 BD Out C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep3Bi; //Endpoint #3 BD In C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #if(4 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep4Bo; //Endpoint #4 BD Out C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep4Bi; //Endpoint #4 BD In C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #if(5 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep5Bo; //Endpoint #5 BD Out C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep5Bi; //Endpoint #5 BD In C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #if(6 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep6Bo; //Endpoint #6 BD Out C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep6Bi; //Endpoint #6 BD In C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #if(7 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep7Bo; //Endpoint #7 BD Out C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep7Bi; //Endpoint #7 BD In C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #if(8 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep8Bo; //Endpoint #8 BD Out C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep8Bi; //Endpoint #8 BD In C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #if(9 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep9Bo; //Endpoint #9 BD Out C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep9Bi; //Endpoint #9 BD In C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #if(10 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep10Bo; //Endpoint #10 BD Out C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep10Bi; //Endpoint #10 BD In C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #if(11 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep11Bo; //Endpoint #11 BD Out C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep11Bi; //Endpoint #11 BD In C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #if(12 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep12Bo; //Endpoint #12 BD Out C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep12Bi; //Endpoint #12 BD In C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #if(13 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep13Bo; //Endpoint #13 BD Out C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep13Bi; //Endpoint #13 BD In C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #if(14 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep14Bo; //Endpoint #14 BD Out C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep14Bi; //Endpoint #14 BD In C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #if(15 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep15Bo; //Endpoint #15 BD Out C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far BDT ep15Bi; //Endpoint #15 BD In C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * Section B: EP0 Buffer Space C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c ****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * - Two buffer areas are defined: C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * A. CTRL_TRF_SETUP C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * - Size = EP0_BUFF_SIZE as defined in autofiles\usbcfg.h C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * - Detailed data structure allows direct adddressing of bits and bytes. C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * B. CTRL_TRF_DATA C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * - Size = EP0_BUFF_SIZE as defined in autofiles\usbcfg.h C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * - Data structure allows direct adddressing of the first 8 bytes. C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * - Both data types are defined in system\usb\usbdefs\usbdefs_ep0_buff.h C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far CTRL_TRF_SETUP SetupPkt; C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far CTRL_TRF_DATA CtrlTrfData; C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * Section C: CDC Buffer C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c ****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c * C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #pragma udata usbram5a=0x500 //See Linker Script,usb5:0x500-... C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #if defined(USB_USE_CDC) C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far unsigned char cdc_notice[CDC_INT_EP_SIZE]; C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far unsigned char cdc_data_rx[CDC_BULK_OUT_EP_SIZE]; C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c volatile far unsigned char cdc_data_tx[CDC_BULK_IN_EP_SIZE]; C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c #pragma udata C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c /** EOF usbmmap.c ************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbmmap.c /********************************************************************* C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c ********************************************************************* C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * FileName: usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Processor: PIC18 C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Software License Agreement C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * license. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Author Date Comment C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Rawin Rojvanit 11/19/04 Original. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c ********************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c #include C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c #include "system\typedefs.h" C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c #include "system\usb\usb.h" C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c #include "io_cfg.h" // Required for USBCheckBusStatus() C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /** V A R I A B L E S ********************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c #pragma udata C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\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\D\system\usb\usbdrv\usbdrv.c void USBModuleEnable(void); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c void USBModuleDisable(void); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c void USBSuspend(void); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c void USBWakeFromSuspend(void); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c void USBProtocolResetHandler(void); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c void USB_SOF_Handler(void); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c void USBStallHandler(void); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c void USBErrorHandler(void); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /** D E C L A R A T I O N S **************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c #pragma code C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Function: void USBCheckBusStatus(void) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Overview: This routine enables/disables the USB module by monitoring C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * the USB power signal. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Note: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c void USBCheckBusStatus(void) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Bus Attachment & Detachment Detection C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * usb_bus_sense is an i/o pin defined in io_cfg.h C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c *************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c #define USB_BUS_ATTACHED 1 C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c #define USB_BUS_DETACHED 0 C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c if(usb_bus_sense == USB_BUS_ATTACHED) // Is USB bus attached? C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00380c a66d BTFSS 0x6d,0x3,0x0 if(UCONbits.USBEN == 0) // Is the module off? C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00380e d80f RCALL 0x382e USBModuleEnable(); // Is off, enable it C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c } C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003810 d002 BRA 0x3816 else C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003812 b66d BTFSC 0x6d,0x3,0x0 if(UCONbits.USBEN == 1) // Is the module on? C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003814 d813 RCALL 0x383c USBModuleDisable(); // Is on, disable it C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c }//end if(usb_bus_sense...) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * After enabling the USB module, it takes some time for the voltage C:\Projects\UBW\FW\2455\D\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\D\system\usb\usbdrv\usbdrv.c * The USB Reset interrupt should not be unmasked until the SE0 condition is C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * cleared. This helps preventing the firmware from misinterpreting this C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * unique event as a USB bus reset from the USB host. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003816 0100 MOVLB 0x0 if(usb_device_state == ATTACHED_STATE) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003818 05fc DECF 0xfc,0x0,0x1 00381a e108 BNZ 0x382c { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00381c ba6d BTFSC 0x6d,0x5,0x0 if(!UCONbits.SE0) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00381e d006 BRA 0x382c { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003820 6a68 CLRF 0x68,0x0 UIR = 0; // Clear all USB interrupts C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003822 6a69 CLRF 0x69,0x0 UIE = 0; // Mask all USB interrupts C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003824 8069 BSF 0x69,0x0,0x0 UIEbits.URSTIE = 1; // Unmask RESET interrupt C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003826 8869 BSF 0x69,0x4,0x0 UIEbits.IDLEIE = 1; // Unmask IDLE interrupt C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003828 0e02 MOVLW 0x2 usb_device_state = POWERED_STATE; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00382a 6ffc MOVWF 0xfc,0x1 }//end if // else wait until SE0 is cleared C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c }//end if(usb_device_state == ATTACHED_STATE) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00382c 0012 RETURN 0x0 }//end USBCheckBusStatus C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Function: void USBModuleEnable(void) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Overview: This routine enables the USB module. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * An end designer should never have to call this routine C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * manually. This routine should only be called from C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * USBCheckBusStatus(). C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Note: See USBCheckBusStatus() for more information. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c void USBModuleEnable(void) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00382e 6a6d CLRF 0x6d,0x0 UCON = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003830 6a69 CLRF 0x69,0x0 UIE = 0; // Mask all USB interrupts C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003832 866d BSF 0x6d,0x3,0x0 UCONbits.USBEN = 1; // Enable module & attach to bus C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003834 0100 MOVLB 0x0 usb_device_state = ATTACHED_STATE; // Defined in usbmmap.c & .h C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003836 0e01 MOVLW 0x1 003838 6ffc MOVWF 0xfc,0x1 00383a 0012 RETURN 0x0 }//end USBModuleEnable C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Function: void USBModuleDisable(void) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Overview: This routine disables the USB module. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * An end designer should never have to call this routine C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * manually. This routine should only be called from C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * USBCheckBusStatus(). C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Note: See USBCheckBusStatus() for more information. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c void USBModuleDisable(void) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00383c 6a6d CLRF 0x6d,0x0 UCON = 0; // Disable module & detach from bus C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00383e 6a69 CLRF 0x69,0x0 UIE = 0; // Mask all USB interrupts C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003840 0100 MOVLB 0x0 usb_device_state = DETACHED_STATE; // Defined in usbmmap.c & .h C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003842 6bfc CLRF 0xfc,0x1 003844 0012 RETURN 0x0 }//end USBModuleDisable C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Function: void USBSoftDetach(void) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Side Effects: The device will have to be re-enumerated to function again. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Overview: USBSoftDetach electrically disconnects the device from C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * the bus. This is done by stop supplying Vusb voltage to C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * pull-up resistor. The pull-down resistors on the host C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * side will pull both differential signal lines low and C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * the host registers the event as a disconnect. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Since the USB cable is not physically disconnected, the C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * power supply through the cable can still be sensed by C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * the device. The next time USBCheckBusStatus() function C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * is called, it will reconnect the device back to the bus. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Note: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c void USBSoftDetach(void) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003846 ef1e GOTO 0x383c USBModuleDisable(); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003848 f01c }//end USBSoftDetach C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Function: void USBDriverService(void) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Overview: This routine is the heart of this firmware. It manages C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * all USB interrupts. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Note: Device state transitions through the following stages: C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * DETACHED -> ATTACHED -> POWERED -> DEFAULT -> C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * ADDRESS_PENDING -> ADDRESSED -> CONFIGURED -> READY C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c void USBDriverService(void) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Pointless to continue servicing if USB cable is not even attached. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00384a 0100 MOVLB 0x0 if(usb_device_state == DETACHED_STATE) return; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00384c 51fc MOVF 0xfc,0x0,0x1 00384e e101 BNZ 0x3852 003850 d03a BRA 0x38c6 C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Task A: Service USB Activity Interrupt C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003852 5068 MOVF 0x68,0x0,0x0 if(UIRbits.ACTVIF && UIEbits.ACTVIE) USBWakeFromSuspend(); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003854 0b04 ANDLW 0x4 003856 e004 BZ 0x3860 003858 5069 MOVF 0x69,0x0,0x0 00385a 0b04 ANDLW 0x4 00385c e001 BZ 0x3860 00385e d83c RCALL 0x38d8 C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Pointless to continue servicing if the device is in suspend mode. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003860 b26d BTFSC 0x6d,0x1,0x0 if(UCONbits.SUSPND==1) return; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003862 d031 BRA 0x38c6 C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Task B: Service USB Bus Reset Interrupt. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * When bus reset is received during suspend, ACTVIF will be set first, C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * once the UCONbits.SUSPND is clear, then the URSTIF bit will be asserted. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * This is why URSTIF is checked after ACTVIF. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003864 5068 MOVF 0x68,0x0,0x0 if(UIRbits.URSTIF && UIEbits.URSTIE) USBProtocolResetHandler(); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003866 0b01 ANDLW 0x1 003868 e004 BZ 0x3872 00386a 5069 MOVF 0x69,0x0,0x0 00386c 0b01 ANDLW 0x1 00386e e001 BZ 0x3872 003870 d854 RCALL 0x391a C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Task C: Service other USB interrupts C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003872 5068 MOVF 0x68,0x0,0x0 if(UIRbits.IDLEIF && UIEbits.IDLEIE) USBSuspend(); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003874 0b10 ANDLW 0x10 003876 e004 BZ 0x3880 003878 5069 MOVF 0x69,0x0,0x0 00387a 0b10 ANDLW 0x10 00387c e001 BZ 0x3880 00387e d824 RCALL 0x38c8 003880 5068 MOVF 0x68,0x0,0x0 if(UIRbits.SOFIF && UIEbits.SOFIE) USB_SOF_Handler(); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003882 0b40 ANDLW 0x40 003884 e004 BZ 0x388e 003886 5069 MOVF 0x69,0x0,0x0 003888 0b40 ANDLW 0x40 00388a e001 BZ 0x388e 00388c d83b RCALL 0x3904 00388e 5068 MOVF 0x68,0x0,0x0 if(UIRbits.STALLIF && UIEbits.STALLIE) USBStallHandler(); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003890 0b20 ANDLW 0x20 003892 e004 BZ 0x389c 003894 5069 MOVF 0x69,0x0,0x0 003896 0b20 ANDLW 0x20 003898 e001 BZ 0x389c 00389a d836 RCALL 0x3908 00389c 5068 MOVF 0x68,0x0,0x0 if(UIRbits.UERRIF && UIEbits.UERRIE) USBErrorHandler(); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00389e 0b02 ANDLW 0x2 0038a0 e004 BZ 0x38aa 0038a2 5069 MOVF 0x69,0x0,0x0 0038a4 0b02 ANDLW 0x2 0038a6 e001 BZ 0x38aa 0038a8 d836 RCALL 0x3916 C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Pointless to continue servicing if the host has not sent a bus reset. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Once bus reset is received, the device transitions into the DEFAULT C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * state and is ready for communication. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038aa 0e03 MOVLW 0x3 if(usb_device_state < DEFAULT_STATE) return; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038ac 0100 MOVLB 0x0 0038ae 5dfc SUBWF 0xfc,0x0,0x1 0038b0 e201 BC 0x38b4 0038b2 d009 BRA 0x38c6 C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Task D: Servicing USB Transaction Complete Interrupt C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038b4 5068 MOVF 0x68,0x0,0x0 if(UIRbits.TRNIF && UIEbits.TRNIE) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038b6 0b08 ANDLW 0x8 0038b8 e006 BZ 0x38c6 0038ba 5069 MOVF 0x69,0x0,0x0 0038bc 0b08 ANDLW 0x8 0038be e003 BZ 0x38c6 { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * USBCtrlEPService only services transactions over EP0. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * It ignores all other EP transactions. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038c0 ec89 CALL 0x3512,0x0 USBCtrlEPService(); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038c2 f01a C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Other EP can be serviced later by responsible device class firmware. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Each device driver knows when an OUT or IN transaction is ready by C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * checking the buffer ownership bit. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * An OUT EP should always be owned by SIE until the data is ready. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * An IN EP should always be owned by CPU until the data is ready. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Because of this logic, it is not necessary to save the USTAT value C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * of non-EP0 transactions. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038c4 9668 BCF 0x68,0x3,0x0 UIRbits.TRNIF = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c }//end if(UIRbits.TRNIF && UIEbits.TRNIE) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038c6 0012 RETURN 0x0 }//end USBDriverService C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Function: void USBSuspend(void) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Overview: C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Note: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c void USBSuspend(void) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * NOTE: Do not clear UIRbits.ACTVIF here! C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Reason: C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * ACTVIF is only generated once an IDLEIF has been generated. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * This is a 1:1 ratio interrupt generation. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * For every IDLEIF, there will be only one ACTVIF regardless of C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * the number of subsequent bus transitions. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * If the ACTIF is cleared here, a problem could occur when: C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * [ IDLE ][bus activity -> C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * <--- 3 ms -----> ^ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * ^ ACTVIF=1 C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * IDLEIF=1 C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * # # # # (#=Program polling flags) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * ^ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * This polling loop will see both C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * IDLEIF=1 and ACTVIF=1. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * However, the program services IDLEIF first C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * because ACTIVIE=0. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * If this routine clears the only ACTIVIF, C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * then it can never get out of the suspend C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * mode. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038c8 8469 BSF 0x69,0x2,0x0 UIEbits.ACTVIE = 1; // Enable bus activity interrupt C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038ca 9868 BCF 0x68,0x4,0x0 UIRbits.IDLEIF = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038cc 826d BSF 0x6d,0x1,0x0 UCONbits.SUSPND = 1; // Put USB module in power conserve C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c // mode, SIE clock inactive C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * At this point the PIC can go into sleep,idle, or C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * switch to a slower clock, etc. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /* Modifiable Section */ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038ce 9aa1 BCF 0xa1,0x5,0x0 PIR2bits.USBIF = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038d0 8aa0 BSF 0xa0,0x5,0x0 PIE2bits.USBIE = 1; // Set USB wakeup source C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038d2 0003 SLEEP Sleep(); // Goto sleep C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038d4 9aa0 BCF 0xa0,0x5,0x0 PIE2bits.USBIE = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /* End Modifiable Section */ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038d6 0012 RETURN 0x0 }//end USBSuspend C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Function: void USBWakeFromSuspend(void) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Overview: C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Note: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c void USBWakeFromSuspend(void) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * If using clock switching, this is the place to restore the C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * original clock frequency. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038d8 926d BCF 0x6d,0x1,0x0 UCONbits.SUSPND = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038da 9469 BCF 0x69,0x2,0x0 UIEbits.ACTVIE = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038dc 9468 BCF 0x68,0x2,0x0 UIRbits.ACTVIF = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038de 0012 RETURN 0x0 }//end USBWakeFromSuspend C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Function: void USBRemoteWakeup(void) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Overview: This function should be called by user when the device C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * is waken up by an external stimulus other than ACTIVIF. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Please read the note below to understand the limitations. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Note: The modifiable section in this routine should be changed C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * to meet the application needs. Current implementation C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * temporary blocks other functions from executing for a C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * period of 1-13 ms depending on the core frequency. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * According to USB 2.0 specification section 7.1.7.7, C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * "The remote wakeup device must hold the resume signaling C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * for at lest 1 ms but for no more than 15 ms." C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * The idea here is to use a delay counter loop, using a C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * common value that would work over a wide range of core C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * frequencies. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * That value selected is 1800. See table below: C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * ========================================================== C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Core Freq(MHz) MIP RESUME Signal Period (ms) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * ========================================================== C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * 48 12 1.05 C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * 4 1 12.6 C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * ========================================================== C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * * These timing could be incorrect when using code C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * optimization or extended instruction mode, C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * or when having other interrupts enabled. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Make sure to verify using the MPLAB SIM's Stopwatch C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c void USBRemoteWakeup(void) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c static word delay_count; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038e0 0100 MOVLB 0x0 if(usb_stat.RemoteWakeup == 1) // Check if RemoteWakeup function C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038e2 a1fd BTFSS 0xfd,0x0,0x1 0038e4 d00e BRA 0x3902 { // has been enabled by the host. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038e6 dff8 RCALL 0x38d8 USBWakeFromSuspend(); // Unsuspend USB modue C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038e8 846d BSF 0x6d,0x2,0x0 UCONbits.RESUME = 1; // Start RESUME signaling C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /* Modifiable Section */ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038ea 0102 MOVLB 0x2 delay_count = 1800U; // Set RESUME line for 1-13 ms C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038ec 0e08 MOVLW 0x8 0038ee 6ffe MOVWF 0xfe,0x1 0038f0 0e07 MOVLW 0x7 0038f2 6fff MOVWF 0xff,0x1 do C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038f4 07fe DECF 0xfe,0x1,0x1 delay_count--; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038f6 0e00 MOVLW 0x0 0038f8 5bff SUBWFB 0xff,0x1,0x1 0038fa 51fe MOVF 0xfe,0x0,0x1 }while(delay_count); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0038fc 11ff IORWF 0xff,0x0,0x1 0038fe e1fa BNZ 0x38f4 C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /* End Modifiable Section */ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003900 946d BCF 0x6d,0x2,0x0 UCONbits.RESUME = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c }//endif C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003902 0012 RETURN 0x0 }//end USBRemoteWakeup C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Function: void USB_SOF_Handler(void) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Overview: The USB host sends out a SOF packet to full-speed devices C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * every 1 ms. This interrupt may be useful for isochronous C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * pipes. End designers should implement callback routine C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * as necessary. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Note: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c void USB_SOF_Handler(void) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /* Callback routine here */ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003904 9c68 BCF 0x68,0x6,0x0 UIRbits.SOFIF = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003906 0012 RETURN 0x0 }//end USB_SOF_Handler C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Function: void USBStallHandler(void) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * PreCondition: A STALL packet is sent to the host by the SIE. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Overview: The STALLIF is set anytime the SIE sends out a STALL C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * packet regardless of which endpoint causes it. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * A Setup transaction overrides the STALL function. A stalled C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * endpoint stops stalling once it receives a setup packet. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * In this case, the SIE will accepts the Setup packet and C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * set the TRNIF flag to notify the firmware. STALL function C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * for that particular endpoint pipe will be automatically C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * disabled (direction specific). C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * There are a few reasons for an endpoint to be stalled. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * 1. When a non-supported USB request is received. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Example: GET_DESCRIPTOR(DEVICE_QUALIFIER) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * 2. When an endpoint is currently halted. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * 3. When the device class specifies that an endpoint must C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * stall in response to a specific event. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Example: Mass Storage Device Class C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * If the CBW is not valid, the device shall C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * STALL the Bulk-In pipe. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * See USB Mass Storage Class Bulk-only Transport C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Specification for more details. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Note: UEPn.EPSTALL can be scanned to see which endpoint causes C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * the stall event. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * If C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c void USBStallHandler(void) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Does not really have to do anything here, C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * even for the control endpoint. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * All BDs of Endpoint 0 are owned by SIE right now, C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * but once a Setup Transaction is received, the ownership C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * for EP0_OUT will be returned to CPU. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * When the Setup Transaction is serviced, the ownership C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * for EP0_IN will then be forced back to CPU by firmware. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003908 a070 BTFSS 0x70,0x0,0x0 if(UEP0bits.EPSTALL == 1) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00390a d003 BRA 0x3912 { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00390c ecf8 CALL 0x37f0,0x0 USBPrepareForNextSetupTrf(); // Firmware work-around C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00390e f01b 003910 9070 BCF 0x70,0x0,0x0 UEP0bits.EPSTALL = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c } C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003912 9a68 BCF 0x68,0x5,0x0 UIRbits.STALLIF = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003914 0012 RETURN 0x0 }//end USBStallHandler C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Function: void USBErrorHandler(void) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Overview: The purpose of this interrupt is mainly for debugging C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * during development. Check UEIR to see which error causes C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * the interrupt. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Note: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c void USBErrorHandler(void) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003916 9268 BCF 0x68,0x1,0x0 UIRbits.UERRIF = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003918 0012 RETURN 0x0 }//end USBErrorHandler C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Function: void USBProtocolResetHandler(void) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * PreCondition: A USB bus reset is received from the host. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Side Effects: Currently, this routine flushes any pending USB C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * transactions. It empties out the USTAT FIFO. This action C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * might not be desirable in some applications. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Overview: Once a USB bus reset is received from the host, this C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * routine should be called. It resets the device address to C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * zero, disables all non-EP0 endpoints, initializes EP0 to C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * be ready for default communication, clears all USB C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * interrupt flags, unmasks applicable USB interrupts, and C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * reinitializes internal state-machine variables. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c * Note: None C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c void USBProtocolResetHandler(void) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00391a 6a6a CLRF 0x6a,0x0 UEIR = 0; // Clear all USB error flags C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00391c 6a68 CLRF 0x68,0x0 UIR = 0; // Clears all USB interrupts C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00391e 0e9f MOVLW 0x9f UEIE = 0b10011111; // Unmask all USB error interrupts C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003920 6e6b MOVWF 0x6b,0x0 003922 0e7b MOVLW 0x7b UIE = 0b01111011; // Enable all interrupts except ACTVIE C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003924 6e69 MOVWF 0x69,0x0 C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003926 6a6e CLRF 0x6e,0x0 UADDR = 0x00; // Reset to default address C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003928 0e0f MOVLW 0xf mDisableEP1to15(); // Reset all non-EP0 UEPn registers C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00392a 6ee6 MOVWF 0xe6,0x0 00392c 0e71 MOVLW 0x71 00392e 6ee6 MOVWF 0xe6,0x0 003930 0e0f MOVLW 0xf 003932 6ee6 MOVWF 0xe6,0x0 003934 d814 RCALL 0x395e 003936 52e5 MOVF 0xe5,0x1,0x0 003938 52e5 MOVF 0xe5,0x1,0x0 00393a 52e5 MOVF 0xe5,0x1,0x0 00393c 0e16 MOVLW 0x16 UEP0 = EP_CTRL|HSHK_EN; // Init EP0 as a Ctrl EP, see usbdrv.h C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00393e 6e70 MOVWF 0x70,0x0 C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003940 a668 BTFSS 0x68,0x3,0x0 while(UIRbits.TRNIF == 1) // Flush any pending transactions C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003942 d002 BRA 0x3948 003946 d7fc BRA 0x3940 003944 9668 BCF 0x68,0x3,0x0 UIRbits.TRNIF = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003948 986d BCF 0x6d,0x4,0x0 UCONbits.PKTDIS = 0; // Make sure packet processing is enabled C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00394a ecf8 CALL 0x37f0,0x0 USBPrepareForNextSetupTrf(); // Declared in usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00394c f01b C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00394e 0100 MOVLB 0x0 usb_stat.RemoteWakeup = 0; // Default status flag to disable C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003950 91fd BCF 0xfd,0x0,0x1 003952 0100 MOVLB 0x0 usb_active_cfg = 0; // Clear active configuration C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003954 6bfe CLRF 0xfe,0x1 003956 0100 MOVLB 0x0 usb_device_state = DEFAULT_STATE; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003958 0e03 MOVLW 0x3 00395a 6ffc MOVWF 0xfc,0x1 00395c 0012 RETURN 0x0 }//end USBProtocolResetHandler C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /* Auxiliary Function */ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00395e cfd9 MOVFF 0xfd9,0xfe6 void ClearArray(byte* startAdr,byte count) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003960 ffe6 003962 cfe1 MOVFF 0xfe1,0xfd9 003964 ffd9 { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003966 0efd MOVLW 0xfd *startAdr; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003968 cfdb MOVFF 0xfdb,0xfe9 00396a ffe9 00396c 0efe MOVLW 0xfe 00396e cfdb MOVFF 0xfdb,0xfea 003970 ffea 003972 0efc MOVLW 0xfc while(count) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003974 50db MOVF 0xdb,0x0,0x0 003976 e004 BZ 0x3980 00397e d7f9 BRA 0x3972 { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c _asm C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003978 6aee CLRF 0xee,0x0 clrf POSTINC0,0 C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c _endasm C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00397a 0efc MOVLW 0xfc count--; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00397c 06db DECF 0xdb,0x1,0x0 }//end while C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003980 52e5 MOVF 0xe5,0x1,0x0 }//end ClearArray C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003982 cfe7 MOVFF 0xfe7,0xfd9 003984 ffd9 003986 0012 RETURN 0x0 C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /** EOF usbdrv.c *************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c /********************************************************************* C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c ********************************************************************* C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * FileName: usb9.c C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Processor: PIC18 C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Software License Agreement C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * license. C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Author Date Comment C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Rawin Rojvanit 11/19/04 Original. C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c ********************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c #include C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c #include "system\typedefs.h" C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c #include "system\usb\usb.h" C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c #include "io_cfg.h" // Required for self_power status C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c /** V A R I A B L E S ********************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c #pragma udata C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\D\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\D\system\usb\usb9\usb9.c void USBStdGetDscHandler(void); C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c void USBStdSetCfgHandler(void); C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c void USBStdGetStatusHandler(void); C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c void USBStdFeatureReqHandler(void); C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c /** D E C L A R A T I O N S **************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c #pragma code C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Function: void USBCheckStdRequest(void) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * PreCondition: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Side Effects: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Overview: This routine checks the setup data packet to see if it C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * knows how to handle it C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Note: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c void USBCheckStdRequest(void) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 00320a 0104 MOVLB 0x4 if(SetupPkt.RequestType != STANDARD) return; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 00320c 5120 MOVF 0x20,0x0,0x1 00320e 0b60 ANDLW 0x60 003210 42e8 RRNCF 0xe8,0x1,0x0 003212 42e8 RRNCF 0xe8,0x1,0x0 003214 42e8 RRNCF 0xe8,0x1,0x0 003216 42e8 RRNCF 0xe8,0x1,0x0 003218 42e8 RRNCF 0xe8,0x1,0x0 00321a 0900 IORLW 0x0 00321c e001 BZ 0x3220 00321e d055 BRA 0x32ca C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003220 5121 MOVF 0x21,0x0,0x1 switch(SetupPkt.bRequest) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003222 0a07 XORLW 0x7 003224 e051 BZ 0x32c8 003226 0a0b XORLW 0xb 003228 e04f BZ 0x32c8 00322a 0a07 XORLW 0x7 00322c e040 BZ 0x32ae 00322e 0a01 XORLW 0x1 003230 e02c BZ 0x328a 003232 0a0b XORLW 0xb 003234 e028 BZ 0x3286 003236 0a02 XORLW 0x2 003238 e026 BZ 0x3286 00323a 0a03 XORLW 0x3 00323c e022 BZ 0x3282 00323e 0a08 XORLW 0x8 003240 e012 BZ 0x3266 003242 0a01 XORLW 0x1 003244 e00e BZ 0x3262 003246 0a0f XORLW 0xf 003248 e00a BZ 0x325e 00324a 0a03 XORLW 0x3 00324c e001 BZ 0x3250 00324e d03c BRA 0x32c8 { C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c case SET_ADR: C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003250 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003252 0e01 MOVLW 0x1 003254 6ff7 MOVWF 0xf7,0x1 003256 0100 MOVLB 0x0 usb_device_state = ADR_PENDING_STATE; // Update state only C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003258 0e04 MOVLW 0x4 00325a 6ffc MOVWF 0xfc,0x1 /* See USBCtrlTrfInHandler() in usbctrltrf.c for the next step */ C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 00325c d036 BRA 0x32ca break; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c case GET_DSC: C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 00325e d836 RCALL 0x32cc USBStdGetDscHandler(); C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003260 d034 BRA 0x32ca break; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c case SET_CFG: C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003262 d890 RCALL 0x3384 USBStdSetCfgHandler(); C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003264 d032 BRA 0x32ca break; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c case GET_CFG: C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003266 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003268 0e01 MOVLW 0x1 00326a 6ff7 MOVWF 0xf7,0x1 00326c 0102 MOVLB 0x2 pSrc.bRam = (byte*)&usb_active_cfg; // Set Source C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 00326e 0efe MOVLW 0xfe 003270 6ff8 MOVWF 0xf8,0x1 003272 0e00 MOVLW 0x0 003274 6ff9 MOVWF 0xf9,0x1 003276 0100 MOVLB 0x0 usb_stat.ctrl_trf_mem = _RAM; // Set memory type C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003278 93fd BCF 0xfd,0x1,0x1 00327a 0102 MOVLB 0x2 LSB(wCount) = 1; // Set data count C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 00327c 0e01 MOVLW 0x1 00327e 6ffc MOVWF 0xfc,0x1 003280 d024 BRA 0x32ca break; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c case GET_STATUS: C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003282 d8a8 RCALL 0x33d4 USBStdGetStatusHandler(); C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003284 d022 BRA 0x32ca break; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c case CLR_FEATURE: C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c case SET_FEATURE: C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003286 d8f4 RCALL 0x3470 USBStdFeatureReqHandler(); C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003288 d020 BRA 0x32ca break; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c case GET_INTF: C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 00328a 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 00328c 0e01 MOVLW 0x1 00328e 6ff7 MOVWF 0xf7,0x1 003290 0104 MOVLB 0x4 pSrc.bRam = (byte*)&usb_alt_intf+SetupPkt.bIntfID; // Set source C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003292 5124 MOVF 0x24,0x0,0x1 003294 0102 MOVLB 0x2 003296 6ff8 MOVWF 0xf8,0x1 003298 6bf9 CLRF 0xf9,0x1 00329a 0eff MOVLW 0xff 00329c 27f8 ADDWF 0xf8,0x1,0x1 00329e 0e00 MOVLW 0x0 0032a0 23f9 ADDWFC 0xf9,0x1,0x1 0032a2 0100 MOVLB 0x0 usb_stat.ctrl_trf_mem = _RAM; // Set memory type C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0032a4 93fd BCF 0xfd,0x1,0x1 0032a6 0102 MOVLB 0x2 LSB(wCount) = 1; // Set data count C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0032a8 0e01 MOVLW 0x1 0032aa 6ffc MOVWF 0xfc,0x1 0032ac d00e BRA 0x32ca break; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c case SET_INTF: C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0032ae 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0032b0 0e01 MOVLW 0x1 0032b2 6ff7 MOVWF 0xf7,0x1 0032b4 0104 MOVLB 0x4 usb_alt_intf[SetupPkt.bIntfID] = SetupPkt.bAltID; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0032b6 5124 MOVF 0x24,0x0,0x1 0032b8 6aea CLRF 0xea,0x0 0032ba 0fff ADDLW 0xff 0032bc 6ee9 MOVWF 0xe9,0x0 0032be 0e00 MOVLW 0x0 0032c0 22ea ADDWFC 0xea,0x1,0x0 0032c2 c422 MOVFF 0x422,0xfef 0032c4 ffef 0032c6 d001 BRA 0x32ca break; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c case SET_DSC: C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c case SYNCH_FRAME: C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c default: C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0032c8 d000 BRA 0x32ca break; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c }//end switch C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0032ca 0012 RETURN 0x0 }//end USBCheckStdRequest C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Function: void USBStdGetDscHandler(void) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * PreCondition: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Side Effects: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Overview: This routine handles the standard GET_DESCRIPTOR request. C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * It utilizes tables dynamically looks up descriptor size. C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * This routine should never have to be modified if the tables C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * in usbdsc.c are declared correctly. C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Note: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c void USBStdGetDscHandler(void) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0032cc 0e80 MOVLW 0x80 if(SetupPkt.bmRequestType == 0x80) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0032ce 0104 MOVLB 0x4 0032d0 5d20 SUBWF 0x20,0x0,0x1 0032d2 e157 BNZ 0x3382 { C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0032d4 5123 MOVF 0x23,0x0,0x1 switch(SetupPkt.bDscType) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0032d6 0a03 XORLW 0x3 0032d8 e034 BZ 0x3342 0032da 0a01 XORLW 0x1 0032dc e010 BZ 0x32fe 0032de 0a03 XORLW 0x3 0032e0 e001 BZ 0x32e4 0032e2 d04d BRA 0x337e { C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c case DSC_DEV: C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0032e4 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0032e6 0e01 MOVLW 0x1 0032e8 6ff7 MOVWF 0xf7,0x1 0032ea 0102 MOVLB 0x2 pSrc.bRom = (rom byte*)&device_dsc; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0032ec 0e74 MOVLW 0x74 0032ee 6ff8 MOVWF 0xf8,0x1 0032f0 0e3a MOVLW 0x3a 0032f2 6ff9 MOVWF 0xf9,0x1 0032f4 0e12 MOVLW 0x12 wCount._word = sizeof(device_dsc); // Set data count C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0032f6 0102 MOVLB 0x2 0032f8 6ffc MOVWF 0xfc,0x1 0032fa 6bfd CLRF 0xfd,0x1 0032fc d040 BRA 0x337e break; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c case DSC_CFG: C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0032fe 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003300 0e01 MOVLW 0x1 003302 6ff7 MOVWF 0xf7,0x1 003304 0104 MOVLB 0x4 pSrc.bRom = *(USB_CD_Ptr+SetupPkt.bDscIndex); C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003306 5122 MOVF 0x22,0x0,0x1 003308 6ef6 MOVWF 0xf6,0x0 00330a 6af7 CLRF 0xf7,0x0 00330c 90d8 BCF 0xd8,0x0,0x0 00330e 36f6 RLCF 0xf6,0x1,0x0 003310 36f7 RLCF 0xf7,0x1,0x0 003312 0e35 MOVLW 0x35 003314 26f6 ADDWF 0xf6,0x1,0x0 003316 0e3b MOVLW 0x3b 003318 22f7 ADDWFC 0xf7,0x1,0x0 00331a 0009 TBLRDPOSTINC 00331c cff5 MOVFF 0xff5,0x2f8 00331e f2f8 003320 000a TBLRDPOSTDEC 003322 cff5 MOVFF 0xff5,0x2f9 003324 f2f9 003326 0e02 MOVLW 0x2 wCount._word = *(pSrc.wRom+1); // Set data count C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003328 0102 MOVLB 0x2 00332a 6af7 CLRF 0xf7,0x0 00332c 25f8 ADDWF 0xf8,0x0,0x1 00332e 6ef6 MOVWF 0xf6,0x0 003330 51f9 MOVF 0xf9,0x0,0x1 003332 22f7 ADDWFC 0xf7,0x1,0x0 003334 0009 TBLRDPOSTINC 003336 cff5 MOVFF 0xff5,0x2fc 003338 f2fc 00333a 000a TBLRDPOSTDEC 00333c cff5 MOVFF 0xff5,0x2fd 00333e f2fd 003340 d01e BRA 0x337e break; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c case DSC_STR: C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003342 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003344 0e01 MOVLW 0x1 003346 6ff7 MOVWF 0xf7,0x1 003348 0104 MOVLB 0x4 pSrc.bRom = *(USB_SD_Ptr+SetupPkt.bDscIndex); C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 00334a 5122 MOVF 0x22,0x0,0x1 00334c 6ef6 MOVWF 0xf6,0x0 00334e 6af7 CLRF 0xf7,0x0 003350 90d8 BCF 0xd8,0x0,0x0 003352 36f6 RLCF 0xf6,0x1,0x0 003354 36f7 RLCF 0xf7,0x1,0x0 003356 0e39 MOVLW 0x39 003358 26f6 ADDWF 0xf6,0x1,0x0 00335a 0e3b MOVLW 0x3b 00335c 22f7 ADDWFC 0xf7,0x1,0x0 00335e 0009 TBLRDPOSTINC 003360 cff5 MOVFF 0xff5,0x2f8 003362 f2f8 003364 000a TBLRDPOSTDEC 003366 cff5 MOVFF 0xff5,0x2f9 003368 f2f9 00336a c2f8 MOVFF 0x2f8,0xff6 wCount._word = *pSrc.bRom; // Set data count C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 00336c fff6 00336e c2f9 MOVFF 0x2f9,0xff7 003370 fff7 003372 0008 TBLRD 003374 50f5 MOVF 0xf5,0x0,0x0 003376 0102 MOVLB 0x2 003378 6ffc MOVWF 0xfc,0x1 00337a 6bfd CLRF 0xfd,0x1 00337c d000 BRA 0x337e break; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c }//end switch C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 00337e 0100 MOVLB 0x0 usb_stat.ctrl_trf_mem = _ROM; // Set memory type C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003380 83fd BSF 0xfd,0x1,0x1 }//end if C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003382 0012 RETURN 0x0 }//end USBStdGetDscHandler C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Function: void USBStdSetCfgHandler(void) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * PreCondition: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Side Effects: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Overview: This routine first disables all endpoints by clearing C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * UEP registers. It then configures (initializes) endpoints C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * specified in the modifiable section. C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Note: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c void USBStdSetCfgHandler(void) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003384 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003386 0e01 MOVLW 0x1 003388 6ff7 MOVWF 0xf7,0x1 00338a 0e0f MOVLW 0xf mDisableEP1to15(); // See usbdrv.h C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 00338c 6ee6 MOVWF 0xe6,0x0 00338e 0e71 MOVLW 0x71 003390 6ee6 MOVWF 0xe6,0x0 003392 0e0f MOVLW 0xf 003394 6ee6 MOVWF 0xe6,0x0 003396 ecaf CALL 0x395e,0x0 003398 f01c 00339a 52e5 MOVF 0xe5,0x1,0x0 00339c 52e5 MOVF 0xe5,0x1,0x0 00339e 52e5 MOVF 0xe5,0x1,0x0 0033a0 0e01 MOVLW 0x1 ClearArray((byte*)&usb_alt_intf,MAX_NUM_INT); C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0033a2 6ee6 MOVWF 0xe6,0x0 0033a4 0eff MOVLW 0xff 0033a6 6ee6 MOVWF 0xe6,0x0 0033a8 0e00 MOVLW 0x0 0033aa 6ee6 MOVWF 0xe6,0x0 0033ac ecaf CALL 0x395e,0x0 0033ae f01c 0033b0 52e5 MOVF 0xe5,0x1,0x0 0033b2 52e5 MOVF 0xe5,0x1,0x0 0033b4 52e5 MOVF 0xe5,0x1,0x0 0033b6 c422 MOVFF 0x422,0xfe usb_active_cfg = SetupPkt.bCfgValue; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0033b8 f0fe 0033ba 0104 MOVLB 0x4 if(SetupPkt.bCfgValue == 0) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0033bc 5122 MOVF 0x22,0x0,0x1 0033be e104 BNZ 0x33c8 0033c0 0100 MOVLB 0x0 usb_device_state = ADDRESS_STATE; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0033c2 0e05 MOVLW 0x5 0033c4 6ffc MOVWF 0xfc,0x1 0033c6 d005 BRA 0x33d2 else C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0033c8 0100 MOVLB 0x0 usb_device_state = CONFIGURED_STATE; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0033ca 0e06 MOVLW 0x6 0033cc 6ffc MOVWF 0xfc,0x1 C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c /* Modifiable Section */ C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c #if defined(USB_USE_CDC) // See autofiles\usbcfg.h C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0033ce eca8 CALL 0x2f50,0x0 CDCInitEP(); C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0033d0 f017 #endif C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c /* End modifiable section */ C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c }//end if(SetupPkt.bcfgValue == 0) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0033d2 0012 RETURN 0x0 }//end USBStdSetCfgHandler C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Function: void USBStdGetStatusHandler(void) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * PreCondition: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Side Effects: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Overview: This routine handles the standard GET_STATUS request C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Note: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c void USBStdGetStatusHandler(void) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0033d4 0104 MOVLB 0x4 CtrlTrfData._byte0 = 0; // Initialize content C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0033d6 6b28 CLRF 0x28,0x1 0033d8 6b29 CLRF 0x29,0x1 CtrlTrfData._byte1 = 0; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0033da 0104 MOVLB 0x4 switch(SetupPkt.Recipient) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0033dc 5120 MOVF 0x20,0x0,0x1 0033de 0b1f ANDLW 0x1f 0033e0 0a02 XORLW 0x2 0033e2 e014 BZ 0x340c 0033e4 0a03 XORLW 0x3 0033e6 e00e BZ 0x3404 0033e8 0a01 XORLW 0x1 0033ea e001 BZ 0x33ee 0033ec d033 BRA 0x3454 { C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c case RCPT_DEV: C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0033ee 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0033f0 0e01 MOVLW 0x1 0033f2 6ff7 MOVWF 0xf7,0x1 /* C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * _byte0: bit0: Self-Powered Status [0] Bus-Powered [1] Self-Powered C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * bit1: RemoteWakeup [0] Disabled [1] Enabled C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c */ C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c if(self_power == 1) // self_power defined in io_cfg.h C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0033f4 0104 MOVLB 0x4 CtrlTrfData._byte0|=0b000000001; // Set bit0 C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0033f6 8128 BSF 0x28,0x0,0x1 C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0033f8 0100 MOVLB 0x0 if(usb_stat.RemoteWakeup == 1) // usb_stat defined in usbmmap.c C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0033fa a1fd BTFSS 0xfd,0x0,0x1 0033fc d002 BRA 0x3402 0033fe 0104 MOVLB 0x4 CtrlTrfData._byte0|=0b00000010; // Set bit1 C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003400 8328 BSF 0x28,0x1,0x1 003402 d028 BRA 0x3454 break; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c case RCPT_INTF: C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003404 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; // No data to update C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003406 0e01 MOVLW 0x1 003408 6ff7 MOVWF 0xf7,0x1 00340a d024 BRA 0x3454 break; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c case RCPT_EP: C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 00340c 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 00340e 0e01 MOVLW 0x1 003410 6ff7 MOVWF 0xf7,0x1 /* C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * _byte0: bit0: Halt Status [0] Not Halted [1] Halted C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c */ C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003412 0104 MOVLB 0x4 pDst.bRam = (byte*)&ep0Bo+(SetupPkt.EPNum*8)+(SetupPkt.EPDir*4); C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003414 5124 MOVF 0x24,0x0,0x1 003416 0b0f ANDLW 0xf 003418 0d08 MULLW 0x8 00341a 50f3 MOVF 0xf3,0x0,0x0 00341c 6a15 CLRF 0x15,0x0 00341e 0f00 ADDLW 0x0 003420 6e14 MOVWF 0x14,0x0 003422 0e04 MOVLW 0x4 003424 2215 ADDWFC 0x15,0x1,0x0 003426 5124 MOVF 0x24,0x0,0x1 003428 0b80 ANDLW 0x80 00342a e001 BZ 0x342e 00342c 0e01 MOVLW 0x1 00342e 0d04 MULLW 0x4 003430 50f3 MOVF 0xf3,0x0,0x0 003432 0102 MOVLB 0x2 003434 2414 ADDWF 0x14,0x0,0x0 003436 6ffa MOVWF 0xfa,0x1 003438 0e00 MOVLW 0x0 00343a 2015 ADDWFC 0x15,0x0,0x0 00343c 6ffb MOVWF 0xfb,0x1 00343e c2fa MOVFF 0x2fa,0xfe9 if(*pDst.bRam & _BSTALL) // Use _BSTALL as a bit mask C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003440 ffe9 003442 c2fb MOVFF 0x2fb,0xfea 003444 ffea 003446 50ef MOVF 0xef,0x0,0x0 003448 0b04 ANDLW 0x4 00344a e003 BZ 0x3452 00344c 0104 MOVLB 0x4 CtrlTrfData._byte0=0x01;// Set bit0 C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 00344e 0e01 MOVLW 0x1 003450 6f28 MOVWF 0x28,0x1 003452 d000 BRA 0x3454 break; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c }//end switch C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003454 0102 MOVLB 0x2 if(ctrl_trf_session_owner == MUID_USB9) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003456 05f7 DECF 0xf7,0x0,0x1 003458 e10a BNZ 0x346e { C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 00345a 0102 MOVLB 0x2 pSrc.bRam = (byte*)&CtrlTrfData; // Set Source C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 00345c 0e28 MOVLW 0x28 00345e 6ff8 MOVWF 0xf8,0x1 003460 0e04 MOVLW 0x4 003462 6ff9 MOVWF 0xf9,0x1 003464 0100 MOVLB 0x0 usb_stat.ctrl_trf_mem = _RAM; // Set memory type C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003466 93fd BCF 0xfd,0x1,0x1 003468 0102 MOVLB 0x2 LSB(wCount) = 2; // Set data count C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 00346a 0e02 MOVLW 0x2 00346c 6ffc MOVWF 0xfc,0x1 }//end if(...) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 00346e 0012 RETURN 0x0 }//end USBStdGetStatusHandler C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Function: void USBStdFeatureReqHandler(void) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * PreCondition: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Side Effects: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Overview: This routine handles the standard SET & CLEAR FEATURES C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * requests C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c * Note: None C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c void USBStdFeatureReqHandler(void) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003470 0104 MOVLB 0x4 if((SetupPkt.bFeature == DEVICE_REMOTE_WAKEUP)&& C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003472 0522 DECF 0x22,0x0,0x1 003474 e110 BNZ 0x3496 (SetupPkt.Recipient == RCPT_DEV)) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003476 5120 MOVF 0x20,0x0,0x1 003478 0b1f ANDLW 0x1f 00347a 0900 IORLW 0x0 00347c e10c BNZ 0x3496 { C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 00347e 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003480 0e01 MOVLW 0x1 003482 6ff7 MOVWF 0xf7,0x1 003484 0e03 MOVLW 0x3 if(SetupPkt.bRequest == SET_FEATURE) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003486 0104 MOVLB 0x4 003488 5d21 SUBWF 0x21,0x0,0x1 00348a e103 BNZ 0x3492 00348c 0100 MOVLB 0x0 usb_stat.RemoteWakeup = 1; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 00348e 81fd BSF 0xfd,0x0,0x1 003490 d002 BRA 0x3496 else C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003492 0100 MOVLB 0x0 usb_stat.RemoteWakeup = 0; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003494 91fd BCF 0xfd,0x0,0x1 }//end if C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003496 0104 MOVLB 0x4 if((SetupPkt.bFeature == ENDPOINT_HALT)&& C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003498 5122 MOVF 0x22,0x0,0x1 00349a e13a BNZ 0x3510 (SetupPkt.Recipient == RCPT_EP)&& C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 00349c 5120 MOVF 0x20,0x0,0x1 00349e 0b1f ANDLW 0x1f 0034a0 0802 SUBLW 0x2 0034a2 e136 BNZ 0x3510 0034a4 5124 MOVF 0x24,0x0,0x1 (SetupPkt.EPNum != 0)) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0034a6 0b0f ANDLW 0xf 0034a8 0900 IORLW 0x0 0034aa e032 BZ 0x3510 { C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0034ac 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0034ae 0e01 MOVLW 0x1 0034b0 6ff7 MOVWF 0xf7,0x1 /* Must do address calculation here */ C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0034b2 0104 MOVLB 0x4 pDst.bRam = (byte*)&ep0Bo+(SetupPkt.EPNum*8)+(SetupPkt.EPDir*4); C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0034b4 5124 MOVF 0x24,0x0,0x1 0034b6 0b0f ANDLW 0xf 0034b8 0d08 MULLW 0x8 0034ba 50f3 MOVF 0xf3,0x0,0x0 0034bc 6a15 CLRF 0x15,0x0 0034be 0f00 ADDLW 0x0 0034c0 6e14 MOVWF 0x14,0x0 0034c2 0e04 MOVLW 0x4 0034c4 2215 ADDWFC 0x15,0x1,0x0 0034c6 5124 MOVF 0x24,0x0,0x1 0034c8 0b80 ANDLW 0x80 0034ca e001 BZ 0x34ce 0034cc 0e01 MOVLW 0x1 0034ce 0d04 MULLW 0x4 0034d0 50f3 MOVF 0xf3,0x0,0x0 0034d2 0102 MOVLB 0x2 0034d4 2414 ADDWF 0x14,0x0,0x0 0034d6 6ffa MOVWF 0xfa,0x1 0034d8 0e00 MOVLW 0x0 0034da 2015 ADDWFC 0x15,0x0,0x0 0034dc 6ffb MOVWF 0xfb,0x1 C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0034de 0e03 MOVLW 0x3 if(SetupPkt.bRequest == SET_FEATURE) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0034e0 0104 MOVLB 0x4 0034e2 5d21 SUBWF 0x21,0x0,0x1 0034e4 e107 BNZ 0x34f4 0034e6 0e84 MOVLW 0x84 *pDst.bRam = _USIE|_BSTALL; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0034e8 c2fa MOVFF 0x2fa,0xfe9 0034ea ffe9 0034ec c2fb MOVFF 0x2fb,0xfea 0034ee ffea 0034f0 6eef MOVWF 0xef,0x0 0034f2 d00e BRA 0x3510 else C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0034f4 af24 BTFSS 0x24,0x7,0x1 if(SetupPkt.EPDir == 1) // IN C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0034f6 d006 BRA 0x3504 0034f8 c2fa MOVFF 0x2fa,0xfe9 *pDst.bRam = _UCPU; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0034fa ffe9 0034fc c2fb MOVFF 0x2fb,0xfea 0034fe ffea 003500 6aef CLRF 0xef,0x0 003502 d006 BRA 0x3510 else C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003504 0e88 MOVLW 0x88 *pDst.bRam = _USIE|_DAT0|_DTSEN; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003506 c2fa MOVFF 0x2fa,0xfe9 003508 ffe9 00350a c2fb MOVFF 0x2fb,0xfea 00350c ffea 00350e 6eef MOVWF 0xef,0x0 }//end if C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c }//end if C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 003510 0012 RETURN 0x0 }//end USBStdFeatureReqHandler C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c /** EOF usb9.c ***************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c /********************************************************************* C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c ********************************************************************* C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * FileName: usbdsc.c C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * Processor: PIC18 C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * Software License Agreement C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * license. C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c ********************************************************************/ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c /********************************************************************* C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * -usbdsc.c- C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * This file contains the USB descriptor information. It is used C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * in conjunction with the usbdsc.h file. When a descriptor is added C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * or removed from the main configuration descriptor, i.e. CFG01, C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * the user must also change the descriptor structure defined in C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * the usbdsc.h file. The structure is used to calculate the C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * descriptor size, i.e. sizeof(CFG01). C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * A typical configuration descriptor consists of: C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * At least one configuration descriptor (USB_CFG_DSC) C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * One or more interface descriptors (USB_INTF_DSC) C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * One or more endpoint descriptors (USB_EP_DSC) C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * Naming Convention: C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * To resolve ambiguity, the naming convention are as followed: C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * - USB_CFG_DSC type should be named cdxx, where xx is the C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * configuration number. This number should match the actual C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * index value of this configuration. C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * - USB_INTF_DSC type should be named ia, where yy is the C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * interface number and zz is the alternate interface number. C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * - USB_EP_DSC type should be named ep<##>_ia, where C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * ## is the endpoint number and d is the direction of transfer. C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * The interface name should also be listed as a suffix to identify C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * which interface does the endpoint belong to. C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * Example: C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * If a device has one configuration, two interfaces; interface 0 C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * has two endpoints (in and out), and interface 1 has one endpoint(in). C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * Then the CFG01 structure in the usbdsc.h should be: C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * #define CFG01 rom struct \ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * { USB_CFG_DSC cd01; \ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * USB_INTF_DSC i00a00; \ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * USB_EP_DSC ep01o_i00a00; \ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * USB_EP_DSC ep01i_i00a00; \ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * USB_INTF_DSC i01a00; \ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * USB_EP_DSC ep02i_i01a00; \ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * } cfg01 C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * Note the hierarchy of the descriptors above, it follows the USB C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * specification requirement. All endpoints belonging to an interface C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * should be listed immediately after that interface. C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * ------------------------------------------------------------------- C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * Filling in the descriptor values in the usbdsc.c file: C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * ------------------------------------------------------------------- C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * Most items should be self-explanatory, however, a few will be C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * explained for clarification. C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * [Configuration Descriptor(USB_CFG_DSC)] C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * The configuration attribute must always have the _DEFAULT C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * definition at the minimum. Additional options can be ORed C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * to the _DEFAULT attribute. Available options are _SELF and _RWU. C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * These definitions are defined in the usbdefs_std_dsc.h file. The C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * _SELF tells the USB host that this device is self-powered. The C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * _RWU tells the USB host that this device supports Remote Wakeup. C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * [Endpoint Descriptor(USB_EP_DSC)] C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * Assume the following example: C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * sizeof(USB_EP_DSC),DSC_EP,_EP01_OUT,_BULK,64,0x00 C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * The first two parameters are self-explanatory. They specify the C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * length of this endpoint descriptor (7) and the descriptor type. C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * The next parameter identifies the endpoint, the definitions are C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * defined in usbdefs_std_dsc.h and has the following naming C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * convention: C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * _EP<##>_ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * where ## is the endpoint number and dir is the direction of C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * transfer. The dir has the value of either 'OUT' or 'IN'. C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * The next parameter identifies the type of the endpoint. Available C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * options are _BULK, _INT, _ISO, and _CTRL. The _CTRL is not C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * typically used because the default control transfer endpoint is C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * not defined in the USB descriptors. When _ISO option is used, C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * addition options can be ORed to _ISO. Example: C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * _ISO|_AD|_FE C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * This describes the endpoint as an isochronous pipe with adaptive C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * and feedback attributes. See usbdefs_std_dsc.h and the USB C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * specification for details. The next parameter defines the size of C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * the endpoint. The last parameter in the polling interval. C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * ------------------------------------------------------------------- C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * Adding a USB String C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * ------------------------------------------------------------------- C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * A string descriptor array should have the following format: C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * rom struct{byte bLength;byte bDscType;word string[size];}sdxxx={ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * sizeof(sdxxx),DSC_STR,}; C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * The above structure provides a means for the C compiler to C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * calculate the length of string descriptor sdxxx, where xxx is the C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * index number. The first two bytes of the descriptor are descriptor C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * length and type. The rest are string texts which must be C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * in the unicode format. The unicode format is achieved by declaring C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * each character as a word type. The whole text string is declared C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * as a word array with the number of characters equals to . C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * has to be manually counted and entered into the array C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * declaration. Let's study this through an example: C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * if the string is "USB" , then the string descriptor should be: C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * (Using index 02) C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * rom struct{byte bLength;byte bDscType;word string[3];}sd002={ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * sizeof(sd002),DSC_STR,'U','S','B'}; C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * A USB project may have multiple strings and the firmware supports C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * the management of multiple strings through a look-up table. C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * The look-up table is defined as: C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * rom const unsigned char *rom USB_SD_Ptr[]={&sd000,&sd001,&sd002}; C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * The above declaration has 3 strings, sd000, sd001, and sd002. C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * Strings can be removed or added. sd000 is a specialized string C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * descriptor. It defines the language code, usually this is C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * US English (0x0409). The index of the string must match the index C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * position of the USB_SD_Ptr array, &sd000 must be in position C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * USB_SD_Ptr[0], &sd001 must be in position USB_SD_Ptr[1] and so on. C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * The look-up table USB_SD_Ptr is used by the get string handler C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * function in usb9.c. C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * ------------------------------------------------------------------- C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * The look-up table scheme also applies to the configuration C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * descriptor. A USB device may have multiple configuration C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * descriptors, i.e. CFG01, CFG02, etc. To add a configuration C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * descriptor, user must implement a structure similar to CFG01. C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * The next step is to add the configuration descriptor name, i.e. C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * cfg01, cfg02,.., to the look-up table USB_CD_Ptr. USB_CD_Ptr[0] C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * is a dummy place holder since configuration 0 is the un-configured C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * state according to the definition in the USB specification. C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c ********************************************************************/ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c /********************************************************************* C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * Descriptor specific type definitions are defined in: C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * system\usb\usbdefs\usbdefs_std_dsc.h C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * Configuration information is defined in: C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c * autofiles\usbcfg.h C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c ********************************************************************/ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c /** I N C L U D E S *************************************************/ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c #include "system\typedefs.h" C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c #include "system\usb\usb.h" C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c /** C O N S T A N T S ************************************************/ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c #pragma romdata C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c /* Device Descriptor */ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c rom USB_DEV_DSC device_dsc= C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c { C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c sizeof(USB_DEV_DSC), // Size of this descriptor in bytes C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c DSC_DEV, // DEVICE descriptor type C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 0x0200, // USB Spec Release Number in BCD format C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c CDC_DEVICE, // Class Code C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 0x00, // Subclass code C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 0x00, // Protocol code C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c EP0_BUFF_SIZE, // Max packet size for EP0, see usbcfg.h C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 0x04D8, // Vendor ID C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 0x000A, // Product ID: CDC RS-232 Emulation Demo C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 0x0000, // Device release number in BCD format C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 0x01, // Manufacturer string index C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 0x02, // Product string index C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 0x00, // Device serial number string index C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 0x01 // Number of possible configurations C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c }; C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c /* Configuration 1 Descriptor */ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c CFG01= C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c { C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c /* Configuration Descriptor */ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c sizeof(USB_CFG_DSC), // Size of this descriptor in bytes C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c DSC_CFG, // CONFIGURATION descriptor type C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c sizeof(cfg01), // Total length of data for this cfg C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 2, // Number of interfaces in this cfg C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 1, // Index value of this configuration C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 0, // Configuration string index C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c _DEFAULT, // Attributes, see usbdefs_std_dsc.h C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 50, // Max power consumption (2X mA) C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c /* Interface Descriptor */ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c sizeof(USB_INTF_DSC), // Size of this descriptor in bytes C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c DSC_INTF, // INTERFACE descriptor type C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 0, // Interface Number C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 0, // Alternate Setting Number C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 1, // Number of endpoints in this intf C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c COMM_INTF, // Class code C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c ABSTRACT_CONTROL_MODEL, // Subclass code C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c V25TER, // Protocol code C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 0, // Interface string index C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c /* CDC Class-Specific Descriptors */ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c sizeof(USB_CDC_HEADER_FN_DSC),CS_INTERFACE,DSC_FN_HEADER,0x0110, C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c sizeof(USB_CDC_ACM_FN_DSC),CS_INTERFACE,DSC_FN_ACM,0x02, C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c sizeof(USB_CDC_UNION_FN_DSC),CS_INTERFACE,DSC_FN_UNION,CDC_COMM_INTF_ID,CDC_DATA_INTF_ID, C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c sizeof(USB_CDC_CALL_MGT_FN_DSC),CS_INTERFACE,DSC_FN_CALL_MGT,0x00,CDC_DATA_INTF_ID, C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c /* Endpoint Descriptor */ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c sizeof(USB_EP_DSC),DSC_EP,_EP02_IN,_INT,CDC_INT_EP_SIZE,0x02, C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c /* Interface Descriptor */ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c sizeof(USB_INTF_DSC), // Size of this descriptor in bytes C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c DSC_INTF, // INTERFACE descriptor type C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 1, // Interface Number C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 0, // Alternate Setting Number C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 2, // Number of endpoints in this intf C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c DATA_INTF, // Class code C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 0, // Subclass code C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c NO_PROTOCOL, // Protocol code C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 0, // Interface string index C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c /* Endpoint Descriptors */ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c sizeof(USB_EP_DSC),DSC_EP,_EP03_OUT,_BULK,CDC_BULK_OUT_EP_SIZE,0x00, C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c sizeof(USB_EP_DSC),DSC_EP,_EP03_IN,_BULK,CDC_BULK_IN_EP_SIZE,0x00 C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c }; C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c rom struct{byte bLength;byte bDscType;word string[1];}sd000={ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c sizeof(sd000),DSC_STR,0x0409}; C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c rom struct{byte bLength;byte bDscType;word string[25];}sd001={ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c sizeof(sd001),DSC_STR, C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 'M','i','c','r','o','c','h','i','p',' ', C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 'T','e','c','h','n','o','l','o','g','y',' ','I','n','c','.'}; C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c rom struct{byte bLength;byte bDscType;word string[25];}sd002={ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c sizeof(sd002),DSC_STR, C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 'C','D','C',' ','R','S','-','2','3','2',' ', C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c 'E','m','u','l','a','t','i','o','n',' ','D','e','m','o'}; C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c rom const unsigned char *rom USB_CD_Ptr[]={&cfg01,&cfg01}; C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c rom const unsigned char *rom USB_SD_Ptr[]={&sd000,&sd001,&sd002}; C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c rom pFunc ClassReqHandler[1]= C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c { C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c &USBCheckCDCRequest C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c }; C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c #pragma code C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c /** EOF usbdsc.c ****************************************************/ C:\Projects\UBW\FW\2455\D\autofiles\usbdsc.c /********************************************************************* C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c ********************************************************************* C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * FileName: usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Processor: PIC18 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Software License Agreement C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * license. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Author Date Comment C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Rawin Rojvanit 11/19/04 Original. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c ********************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c #include C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c #include "system\typedefs.h" C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c #include "system\usb\usb.h" C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /** V A R I A B L E S ********************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c #pragma udata C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c byte ctrl_trf_state; // Control Transfer State C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c byte ctrl_trf_session_owner; // Current transfer session owner C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c POINTER pSrc; // Data source pointer C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c POINTER pDst; // Data destination pointer C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c WORD wCount; // Data counter C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\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\D\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlTrfSetupHandler(void); C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlTrfOutHandler(void); C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlTrfInHandler(void); C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /** D E C L A R A T I O N S **************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c #pragma code C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlEPService(void) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: USTAT is loaded with a valid endpoint address. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Overview: USBCtrlEPService checks for three transaction types that C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * it knows how to service and services them: C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * 1. EP0 SETUP C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * 2. EP0 OUT C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * 3. EP0 IN C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * It ignores all other types (i.e. EP1, EP2, etc.) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Note: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlEPService(void) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003512 506c MOVF 0x6c,0x0,0x0 if(USTAT == EP00_OUT) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003514 e002 BZ 0x351a 003516 0e00 MOVLW 0x0 003518 d001 BRA 0x351c 00351a 0e01 MOVLW 0x1 00351c 0900 IORLW 0x0 00351e e00b BZ 0x3536 { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003520 0104 MOVLB 0x4 if(ep0Bo.Stat.PID == SETUP_TOKEN) // EP0 SETUP C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003522 5100 MOVF 0x0,0x0,0x1 003524 0b3c ANDLW 0x3c 003526 42e8 RRNCF 0xe8,0x1,0x0 003528 42e8 RRNCF 0xe8,0x1,0x0 00352a 080d SUBLW 0xd 00352c e102 BNZ 0x3532 00352e d80c RCALL 0x3548 USBCtrlTrfSetupHandler(); C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003530 d001 BRA 0x3534 else // EP0 OUT C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003532 d840 RCALL 0x35b4 USBCtrlTrfOutHandler(); C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c } C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003534 d008 BRA 0x3546 else if(USTAT == EP00_IN) // EP0 IN C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003536 506c MOVF 0x6c,0x0,0x0 003538 e002 BZ 0x353e 00353a 0e00 MOVLW 0x0 00353c d001 BRA 0x3540 00353e 0e01 MOVLW 0x1 003540 0904 IORLW 0x4 003542 e001 BZ 0x3546 003544 d847 RCALL 0x35d4 USBCtrlTrfInHandler(); C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003546 0012 RETURN 0x0 }//end USBCtrlEPService C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlTrfSetupHandler(void) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: SetupPkt buffer is loaded with valid USB Setup Data C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Overview: This routine is a task dispatcher and has 3 stages. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * 1. It initializes the control transfer state machine. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * 2. It calls on each of the module that may know how to C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * service the Setup Request from the host. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Module Example: USB9, HID, CDC, MSD, ... C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * As new classes are added, ClassReqHandler table in C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * usbdsc.c should be updated to call all available C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * class handlers. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * 3. Once each of the modules has had a chance to check if C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * it is responsible for servicing the request, stage 3 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * then checks direction of the transfer to determine how C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * to prepare EP0 for the control transfer. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Refer to USBCtrlEPServiceComplete() for more details. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Note: Microchip USB Firmware has three different states for C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * the control transfer state machine: C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * 1. WAIT_SETUP C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * 2. CTRL_TRF_TX C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * 3. CTRL_TRF_RX C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Refer to firmware manual to find out how one state C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * is transitioned to another. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * A Control Transfer is composed of many USB transactions. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * When transferring data over multiple transactions, C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * it is important to keep track of data source, data C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * destination, and data count. These three parameters are C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * stored in pSrc,pDst, and wCount. A flag is used to C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * note if the data source is from ROM or RAM. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003548 cfd9 MOVFF 0xfd9,0xfe6 void USBCtrlTrfSetupHandler(void) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00354a ffe6 00354c cfe1 MOVFF 0xfe1,0xfd9 00354e ffd9 003550 52e6 MOVF 0xe6,0x1,0x0 { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c byte i; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /* Stage 1 */ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003552 0102 MOVLB 0x2 ctrl_trf_state = WAIT_SETUP; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003554 6bf6 CLRF 0xf6,0x1 003556 6bf7 CLRF 0xf7,0x1 ctrl_trf_session_owner = MUID_NULL; // Set owner to NULL C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003558 6bfc CLRF 0xfc,0x1 wCount._word = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00355a 6bfd CLRF 0xfd,0x1 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /* Stage 2 */ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00355c ec05 CALL 0x320a,0x0 USBCheckStdRequest(); // See system\usb9\usb9.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00355e f019 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003560 6adf CLRF 0xdf,0x0 for(i=0;i < (sizeof(ClassReqHandler)/sizeof(pFunc));i++) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003562 50df MOVF 0xdf,0x0,0x0 003564 6e14 MOVWF 0x14,0x0 003566 6a15 CLRF 0x15,0x0 003568 0e01 MOVLW 0x1 00356a 5c14 SUBWF 0x14,0x0,0x0 00356c 0e00 MOVLW 0x0 00356e 5815 SUBWFB 0x15,0x0,0x0 003570 e21b BC 0x35a8 0035a4 2adf INCF 0xdf,0x1,0x0 0035a6 d7dd BRA 0x3562 { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003572 0102 MOVLB 0x2 if(ctrl_trf_session_owner != MUID_NULL)break; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003574 51f7 MOVF 0xf7,0x0,0x1 003576 e001 BZ 0x357a 003578 d017 BRA 0x35a8 00357a 6af7 CLRF 0xf7,0x0 ClassReqHandler[i](); // See autofiles\usbdsc.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00357c 34df RLCF 0xdf,0x0,0x0 00357e 0bfe ANDLW 0xfe 003580 36f7 RLCF 0xf7,0x1,0x0 003582 6ef6 MOVWF 0xf6,0x0 003584 0e3f MOVLW 0x3f 003586 26f6 ADDWF 0xf6,0x1,0x0 003588 0e3b MOVLW 0x3b 00358a 22f7 ADDWFC 0xf7,0x1,0x0 00358c 0009 TBLRDPOSTINC 00358e cff5 MOVFF 0xff5,0x14 003590 f014 003592 0008 TBLRD 003594 cff5 MOVFF 0xff5,0x15 003596 f015 003598 d004 BRA 0x35a2 00359a c015 MOVFF 0x15,0xffa 00359c fffa 00359e 5014 MOVF 0x14,0x0,0x0 0035a0 6ef9 MOVWF 0xf9,0x0 0035a2 dffb RCALL 0x359a }//end while C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /* Stage 3 */ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0035a8 d8dd RCALL 0x3764 USBCtrlEPServiceComplete(); C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0035aa 52e5 MOVF 0xe5,0x1,0x0 }//end USBCtrlTrfSetupHandler C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0035ac 52e5 MOVF 0xe5,0x1,0x0 0035ae cfe7 MOVFF 0xfe7,0xfd9 0035b0 ffd9 0035b2 0012 RETURN 0x0 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlTrfOutHandler(void) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Overview: This routine handles an OUT transaction according to C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * which control transfer state is currently active. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Note: Note that if the the control transfer was from C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * host to device, the session owner should be notified C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * at the end of each OUT transaction to service the C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * received data. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlTrfOutHandler(void) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0035b4 0e02 MOVLW 0x2 if(ctrl_trf_state == CTRL_TRF_RX) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0035b6 0102 MOVLB 0x2 0035b8 5df6 SUBWF 0xf6,0x0,0x1 0035ba e10a BNZ 0x35d0 { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0035bc d896 RCALL 0x36ea USBCtrlTrfRxService(); C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Don't have to worry about overwriting _KEEP bit C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * because if _KEEP was set, TRNIF would not have been C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * generated in the first place. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0035be 0104 MOVLB 0x4 if(ep0Bo.Stat.DTS == 0) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0035c0 bd00 BTFSC 0x0,0x6,0x1 0035c2 d003 BRA 0x35ca 0035c4 0ec8 MOVLW 0xc8 ep0Bo.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0035c6 6f00 MOVWF 0x0,0x1 0035c8 d002 BRA 0x35ce else C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0035ca 0e88 MOVLW 0x88 ep0Bo.Stat._byte = _USIE|_DAT0|_DTSEN; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0035cc 6f00 MOVWF 0x0,0x1 } C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0035ce d001 BRA 0x35d2 else // CTRL_TRF_TX C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0035d0 d90f RCALL 0x37f0 USBPrepareForNextSetupTrf(); C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0035d2 0012 RETURN 0x0 }//end USBCtrlTrfOutHandler C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlTrfInHandler(void) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Overview: This routine handles an IN transaction according to C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * which control transfer state is currently active. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Note: A Set Address Request must not change the acutal address C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * of the device until the completion of the control C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * transfer. The end of the control transfer for Set Address C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Request is an IN transaction. Therefore it is necessary C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * to service this unique situation when the condition is C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * right. Macro mUSBCheckAdrPendingState is defined in C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * usb9.h and its function is to specifically service this C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * event. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlTrfInHandler(void) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0035d4 0e04 MOVLW 0x4 mUSBCheckAdrPendingState(); // Must check if in ADR_PENDING_STATE C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0035d6 0100 MOVLB 0x0 0035d8 5dfc SUBWF 0xfc,0x0,0x1 0035da e10a BNZ 0x35f0 0035dc c422 MOVFF 0x422,0xf6e 0035de ff6e 0035e0 506e MOVF 0x6e,0x0,0x0 0035e2 0800 SUBLW 0x0 0035e4 e203 BC 0x35ec 0035e6 0e05 MOVLW 0x5 0035e8 6ffc MOVWF 0xfc,0x1 0035ea d002 BRA 0x35f0 0035ec 0e03 MOVLW 0x3 0035ee 6ffc MOVWF 0xfc,0x1 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0035f0 0102 MOVLB 0x2 if(ctrl_trf_state == CTRL_TRF_TX) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0035f2 05f6 DECF 0xf6,0x0,0x1 0035f4 e10a BNZ 0x360a { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0035f6 d80b RCALL 0x360e USBCtrlTrfTxService(); C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0035f8 0104 MOVLB 0x4 if(ep0Bi.Stat.DTS == 0) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0035fa bd04 BTFSC 0x4,0x6,0x1 0035fc d003 BRA 0x3604 0035fe 0ec8 MOVLW 0xc8 ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003600 6f04 MOVWF 0x4,0x1 003602 d002 BRA 0x3608 else C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003604 0e88 MOVLW 0x88 ep0Bi.Stat._byte = _USIE|_DAT0|_DTSEN; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003606 6f04 MOVWF 0x4,0x1 } C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003608 d001 BRA 0x360c else // CTRL_TRF_RX C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00360a d8f2 RCALL 0x37f0 USBPrepareForNextSetupTrf(); C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00360c 0012 RETURN 0x0 }//end USBCtrlTrfInHandler C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlTrfTxService(void) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: pSrc, wCount, and usb_stat.ctrl_trf_mem are setup properly. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Overview: This routine should be called from only two places. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * One from USBCtrlEPServiceComplete() and one from C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * USBCtrlTrfInHandler(). It takes care of managing a C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * transfer over multiple USB transactions. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Note: This routine works with isochronous endpoint larger than C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * 256 bytes and is shown here as an example of how to deal C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * with BC9 and BC8. In reality, a control endpoint can never C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * be larger than 64 bytes. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00360e cfd9 MOVFF 0xfd9,0xfe6 void USBCtrlTrfTxService(void) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003610 ffe6 003612 cfe1 MOVFF 0xfe1,0xfd9 003614 ffd9 003616 0e02 MOVLW 0x2 003618 26e1 ADDWF 0xe1,0x1,0x0 { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c WORD byte_to_send; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * First, have to figure out how many byte of data to send. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00361a 0102 MOVLB 0x2 if(wCount._word < EP0_BUFF_SIZE) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00361c 0e08 MOVLW 0x8 00361e 5dfc SUBWF 0xfc,0x0,0x1 003620 0e00 MOVLW 0x0 003622 59fd SUBWFB 0xfd,0x0,0x1 003624 e205 BC 0x3630 003626 c2fc MOVFF 0x2fc,0xfde byte_to_send._word = wCount._word; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003628 ffde 00362a c2fd MOVFF 0x2fd,0xfdd 00362c ffdd 00362e d003 BRA 0x3636 else C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003630 0e08 MOVLW 0x8 byte_to_send._word = EP0_BUFF_SIZE; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003632 6ede MOVWF 0xde,0x0 003634 6add CLRF 0xdd,0x0 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Next, load the number of bytes to send to BC9..0 in buffer descriptor C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003636 0104 MOVLB 0x4 ep0Bi.Stat.BC9 = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003638 9304 BCF 0x4,0x1,0x1 00363a 9104 BCF 0x4,0x0,0x1 ep0Bi.Stat.BC8 = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00363c 0e01 MOVLW 0x1 ep0Bi.Stat._byte |= MSB(byte_to_send); C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00363e 50db MOVF 0xdb,0x0,0x0 003640 1304 IORWF 0x4,0x1,0x1 003642 cfdf MOVFF 0xfdf,0x405 ep0Bi.Cnt = LSB(byte_to_send); C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003644 f405 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Subtract the number of bytes just about to be sent from the total. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003646 0e00 MOVLW 0x0 wCount._word = wCount._word - byte_to_send._word; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003648 50db MOVF 0xdb,0x0,0x0 00364a 0102 MOVLB 0x2 00364c 5ffc SUBWF 0xfc,0x1,0x1 00364e 0e01 MOVLW 0x1 003650 50db MOVF 0xdb,0x0,0x0 003652 5bfd SUBWFB 0xfd,0x1,0x1 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003654 0e28 MOVLW 0x28 pDst.bRam = (byte*)&CtrlTrfData; // Set destination pointer C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003656 6ffa MOVWF 0xfa,0x1 003658 0e04 MOVLW 0x4 00365a 6ffb MOVWF 0xfb,0x1 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00365c 0100 MOVLB 0x0 if(usb_stat.ctrl_trf_mem == _ROM) // Determine type of memory source C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00365e a3fd BTFSS 0xfd,0x1,0x1 003660 d01e BRA 0x369e { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003662 cfd9 MOVFF 0xfd9,0xfe9 while(byte_to_send._word) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003664 ffe9 003666 cfda MOVFF 0xfda,0xfea 003668 ffea 00366a 50ee MOVF 0xee,0x0,0x0 00366c 10ed IORWF 0xed,0x0,0x0 00366e e016 BZ 0x369c 00369a d7e3 BRA 0x3662 { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003670 c2f8 MOVFF 0x2f8,0xff6 *pDst.bRam = *pSrc.bRom; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003672 fff6 003674 c2f9 MOVFF 0x2f9,0xff7 003676 fff7 003678 0008 TBLRD 00367a 50f5 MOVF 0xf5,0x0,0x0 00367c c2fa MOVFF 0x2fa,0xfe9 00367e ffe9 003680 c2fb MOVFF 0x2fb,0xfea 003682 ffea 003684 6eef MOVWF 0xef,0x0 003686 0102 MOVLB 0x2 pDst.bRam++; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003688 2bfa INCF 0xfa,0x1,0x1 00368a 0e00 MOVLW 0x0 00368c 23fb ADDWFC 0xfb,0x1,0x1 00368e 2bf8 INCF 0xf8,0x1,0x1 pSrc.bRom++; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003690 23f9 ADDWFC 0xf9,0x1,0x1 003692 06df DECF 0xdf,0x1,0x0 byte_to_send._word--; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003694 0e01 MOVLW 0x1 003696 e201 BC 0x369a 003698 06db DECF 0xdb,0x1,0x0 }//end while(byte_to_send._word) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c } C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00369c d01c BRA 0x36d6 else // RAM C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00369e cfd9 MOVFF 0xfd9,0xfe9 while(byte_to_send._word) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0036a0 ffe9 0036a2 cfda MOVFF 0xfda,0xfea 0036a4 ffea 0036a6 50ee MOVF 0xee,0x0,0x0 0036a8 10ed IORWF 0xed,0x0,0x0 0036aa e015 BZ 0x36d6 0036d4 d7e4 BRA 0x369e { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0036ac c2f8 MOVFF 0x2f8,0xfe9 *pDst.bRam = *pSrc.bRam; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0036ae ffe9 0036b0 c2f9 MOVFF 0x2f9,0xfea 0036b2 ffea 0036b4 50ef MOVF 0xef,0x0,0x0 0036b6 c2fa MOVFF 0x2fa,0xfe9 0036b8 ffe9 0036ba c2fb MOVFF 0x2fb,0xfea 0036bc ffea 0036be 6eef MOVWF 0xef,0x0 0036c0 0102 MOVLB 0x2 pDst.bRam++; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0036c2 2bfa INCF 0xfa,0x1,0x1 0036c4 0e00 MOVLW 0x0 0036c6 23fb ADDWFC 0xfb,0x1,0x1 0036c8 2bf8 INCF 0xf8,0x1,0x1 pSrc.bRam++; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0036ca 23f9 ADDWFC 0xf9,0x1,0x1 0036cc 06df DECF 0xdf,0x1,0x0 byte_to_send._word--; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0036ce 0e01 MOVLW 0x1 0036d0 e201 BC 0x36d4 0036d2 06db DECF 0xdb,0x1,0x0 }//end while(byte_to_send._word) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c }//end if(usb_stat.ctrl_trf_mem == _ROM) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0036d6 0e02 MOVLW 0x2 }//end USBCtrlTrfTxService C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0036d8 5ce1 SUBWF 0xe1,0x0,0x0 0036da e202 BC 0x36e0 0036dc 6ae1 CLRF 0xe1,0x0 0036de 52e5 MOVF 0xe5,0x1,0x0 0036e0 6ee1 MOVWF 0xe1,0x0 0036e2 52e5 MOVF 0xe5,0x1,0x0 0036e4 cfe7 MOVFF 0xfe7,0xfd9 0036e6 ffd9 0036e8 0012 RETURN 0x0 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlTrfRxService(void) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: pDst and wCount are setup properly. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * pSrc is always &CtrlTrfData C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * usb_stat.ctrl_trf_mem is always _RAM. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * wCount should be set to 0 at the start of each control C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * transfer. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Overview: *** This routine is only partially complete. Check for C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * new version of the firmware. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Note: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0036ea cfd9 MOVFF 0xfd9,0xfe6 void USBCtrlTrfRxService(void) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0036ec ffe6 0036ee cfe1 MOVFF 0xfe1,0xfd9 0036f0 ffd9 0036f2 0e02 MOVLW 0x2 0036f4 26e1 ADDWF 0xe1,0x1,0x0 { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c WORD byte_to_read; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0036f6 0e03 MOVLW 0x3 MSB(byte_to_read) = 0x03 & ep0Bo.Stat._byte; // Filter out last 2 bits C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0036f8 0104 MOVLB 0x4 0036fa 1500 ANDWF 0x0,0x0,0x1 0036fc 6ee7 MOVWF 0xe7,0x0 0036fe 0e01 MOVLW 0x1 003700 cfe7 MOVFF 0xfe7,0xfdb 003702 ffdb 003704 c401 MOVFF 0x401,0xfdf LSB(byte_to_read) = ep0Bo.Cnt; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003706 ffdf C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Accumulate total number of bytes read C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003708 50de MOVF 0xde,0x0,0x0 wCount._word = wCount._word + byte_to_read._word; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00370a 0102 MOVLB 0x2 00370c 27fc ADDWF 0xfc,0x1,0x1 00370e 50dd MOVF 0xdd,0x0,0x0 003710 23fd ADDWFC 0xfd,0x1,0x1 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003712 0e28 MOVLW 0x28 pSrc.bRam = (byte*)&CtrlTrfData; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003714 6ff8 MOVWF 0xf8,0x1 003716 0e04 MOVLW 0x4 003718 6ff9 MOVWF 0xf9,0x1 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00371a cfd9 MOVFF 0xfd9,0xfe9 while(byte_to_read._word) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00371c ffe9 00371e cfda MOVFF 0xfda,0xfea 003720 ffea 003722 50ee MOVF 0xee,0x0,0x0 003724 10ed IORWF 0xed,0x0,0x0 003726 e014 BZ 0x3750 00374e d7e5 BRA 0x371a { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003728 c2f8 MOVFF 0x2f8,0xfe9 *pDst.bRam = *pSrc.bRam; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00372a ffe9 00372c c2f9 MOVFF 0x2f9,0xfea 00372e ffea 003730 50ef MOVF 0xef,0x0,0x0 003732 c2fa MOVFF 0x2fa,0xfe9 003734 ffe9 003736 c2fb MOVFF 0x2fb,0xfea 003738 ffea 00373a 6eef MOVWF 0xef,0x0 00373c 2bfa INCF 0xfa,0x1,0x1 pDst.bRam++; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00373e 0e00 MOVLW 0x0 003740 23fb ADDWFC 0xfb,0x1,0x1 003742 2bf8 INCF 0xf8,0x1,0x1 pSrc.bRam++; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003744 23f9 ADDWFC 0xf9,0x1,0x1 003746 06df DECF 0xdf,0x1,0x0 byte_to_read._word--; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003748 0e01 MOVLW 0x1 00374a e201 BC 0x374e 00374c 06db DECF 0xdb,0x1,0x0 }//end while(byte_to_read._word) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003750 0e02 MOVLW 0x2 }//end USBCtrlTrfRxService C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003752 5ce1 SUBWF 0xe1,0x0,0x0 003754 e202 BC 0x375a 003756 6ae1 CLRF 0xe1,0x0 003758 52e5 MOVF 0xe5,0x1,0x0 00375a 6ee1 MOVWF 0xe1,0x0 00375c 52e5 MOVF 0xe5,0x1,0x0 00375e cfe7 MOVFF 0xfe7,0xfd9 003760 ffd9 003762 0012 RETURN 0x0 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlEPServiceComplete(void) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Overview: This routine wrap up the ramaining tasks in servicing C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * a Setup Request. Its main task is to set the endpoint C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * controls appropriately for a given situation. See code C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * below. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * There are three main scenarios: C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * a) There was no handler for the Request, in this case C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * a STALL should be sent out. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * b) The host has requested a read control transfer, C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * endpoints are required to be setup in a specific way. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * c) The host has requested a write control transfer, or C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * a control data stage is not required, endpoints are C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * required to be setup in a specific way. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Packet processing is resumed by clearing PKTDIS bit. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Note: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlEPServiceComplete(void) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003764 0102 MOVLB 0x2 if(ctrl_trf_session_owner == MUID_NULL) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003766 51f7 MOVF 0xf7,0x0,0x1 003768 e10c BNZ 0x3782 { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * If no one knows how to service this request then stall. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Must also prepare EP0 to receive the next SETUP transaction. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00376a 0104 MOVLB 0x4 ep0Bo.Cnt = EP0_BUFF_SIZE; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00376c 0e08 MOVLW 0x8 00376e 6f01 MOVWF 0x1,0x1 003770 0e20 MOVLW 0x20 ep0Bo.ADR = (byte*)&SetupPkt; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003772 6f02 MOVWF 0x2,0x1 003774 0e04 MOVLW 0x4 003776 6f03 MOVWF 0x3,0x1 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003778 0e84 MOVLW 0x84 ep0Bo.Stat._byte = _USIE|_BSTALL; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00377a 6f00 MOVWF 0x0,0x1 00377c 0104 MOVLB 0x4 ep0Bi.Stat._byte = _USIE|_BSTALL; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00377e 6f04 MOVWF 0x4,0x1 } C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003780 d035 BRA 0x37ec else // A module has claimed ownership of the control transfer session. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003782 0104 MOVLB 0x4 if(SetupPkt.DataDir == DEV_TO_HOST) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003784 af20 BTFSS 0x20,0x7,0x1 003786 d022 BRA 0x37cc { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003788 0102 MOVLB 0x2 if(SetupPkt.wLength < wCount._word) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00378a 51fc MOVF 0xfc,0x0,0x1 00378c 0104 MOVLB 0x4 00378e 5d26 SUBWF 0x26,0x0,0x1 003790 0102 MOVLB 0x2 003792 51fd MOVF 0xfd,0x0,0x1 003794 0104 MOVLB 0x4 003796 5927 SUBWFB 0x27,0x0,0x1 003798 e204 BC 0x37a2 00379a c426 MOVFF 0x426,0x2fc wCount._word = SetupPkt.wLength; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 00379c f2fc 00379e c427 MOVFF 0x427,0x2fd 0037a0 f2fd 0037a2 df35 RCALL 0x360e USBCtrlTrfTxService(); C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037a4 0102 MOVLB 0x2 ctrl_trf_state = CTRL_TRF_TX; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037a6 0e01 MOVLW 0x1 0037a8 6ff6 MOVWF 0xf6,0x1 /* C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Control Read: C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * ... | C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * 1. Prepare OUT EP to respond to early termination C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * NOTE: C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * If something went wrong during the control transfer, C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * the last status stage may not be sent by the host. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * When this happens, two different things could happen C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * depending on the host. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * a) The host could send out a RESET. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * b) The host could send out a new SETUP transaction C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * without sending a RESET first. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * To properly handle case (b), the OUT EP must be setup C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * to receive either a zero length OUT transaction, or a C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * new SETUP transaction. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Since the SETUP transaction requires the DTS bit to be C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * DAT0 while the zero length OUT status requires the DTS C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * bit to be DAT1, the DTS bit check by the hardware should C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * be disabled. This way the SIE could accept either of C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * the two transactions. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Furthermore, the Cnt byte should be set to prepare for C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * the SETUP data (8-byte or more), and the buffer address C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * should be pointed to SetupPkt. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037aa 0104 MOVLB 0x4 ep0Bo.Cnt = EP0_BUFF_SIZE; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037ac 0e08 MOVLW 0x8 0037ae 6f01 MOVWF 0x1,0x1 0037b0 0e20 MOVLW 0x20 ep0Bo.ADR = (byte*)&SetupPkt; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037b2 6f02 MOVWF 0x2,0x1 0037b4 0e04 MOVLW 0x4 0037b6 6f03 MOVWF 0x3,0x1 0037b8 0e80 MOVLW 0x80 ep0Bo.Stat._byte = _USIE; // Note: DTSEN is 0! C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037ba 6f00 MOVWF 0x0,0x1 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * 2. Prepare IN EP to transfer data, Cnt should have C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * been initialized by responsible request owner. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037bc 0104 MOVLB 0x4 ep0Bi.ADR = (byte*)&CtrlTrfData; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037be 0e28 MOVLW 0x28 0037c0 6f06 MOVWF 0x6,0x1 0037c2 0e04 MOVLW 0x4 0037c4 6f07 MOVWF 0x7,0x1 0037c6 0ec8 MOVLW 0xc8 ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037c8 6f04 MOVWF 0x4,0x1 } C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037ca d010 BRA 0x37ec else // (SetupPkt.DataDir == HOST_TO_DEV) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037cc 0102 MOVLB 0x2 ctrl_trf_state = CTRL_TRF_RX; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037ce 0e02 MOVLW 0x2 0037d0 6ff6 MOVWF 0xf6,0x1 /* C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Control Write: C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * ... | C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * 1. Prepare IN EP to respond to early termination C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * This is the same as a Zero Length Packet Response C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * for control transfer without a data stage C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037d2 0104 MOVLB 0x4 ep0Bi.Cnt = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037d4 6b05 CLRF 0x5,0x1 0037d6 0ec8 MOVLW 0xc8 ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037d8 6f04 MOVWF 0x4,0x1 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * 2. Prepare OUT EP to receive data. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037da 0104 MOVLB 0x4 ep0Bo.Cnt = EP0_BUFF_SIZE; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037dc 0e08 MOVLW 0x8 0037de 6f01 MOVWF 0x1,0x1 0037e0 0e28 MOVLW 0x28 ep0Bo.ADR = (byte*)&CtrlTrfData; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037e2 6f02 MOVWF 0x2,0x1 0037e4 0e04 MOVLW 0x4 0037e6 6f03 MOVWF 0x3,0x1 0037e8 0ec8 MOVLW 0xc8 ep0Bo.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037ea 6f00 MOVWF 0x0,0x1 }//end if(SetupPkt.DataDir == DEV_TO_HOST) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c }//end if(ctrl_trf_session_owner == MUID_NULL) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * PKTDIS bit is set when a Setup Transaction is received. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Clear to resume packet processing. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037ec 986d BCF 0x6d,0x4,0x0 UCONbits.PKTDIS = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037ee 0012 RETURN 0x0 }//end USBCtrlEPServiceComplete C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBPrepareForNextSetupTrf(void) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Overview: The routine forces EP0 OUT to be ready for a new Setup C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * transaction, and forces EP0 IN to be owned by CPU. C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c * Note: None C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c void USBPrepareForNextSetupTrf(void) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037f0 0102 MOVLB 0x2 ctrl_trf_state = WAIT_SETUP; // See usbctrltrf.h C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037f2 6bf6 CLRF 0xf6,0x1 0037f4 0104 MOVLB 0x4 ep0Bo.Cnt = EP0_BUFF_SIZE; // Defined in usbcfg.h C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037f6 0e08 MOVLW 0x8 0037f8 6f01 MOVWF 0x1,0x1 0037fa 0e20 MOVLW 0x20 ep0Bo.ADR = (byte*)&SetupPkt; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 0037fc 6f02 MOVWF 0x2,0x1 0037fe 0e04 MOVLW 0x4 003800 6f03 MOVWF 0x3,0x1 003802 0e88 MOVLW 0x88 ep0Bo.Stat._byte = _USIE|_DAT0|_DTSEN; // EP0 buff dsc init, see usbmmap.h C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003804 6f00 MOVWF 0x0,0x1 003806 0104 MOVLB 0x4 ep0Bi.Stat._byte = _UCPU; // EP0 IN buffer initialization C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 003808 6b04 CLRF 0x4,0x1 00380a 0012 RETURN 0x0 }//end USBPrepareForNextSetupTrf C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /** EOF usbctrltrf.c *********************************************************/ C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c /********************************************************************* C:\Projects\UBW\FW\2455\D\user\user.c * C:\Projects\UBW\FW\2455\D\user\user.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\2455\D\user\user.c * C:\Projects\UBW\FW\2455\D\user\user.c ********************************************************************* C:\Projects\UBW\FW\2455\D\user\user.c * FileName: user.c C:\Projects\UBW\FW\2455\D\user\user.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\2455\D\user\user.c * Processor: PIC18 C:\Projects\UBW\FW\2455\D\user\user.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\2455\D\user\user.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\2455\D\user\user.c * C:\Projects\UBW\FW\2455\D\user\user.c * Software License Agreement C:\Projects\UBW\FW\2455\D\user\user.c * C:\Projects\UBW\FW\2455\D\user\user.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\2455\D\user\user.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\2455\D\user\user.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\2455\D\user\user.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\2455\D\user\user.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\2455\D\user\user.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\2455\D\user\user.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\2455\D\user\user.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\2455\D\user\user.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\2455\D\user\user.c * license. C:\Projects\UBW\FW\2455\D\user\user.c * C:\Projects\UBW\FW\2455\D\user\user.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\2455\D\user\user.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\2455\D\user\user.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\2455\D\user\user.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\2455\D\user\user.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\2455\D\user\user.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\2455\D\user\user.c * C:\Projects\UBW\FW\2455\D\user\user.c * Author Date Comment C:\Projects\UBW\FW\2455\D\user\user.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\2455\D\user\user.c * Rawin Rojvanit 11/19/04 Original. C:\Projects\UBW\FW\2455\D\user\user.c * Brian Schmalz 03/15/06 Added user code to impliment C:\Projects\UBW\FW\2455\D\user\user.c * firmware version D v1.0 for UBW C:\Projects\UBW\FW\2455\D\user\user.c * project. See www.greta.dhs.org/UBW C:\Projects\UBW\FW\2455\D\user\user.c * Brian Schmalz 05/04/06 Starting version 1.1, which will C:\Projects\UBW\FW\2455\D\user\user.c * include several fixes. See website. C:\Projects\UBW\FW\2455\D\user\user.c * BPS 06/21/06 Starting v1.2 - C:\Projects\UBW\FW\2455\D\user\user.c * - Fixed problem with I packets (from T command) filling up TX buffer C:\Projects\UBW\FW\2455\D\user\user.c * and not letting any incoming commands be received. (strange) C:\Projects\UBW\FW\2455\D\user\user.c * - Adding several commands - Analog inputs being the biggest set. C:\Projects\UBW\FW\2455\D\user\user.c * - Also Byte read/Byte write (PEEK/POKE) anywhere in memory C:\Projects\UBW\FW\2455\D\user\user.c * - Individual pin I/O and direction C:\Projects\UBW\FW\2455\D\user\user.c * BPS 08/16/06 v1.3 - Fixed bug with USB startup C:\Projects\UBW\FW\2455\D\user\user.c ********************************************************************/ C:\Projects\UBW\FW\2455\D\user\user.c C:\Projects\UBW\FW\2455\D\user\user.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\2455\D\user\user.c #include C:\Projects\UBW\FW\2455\D\user\user.c #include C:\Projects\UBW\FW\2455\D\user\user.c #include C:\Projects\UBW\FW\2455\D\user\user.c #include "system\typedefs.h" C:\Projects\UBW\FW\2455\D\user\user.c #include "system\usb\usb.h" C:\Projects\UBW\FW\2455\D\user\user.c C:\Projects\UBW\FW\2455\D\user\user.c #include "io_cfg.h" // I/O pin mapping C:\Projects\UBW\FW\2455\D\user\user.c #include "user\user.h" C:\Projects\UBW\FW\2455\D\user\user.c C:\Projects\UBW\FW\2455\D\user\user.c /** V A R I A B L E S ********************************************************/ C:\Projects\UBW\FW\2455\D\user\user.c #define MAX_USB_BUF_SIZE 64 C:\Projects\UBW\FW\2455\D\user\user.c #define MAX_WORKING_BUF_SIZE 128 C:\Projects\UBW\FW\2455\D\user\user.c C:\Projects\UBW\FW\2455\D\user\user.c #define kCHAR 0 C:\Projects\UBW\FW\2455\D\user\user.c #define kUCHAR 1 C:\Projects\UBW\FW\2455\D\user\user.c #define kINT 2 C:\Projects\UBW\FW\2455\D\user\user.c #define kUINT 3 C:\Projects\UBW\FW\2455\D\user\user.c #define kASCII_CHAR 4 C:\Projects\UBW\FW\2455\D\user\user.c C:\Projects\UBW\FW\2455\D\user\user.c #define kISR_FIFO_A_DEPTH 3 C:\Projects\UBW\FW\2455\D\user\user.c #define kISR_FIFO_D_DEPTH 3 C:\Projects\UBW\FW\2455\D\user\user.c #define kPR2_RELOAD 250 // For 1ms TMR2 tick C:\Projects\UBW\FW\2455\D\user\user.c C:\Projects\UBW\FW\2455\D\user\user.c #define bitset(var,bitno) ((var) |= (1 << (bitno))) C:\Projects\UBW\FW\2455\D\user\user.c #define bitclr(var,bitno) ((var) &= ~(1 << (bitno))) C:\Projects\UBW\FW\2455\D\user\user.c #define bittst(var,bitno) (var& (1 << (bitno))) C:\Projects\UBW\FW\2455\D\user\user.c C:\Projects\UBW\FW\2455\D\user\user.c #pragma udata C:\Projects\UBW\FW\2455\D\user\user.c byte old_sw; C:\Projects\UBW\FW\2455\D\user\user.c C:\Projects\UBW\FW\2455\D\user\user.c unsigned char input_buffer[MAX_USB_BUF_SIZE]; C:\Projects\UBW\FW\2455\D\user\user.c unsigned char output_buffer[MAX_USB_BUF_SIZE]; C:\Projects\UBW\FW\2455\D\user\user.c // Our error byte C:\Projects\UBW\FW\2455\D\user\user.c char g_error; C:\Projects\UBW\FW\2455\D\user\user.c // Version string C:\Projects\UBW\FW\2455\D\user\user.c rom unsigned char g_version[]={"UBW FW D Version 1.3.0\n\r"}; C:\Projects\UBW\FW\2455\D\user\user.c C:\Projects\UBW\FW\2455\D\user\user.c // This big boy goes in a different bank C:\Projects\UBW\FW\2455\D\user\user.c #pragma udata big_buf=0x200 C:\Projects\UBW\FW\2455\D\user\user.c unsigned char working_buf[MAX_WORKING_BUF_SIZE]; C:\Projects\UBW\FW\2455\D\user\user.c volatile unsigned int ISR_A_FIFO[12][kISR_FIFO_A_DEPTH]; // Stores the most recent analog conversions C:\Projects\UBW\FW\2455\D\user\user.c volatile unsigned char ISR_D_FIFO[3][kISR_FIFO_D_DEPTH]; // FIFO of actual data C:\Projects\UBW\FW\2455\D\user\user.c C:\Projects\UBW\FW\2455\D\user\user.c #pragma udata C:\Projects\UBW\FW\2455\D\user\user.c // In and out pointers to our working USB data input buffer C:\Projects\UBW\FW\2455\D\user\user.c unsigned char working_buf_in; C:\Projects\UBW\FW\2455\D\user\user.c unsigned char working_buf_out; C:\Projects\UBW\FW\2455\D\user\user.c C:\Projects\UBW\FW\2455\D\user\user.c // Rate variable - how fast does interrupt fire to capture inputs? C:\Projects\UBW\FW\2455\D\user\user.c unsigned int time_between_updates; C:\Projects\UBW\FW\2455\D\user\user.c C:\Projects\UBW\FW\2455\D\user\user.c volatile unsigned int ISR_D_RepeatRate; // How many 1ms ticks between Digital updates C:\Projects\UBW\FW\2455\D\user\user.c volatile unsigned char ISR_D_FIFO_in; // In pointer C:\Projects\UBW\FW\2455\D\user\user.c volatile unsigned char ISR_D_FIFO_out; // Out pointer C:\Projects\UBW\FW\2455\D\user\user.c volatile unsigned char ISR_D_FIFO_length; // Current FIFO depth C:\Projects\UBW\FW\2455\D\user\user.c C:\Projects\UBW\FW\2455\D\user\user.c volatile unsigned int ISR_A_RepeatRate; // How many 1ms ticks between Analog updates C:\Projects\UBW\FW\2455\D\user\user.c volatile unsigned char ISR_A_FIFO_in; // In pointer C:\Projects\UBW\FW\2455\D\user\user.c volatile unsigned char ISR_A_FIFO_out; // Out pointer C:\Projects\UBW\FW\2455\D\user\user.c volatile unsigned char ISR_A_FIFO_length; // Current FIFO depth C:\Projects\UBW\FW\2455\D\user\user.c volatile unsigned char AnalogEnable; // Maximum ADC channel to convert C:\Projects\UBW\FW\2455\D\user\user.c C:\Projects\UBW\FW\2455\D\user\user.c /** P R I V A T E P R O T O T Y P E S ***************************************/ C:\Projects\UBW\FW\2455\D\user\user.c void add_to_buffer(unsigned char); C:\Projects\UBW\FW\2455\D\user\user.c BOOL do_we_have_a_full_packet(unsigned char *); C:\Projects\UBW\FW\2455\D\user\user.c void BlinkUSBStatus(void); C:\Projects\UBW\FW\2455\D\user\user.c BOOL SwitchIsPressed(void); C:\Projects\UBW\FW\2455\D\user\user.c void parse_packet(unsigned char); C:\Projects\UBW\FW\2455\D\user\user.c signed short long extract_number( C:\Projects\UBW\FW\2455\D\user\user.c unsigned char * ptr, C:\Projects\UBW\FW\2455\D\user\user.c unsigned char type C:\Projects\UBW\FW\2455\D\user\user.c ); C:\Projects\UBW\FW\2455\D\user\user.c signed char extract_digit( C:\Projects\UBW\FW\2455\D\user\user.c unsigned char * ptr, C:\Projects\UBW\FW\2455\D\user\user.c signed short long * acc, C:\Projects\UBW\FW\2455\D\user\user.c unsigned char digits C:\Projects\UBW\FW\2455\D\user\user.c ); C:\Projects\UBW\FW\2455\D\user\user.c void parse_R_packet(void); // R for resetting UBW C:\Projects\UBW\FW\2455\D\user\user.c void parse_C_packet(void); // C for configuring I/O and analog pins C:\Projects\UBW\FW\2455\D\user\user.c void parse_CX_packet(void); // CX For configuring serial port C:\Projects\UBW\FW\2455\D\user\user.c void parse_O_packet(void); // O for output digital to pins C:\Projects\UBW\FW\2455\D\user\user.c void parse_I_packet(void); // I for input digital from pins C:\Projects\UBW\FW\2455\D\user\user.c void parse_V_packet(void); // V for printing version C:\Projects\UBW\FW\2455\D\user\user.c void parse_A_packet(void); // A for requesting analog inputs C:\Projects\UBW\FW\2455\D\user\user.c void parse_T_packet(void); // T for setting up timed I/O (digital or analog) C:\Projects\UBW\FW\2455\D\user\user.c void parse_PI_packet(void); // PI for reading a single pin C:\Projects\UBW\FW\2455\D\user\user.c void parse_PO_packet(void); // PO for setting a single pin state C:\Projects\UBW\FW\2455\D\user\user.c void parse_PD_packet(void); // PD for setting a pin's direction C:\Projects\UBW\FW\2455\D\user\user.c void parse_MR_packet(void); // MR for Memory Read C:\Projects\UBW\FW\2455\D\user\user.c void parse_MW_packet(void); // MW for Memory Write C:\Projects\UBW\FW\2455\D\user\user.c void parse_TX_packet(void); // TX for transmitting serial C:\Projects\UBW\FW\2455\D\user\user.c void parse_RX_packet(void); // RX for receiving serial C:\Projects\UBW\FW\2455\D\user\user.c void parse_RC_packet(void); // RC is for outputing RC servo pulses C:\Projects\UBW\FW\2455\D\user\user.c C:\Projects\UBW\FW\2455\D\user\user.c /** D E C L A R A T I O N S **************************************************/ C:\Projects\UBW\FW\2455\D\user\user.c #pragma code C:\Projects\UBW\FW\2455\D\user\user.c C:\Projects\UBW\FW\2455\D\user\user.c #pragma interruptlow LowISR C:\Projects\UBW\FW\2455\D\user\user.c 000838 cfd8 MOVFF 0xfd8,0xfe4 void LowISR(void) C:\Projects\UBW\FW\2455\D\user\user.c 00083a ffe4 00083c cfe0 MOVFF 0xfe0,0xfe4 00083e ffe4 000840 6ee4 MOVWF 0xe4,0x0 000842 cfda MOVFF 0xfda,0xfe4 000844 ffe4 000846 cfe2 MOVFF 0xfe2,0xfda 000848 ffda 00084a cfe9 MOVFF 0xfe9,0xfe4 00084c ffe4 00084e cfea MOVFF 0xfea,0xfe4 000850 ffe4 000852 cff3 MOVFF 0xff3,0xfe4 000854 ffe4 000856 cff4 MOVFF 0xff4,0xfe4 000858 ffe4 00085a 52e6 MOVF 0xe6,0x1,0x0 { C:\Projects\UBW\FW\2455\D\user\user.c static unsigned int D_tick_counter = 0; C:\Projects\UBW\FW\2455\D\user\user.c static unsigned int A_tick_counter = 0; C:\Projects\UBW\FW\2455\D\user\user.c static unsigned char A_cur_channel; C:\Projects\UBW\FW\2455\D\user\user.c C:\Projects\UBW\FW\2455\D\user\user.c // Do we have a Timer2 interrupt? (1ms rate) C:\Projects\UBW\FW\2455\D\user\user.c 00085c a29e BTFSS 0x9e,0x1,0x0 if (PIR1bits.TMR2IF) C:\Projects\UBW\FW\2455\D\user\user.c 00085e d082 BRA 0x964 { C:\Projects\UBW\FW\2455\D\user\user.c // Clear the interrupt C:\Projects\UBW\FW\2455\D\user\user.c 000860 929e BCF 0x9e,0x1,0x0 PIR1bits.TMR2IF = 0; C:\Projects\UBW\FW\2455\D\user\user.c C:\Projects\UBW\FW\2455\D\user\user.c // See if it's time to fire off an I packet C:\Projects\UBW\FW\2455\D\user\user.c 000862 0100 MOVLB 0x0 if (ISR_D_RepeatRate > 0) C:\Projects\UBW\FW\2455\D\user\user.c 000864 0e00 MOVLW 0x0 000866 80d8 BSF 0xd8,0x0,0x0 000868 55e6 SUBFWB 0xe6,0x0,0x1 00086a 0e00 MOVLW 0x0 00086c 55e7 SUBFWB 0xe7,0x0,0x1 00086e e23d BC 0x8ea { C:\Projects\UBW\FW\2455\D\user\user.c 000870 0102 MOVLB 0x2 D_tick_counter++; C:\Projects\UBW\FW\2455\D\user\user.c 000872 2bec INCF 0xec,0x1,0x1 000874 0e00 MOVLW 0x0 000876 23ed ADDWFC 0xed,0x1,0x1 000878 0100 MOVLB 0x0 if (D_tick_counter >= ISR_D_RepeatRate) C:\Projects\UBW\FW\2455\D\user\user.c 00087a 51e6 MOVF 0xe6,0x0,0x1 00087c 0102 MOVLB 0x2 00087e 5dec SUBWF 0xec,0x0,0x1 000880 0100 MOVLB 0x0 000882 51e7 MOVF 0xe7,0x0,0x1 000884 0102 MOVLB 0x2 000886 59ed SUBWFB 0xed,0x0,0x1 000888 e330 BNC 0x8ea { C:\Projects\UBW\FW\2455\D\user\user.c 00088a 0102 MOVLB 0x2 D_tick_counter = 0; C:\Projects\UBW\FW\2455\D\user\user.c 00088c 6bec CLRF 0xec,0x1 00088e 6bed CLRF 0xed,0x1