MP2COD 4.02, COFF to COD File Converter Copyright (c) 2006 Microchip Technology Inc. Listing File Generated: Thu Jul 20 19:13:26 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 ef6d GOTO 0x36da _asm goto _startup _endasm C:\MCC18\src\traditional\startup\c018i.c 000002 f01b 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 0036da ee13 LFSR 0x1,0x300 lfsr 1, _stack C:\MCC18\src\traditional\startup\c018i.c 0036dc f000 0036de ee23 LFSR 0x2,0x300 lfsr 2, _stack C:\MCC18\src\traditional\startup\c018i.c 0036e0 f000 C:\MCC18\src\traditional\startup\c018i.c 0036e2 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 0036e4 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 0036e6 eceb CALL 0x33d6,0x0 _do_cinit (); C:\MCC18\src\traditional\startup\c018i.c 0036e8 f019 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 0036ea ec26 CALL 0x364c,0x0 main (); C:\MCC18\src\traditional\startup\c018i.c 0036ec f01b C:\MCC18\src\traditional\startup\c018i.c 0036ee d7fd BRA 0x36ea goto loop; C:\MCC18\src\traditional\startup\c018i.c 0036f0 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 0033d6 0e2a MOVLW 0x2a TBLPTR = (short long)&_cinit; C:\MCC18\src\traditional\startup\c018i.c 0033d8 6ef6 MOVWF 0xf6,0x0 0033da 0e08 MOVLW 0x8 0033dc 6ef7 MOVWF 0xf7,0x0 0033de 0e00 MOVLW 0x0 0033e0 6ef8 MOVWF 0xf8,0x0 _asm C:\MCC18\src\traditional\startup\c018i.c 0033e2 0100 MOVLB 0x0 movlb data_ptr C:\MCC18\src\traditional\startup\c018i.c 0033e4 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 0033e6 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 0033e8 6ff7 MOVWF 0xf7,0x1 movwf curr_entry, 1 C:\MCC18\src\traditional\startup\c018i.c 0033ea 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 0033ec 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 0033ee 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 0033f0 e103 BNZ 0x33f8 bnz 3 C:\MCC18\src\traditional\startup\c018i.c 0033f2 67f7 TSTFSZ 0xf7,0x1 tstfsz curr_entry, 1 C:\MCC18\src\traditional\startup\c018i.c 0033f4 d001 BRA 0x33f8 bra 1 C:\MCC18\src\traditional\startup\c018i.c _endasm C:\MCC18\src\traditional\startup\c018i.c 0033f6 d03d BRA 0x3472 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 0033f8 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 0033fa 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 0033fc 6ff2 MOVWF 0xf2,0x1 movwf prom, 1 C:\MCC18\src\traditional\startup\c018i.c 0033fe 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 003400 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 003402 6ff3 MOVWF 0xf3,0x1 movwf prom+1, 1 C:\MCC18\src\traditional\startup\c018i.c 003404 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 003406 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 003408 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 00340a 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c /* read the destination address directly into FSR0 */ C:\MCC18\src\traditional\startup\c018i.c 00340c 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 00340e 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 003410 6ee9 MOVWF 0xe9,0x0 movwf FSR0L, 0 C:\MCC18\src\traditional\startup\c018i.c 003412 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 003414 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 003416 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 003418 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 00341a 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c /* read the destination address directly into FSR0 */ C:\MCC18\src\traditional\startup\c018i.c 00341c 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 00341e 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 003420 6ff5 MOVWF 0xf5,0x1 movwf curr_byte, 1 C:\MCC18\src\traditional\startup\c018i.c 003422 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 003424 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 003426 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 003428 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 00342a 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 00342c cff6 MOVFF 0xff6,0xf9 data_ptr = TBLPTR; C:\MCC18\src\traditional\startup\c018i.c 00342e f0f9 003430 cff7 MOVFF 0xff7,0xfa 003432 f0fa 003434 cff8 MOVFF 0xff8,0xfb 003436 f0fb C:\MCC18\src\traditional\startup\c018i.c /* now assign the source address to the table pointer */ C:\MCC18\src\traditional\startup\c018i.c 003438 c0f2 MOVFF 0xf2,0xff6 TBLPTR = prom; C:\MCC18\src\traditional\startup\c018i.c 00343a fff6 00343c c0f3 MOVFF 0xf3,0xff7 00343e fff7 003440 c0f4 MOVFF 0xf4,0xff8 003442 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 003444 0100 MOVLB 0x0 movlb curr_byte C:\MCC18\src\traditional\startup\c018i.c 003446 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 003448 e102 BNZ 0x344e bnz 2 // copy_one_byte C:\MCC18\src\traditional\startup\c018i.c 00344a 53f6 MOVF 0xf6,0x1,0x1 movf curr_byte + 1, 1, 1 C:\MCC18\src\traditional\startup\c018i.c 00344c e007 BZ 0x345c 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 00344e 0009 TBLRDPOSTINC tblrdpostinc C:\MCC18\src\traditional\startup\c018i.c 003450 50f5 MOVF 0xf5,0x0,0x0 movf TABLAT, 0, 0 C:\MCC18\src\traditional\startup\c018i.c 003452 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 003454 07f5 DECF 0xf5,0x1,0x1 decf curr_byte, 1, 1 C:\MCC18\src\traditional\startup\c018i.c 003456 e2f8 BC 0x3448 bc -8 // copy_loop C:\MCC18\src\traditional\startup\c018i.c 003458 07f6 DECF 0xf6,0x1,0x1 decf curr_byte + 1, 1, 1 C:\MCC18\src\traditional\startup\c018i.c 00345a d7f9 BRA 0x344e 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 00345c c0f9 MOVFF 0xf9,0xff6 TBLPTR = data_ptr; C:\MCC18\src\traditional\startup\c018i.c 00345e fff6 003460 c0fa MOVFF 0xfa,0xff7 003462 fff7 003464 c0fb MOVFF 0xfb,0xff8 003466 fff8 /* next entry... */ C:\MCC18\src\traditional\startup\c018i.c 003468 0100 MOVLB 0x0 curr_entry--; C:\MCC18\src\traditional\startup\c018i.c 00346a 07f7 DECF 0xf7,0x1,0x1 00346c 0e00 MOVLW 0x0 00346e 5bf8 SUBWFB 0xf8,0x1,0x1 003470 d7bf BRA 0x33f0 goto test; C:\MCC18\src\traditional\startup\c018i.c done: C:\MCC18\src\traditional\startup\c018i.c ; C:\MCC18\src\traditional\startup\c018i.c 003472 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 ef6d GOTO 0x36da _asm goto _startup _endasm C:\Projects\UBW\FW\2455\D\main.c 000802 f01b 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 efd9 GOTO 0x9b2 _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 00364c d805 RCALL 0x3658 InitializeSystem(); C:\Projects\UBW\FW\2455\D\main.c 003654 d7fc BRA 0x364e while(1) C:\Projects\UBW\FW\2455\D\main.c { C:\Projects\UBW\FW\2455\D\main.c 00364e d810 RCALL 0x3670 USBTasks(); // USB Tasks C:\Projects\UBW\FW\2455\D\main.c 003650 ec60 CALL 0xac0,0x0 ProcessIO(); // See user\user.c & .h C:\Projects\UBW\FW\2455\D\main.c 003652 f005 }//end while C:\Projects\UBW\FW\2455\D\main.c 003656 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 003658 0e0f MOVLW 0xf ADCON1 |= 0x0F; // Default all pins to digital C:\Projects\UBW\FW\2455\D\main.c 00365a 12c1 IORWF 0xc1,0x1,0x0 C:\Projects\UBW\FW\2455\D\main.c 00365c 0e14 MOVLW 0x14 mInitializeUSBDriver(); // See usbdrv.h C:\Projects\UBW\FW\2455\D\main.c 00365e 6e6f MOVWF 0x6f,0x0 003660 0100 MOVLB 0x0 003662 6bfc CLRF 0xfc,0x1 003664 0100 MOVLB 0x0 003666 6bfd CLRF 0xfd,0x1 003668 0100 MOVLB 0x0 00366a 6bfe CLRF 0xfe,0x1 C:\Projects\UBW\FW\2455\D\main.c 00366c efe2 GOTO 0x9c4 UserInit(); // See user.c & .h C:\Projects\UBW\FW\2455\D\main.c 00366e f004 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 003670 ecfa CALL 0x2ff4,0x0 USBCheckBusStatus(); // Must use polling method C:\Projects\UBW\FW\2455\D\main.c 003672 f017 003674 be6f BTFSC 0x6f,0x7,0x0 if(UCFGbits.UTEYE!=1) C:\Projects\UBW\FW\2455\D\main.c 003676 d002 BRA 0x367c 003678 ec19 CALL 0x3032,0x0 USBDriverService(); // Interrupt or polling method C:\Projects\UBW\FW\2455\D\main.c 00367a f018 C:\Projects\UBW\FW\2455\D\main.c #if defined(USB_USE_CDC) C:\Projects\UBW\FW\2455\D\main.c 00367c ef81 GOTO 0x2902 CDCTxService(); C:\Projects\UBW\FW\2455\D\main.c 00367e f014 #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 002ff4 a66d BTFSS 0x6d,0x3,0x0 if(UCONbits.USBEN == 0) // Is the module off? C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 002ff6 d80f RCALL 0x3016 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 002ff8 d002 BRA 0x2ffe else C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 002ffa b66d BTFSC 0x6d,0x3,0x0 if(UCONbits.USBEN == 1) // Is the module on? C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 002ffc d813 RCALL 0x3024 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 002ffe 0100 MOVLB 0x0 if(usb_device_state == ATTACHED_STATE) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003000 05fc DECF 0xfc,0x0,0x1 003002 e108 BNZ 0x3014 { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003004 ba6d BTFSC 0x6d,0x5,0x0 if(!UCONbits.SE0) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003006 d006 BRA 0x3014 { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003008 6a68 CLRF 0x68,0x0 UIR = 0; // Clear all USB interrupts C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00300a 6a69 CLRF 0x69,0x0 UIE = 0; // Mask all USB interrupts C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00300c 8069 BSF 0x69,0x0,0x0 UIEbits.URSTIE = 1; // Unmask RESET interrupt C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00300e 8869 BSF 0x69,0x4,0x0 UIEbits.IDLEIE = 1; // Unmask IDLE interrupt C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003010 0e02 MOVLW 0x2 usb_device_state = POWERED_STATE; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003012 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 003014 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 003016 6a6d CLRF 0x6d,0x0 UCON = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003018 6a69 CLRF 0x69,0x0 UIE = 0; // Mask all USB interrupts C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00301a 866d BSF 0x6d,0x3,0x0 UCONbits.USBEN = 1; // Enable module & attach to bus C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00301c 0100 MOVLB 0x0 usb_device_state = ATTACHED_STATE; // Defined in usbmmap.c & .h C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00301e 0e01 MOVLW 0x1 003020 6ffc MOVWF 0xfc,0x1 003022 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 003024 6a6d CLRF 0x6d,0x0 UCON = 0; // Disable module & detach from bus C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003026 6a69 CLRF 0x69,0x0 UIE = 0; // Mask all USB interrupts C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003028 0100 MOVLB 0x0 usb_device_state = DETACHED_STATE; // Defined in usbmmap.c & .h C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00302a 6bfc CLRF 0xfc,0x1 00302c 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 00302e ef12 GOTO 0x3024 USBModuleDisable(); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003030 f018 }//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 003032 0100 MOVLB 0x0 if(usb_device_state == DETACHED_STATE) return; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003034 51fc MOVF 0xfc,0x0,0x1 003036 e101 BNZ 0x303a 003038 d03a BRA 0x30ae 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 00303a 5068 MOVF 0x68,0x0,0x0 if(UIRbits.ACTVIF && UIEbits.ACTVIE) USBWakeFromSuspend(); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00303c 0b04 ANDLW 0x4 00303e e004 BZ 0x3048 003040 5069 MOVF 0x69,0x0,0x0 003042 0b04 ANDLW 0x4 003044 e001 BZ 0x3048 003046 d83c RCALL 0x30c0 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 003048 b26d BTFSC 0x6d,0x1,0x0 if(UCONbits.SUSPND==1) return; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00304a d031 BRA 0x30ae 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 00304c 5068 MOVF 0x68,0x0,0x0 if(UIRbits.URSTIF && UIEbits.URSTIE) USBProtocolResetHandler(); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00304e 0b01 ANDLW 0x1 003050 e004 BZ 0x305a 003052 5069 MOVF 0x69,0x0,0x0 003054 0b01 ANDLW 0x1 003056 e001 BZ 0x305a 003058 d854 RCALL 0x3102 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 00305a 5068 MOVF 0x68,0x0,0x0 if(UIRbits.IDLEIF && UIEbits.IDLEIE) USBSuspend(); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00305c 0b10 ANDLW 0x10 00305e e004 BZ 0x3068 003060 5069 MOVF 0x69,0x0,0x0 003062 0b10 ANDLW 0x10 003064 e001 BZ 0x3068 003066 d824 RCALL 0x30b0 003068 5068 MOVF 0x68,0x0,0x0 if(UIRbits.SOFIF && UIEbits.SOFIE) USB_SOF_Handler(); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00306a 0b40 ANDLW 0x40 00306c e004 BZ 0x3076 00306e 5069 MOVF 0x69,0x0,0x0 003070 0b40 ANDLW 0x40 003072 e001 BZ 0x3076 003074 d83b RCALL 0x30ec 003076 5068 MOVF 0x68,0x0,0x0 if(UIRbits.STALLIF && UIEbits.STALLIE) USBStallHandler(); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003078 0b20 ANDLW 0x20 00307a e004 BZ 0x3084 00307c 5069 MOVF 0x69,0x0,0x0 00307e 0b20 ANDLW 0x20 003080 e001 BZ 0x3084 003082 d836 RCALL 0x30f0 003084 5068 MOVF 0x68,0x0,0x0 if(UIRbits.UERRIF && UIEbits.UERRIE) USBErrorHandler(); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003086 0b02 ANDLW 0x2 003088 e004 BZ 0x3092 00308a 5069 MOVF 0x69,0x0,0x0 00308c 0b02 ANDLW 0x2 00308e e001 BZ 0x3092 003090 d836 RCALL 0x30fe 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 003092 0e03 MOVLW 0x3 if(usb_device_state < DEFAULT_STATE) return; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003094 0100 MOVLB 0x0 003096 5dfc SUBWF 0xfc,0x0,0x1 003098 e201 BC 0x309c 00309a d009 BRA 0x30ae 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 00309c 5068 MOVF 0x68,0x0,0x0 if(UIRbits.TRNIF && UIEbits.TRNIE) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00309e 0b08 ANDLW 0x8 0030a0 e006 BZ 0x30ae 0030a2 5069 MOVF 0x69,0x0,0x0 0030a4 0b08 ANDLW 0x8 0030a6 e003 BZ 0x30ae { 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 0030a8 ec7d CALL 0x2cfa,0x0 USBCtrlEPService(); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0030aa f016 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 0030ac 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 0030ae 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 0030b0 8469 BSF 0x69,0x2,0x0 UIEbits.ACTVIE = 1; // Enable bus activity interrupt C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0030b2 9868 BCF 0x68,0x4,0x0 UIRbits.IDLEIF = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0030b4 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 0030b6 9aa1 BCF 0xa1,0x5,0x0 PIR2bits.USBIF = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0030b8 8aa0 BSF 0xa0,0x5,0x0 PIE2bits.USBIE = 1; // Set USB wakeup source C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0030ba 0003 SLEEP Sleep(); // Goto sleep C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0030bc 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 0030be 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 0030c0 926d BCF 0x6d,0x1,0x0 UCONbits.SUSPND = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0030c2 9469 BCF 0x69,0x2,0x0 UIEbits.ACTVIE = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0030c4 9468 BCF 0x68,0x2,0x0 UIRbits.ACTVIF = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0030c6 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 0030c8 0100 MOVLB 0x0 if(usb_stat.RemoteWakeup == 1) // Check if RemoteWakeup function C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0030ca a1fd BTFSS 0xfd,0x0,0x1 0030cc d00e BRA 0x30ea { // has been enabled by the host. C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0030ce dff8 RCALL 0x30c0 USBWakeFromSuspend(); // Unsuspend USB modue C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0030d0 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 0030d2 0102 MOVLB 0x2 delay_count = 1800U; // Set RESUME line for 1-13 ms C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0030d4 0e08 MOVLW 0x8 0030d6 6ffe MOVWF 0xfe,0x1 0030d8 0e07 MOVLW 0x7 0030da 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 0030dc 07fe DECF 0xfe,0x1,0x1 delay_count--; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0030de 0e00 MOVLW 0x0 0030e0 5bff SUBWFB 0xff,0x1,0x1 0030e2 51fe MOVF 0xfe,0x0,0x1 }while(delay_count); C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0030e4 11ff IORWF 0xff,0x0,0x1 0030e6 e1fa BNZ 0x30dc 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 0030e8 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 0030ea 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 0030ec 9c68 BCF 0x68,0x6,0x0 UIRbits.SOFIF = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0030ee 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 0030f0 a070 BTFSS 0x70,0x0,0x0 if(UEP0bits.EPSTALL == 1) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0030f2 d003 BRA 0x30fa { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0030f4 ecec CALL 0x2fd8,0x0 USBPrepareForNextSetupTrf(); // Firmware work-around C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0030f6 f017 0030f8 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 0030fa 9a68 BCF 0x68,0x5,0x0 UIRbits.STALLIF = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 0030fc 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 0030fe 9268 BCF 0x68,0x1,0x0 UIRbits.UERRIF = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003100 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 003102 6a6a CLRF 0x6a,0x0 UEIR = 0; // Clear all USB error flags C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003104 6a68 CLRF 0x68,0x0 UIR = 0; // Clears all USB interrupts C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003106 0e9f MOVLW 0x9f UEIE = 0b10011111; // Unmask all USB error interrupts C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003108 6e6b MOVWF 0x6b,0x0 00310a 0e7b MOVLW 0x7b UIE = 0b01111011; // Enable all interrupts except ACTVIE C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00310c 6e69 MOVWF 0x69,0x0 C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00310e 6a6e CLRF 0x6e,0x0 UADDR = 0x00; // Reset to default address C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003110 0e0f MOVLW 0xf mDisableEP1to15(); // Reset all non-EP0 UEPn registers C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003112 6ee6 MOVWF 0xe6,0x0 003114 0e71 MOVLW 0x71 003116 6ee6 MOVWF 0xe6,0x0 003118 0e0f MOVLW 0xf 00311a 6ee6 MOVWF 0xe6,0x0 00311c d814 RCALL 0x3146 00311e 52e5 MOVF 0xe5,0x1,0x0 003120 52e5 MOVF 0xe5,0x1,0x0 003122 52e5 MOVF 0xe5,0x1,0x0 003124 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 003126 6e70 MOVWF 0x70,0x0 C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003128 a668 BTFSS 0x68,0x3,0x0 while(UIRbits.TRNIF == 1) // Flush any pending transactions C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00312a d002 BRA 0x3130 00312e d7fc BRA 0x3128 00312c 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 003130 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 003132 ecec CALL 0x2fd8,0x0 USBPrepareForNextSetupTrf(); // Declared in usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003134 f017 C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003136 0100 MOVLB 0x0 usb_stat.RemoteWakeup = 0; // Default status flag to disable C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003138 91fd BCF 0xfd,0x0,0x1 00313a 0100 MOVLB 0x0 usb_active_cfg = 0; // Clear active configuration C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00313c 6bfe CLRF 0xfe,0x1 00313e 0100 MOVLB 0x0 usb_device_state = DEFAULT_STATE; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003140 0e03 MOVLW 0x3 003142 6ffc MOVWF 0xfc,0x1 003144 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 003146 cfd9 MOVFF 0xfd9,0xfe6 void ClearArray(byte* startAdr,byte count) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003148 ffe6 00314a cfe1 MOVFF 0xfe1,0xfd9 00314c ffd9 { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00314e 0efd MOVLW 0xfd *startAdr; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003150 cfdb MOVFF 0xfdb,0xfe9 003152 ffe9 003154 0efe MOVLW 0xfe 003156 cfdb MOVFF 0xfdb,0xfea 003158 ffea 00315a 0efc MOVLW 0xfc while(count) C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00315c 50db MOVF 0xdb,0x0,0x0 00315e e004 BZ 0x3168 003166 d7f9 BRA 0x315a { C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c _asm C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003160 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 003162 0efc MOVLW 0xfc count--; C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003164 06db DECF 0xdb,0x1,0x0 }//end while C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 003168 52e5 MOVF 0xe5,0x1,0x0 }//end ClearArray C:\Projects\UBW\FW\2455\D\system\usb\usbdrv\usbdrv.c 00316a cfe7 MOVFF 0xfe7,0xfd9 00316c ffd9 00316e 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 0029f2 0104 MOVLB 0x4 if(SetupPkt.RequestType != STANDARD) return; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 0029f4 5120 MOVF 0x20,0x0,0x1 0029f6 0b60 ANDLW 0x60 0029f8 42e8 RRNCF 0xe8,0x1,0x0 0029fa 42e8 RRNCF 0xe8,0x1,0x0 0029fc 42e8 RRNCF 0xe8,0x1,0x0 0029fe 42e8 RRNCF 0xe8,0x1,0x0 002a00 42e8 RRNCF 0xe8,0x1,0x0 002a02 0900 IORLW 0x0 002a04 e001 BZ 0x2a08 002a06 d055 BRA 0x2ab2 C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002a08 5121 MOVF 0x21,0x0,0x1 switch(SetupPkt.bRequest) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002a0a 0a07 XORLW 0x7 002a0c e051 BZ 0x2ab0 002a0e 0a0b XORLW 0xb 002a10 e04f BZ 0x2ab0 002a12 0a07 XORLW 0x7 002a14 e040 BZ 0x2a96 002a16 0a01 XORLW 0x1 002a18 e02c BZ 0x2a72 002a1a 0a0b XORLW 0xb 002a1c e028 BZ 0x2a6e 002a1e 0a02 XORLW 0x2 002a20 e026 BZ 0x2a6e 002a22 0a03 XORLW 0x3 002a24 e022 BZ 0x2a6a 002a26 0a08 XORLW 0x8 002a28 e012 BZ 0x2a4e 002a2a 0a01 XORLW 0x1 002a2c e00e BZ 0x2a4a 002a2e 0a0f XORLW 0xf 002a30 e00a BZ 0x2a46 002a32 0a03 XORLW 0x3 002a34 e001 BZ 0x2a38 002a36 d03c BRA 0x2ab0 { 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 002a38 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002a3a 0e01 MOVLW 0x1 002a3c 6ff7 MOVWF 0xf7,0x1 002a3e 0100 MOVLB 0x0 usb_device_state = ADR_PENDING_STATE; // Update state only C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002a40 0e04 MOVLW 0x4 002a42 6ffc MOVWF 0xfc,0x1 /* See USBCtrlTrfInHandler() in usbctrltrf.c for the next step */ C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002a44 d036 BRA 0x2ab2 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 002a46 d836 RCALL 0x2ab4 USBStdGetDscHandler(); C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002a48 d034 BRA 0x2ab2 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 002a4a d890 RCALL 0x2b6c USBStdSetCfgHandler(); C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002a4c d032 BRA 0x2ab2 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 002a4e 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002a50 0e01 MOVLW 0x1 002a52 6ff7 MOVWF 0xf7,0x1 002a54 0102 MOVLB 0x2 pSrc.bRam = (byte*)&usb_active_cfg; // Set Source C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002a56 0efe MOVLW 0xfe 002a58 6ff8 MOVWF 0xf8,0x1 002a5a 0e00 MOVLW 0x0 002a5c 6ff9 MOVWF 0xf9,0x1 002a5e 0100 MOVLB 0x0 usb_stat.ctrl_trf_mem = _RAM; // Set memory type C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002a60 93fd BCF 0xfd,0x1,0x1 002a62 0102 MOVLB 0x2 LSB(wCount) = 1; // Set data count C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002a64 0e01 MOVLW 0x1 002a66 6ffc MOVWF 0xfc,0x1 002a68 d024 BRA 0x2ab2 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 002a6a d8a8 RCALL 0x2bbc USBStdGetStatusHandler(); C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002a6c d022 BRA 0x2ab2 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 002a6e d8f4 RCALL 0x2c58 USBStdFeatureReqHandler(); C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002a70 d020 BRA 0x2ab2 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 002a72 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002a74 0e01 MOVLW 0x1 002a76 6ff7 MOVWF 0xf7,0x1 002a78 0104 MOVLB 0x4 pSrc.bRam = (byte*)&usb_alt_intf+SetupPkt.bIntfID; // Set source C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002a7a 5124 MOVF 0x24,0x0,0x1 002a7c 0102 MOVLB 0x2 002a7e 6ff8 MOVWF 0xf8,0x1 002a80 6bf9 CLRF 0xf9,0x1 002a82 0eff MOVLW 0xff 002a84 27f8 ADDWF 0xf8,0x1,0x1 002a86 0e00 MOVLW 0x0 002a88 23f9 ADDWFC 0xf9,0x1,0x1 002a8a 0100 MOVLB 0x0 usb_stat.ctrl_trf_mem = _RAM; // Set memory type C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002a8c 93fd BCF 0xfd,0x1,0x1 002a8e 0102 MOVLB 0x2 LSB(wCount) = 1; // Set data count C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002a90 0e01 MOVLW 0x1 002a92 6ffc MOVWF 0xfc,0x1 002a94 d00e BRA 0x2ab2 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 002a96 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002a98 0e01 MOVLW 0x1 002a9a 6ff7 MOVWF 0xf7,0x1 002a9c 0104 MOVLB 0x4 usb_alt_intf[SetupPkt.bIntfID] = SetupPkt.bAltID; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002a9e 5124 MOVF 0x24,0x0,0x1 002aa0 6aea CLRF 0xea,0x0 002aa2 0fff ADDLW 0xff 002aa4 6ee9 MOVWF 0xe9,0x0 002aa6 0e00 MOVLW 0x0 002aa8 22ea ADDWFC 0xea,0x1,0x0 002aaa c422 MOVFF 0x422,0xfef 002aac ffef 002aae d001 BRA 0x2ab2 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 002ab0 d000 BRA 0x2ab2 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 002ab2 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 002ab4 0e80 MOVLW 0x80 if(SetupPkt.bmRequestType == 0x80) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002ab6 0104 MOVLB 0x4 002ab8 5d20 SUBWF 0x20,0x0,0x1 002aba e157 BNZ 0x2b6a { C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002abc 5123 MOVF 0x23,0x0,0x1 switch(SetupPkt.bDscType) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002abe 0a03 XORLW 0x3 002ac0 e034 BZ 0x2b2a 002ac2 0a01 XORLW 0x1 002ac4 e010 BZ 0x2ae6 002ac6 0a03 XORLW 0x3 002ac8 e001 BZ 0x2acc 002aca d04d BRA 0x2b66 { 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 002acc 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002ace 0e01 MOVLW 0x1 002ad0 6ff7 MOVWF 0xf7,0x1 002ad2 0102 MOVLB 0x2 pSrc.bRom = (rom byte*)&device_dsc; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002ad4 0e5c MOVLW 0x5c 002ad6 6ff8 MOVWF 0xf8,0x1 002ad8 0e32 MOVLW 0x32 002ada 6ff9 MOVWF 0xf9,0x1 002adc 0e12 MOVLW 0x12 wCount._word = sizeof(device_dsc); // Set data count C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002ade 0102 MOVLB 0x2 002ae0 6ffc MOVWF 0xfc,0x1 002ae2 6bfd CLRF 0xfd,0x1 002ae4 d040 BRA 0x2b66 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 002ae6 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002ae8 0e01 MOVLW 0x1 002aea 6ff7 MOVWF 0xf7,0x1 002aec 0104 MOVLB 0x4 pSrc.bRom = *(USB_CD_Ptr+SetupPkt.bDscIndex); C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002aee 5122 MOVF 0x22,0x0,0x1 002af0 6ef6 MOVWF 0xf6,0x0 002af2 6af7 CLRF 0xf7,0x0 002af4 90d8 BCF 0xd8,0x0,0x0 002af6 36f6 RLCF 0xf6,0x1,0x0 002af8 36f7 RLCF 0xf7,0x1,0x0 002afa 0e1d MOVLW 0x1d 002afc 26f6 ADDWF 0xf6,0x1,0x0 002afe 0e33 MOVLW 0x33 002b00 22f7 ADDWFC 0xf7,0x1,0x0 002b02 0009 TBLRDPOSTINC 002b04 cff5 MOVFF 0xff5,0x2f8 002b06 f2f8 002b08 000a TBLRDPOSTDEC 002b0a cff5 MOVFF 0xff5,0x2f9 002b0c f2f9 002b0e 0e02 MOVLW 0x2 wCount._word = *(pSrc.wRom+1); // Set data count C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002b10 0102 MOVLB 0x2 002b12 6af7 CLRF 0xf7,0x0 002b14 25f8 ADDWF 0xf8,0x0,0x1 002b16 6ef6 MOVWF 0xf6,0x0 002b18 51f9 MOVF 0xf9,0x0,0x1 002b1a 22f7 ADDWFC 0xf7,0x1,0x0 002b1c 0009 TBLRDPOSTINC 002b1e cff5 MOVFF 0xff5,0x2fc 002b20 f2fc 002b22 000a TBLRDPOSTDEC 002b24 cff5 MOVFF 0xff5,0x2fd 002b26 f2fd 002b28 d01e BRA 0x2b66 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 002b2a 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002b2c 0e01 MOVLW 0x1 002b2e 6ff7 MOVWF 0xf7,0x1 002b30 0104 MOVLB 0x4 pSrc.bRom = *(USB_SD_Ptr+SetupPkt.bDscIndex); C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002b32 5122 MOVF 0x22,0x0,0x1 002b34 6ef6 MOVWF 0xf6,0x0 002b36 6af7 CLRF 0xf7,0x0 002b38 90d8 BCF 0xd8,0x0,0x0 002b3a 36f6 RLCF 0xf6,0x1,0x0 002b3c 36f7 RLCF 0xf7,0x1,0x0 002b3e 0e21 MOVLW 0x21 002b40 26f6 ADDWF 0xf6,0x1,0x0 002b42 0e33 MOVLW 0x33 002b44 22f7 ADDWFC 0xf7,0x1,0x0 002b46 0009 TBLRDPOSTINC 002b48 cff5 MOVFF 0xff5,0x2f8 002b4a f2f8 002b4c 000a TBLRDPOSTDEC 002b4e cff5 MOVFF 0xff5,0x2f9 002b50 f2f9 002b52 c2f8 MOVFF 0x2f8,0xff6 wCount._word = *pSrc.bRom; // Set data count C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002b54 fff6 002b56 c2f9 MOVFF 0x2f9,0xff7 002b58 fff7 002b5a 0008 TBLRD 002b5c 50f5 MOVF 0xf5,0x0,0x0 002b5e 0102 MOVLB 0x2 002b60 6ffc MOVWF 0xfc,0x1 002b62 6bfd CLRF 0xfd,0x1 002b64 d000 BRA 0x2b66 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 002b66 0100 MOVLB 0x0 usb_stat.ctrl_trf_mem = _ROM; // Set memory type C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002b68 83fd BSF 0xfd,0x1,0x1 }//end if C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002b6a 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 002b6c 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002b6e 0e01 MOVLW 0x1 002b70 6ff7 MOVWF 0xf7,0x1 002b72 0e0f MOVLW 0xf mDisableEP1to15(); // See usbdrv.h C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002b74 6ee6 MOVWF 0xe6,0x0 002b76 0e71 MOVLW 0x71 002b78 6ee6 MOVWF 0xe6,0x0 002b7a 0e0f MOVLW 0xf 002b7c 6ee6 MOVWF 0xe6,0x0 002b7e eca3 CALL 0x3146,0x0 002b80 f018 002b82 52e5 MOVF 0xe5,0x1,0x0 002b84 52e5 MOVF 0xe5,0x1,0x0 002b86 52e5 MOVF 0xe5,0x1,0x0 002b88 0e01 MOVLW 0x1 ClearArray((byte*)&usb_alt_intf,MAX_NUM_INT); C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002b8a 6ee6 MOVWF 0xe6,0x0 002b8c 0eff MOVLW 0xff 002b8e 6ee6 MOVWF 0xe6,0x0 002b90 0e00 MOVLW 0x0 002b92 6ee6 MOVWF 0xe6,0x0 002b94 eca3 CALL 0x3146,0x0 002b96 f018 002b98 52e5 MOVF 0xe5,0x1,0x0 002b9a 52e5 MOVF 0xe5,0x1,0x0 002b9c 52e5 MOVF 0xe5,0x1,0x0 002b9e c422 MOVFF 0x422,0xfe usb_active_cfg = SetupPkt.bCfgValue; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002ba0 f0fe 002ba2 0104 MOVLB 0x4 if(SetupPkt.bCfgValue == 0) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002ba4 5122 MOVF 0x22,0x0,0x1 002ba6 e104 BNZ 0x2bb0 002ba8 0100 MOVLB 0x0 usb_device_state = ADDRESS_STATE; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002baa 0e05 MOVLW 0x5 002bac 6ffc MOVWF 0xfc,0x1 002bae d005 BRA 0x2bba else C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002bb0 0100 MOVLB 0x0 usb_device_state = CONFIGURED_STATE; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002bb2 0e06 MOVLW 0x6 002bb4 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 002bb6 ec9c CALL 0x2738,0x0 CDCInitEP(); C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002bb8 f013 #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 002bba 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 002bbc 0104 MOVLB 0x4 CtrlTrfData._byte0 = 0; // Initialize content C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002bbe 6b28 CLRF 0x28,0x1 002bc0 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 002bc2 0104 MOVLB 0x4 switch(SetupPkt.Recipient) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002bc4 5120 MOVF 0x20,0x0,0x1 002bc6 0b1f ANDLW 0x1f 002bc8 0a02 XORLW 0x2 002bca e014 BZ 0x2bf4 002bcc 0a03 XORLW 0x3 002bce e00e BZ 0x2bec 002bd0 0a01 XORLW 0x1 002bd2 e001 BZ 0x2bd6 002bd4 d033 BRA 0x2c3c { 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 002bd6 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002bd8 0e01 MOVLW 0x1 002bda 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 002bdc 0104 MOVLB 0x4 CtrlTrfData._byte0|=0b000000001; // Set bit0 C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002bde 8128 BSF 0x28,0x0,0x1 C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002be0 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 002be2 a1fd BTFSS 0xfd,0x0,0x1 002be4 d002 BRA 0x2bea 002be6 0104 MOVLB 0x4 CtrlTrfData._byte0|=0b00000010; // Set bit1 C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002be8 8328 BSF 0x28,0x1,0x1 002bea d028 BRA 0x2c3c 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 002bec 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; // No data to update C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002bee 0e01 MOVLW 0x1 002bf0 6ff7 MOVWF 0xf7,0x1 002bf2 d024 BRA 0x2c3c 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 002bf4 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002bf6 0e01 MOVLW 0x1 002bf8 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 002bfa 0104 MOVLB 0x4 pDst.bRam = (byte*)&ep0Bo+(SetupPkt.EPNum*8)+(SetupPkt.EPDir*4); C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002bfc 5124 MOVF 0x24,0x0,0x1 002bfe 0b0f ANDLW 0xf 002c00 0d08 MULLW 0x8 002c02 50f3 MOVF 0xf3,0x0,0x0 002c04 6a15 CLRF 0x15,0x0 002c06 0f00 ADDLW 0x0 002c08 6e14 MOVWF 0x14,0x0 002c0a 0e04 MOVLW 0x4 002c0c 2215 ADDWFC 0x15,0x1,0x0 002c0e 5124 MOVF 0x24,0x0,0x1 002c10 0b80 ANDLW 0x80 002c12 e001 BZ 0x2c16 002c14 0e01 MOVLW 0x1 002c16 0d04 MULLW 0x4 002c18 50f3 MOVF 0xf3,0x0,0x0 002c1a 0102 MOVLB 0x2 002c1c 2414 ADDWF 0x14,0x0,0x0 002c1e 6ffa MOVWF 0xfa,0x1 002c20 0e00 MOVLW 0x0 002c22 2015 ADDWFC 0x15,0x0,0x0 002c24 6ffb MOVWF 0xfb,0x1 002c26 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 002c28 ffe9 002c2a c2fb MOVFF 0x2fb,0xfea 002c2c ffea 002c2e 50ef MOVF 0xef,0x0,0x0 002c30 0b04 ANDLW 0x4 002c32 e003 BZ 0x2c3a 002c34 0104 MOVLB 0x4 CtrlTrfData._byte0=0x01;// Set bit0 C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002c36 0e01 MOVLW 0x1 002c38 6f28 MOVWF 0x28,0x1 002c3a d000 BRA 0x2c3c 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 002c3c 0102 MOVLB 0x2 if(ctrl_trf_session_owner == MUID_USB9) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002c3e 05f7 DECF 0xf7,0x0,0x1 002c40 e10a BNZ 0x2c56 { C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002c42 0102 MOVLB 0x2 pSrc.bRam = (byte*)&CtrlTrfData; // Set Source C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002c44 0e28 MOVLW 0x28 002c46 6ff8 MOVWF 0xf8,0x1 002c48 0e04 MOVLW 0x4 002c4a 6ff9 MOVWF 0xf9,0x1 002c4c 0100 MOVLB 0x0 usb_stat.ctrl_trf_mem = _RAM; // Set memory type C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002c4e 93fd BCF 0xfd,0x1,0x1 002c50 0102 MOVLB 0x2 LSB(wCount) = 2; // Set data count C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002c52 0e02 MOVLW 0x2 002c54 6ffc MOVWF 0xfc,0x1 }//end if(...) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002c56 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 002c58 0104 MOVLB 0x4 if((SetupPkt.bFeature == DEVICE_REMOTE_WAKEUP)&& C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002c5a 0522 DECF 0x22,0x0,0x1 002c5c e110 BNZ 0x2c7e (SetupPkt.Recipient == RCPT_DEV)) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002c5e 5120 MOVF 0x20,0x0,0x1 002c60 0b1f ANDLW 0x1f 002c62 0900 IORLW 0x0 002c64 e10c BNZ 0x2c7e { C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002c66 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002c68 0e01 MOVLW 0x1 002c6a 6ff7 MOVWF 0xf7,0x1 002c6c 0e03 MOVLW 0x3 if(SetupPkt.bRequest == SET_FEATURE) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002c6e 0104 MOVLB 0x4 002c70 5d21 SUBWF 0x21,0x0,0x1 002c72 e103 BNZ 0x2c7a 002c74 0100 MOVLB 0x0 usb_stat.RemoteWakeup = 1; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002c76 81fd BSF 0xfd,0x0,0x1 002c78 d002 BRA 0x2c7e else C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002c7a 0100 MOVLB 0x0 usb_stat.RemoteWakeup = 0; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002c7c 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 002c7e 0104 MOVLB 0x4 if((SetupPkt.bFeature == ENDPOINT_HALT)&& C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002c80 5122 MOVF 0x22,0x0,0x1 002c82 e13a BNZ 0x2cf8 (SetupPkt.Recipient == RCPT_EP)&& C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002c84 5120 MOVF 0x20,0x0,0x1 002c86 0b1f ANDLW 0x1f 002c88 0802 SUBLW 0x2 002c8a e136 BNZ 0x2cf8 002c8c 5124 MOVF 0x24,0x0,0x1 (SetupPkt.EPNum != 0)) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002c8e 0b0f ANDLW 0xf 002c90 0900 IORLW 0x0 002c92 e032 BZ 0x2cf8 { C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002c94 0102 MOVLB 0x2 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002c96 0e01 MOVLW 0x1 002c98 6ff7 MOVWF 0xf7,0x1 /* Must do address calculation here */ C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002c9a 0104 MOVLB 0x4 pDst.bRam = (byte*)&ep0Bo+(SetupPkt.EPNum*8)+(SetupPkt.EPDir*4); C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002c9c 5124 MOVF 0x24,0x0,0x1 002c9e 0b0f ANDLW 0xf 002ca0 0d08 MULLW 0x8 002ca2 50f3 MOVF 0xf3,0x0,0x0 002ca4 6a15 CLRF 0x15,0x0 002ca6 0f00 ADDLW 0x0 002ca8 6e14 MOVWF 0x14,0x0 002caa 0e04 MOVLW 0x4 002cac 2215 ADDWFC 0x15,0x1,0x0 002cae 5124 MOVF 0x24,0x0,0x1 002cb0 0b80 ANDLW 0x80 002cb2 e001 BZ 0x2cb6 002cb4 0e01 MOVLW 0x1 002cb6 0d04 MULLW 0x4 002cb8 50f3 MOVF 0xf3,0x0,0x0 002cba 0102 MOVLB 0x2 002cbc 2414 ADDWF 0x14,0x0,0x0 002cbe 6ffa MOVWF 0xfa,0x1 002cc0 0e00 MOVLW 0x0 002cc2 2015 ADDWFC 0x15,0x0,0x0 002cc4 6ffb MOVWF 0xfb,0x1 C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002cc6 0e03 MOVLW 0x3 if(SetupPkt.bRequest == SET_FEATURE) C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002cc8 0104 MOVLB 0x4 002cca 5d21 SUBWF 0x21,0x0,0x1 002ccc e107 BNZ 0x2cdc 002cce 0e84 MOVLW 0x84 *pDst.bRam = _USIE|_BSTALL; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002cd0 c2fa MOVFF 0x2fa,0xfe9 002cd2 ffe9 002cd4 c2fb MOVFF 0x2fb,0xfea 002cd6 ffea 002cd8 6eef MOVWF 0xef,0x0 002cda d00e BRA 0x2cf8 else C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002cdc af24 BTFSS 0x24,0x7,0x1 if(SetupPkt.EPDir == 1) // IN C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002cde d006 BRA 0x2cec 002ce0 c2fa MOVFF 0x2fa,0xfe9 *pDst.bRam = _UCPU; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002ce2 ffe9 002ce4 c2fb MOVFF 0x2fb,0xfea 002ce6 ffea 002ce8 6aef CLRF 0xef,0x0 002cea d006 BRA 0x2cf8 else C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002cec 0e88 MOVLW 0x88 *pDst.bRam = _USIE|_DAT0|_DTSEN; C:\Projects\UBW\FW\2455\D\system\usb\usb9\usb9.c 002cee c2fa MOVFF 0x2fa,0xfe9 002cf0 ffe9 002cf2 c2fb MOVFF 0x2fb,0xfea 002cf4 ffea 002cf6 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 002cf8 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 002cfa 506c MOVF 0x6c,0x0,0x0 if(USTAT == EP00_OUT) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002cfc e002 BZ 0x2d02 002cfe 0e00 MOVLW 0x0 002d00 d001 BRA 0x2d04 002d02 0e01 MOVLW 0x1 002d04 0900 IORLW 0x0 002d06 e00b BZ 0x2d1e { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002d08 0104 MOVLB 0x4 if(ep0Bo.Stat.PID == SETUP_TOKEN) // EP0 SETUP C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002d0a 5100 MOVF 0x0,0x0,0x1 002d0c 0b3c ANDLW 0x3c 002d0e 42e8 RRNCF 0xe8,0x1,0x0 002d10 42e8 RRNCF 0xe8,0x1,0x0 002d12 080d SUBLW 0xd 002d14 e102 BNZ 0x2d1a 002d16 d80c RCALL 0x2d30 USBCtrlTrfSetupHandler(); C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002d18 d001 BRA 0x2d1c else // EP0 OUT C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002d1a d840 RCALL 0x2d9c USBCtrlTrfOutHandler(); C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c } C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002d1c d008 BRA 0x2d2e else if(USTAT == EP00_IN) // EP0 IN C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002d1e 506c MOVF 0x6c,0x0,0x0 002d20 e002 BZ 0x2d26 002d22 0e00 MOVLW 0x0 002d24 d001 BRA 0x2d28 002d26 0e01 MOVLW 0x1 002d28 0904 IORLW 0x4 002d2a e001 BZ 0x2d2e 002d2c d847 RCALL 0x2dbc USBCtrlTrfInHandler(); C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002d2e 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 002d30 cfd9 MOVFF 0xfd9,0xfe6 void USBCtrlTrfSetupHandler(void) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002d32 ffe6 002d34 cfe1 MOVFF 0xfe1,0xfd9 002d36 ffd9 002d38 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 002d3a 0102 MOVLB 0x2 ctrl_trf_state = WAIT_SETUP; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002d3c 6bf6 CLRF 0xf6,0x1 002d3e 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 002d40 6bfc CLRF 0xfc,0x1 wCount._word = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002d42 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 002d44 ecf9 CALL 0x29f2,0x0 USBCheckStdRequest(); // See system\usb9\usb9.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002d46 f014 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002d48 6adf CLRF 0xdf,0x0 for(i=0;i < (sizeof(ClassReqHandler)/sizeof(pFunc));i++) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002d4a 50df MOVF 0xdf,0x0,0x0 002d4c 6e14 MOVWF 0x14,0x0 002d4e 6a15 CLRF 0x15,0x0 002d50 0e01 MOVLW 0x1 002d52 5c14 SUBWF 0x14,0x0,0x0 002d54 0e00 MOVLW 0x0 002d56 5815 SUBWFB 0x15,0x0,0x0 002d58 e21b BC 0x2d90 002d8c 2adf INCF 0xdf,0x1,0x0 002d8e d7dd BRA 0x2d4a { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002d5a 0102 MOVLB 0x2 if(ctrl_trf_session_owner != MUID_NULL)break; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002d5c 51f7 MOVF 0xf7,0x0,0x1 002d5e e001 BZ 0x2d62 002d60 d017 BRA 0x2d90 002d62 6af7 CLRF 0xf7,0x0 ClassReqHandler[i](); // See autofiles\usbdsc.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002d64 34df RLCF 0xdf,0x0,0x0 002d66 0bfe ANDLW 0xfe 002d68 36f7 RLCF 0xf7,0x1,0x0 002d6a 6ef6 MOVWF 0xf6,0x0 002d6c 0e27 MOVLW 0x27 002d6e 26f6 ADDWF 0xf6,0x1,0x0 002d70 0e33 MOVLW 0x33 002d72 22f7 ADDWFC 0xf7,0x1,0x0 002d74 0009 TBLRDPOSTINC 002d76 cff5 MOVFF 0xff5,0x14 002d78 f014 002d7a 0008 TBLRD 002d7c cff5 MOVFF 0xff5,0x15 002d7e f015 002d80 d004 BRA 0x2d8a 002d82 c015 MOVFF 0x15,0xffa 002d84 fffa 002d86 5014 MOVF 0x14,0x0,0x0 002d88 6ef9 MOVWF 0xf9,0x0 002d8a dffb RCALL 0x2d82 }//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 002d90 d8dd RCALL 0x2f4c USBCtrlEPServiceComplete(); C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002d92 52e5 MOVF 0xe5,0x1,0x0 }//end USBCtrlTrfSetupHandler C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002d94 52e5 MOVF 0xe5,0x1,0x0 002d96 cfe7 MOVFF 0xfe7,0xfd9 002d98 ffd9 002d9a 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 002d9c 0e02 MOVLW 0x2 if(ctrl_trf_state == CTRL_TRF_RX) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002d9e 0102 MOVLB 0x2 002da0 5df6 SUBWF 0xf6,0x0,0x1 002da2 e10a BNZ 0x2db8 { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002da4 d896 RCALL 0x2ed2 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 002da6 0104 MOVLB 0x4 if(ep0Bo.Stat.DTS == 0) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002da8 bd00 BTFSC 0x0,0x6,0x1 002daa d003 BRA 0x2db2 002dac 0ec8 MOVLW 0xc8 ep0Bo.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002dae 6f00 MOVWF 0x0,0x1 002db0 d002 BRA 0x2db6 else C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002db2 0e88 MOVLW 0x88 ep0Bo.Stat._byte = _USIE|_DAT0|_DTSEN; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002db4 6f00 MOVWF 0x0,0x1 } C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002db6 d001 BRA 0x2dba else // CTRL_TRF_TX C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002db8 d90f RCALL 0x2fd8 USBPrepareForNextSetupTrf(); C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002dba 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 002dbc 0e04 MOVLW 0x4 mUSBCheckAdrPendingState(); // Must check if in ADR_PENDING_STATE C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002dbe 0100 MOVLB 0x0 002dc0 5dfc SUBWF 0xfc,0x0,0x1 002dc2 e10a BNZ 0x2dd8 002dc4 c422 MOVFF 0x422,0xf6e 002dc6 ff6e 002dc8 506e MOVF 0x6e,0x0,0x0 002dca 0800 SUBLW 0x0 002dcc e203 BC 0x2dd4 002dce 0e05 MOVLW 0x5 002dd0 6ffc MOVWF 0xfc,0x1 002dd2 d002 BRA 0x2dd8 002dd4 0e03 MOVLW 0x3 002dd6 6ffc MOVWF 0xfc,0x1 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002dd8 0102 MOVLB 0x2 if(ctrl_trf_state == CTRL_TRF_TX) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002dda 05f6 DECF 0xf6,0x0,0x1 002ddc e10a BNZ 0x2df2 { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002dde d80b RCALL 0x2df6 USBCtrlTrfTxService(); C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002de0 0104 MOVLB 0x4 if(ep0Bi.Stat.DTS == 0) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002de2 bd04 BTFSC 0x4,0x6,0x1 002de4 d003 BRA 0x2dec 002de6 0ec8 MOVLW 0xc8 ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002de8 6f04 MOVWF 0x4,0x1 002dea d002 BRA 0x2df0 else C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002dec 0e88 MOVLW 0x88 ep0Bi.Stat._byte = _USIE|_DAT0|_DTSEN; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002dee 6f04 MOVWF 0x4,0x1 } C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002df0 d001 BRA 0x2df4 else // CTRL_TRF_RX C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002df2 d8f2 RCALL 0x2fd8 USBPrepareForNextSetupTrf(); C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002df4 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 002df6 cfd9 MOVFF 0xfd9,0xfe6 void USBCtrlTrfTxService(void) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002df8 ffe6 002dfa cfe1 MOVFF 0xfe1,0xfd9 002dfc ffd9 002dfe 0e02 MOVLW 0x2 002e00 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 002e02 0102 MOVLB 0x2 if(wCount._word < EP0_BUFF_SIZE) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002e04 0e08 MOVLW 0x8 002e06 5dfc SUBWF 0xfc,0x0,0x1 002e08 0e00 MOVLW 0x0 002e0a 59fd SUBWFB 0xfd,0x0,0x1 002e0c e205 BC 0x2e18 002e0e c2fc MOVFF 0x2fc,0xfde byte_to_send._word = wCount._word; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002e10 ffde 002e12 c2fd MOVFF 0x2fd,0xfdd 002e14 ffdd 002e16 d003 BRA 0x2e1e else C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002e18 0e08 MOVLW 0x8 byte_to_send._word = EP0_BUFF_SIZE; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002e1a 6ede MOVWF 0xde,0x0 002e1c 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 002e1e 0104 MOVLB 0x4 ep0Bi.Stat.BC9 = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002e20 9304 BCF 0x4,0x1,0x1 002e22 9104 BCF 0x4,0x0,0x1 ep0Bi.Stat.BC8 = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002e24 0e01 MOVLW 0x1 ep0Bi.Stat._byte |= MSB(byte_to_send); C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002e26 50db MOVF 0xdb,0x0,0x0 002e28 1304 IORWF 0x4,0x1,0x1 002e2a cfdf MOVFF 0xfdf,0x405 ep0Bi.Cnt = LSB(byte_to_send); C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002e2c 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 002e2e 0e00 MOVLW 0x0 wCount._word = wCount._word - byte_to_send._word; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002e30 50db MOVF 0xdb,0x0,0x0 002e32 0102 MOVLB 0x2 002e34 5ffc SUBWF 0xfc,0x1,0x1 002e36 0e01 MOVLW 0x1 002e38 50db MOVF 0xdb,0x0,0x0 002e3a 5bfd SUBWFB 0xfd,0x1,0x1 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002e3c 0e28 MOVLW 0x28 pDst.bRam = (byte*)&CtrlTrfData; // Set destination pointer C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002e3e 6ffa MOVWF 0xfa,0x1 002e40 0e04 MOVLW 0x4 002e42 6ffb MOVWF 0xfb,0x1 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002e44 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 002e46 a3fd BTFSS 0xfd,0x1,0x1 002e48 d01e BRA 0x2e86 { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002e4a cfd9 MOVFF 0xfd9,0xfe9 while(byte_to_send._word) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002e4c ffe9 002e4e cfda MOVFF 0xfda,0xfea 002e50 ffea 002e52 50ee MOVF 0xee,0x0,0x0 002e54 10ed IORWF 0xed,0x0,0x0 002e56 e016 BZ 0x2e84 002e82 d7e3 BRA 0x2e4a { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002e58 c2f8 MOVFF 0x2f8,0xff6 *pDst.bRam = *pSrc.bRom; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002e5a fff6 002e5c c2f9 MOVFF 0x2f9,0xff7 002e5e fff7 002e60 0008 TBLRD 002e62 50f5 MOVF 0xf5,0x0,0x0 002e64 c2fa MOVFF 0x2fa,0xfe9 002e66 ffe9 002e68 c2fb MOVFF 0x2fb,0xfea 002e6a ffea 002e6c 6eef MOVWF 0xef,0x0 002e6e 0102 MOVLB 0x2 pDst.bRam++; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002e70 2bfa INCF 0xfa,0x1,0x1 002e72 0e00 MOVLW 0x0 002e74 23fb ADDWFC 0xfb,0x1,0x1 002e76 2bf8 INCF 0xf8,0x1,0x1 pSrc.bRom++; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002e78 23f9 ADDWFC 0xf9,0x1,0x1 002e7a 06df DECF 0xdf,0x1,0x0 byte_to_send._word--; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002e7c 0e01 MOVLW 0x1 002e7e e201 BC 0x2e82 002e80 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 002e84 d01c BRA 0x2ebe else // RAM C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002e86 cfd9 MOVFF 0xfd9,0xfe9 while(byte_to_send._word) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002e88 ffe9 002e8a cfda MOVFF 0xfda,0xfea 002e8c ffea 002e8e 50ee MOVF 0xee,0x0,0x0 002e90 10ed IORWF 0xed,0x0,0x0 002e92 e015 BZ 0x2ebe 002ebc d7e4 BRA 0x2e86 { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002e94 c2f8 MOVFF 0x2f8,0xfe9 *pDst.bRam = *pSrc.bRam; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002e96 ffe9 002e98 c2f9 MOVFF 0x2f9,0xfea 002e9a ffea 002e9c 50ef MOVF 0xef,0x0,0x0 002e9e c2fa MOVFF 0x2fa,0xfe9 002ea0 ffe9 002ea2 c2fb MOVFF 0x2fb,0xfea 002ea4 ffea 002ea6 6eef MOVWF 0xef,0x0 002ea8 0102 MOVLB 0x2 pDst.bRam++; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002eaa 2bfa INCF 0xfa,0x1,0x1 002eac 0e00 MOVLW 0x0 002eae 23fb ADDWFC 0xfb,0x1,0x1 002eb0 2bf8 INCF 0xf8,0x1,0x1 pSrc.bRam++; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002eb2 23f9 ADDWFC 0xf9,0x1,0x1 002eb4 06df DECF 0xdf,0x1,0x0 byte_to_send._word--; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002eb6 0e01 MOVLW 0x1 002eb8 e201 BC 0x2ebc 002eba 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 002ebe 0e02 MOVLW 0x2 }//end USBCtrlTrfTxService C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002ec0 5ce1 SUBWF 0xe1,0x0,0x0 002ec2 e202 BC 0x2ec8 002ec4 6ae1 CLRF 0xe1,0x0 002ec6 52e5 MOVF 0xe5,0x1,0x0 002ec8 6ee1 MOVWF 0xe1,0x0 002eca 52e5 MOVF 0xe5,0x1,0x0 002ecc cfe7 MOVFF 0xfe7,0xfd9 002ece ffd9 002ed0 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 002ed2 cfd9 MOVFF 0xfd9,0xfe6 void USBCtrlTrfRxService(void) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002ed4 ffe6 002ed6 cfe1 MOVFF 0xfe1,0xfd9 002ed8 ffd9 002eda 0e02 MOVLW 0x2 002edc 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 002ede 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 002ee0 0104 MOVLB 0x4 002ee2 1500 ANDWF 0x0,0x0,0x1 002ee4 6ee7 MOVWF 0xe7,0x0 002ee6 0e01 MOVLW 0x1 002ee8 cfe7 MOVFF 0xfe7,0xfdb 002eea ffdb 002eec c401 MOVFF 0x401,0xfdf LSB(byte_to_read) = ep0Bo.Cnt; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002eee 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 002ef0 50de MOVF 0xde,0x0,0x0 wCount._word = wCount._word + byte_to_read._word; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002ef2 0102 MOVLB 0x2 002ef4 27fc ADDWF 0xfc,0x1,0x1 002ef6 50dd MOVF 0xdd,0x0,0x0 002ef8 23fd ADDWFC 0xfd,0x1,0x1 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002efa 0e28 MOVLW 0x28 pSrc.bRam = (byte*)&CtrlTrfData; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002efc 6ff8 MOVWF 0xf8,0x1 002efe 0e04 MOVLW 0x4 002f00 6ff9 MOVWF 0xf9,0x1 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002f02 cfd9 MOVFF 0xfd9,0xfe9 while(byte_to_read._word) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002f04 ffe9 002f06 cfda MOVFF 0xfda,0xfea 002f08 ffea 002f0a 50ee MOVF 0xee,0x0,0x0 002f0c 10ed IORWF 0xed,0x0,0x0 002f0e e014 BZ 0x2f38 002f36 d7e5 BRA 0x2f02 { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002f10 c2f8 MOVFF 0x2f8,0xfe9 *pDst.bRam = *pSrc.bRam; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002f12 ffe9 002f14 c2f9 MOVFF 0x2f9,0xfea 002f16 ffea 002f18 50ef MOVF 0xef,0x0,0x0 002f1a c2fa MOVFF 0x2fa,0xfe9 002f1c ffe9 002f1e c2fb MOVFF 0x2fb,0xfea 002f20 ffea 002f22 6eef MOVWF 0xef,0x0 002f24 2bfa INCF 0xfa,0x1,0x1 pDst.bRam++; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002f26 0e00 MOVLW 0x0 002f28 23fb ADDWFC 0xfb,0x1,0x1 002f2a 2bf8 INCF 0xf8,0x1,0x1 pSrc.bRam++; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002f2c 23f9 ADDWFC 0xf9,0x1,0x1 002f2e 06df DECF 0xdf,0x1,0x0 byte_to_read._word--; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002f30 0e01 MOVLW 0x1 002f32 e201 BC 0x2f36 002f34 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 002f38 0e02 MOVLW 0x2 }//end USBCtrlTrfRxService C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002f3a 5ce1 SUBWF 0xe1,0x0,0x0 002f3c e202 BC 0x2f42 002f3e 6ae1 CLRF 0xe1,0x0 002f40 52e5 MOVF 0xe5,0x1,0x0 002f42 6ee1 MOVWF 0xe1,0x0 002f44 52e5 MOVF 0xe5,0x1,0x0 002f46 cfe7 MOVFF 0xfe7,0xfd9 002f48 ffd9 002f4a 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 002f4c 0102 MOVLB 0x2 if(ctrl_trf_session_owner == MUID_NULL) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002f4e 51f7 MOVF 0xf7,0x0,0x1 002f50 e10c BNZ 0x2f6a { 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 002f52 0104 MOVLB 0x4 ep0Bo.Cnt = EP0_BUFF_SIZE; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002f54 0e08 MOVLW 0x8 002f56 6f01 MOVWF 0x1,0x1 002f58 0e20 MOVLW 0x20 ep0Bo.ADR = (byte*)&SetupPkt; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002f5a 6f02 MOVWF 0x2,0x1 002f5c 0e04 MOVLW 0x4 002f5e 6f03 MOVWF 0x3,0x1 C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002f60 0e84 MOVLW 0x84 ep0Bo.Stat._byte = _USIE|_BSTALL; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002f62 6f00 MOVWF 0x0,0x1 002f64 0104 MOVLB 0x4 ep0Bi.Stat._byte = _USIE|_BSTALL; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002f66 6f04 MOVWF 0x4,0x1 } C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002f68 d035 BRA 0x2fd4 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 002f6a 0104 MOVLB 0x4 if(SetupPkt.DataDir == DEV_TO_HOST) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002f6c af20 BTFSS 0x20,0x7,0x1 002f6e d022 BRA 0x2fb4 { C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002f70 0102 MOVLB 0x2 if(SetupPkt.wLength < wCount._word) C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002f72 51fc MOVF 0xfc,0x0,0x1 002f74 0104 MOVLB 0x4 002f76 5d26 SUBWF 0x26,0x0,0x1 002f78 0102 MOVLB 0x2 002f7a 51fd MOVF 0xfd,0x0,0x1 002f7c 0104 MOVLB 0x4 002f7e 5927 SUBWFB 0x27,0x0,0x1 002f80 e204 BC 0x2f8a 002f82 c426 MOVFF 0x426,0x2fc wCount._word = SetupPkt.wLength; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002f84 f2fc 002f86 c427 MOVFF 0x427,0x2fd 002f88 f2fd 002f8a df35 RCALL 0x2df6 USBCtrlTrfTxService(); C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002f8c 0102 MOVLB 0x2 ctrl_trf_state = CTRL_TRF_TX; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002f8e 0e01 MOVLW 0x1 002f90 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 002f92 0104 MOVLB 0x4 ep0Bo.Cnt = EP0_BUFF_SIZE; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002f94 0e08 MOVLW 0x8 002f96 6f01 MOVWF 0x1,0x1 002f98 0e20 MOVLW 0x20 ep0Bo.ADR = (byte*)&SetupPkt; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002f9a 6f02 MOVWF 0x2,0x1 002f9c 0e04 MOVLW 0x4 002f9e 6f03 MOVWF 0x3,0x1 002fa0 0e80 MOVLW 0x80 ep0Bo.Stat._byte = _USIE; // Note: DTSEN is 0! C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002fa2 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 002fa4 0104 MOVLB 0x4 ep0Bi.ADR = (byte*)&CtrlTrfData; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002fa6 0e28 MOVLW 0x28 002fa8 6f06 MOVWF 0x6,0x1 002faa 0e04 MOVLW 0x4 002fac 6f07 MOVWF 0x7,0x1 002fae 0ec8 MOVLW 0xc8 ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002fb0 6f04 MOVWF 0x4,0x1 } C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002fb2 d010 BRA 0x2fd4 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 002fb4 0102 MOVLB 0x2 ctrl_trf_state = CTRL_TRF_RX; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002fb6 0e02 MOVLW 0x2 002fb8 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 002fba 0104 MOVLB 0x4 ep0Bi.Cnt = 0; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002fbc 6b05 CLRF 0x5,0x1 002fbe 0ec8 MOVLW 0xc8 ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002fc0 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 002fc2 0104 MOVLB 0x4 ep0Bo.Cnt = EP0_BUFF_SIZE; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002fc4 0e08 MOVLW 0x8 002fc6 6f01 MOVWF 0x1,0x1 002fc8 0e28 MOVLW 0x28 ep0Bo.ADR = (byte*)&CtrlTrfData; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002fca 6f02 MOVWF 0x2,0x1 002fcc 0e04 MOVLW 0x4 002fce 6f03 MOVWF 0x3,0x1 002fd0 0ec8 MOVLW 0xc8 ep0Bo.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002fd2 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 002fd4 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 002fd6 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 002fd8 0102 MOVLB 0x2 ctrl_trf_state = WAIT_SETUP; // See usbctrltrf.h C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002fda 6bf6 CLRF 0xf6,0x1 002fdc 0104 MOVLB 0x4 ep0Bo.Cnt = EP0_BUFF_SIZE; // Defined in usbcfg.h C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002fde 0e08 MOVLW 0x8 002fe0 6f01 MOVWF 0x1,0x1 002fe2 0e20 MOVLW 0x20 ep0Bo.ADR = (byte*)&SetupPkt; C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002fe4 6f02 MOVWF 0x2,0x1 002fe6 0e04 MOVLW 0x4 002fe8 6f03 MOVWF 0x3,0x1 002fea 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 002fec 6f00 MOVWF 0x0,0x1 002fee 0104 MOVLB 0x4 ep0Bi.Stat._byte = _UCPU; // EP0 IN buffer initialization C:\Projects\UBW\FW\2455\D\system\usb\usbctrltrf\usbctrltrf.c 002ff0 6b04 CLRF 0x4,0x1 002ff2 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 ********************************************************************/ 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 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 #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.2.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 d06f BRA 0x93e { 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 e234 BC 0x8d8 { 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 e327 BNC 0x8d8 { C:\Projects\UBW\FW\2455\D\user\user.c 00088a 6bec CLRF 0xec,0x1 D_tick_counter = 0; C:\Projects\UBW\FW\2455\D\user\user.c 00088c 6bed CLRF 0xed,0x1 // Tell the main code to send an I packet C:\Projects\UBW\FW\2455\D\user\user.c 00088e 0e03 MOVLW 0x3 if (ISR_D_FIFO_length < kISR_FIFO_D_DEPTH) C:\Projects\UBW\FW\2455\D\user\user.c 000890 0100 MOVLB 0x0 000892 5dea SUBWF 0xea,0x0,0x1 000894 e21f BC 0x8d4 { C:\Projects\UBW\FW\2455\D\user\user.c // And copy over our port values C:\Projects\UBW\FW\2455\D\user\user.c 000896 51e8 MOVF 0xe8,0x0,0x1 ISR_D_FIFO[0][ISR_D_FIFO_in] = PORTA;