MP2COD 4.12, COFF to COD File Converter Copyright (c) 2007 Microchip Technology Inc. Listing File Generated: Tue Aug 28 10:08:35 2007 Address Value Disassembly Source File ------- ------- ----------------------- ------------------------------------------------------------------------------- ----- /********************************************************************* C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c ********************************************************************* C:\Projects\UBW\FW\D_143\main.c * FileName: main.c C:\Projects\UBW\FW\D_143\main.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\D_143\main.c * Processor: PIC18 C:\Projects\UBW\FW\D_143\main.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\D_143\main.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Software License Agreement C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\D_143\main.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\D_143\main.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\D_143\main.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\D_143\main.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\D_143\main.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\D_143\main.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\D_143\main.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\D_143\main.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\D_143\main.c * license. C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\D_143\main.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\D_143\main.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\D_143\main.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\D_143\main.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\D_143\main.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Author Date Comment C:\Projects\UBW\FW\D_143\main.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\D_143\main.c * Rawin Rojvanit 11/19/04 Original. C:\Projects\UBW\FW\D_143\main.c ********************************************************************/ C:\Projects\UBW\FW\D_143\main.c C:\Projects\UBW\FW\D_143\main.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\D_143\main.c #include C:\Projects\UBW\FW\D_143\main.c #include "system\typedefs.h" // Required C:\Projects\UBW\FW\D_143\main.c #include "system\usb\usb.h" // Required C:\Projects\UBW\FW\D_143\main.c #include "io_cfg.h" // Required C:\Projects\UBW\FW\D_143\main.c C:\Projects\UBW\FW\D_143\main.c #include "system\usb\usb_compile_time_validation.h" // Optional C:\Projects\UBW\FW\D_143\main.c #include "user\user.h" // Modifiable C:\Projects\UBW\FW\D_143\main.c C:\Projects\UBW\FW\D_143\main.c /** V A R I A B L E S ********************************************************/ C:\Projects\UBW\FW\D_143\main.c #pragma udata C:\Projects\UBW\FW\D_143\main.c C:\Projects\UBW\FW\D_143\main.c /** P R I V A T E P R O T O T Y P E S ***************************************/ C:\Projects\UBW\FW\D_143\main.c static void InitializeSystem(void); C:\Projects\UBW\FW\D_143\main.c void USBTasks(void); C:\Projects\UBW\FW\D_143\main.c C:\Projects\UBW\FW\D_143\main.c #pragma code high_vector_section = 0x000808 C:\Projects\UBW\FW\D_143\main.c void high_vector (void) C:\Projects\UBW\FW\D_143\main.c { C:\Projects\UBW\FW\D_143\main.c 000808 efbb GOTO 0xb76 _asm goto high_ISR _endasm C:\Projects\UBW\FW\D_143\main.c 00080a f005 00080c 0012 RETURN 0x0 } C:\Projects\UBW\FW\D_143\main.c #pragma code low_vector_section = 0x000818 C:\Projects\UBW\FW\D_143\main.c void low_vector (void) C:\Projects\UBW\FW\D_143\main.c { C:\Projects\UBW\FW\D_143\main.c 000818 ef22 GOTO 0x844 _asm goto low_ISR _endasm C:\Projects\UBW\FW\D_143\main.c 00081a f004 00081c 0012 RETURN 0x0 } C:\Projects\UBW\FW\D_143\main.c #pragma code C:\Projects\UBW\FW\D_143\main.c C:\Projects\UBW\FW\D_143\main.c /** D E C L A R A T I O N S **************************************************/ C:\Projects\UBW\FW\D_143\main.c #pragma code C:\Projects\UBW\FW\D_143\main.c /****************************************************************************** C:\Projects\UBW\FW\D_143\main.c * Function: void main(void) C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * PreCondition: None C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Input: None C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Output: None C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Side Effects: None C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Overview: Main program entry point. C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Note: None C:\Projects\UBW\FW\D_143\main.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\main.c void main(void) C:\Projects\UBW\FW\D_143\main.c { C:\Projects\UBW\FW\D_143\main.c 004720 d805 RCALL 0x472c InitializeSystem(); C:\Projects\UBW\FW\D_143\main.c 004728 d7fc BRA 0x4722 while(1) C:\Projects\UBW\FW\D_143\main.c { C:\Projects\UBW\FW\D_143\main.c 004722 d811 RCALL 0x4746 USBTasks(); // USB Tasks C:\Projects\UBW\FW\D_143\main.c 004724 ec93 CALL 0xd26,0x0 ProcessIO(); // See user\user.c & .h C:\Projects\UBW\FW\D_143\main.c 004726 f006 }//end while C:\Projects\UBW\FW\D_143\main.c 00472a 0012 RETURN 0x0 }//end main C:\Projects\UBW\FW\D_143\main.c C:\Projects\UBW\FW\D_143\main.c /****************************************************************************** C:\Projects\UBW\FW\D_143\main.c * Function: static void InitializeSystem(void) C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * PreCondition: None C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Input: None C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Output: None C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Side Effects: None C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Overview: InitializeSystem is a centralize initialization routine. C:\Projects\UBW\FW\D_143\main.c * All required USB initialization routines are called from C:\Projects\UBW\FW\D_143\main.c * here. C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * User application initialization routine should also be C:\Projects\UBW\FW\D_143\main.c * called from here. C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Note: None C:\Projects\UBW\FW\D_143\main.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\main.c static void InitializeSystem(void) C:\Projects\UBW\FW\D_143\main.c { C:\Projects\UBW\FW\D_143\main.c 00472c 0e0f MOVLW 0xf ADCON1 |= 0x0F; // Default all pins to digital C:\Projects\UBW\FW\D_143\main.c 00472e 12c1 IORWF 0xc1,0x1,0x0 C:\Projects\UBW\FW\D_143\main.c 004730 0e14 MOVLW 0x14 mInitializeUSBDriver(); // See usbdrv.h C:\Projects\UBW\FW\D_143\main.c 004732 6e6f MOVWF 0x6f,0x0 004734 0101 MOVLB 0x1 004736 6bd2 CLRF 0xd2,0x1 004738 0101 MOVLB 0x1 00473a 6bd3 CLRF 0xd3,0x1 00473c 0101 MOVLB 0x1 00473e 6bd4 CLRF 0xd4,0x1 C:\Projects\UBW\FW\D_143\main.c 004740 ecc4 CALL 0xb88,0x0 UserInit(); // See user.c & .h C:\Projects\UBW\FW\D_143\main.c 004742 f005 C:\Projects\UBW\FW\D_143\main.c 004744 0012 RETURN 0x0 }//end InitializeSystem C:\Projects\UBW\FW\D_143\main.c C:\Projects\UBW\FW\D_143\main.c /****************************************************************************** C:\Projects\UBW\FW\D_143\main.c * Function: void USBTasks(void) C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * PreCondition: InitializeSystem has been called. C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Input: None C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Output: None C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Side Effects: None C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Overview: Service loop for USB tasks. C:\Projects\UBW\FW\D_143\main.c * C:\Projects\UBW\FW\D_143\main.c * Note: None C:\Projects\UBW\FW\D_143\main.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\main.c void USBTasks(void) C:\Projects\UBW\FW\D_143\main.c { C:\Projects\UBW\FW\D_143\main.c /* C:\Projects\UBW\FW\D_143\main.c * Servicing Hardware C:\Projects\UBW\FW\D_143\main.c */ C:\Projects\UBW\FW\D_143\main.c 004746 ecb6 CALL 0x3f6c,0x0 USBCheckBusStatus(); // Must use polling method C:\Projects\UBW\FW\D_143\main.c 004748 f01f 00474a be6f BTFSC 0x6f,0x7,0x0 if(UCFGbits.UTEYE!=1) C:\Projects\UBW\FW\D_143\main.c 00474c d002 BRA 0x4752 00474e ecd6 CALL 0x3fac,0x0 USBDriverService(); // Interrupt or polling method C:\Projects\UBW\FW\D_143\main.c 004750 f01f C:\Projects\UBW\FW\D_143\main.c #if defined(USB_USE_CDC) C:\Projects\UBW\FW\D_143\main.c 004752 ec00 CALL 0x3800,0x0 CDCTxService(); C:\Projects\UBW\FW\D_143\main.c 004754 f01c #endif C:\Projects\UBW\FW\D_143\main.c C:\Projects\UBW\FW\D_143\main.c 004756 0012 RETURN 0x0 }// end USBTasks C:\Projects\UBW\FW\D_143\main.c C:\Projects\UBW\FW\D_143\main.c /** EOF main.c ***************************************************************/ C:\Projects\UBW\FW\D_143\main.c /********************************************************************* C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c ********************************************************************* C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * FileName: usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Processor: PIC18 C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Software License Agreement C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * license. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Author Date Comment C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Rawin Rojvanit 11/19/04 Original. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c ********************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * -usbmmap.c- C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * USB Memory Map C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * This file is the USB memory manager; it serves as a compile-time memory C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * allocator for the USB endpoints. It uses the compile time options passed C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * from usbcfg.h to instantiate endpoints and endpoint buffer. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Each endpoint requires to have a set of Buffer Descriptor registers(BDT). C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * A BDT is 4-byte long and has a specific RAM location for each endpoint. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * The BDT for endpoint 0 out is located at address 0x400 to 0x403. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * The BDT for endpoint 0 in is located at address 0x404 to 0x407. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * The BDT for endpoint 1 out is located at address 0x408 to 0x40B. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * and so on... The above allocation assumes the Ping-Pong Buffer Mode 0 is C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * used. These locations are already hard-wired in the silicon. The point C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * of doing instantiation, i.e. volatile far BDT ep0Bo;, is to provide the C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C compiler a way to address each variable directly. This is very important C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * because when a register can be accessed directly, it saves execution time C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * and reduces program size. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Endpoints are defined using the endpoint number and the direction C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * of transfer. For simplicity, usbmmap.c only uses the endpoint number C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * in the BDT register allocation scheme. This means if the usbcfg.h states C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * that the MAX_EP_NUMBER is number 1, then four BDTs will be C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * instantiated: one each for endpoint0 in and endpoint0 out, which must C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * always be instantiated for control transfer by default, and one each sets C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * for endpoint1 in and endpoint1 out. The naming convention for instantiating C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * BDT is C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * ep<#>B C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * where # is the endpoint number, and d is the direction of C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * transfer, which could be either or . C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * The USB memory manager uses MAX_EP_NUMBER, as defined in usbcfg.h, to define C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * the endpoints to be instantiated. This represents the highest endpoint C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * number to be allocated, not how many endpoints are used. Since the BDTs for C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * endpoints have hardware-assigned addresses in Bank 4, setting this value too C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * high may lead to inefficient use of data RAM. For example, if an application C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * uses only endpoints EP0 and EP4, then the MAX_EP_NUMBER is 4, and not 2. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * The in-between endpoint BDTs in this example (EP1, EP2, and EP3) go unused, C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * and the 24 bytes of memory associated with them are wasted. It does not make C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * much sense to skip endpoints, but the final decision lies with the user. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * The next step is to assign the instantiated BDTs to different C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * USB functions. The firmware framework fundamentally assumes that every USB C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * function should know which endpoint it is using, i.e., the default control C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * transfer should know that it is using endpoint 0 in and endpoint 0 out. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * A HID class can choose which endpoint it wants to use, but once chosen, it C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * should always know the number of the endpoint. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * The assignment of endpoints to USB functions is managed centrally C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * in usbcfg.h. This helps prevent the mistake of having more C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * than one USB function using the same endpoint. The "Endpoint Allocation" C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * section in usbcfg.h provides examples for how to map USB endpoints to USB C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * functions. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Quite a few things can be mapped in that section. There is no C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * one correct way to do the mapping and the user has the choice to C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * choose a method that is most suitable to the application. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Typically, however, a user will want to map the following for a given C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * USB interface function: C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * 1. The USB interface ID C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * 2. The endpoint control registers (UEPn) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * 3. The BDT registers (ep<#>B) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * 4. The endpoint size C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Example: Assume a USB device class "foo", which uses one out endpoint C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * of size 64-byte and one in endpoint of size 64-byte, then: C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * #define FOO_INTF_ID 0x00 C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * #define FOO_UEP UEP1 C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * #define FOO_BD_OUT ep1Bo C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * #define FOO_BD_IN ep1Bi C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * #define FOO_EP_SIZE 64 C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * The mapping above has chosen class "foo" to use endpoint 1. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * The names are arbitrary and can be anything other than FOO_??????. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * For abstraction, the code for class "foo" should use the abstract C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * definitions of FOO_BD_OUT,FOO_BD_IN, and not ep1Bo or ep1Bi. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Note that the endpoint size defined in the usbcfg.h file is again C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * used in the usbmmap.c file. This shows that the relationship between C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * the two files are tightly related. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * The endpoint buffer for each USB function must be located in the C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * dual-port RAM area and has to come after all the BDTs have been C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * instantiated. An example declaration is: C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * volatile far unsigned char[FOO_EP_SIZE] data; C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * The 'volatile' keyword tells the compiler not to perform any code C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * optimization on this variable because its content could be modified C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * by the hardware. The 'far' keyword tells the compiler that this variable C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * is not located in the Access RAM area (0x000 - 0x05F). C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * For the variable to be globally accessible by other files, it should be C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * declared in the header file usbmmap.h as an extern definition, such as C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * extern volatile far unsigned char[FOO_EP_SIZE] data; C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Conclusion: C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * In a short summary, the dependencies between usbcfg and usbmmap can C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * be shown as: C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * usbcfg[MAX_EP_NUMBER] -> usbmmap C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * usbmmap[ep<#>B] -> usbcfg C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * usbcfg[EP size] -> usbmmap C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * usbcfg[abstract ep definitions] -> usb9/hid/cdc/etc class code C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * usbmmap[endpoint buffer variable] -> usb9/hid/cdc/etc class code C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Data mapping provides a means for direct addressing of BDT and endpoint C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * buffer. This means less usage of pointers, which equates to a faster and C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * smaller program code. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #include "system\typedefs.h" C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #include "system\usb\usb.h" C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\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\D_143\system\usb\usbmmap.c #pragma udata C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c byte usb_device_state; // Device States: DETACHED, ATTACHED, ... C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c USB_DEVICE_STATUS usb_stat; // Global USB flags C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c byte usb_active_cfg; // Value of current configuration C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c byte usb_alt_intf[MAX_NUM_INT]; // Array to keep track of the current alternate C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c // setting for each interface ID C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\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\D_143\system\usb\usbmmap.c #pragma udata usbram4=0x400 //See Linker Script,usb4:0x400-0x4FF(256-byte) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Section A: Buffer Descriptor Table C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * - 0x400 - 0x4FF(max) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * - MAX_EP_NUMBER is defined in autofiles\usbcfg.h C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * - BDT data type is defined in system\usb\usbmmap.h C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(0 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep0Bo; //Endpoint #0 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep0Bi; //Endpoint #0 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(1 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep1Bo; //Endpoint #1 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep1Bi; //Endpoint #1 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(2 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep2Bo; //Endpoint #2 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep2Bi; //Endpoint #2 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(3 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep3Bo; //Endpoint #3 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep3Bi; //Endpoint #3 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(4 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep4Bo; //Endpoint #4 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep4Bi; //Endpoint #4 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(5 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep5Bo; //Endpoint #5 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep5Bi; //Endpoint #5 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(6 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep6Bo; //Endpoint #6 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep6Bi; //Endpoint #6 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(7 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep7Bo; //Endpoint #7 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep7Bi; //Endpoint #7 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(8 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep8Bo; //Endpoint #8 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep8Bi; //Endpoint #8 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(9 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep9Bo; //Endpoint #9 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep9Bi; //Endpoint #9 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(10 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep10Bo; //Endpoint #10 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep10Bi; //Endpoint #10 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(11 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep11Bo; //Endpoint #11 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep11Bi; //Endpoint #11 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(12 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep12Bo; //Endpoint #12 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep12Bi; //Endpoint #12 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(13 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep13Bo; //Endpoint #13 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep13Bi; //Endpoint #13 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(14 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep14Bo; //Endpoint #14 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep14Bi; //Endpoint #14 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if(15 <= MAX_EP_NUMBER) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep15Bo; //Endpoint #15 BD Out C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far BDT ep15Bi; //Endpoint #15 BD In C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Section B: EP0 Buffer Space C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c ****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * - Two buffer areas are defined: C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * A. CTRL_TRF_SETUP C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * - Size = EP0_BUFF_SIZE as defined in autofiles\usbcfg.h C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * - Detailed data structure allows direct adddressing of bits and bytes. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * B. CTRL_TRF_DATA C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * - Size = EP0_BUFF_SIZE as defined in autofiles\usbcfg.h C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * - Data structure allows direct adddressing of the first 8 bytes. C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * - Both data types are defined in system\usb\usbdefs\usbdefs_ep0_buff.h C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far CTRL_TRF_SETUP SetupPkt; C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far CTRL_TRF_DATA CtrlTrfData; C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * Section C: CDC Buffer C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c ****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c * C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #pragma udata usbram5a=0x500 //See Linker Script,usb5:0x500-... C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #if defined(USB_USE_CDC) C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far unsigned char cdc_notice[CDC_INT_EP_SIZE]; C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far unsigned char cdc_data_rx[CDC_BULK_OUT_EP_SIZE]; C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c volatile far unsigned char cdc_data_tx[CDC_BULK_IN_EP_SIZE]; C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #endif C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c #pragma udata C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c /** EOF usbmmap.c ************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbmmap.c /********************************************************************* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c ********************************************************************* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * FileName: usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Processor: PIC18 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Software License Agreement C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * license. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Author Date Comment C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Rawin Rojvanit 11/19/04 Original. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c ********************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c #include C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c #include "system\typedefs.h" C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c #include "system\usb\usb.h" C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c #include "io_cfg.h" // Required for USBCheckBusStatus() C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /** V A R I A B L E S ********************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c #pragma udata C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\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\D_143\system\usb\usbdrv\usbdrv.c void USBModuleEnable(void); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBModuleDisable(void); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBSuspend(void); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBWakeFromSuspend(void); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBProtocolResetHandler(void); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USB_SOF_Handler(void); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBStallHandler(void); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBErrorHandler(void); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /** D E C L A R A T I O N S **************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c #pragma code C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Function: void USBCheckBusStatus(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Overview: This routine enables/disables the USB module by monitoring C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * the USB power signal. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBCheckBusStatus(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Bus Attachment & Detachment Detection C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * usb_bus_sense is an i/o pin defined in io_cfg.h C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c #define USB_BUS_ATTACHED 1 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c #define USB_BUS_DETACHED 0 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c if(usb_bus_sense == USB_BUS_ATTACHED) // Is USB bus attached? C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f6c a66d BTFSS 0x6d,0x3,0x0 if(UCONbits.USBEN == 0) // Is the module off? C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f6e d810 RCALL 0x3f90 USBModuleEnable(); // Is off, enable it C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c } C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f70 d002 BRA 0x3f76 else C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f72 b66d BTFSC 0x6d,0x3,0x0 if(UCONbits.USBEN == 1) // Is the module on? C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f74 d814 RCALL 0x3f9e USBModuleDisable(); // Is on, disable it C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c }//end if(usb_bus_sense...) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * After enabling the USB module, it takes some time for the voltage C:\Projects\UBW\FW\D_143\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\D_143\system\usb\usbdrv\usbdrv.c * The USB Reset interrupt should not be unmasked until the SE0 condition is C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * cleared. This helps preventing the firmware from misinterpreting this C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * unique event as a USB bus reset from the USB host. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f76 0101 MOVLB 0x1 if(usb_device_state == ATTACHED_STATE) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f78 05d2 DECF 0xd2,0x0,0x1 003f7a e109 BNZ 0x3f8e { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f7c ba6d BTFSC 0x6d,0x5,0x0 if(!UCONbits.SE0) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f7e d007 BRA 0x3f8e { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f80 6a68 CLRF 0x68,0x0 UIR = 0; // Clear all USB interrupts C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f82 6a69 CLRF 0x69,0x0 UIE = 0; // Mask all USB interrupts C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f84 8069 BSF 0x69,0x0,0x0 UIEbits.URSTIE = 1; // Unmask RESET interrupt C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f86 8869 BSF 0x69,0x4,0x0 UIEbits.IDLEIE = 1; // Unmask IDLE interrupt C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f88 0101 MOVLB 0x1 usb_device_state = POWERED_STATE; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f8a 0e02 MOVLW 0x2 003f8c 6fd2 MOVWF 0xd2,0x1 }//end if // else wait until SE0 is cleared C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c }//end if(usb_device_state == ATTACHED_STATE) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f8e 0012 RETURN 0x0 }//end USBCheckBusStatus C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Function: void USBModuleEnable(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Overview: This routine enables the USB module. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * An end designer should never have to call this routine C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * manually. This routine should only be called from C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * USBCheckBusStatus(). C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Note: See USBCheckBusStatus() for more information. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBModuleEnable(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f90 6a6d CLRF 0x6d,0x0 UCON = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f92 6a69 CLRF 0x69,0x0 UIE = 0; // Mask all USB interrupts C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f94 866d BSF 0x6d,0x3,0x0 UCONbits.USBEN = 1; // Enable module & attach to bus C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f96 0101 MOVLB 0x1 usb_device_state = ATTACHED_STATE; // Defined in usbmmap.c & .h C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f98 0e01 MOVLW 0x1 003f9a 6fd2 MOVWF 0xd2,0x1 003f9c 0012 RETURN 0x0 }//end USBModuleEnable C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Function: void USBModuleDisable(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Overview: This routine disables the USB module. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * An end designer should never have to call this routine C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * manually. This routine should only be called from C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * USBCheckBusStatus(). C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Note: See USBCheckBusStatus() for more information. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBModuleDisable(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f9e 6a6d CLRF 0x6d,0x0 UCON = 0; // Disable module & detach from bus C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fa0 6a69 CLRF 0x69,0x0 UIE = 0; // Mask all USB interrupts C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fa2 0101 MOVLB 0x1 usb_device_state = DETACHED_STATE; // Defined in usbmmap.c & .h C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fa4 6bd2 CLRF 0xd2,0x1 003fa6 0012 RETURN 0x0 }//end USBModuleDisable C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Function: void USBSoftDetach(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Side Effects: The device will have to be re-enumerated to function again. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Overview: USBSoftDetach electrically disconnects the device from C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * the bus. This is done by stop supplying Vusb voltage to C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * pull-up resistor. The pull-down resistors on the host C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * side will pull both differential signal lines low and C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * the host registers the event as a disconnect. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Since the USB cable is not physically disconnected, the C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * power supply through the cable can still be sensed by C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * the device. The next time USBCheckBusStatus() function C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * is called, it will reconnect the device back to the bus. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBSoftDetach(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fa8 dffa RCALL 0x3f9e USBModuleDisable(); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003faa 0012 RETURN 0x0 }//end USBSoftDetach C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Function: void USBDriverService(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Overview: This routine is the heart of this firmware. It manages C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * all USB interrupts. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Note: Device state transitions through the following stages: C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * DETACHED -> ATTACHED -> POWERED -> DEFAULT -> C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * ADDRESS_PENDING -> ADDRESSED -> CONFIGURED -> READY C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBDriverService(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Pointless to continue servicing if USB cable is not even attached. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fac 0101 MOVLB 0x1 if(usb_device_state == DETACHED_STATE) return; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fae 51d2 MOVF 0xd2,0x0,0x1 003fb0 e101 BNZ 0x3fb4 003fb2 d03a BRA 0x4028 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Task A: Service USB Activity Interrupt C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fb4 5068 MOVF 0x68,0x0,0x0 if(UIRbits.ACTVIF && UIEbits.ACTVIE) USBWakeFromSuspend(); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fb6 0b04 ANDLW 0x4 003fb8 e004 BZ 0x3fc2 003fba 5069 MOVF 0x69,0x0,0x0 003fbc 0b04 ANDLW 0x4 003fbe e001 BZ 0x3fc2 003fc0 d83c RCALL 0x403a C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Pointless to continue servicing if the device is in suspend mode. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fc2 b26d BTFSC 0x6d,0x1,0x0 if(UCONbits.SUSPND==1) return; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fc4 d031 BRA 0x4028 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Task B: Service USB Bus Reset Interrupt. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * When bus reset is received during suspend, ACTVIF will be set first, C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * once the UCONbits.SUSPND is clear, then the URSTIF bit will be asserted. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * This is why URSTIF is checked after ACTVIF. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fc6 5068 MOVF 0x68,0x0,0x0 if(UIRbits.URSTIF && UIEbits.URSTIE) USBProtocolResetHandler(); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fc8 0b01 ANDLW 0x1 003fca e004 BZ 0x3fd4 003fcc 5069 MOVF 0x69,0x0,0x0 003fce 0b01 ANDLW 0x1 003fd0 e001 BZ 0x3fd4 003fd2 d856 RCALL 0x4080 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Task C: Service other USB interrupts C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fd4 5068 MOVF 0x68,0x0,0x0 if(UIRbits.IDLEIF && UIEbits.IDLEIE) USBSuspend(); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fd6 0b10 ANDLW 0x10 003fd8 e004 BZ 0x3fe2 003fda 5069 MOVF 0x69,0x0,0x0 003fdc 0b10 ANDLW 0x10 003fde e001 BZ 0x3fe2 003fe0 d824 RCALL 0x402a 003fe2 5068 MOVF 0x68,0x0,0x0 if(UIRbits.SOFIF && UIEbits.SOFIE) USB_SOF_Handler(); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003fe4 0b40 ANDLW 0x40 003fe6 e004 BZ 0x3ff0 003fe8 5069 MOVF 0x69,0x0,0x0 003fea 0b40 ANDLW 0x40 003fec e001 BZ 0x3ff0 003fee d83d RCALL 0x406a 003ff0 5068 MOVF 0x68,0x0,0x0 if(UIRbits.STALLIF && UIEbits.STALLIE) USBStallHandler(); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003ff2 0b20 ANDLW 0x20 003ff4 e004 BZ 0x3ffe 003ff6 5069 MOVF 0x69,0x0,0x0 003ff8 0b20 ANDLW 0x20 003ffa e001 BZ 0x3ffe 003ffc d838 RCALL 0x406e 003ffe 5068 MOVF 0x68,0x0,0x0 if(UIRbits.UERRIF && UIEbits.UERRIE) USBErrorHandler(); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004000 0b02 ANDLW 0x2 004002 e004 BZ 0x400c 004004 5069 MOVF 0x69,0x0,0x0 004006 0b02 ANDLW 0x2 004008 e001 BZ 0x400c 00400a d838 RCALL 0x407c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Pointless to continue servicing if the host has not sent a bus reset. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Once bus reset is received, the device transitions into the DEFAULT C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * state and is ready for communication. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00400c 0e03 MOVLW 0x3 if(usb_device_state < DEFAULT_STATE) return; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00400e 0101 MOVLB 0x1 004010 5dd2 SUBWF 0xd2,0x0,0x1 004012 e201 BC 0x4016 004014 d009 BRA 0x4028 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Task D: Servicing USB Transaction Complete Interrupt C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004016 5068 MOVF 0x68,0x0,0x0 if(UIRbits.TRNIF && UIEbits.TRNIE) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004018 0b08 ANDLW 0x8 00401a e006 BZ 0x4028 00401c 5069 MOVF 0x69,0x0,0x0 00401e 0b08 ANDLW 0x8 004020 e003 BZ 0x4028 { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * USBCtrlEPService only services transactions over EP0. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * It ignores all other EP transactions. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004022 ec8a CALL 0x3914,0x0 USBCtrlEPService(); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004024 f01c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Other EP can be serviced later by responsible device class firmware. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Each device driver knows when an OUT or IN transaction is ready by C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * checking the buffer ownership bit. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * An OUT EP should always be owned by SIE until the data is ready. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * An IN EP should always be owned by CPU until the data is ready. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Because of this logic, it is not necessary to save the USTAT value C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * of non-EP0 transactions. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004026 9668 BCF 0x68,0x3,0x0 UIRbits.TRNIF = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c }//end if(UIRbits.TRNIF && UIEbits.TRNIE) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004028 0012 RETURN 0x0 }//end USBDriverService C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Function: void USBSuspend(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Overview: C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBSuspend(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * NOTE: Do not clear UIRbits.ACTVIF here! C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Reason: C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * ACTVIF is only generated once an IDLEIF has been generated. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * This is a 1:1 ratio interrupt generation. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * For every IDLEIF, there will be only one ACTVIF regardless of C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * the number of subsequent bus transitions. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * If the ACTIF is cleared here, a problem could occur when: C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * [ IDLE ][bus activity -> C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * <--- 3 ms -----> ^ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * ^ ACTVIF=1 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * IDLEIF=1 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * # # # # (#=Program polling flags) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * ^ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * This polling loop will see both C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * IDLEIF=1 and ACTVIF=1. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * However, the program services IDLEIF first C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * because ACTIVIE=0. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * If this routine clears the only ACTIVIF, C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * then it can never get out of the suspend C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * mode. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00402a 8469 BSF 0x69,0x2,0x0 UIEbits.ACTVIE = 1; // Enable bus activity interrupt C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00402c 9868 BCF 0x68,0x4,0x0 UIRbits.IDLEIF = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00402e 826d BSF 0x6d,0x1,0x0 UCONbits.SUSPND = 1; // Put USB module in power conserve C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c // mode, SIE clock inactive C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * At this point the PIC can go into sleep,idle, or C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * switch to a slower clock, etc. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* Modifiable Section */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004030 9aa1 BCF 0xa1,0x5,0x0 PIR2bits.USBIF = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004032 8aa0 BSF 0xa0,0x5,0x0 PIE2bits.USBIE = 1; // Set USB wakeup source C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004034 0003 SLEEP Sleep(); // Goto sleep C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004036 9aa0 BCF 0xa0,0x5,0x0 PIE2bits.USBIE = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* End Modifiable Section */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004038 0012 RETURN 0x0 }//end USBSuspend C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Function: void USBWakeFromSuspend(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Overview: C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBWakeFromSuspend(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * If using clock switching, this is the place to restore the C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * original clock frequency. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00403a 926d BCF 0x6d,0x1,0x0 UCONbits.SUSPND = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00403c 9469 BCF 0x69,0x2,0x0 UIEbits.ACTVIE = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00403e 9468 BCF 0x68,0x2,0x0 UIRbits.ACTVIF = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004040 0012 RETURN 0x0 }//end USBWakeFromSuspend C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Function: void USBRemoteWakeup(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Overview: This function should be called by user when the device C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * is waken up by an external stimulus other than ACTIVIF. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Please read the note below to understand the limitations. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Note: The modifiable section in this routine should be changed C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * to meet the application needs. Current implementation C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * temporary blocks other functions from executing for a C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * period of 1-13 ms depending on the core frequency. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * According to USB 2.0 specification section 7.1.7.7, C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * "The remote wakeup device must hold the resume signaling C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * for at lest 1 ms but for no more than 15 ms." C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * The idea here is to use a delay counter loop, using a C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * common value that would work over a wide range of core C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * frequencies. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * That value selected is 1800. See table below: C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * ========================================================== C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Core Freq(MHz) MIP RESUME Signal Period (ms) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * ========================================================== C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * 48 12 1.05 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * 4 1 12.6 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * ========================================================== C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * * These timing could be incorrect when using code C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * optimization or extended instruction mode, C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * or when having other interrupts enabled. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Make sure to verify using the MPLAB SIM's Stopwatch C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBRemoteWakeup(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c static word delay_count; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004042 0101 MOVLB 0x1 if(usb_stat.RemoteWakeup == 1) // Check if RemoteWakeup function C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004044 a1d3 BTFSS 0xd3,0x0,0x1 004046 d010 BRA 0x4068 { // has been enabled by the host. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004048 dff8 RCALL 0x403a USBWakeFromSuspend(); // Unsuspend USB modue C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00404a 846d BSF 0x6d,0x2,0x0 UCONbits.RESUME = 1; // Start RESUME signaling C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* Modifiable Section */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00404c 0101 MOVLB 0x1 delay_count = 1800U; // Set RESUME line for 1-13 ms C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00404e 0e08 MOVLW 0x8 004050 6fda MOVWF 0xda,0x1 004052 0e07 MOVLW 0x7 004054 6fdb MOVWF 0xdb,0x1 do C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004056 0101 MOVLB 0x1 delay_count--; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004058 07da DECF 0xda,0x1,0x1 00405a 0e00 MOVLW 0x0 00405c 5bdb SUBWFB 0xdb,0x1,0x1 00405e 0101 MOVLB 0x1 }while(delay_count); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004060 51da MOVF 0xda,0x0,0x1 004062 11db IORWF 0xdb,0x0,0x1 004064 e1f8 BNZ 0x4056 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* End Modifiable Section */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004066 946d BCF 0x6d,0x2,0x0 UCONbits.RESUME = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c }//endif C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004068 0012 RETURN 0x0 }//end USBRemoteWakeup C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Function: void USB_SOF_Handler(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Overview: The USB host sends out a SOF packet to full-speed devices C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * every 1 ms. This interrupt may be useful for isochronous C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * pipes. End designers should implement callback routine C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * as necessary. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USB_SOF_Handler(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* Callback routine here */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00406a 9c68 BCF 0x68,0x6,0x0 UIRbits.SOFIF = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00406c 0012 RETURN 0x0 }//end USB_SOF_Handler C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Function: void USBStallHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PreCondition: A STALL packet is sent to the host by the SIE. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Overview: The STALLIF is set anytime the SIE sends out a STALL C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * packet regardless of which endpoint causes it. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * A Setup transaction overrides the STALL function. A stalled C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * endpoint stops stalling once it receives a setup packet. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * In this case, the SIE will accepts the Setup packet and C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * set the TRNIF flag to notify the firmware. STALL function C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * for that particular endpoint pipe will be automatically C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * disabled (direction specific). C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * There are a few reasons for an endpoint to be stalled. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * 1. When a non-supported USB request is received. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Example: GET_DESCRIPTOR(DEVICE_QUALIFIER) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * 2. When an endpoint is currently halted. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * 3. When the device class specifies that an endpoint must C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * stall in response to a specific event. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Example: Mass Storage Device Class C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * If the CBW is not valid, the device shall C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * STALL the Bulk-In pipe. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * See USB Mass Storage Class Bulk-only Transport C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Specification for more details. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Note: UEPn.EPSTALL can be scanned to see which endpoint causes C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * the stall event. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * If C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBStallHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Does not really have to do anything here, C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * even for the control endpoint. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * All BDs of Endpoint 0 are owned by SIE right now, C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * but once a Setup Transaction is received, the ownership C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * for EP0_OUT will be returned to CPU. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * When the Setup Transaction is serviced, the ownership C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * for EP0_IN will then be forced back to CPU by firmware. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00406e a070 BTFSS 0x70,0x0,0x0 if(UEP0bits.EPSTALL == 1) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004070 d003 BRA 0x4078 { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004072 ec17 CALL 0x3c2e,0x0 USBPrepareForNextSetupTrf(); // Firmware work-around C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004074 f01e 004076 9070 BCF 0x70,0x0,0x0 UEP0bits.EPSTALL = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c } C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004078 9a68 BCF 0x68,0x5,0x0 UIRbits.STALLIF = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00407a 0012 RETURN 0x0 }//end USBStallHandler C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Function: void USBErrorHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Overview: The purpose of this interrupt is mainly for debugging C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * during development. Check UEIR to see which error causes C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * the interrupt. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBErrorHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00407c 9268 BCF 0x68,0x1,0x0 UIRbits.UERRIF = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00407e 0012 RETURN 0x0 }//end USBErrorHandler C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Function: void USBProtocolResetHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * PreCondition: A USB bus reset is received from the host. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Side Effects: Currently, this routine flushes any pending USB C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * transactions. It empties out the USTAT FIFO. This action C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * might not be desirable in some applications. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Overview: Once a USB bus reset is received from the host, this C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * routine should be called. It resets the device address to C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * zero, disables all non-EP0 endpoints, initializes EP0 to C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * be ready for default communication, clears all USB C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * interrupt flags, unmasks applicable USB interrupts, and C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * reinitializes internal state-machine variables. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c void USBProtocolResetHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004080 6a6a CLRF 0x6a,0x0 UEIR = 0; // Clear all USB error flags C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004082 6a68 CLRF 0x68,0x0 UIR = 0; // Clears all USB interrupts C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004084 0e9f MOVLW 0x9f UEIE = 0b10011111; // Unmask all USB error interrupts C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004086 6e6b MOVWF 0x6b,0x0 004088 0e7b MOVLW 0x7b UIE = 0b01111011; // Enable all interrupts except ACTVIE C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00408a 6e69 MOVWF 0x69,0x0 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00408c 6a6e CLRF 0x6e,0x0 UADDR = 0x00; // Reset to default address C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 00408e 0e0f MOVLW 0xf mDisableEP1to15(); // Reset all non-EP0 UEPn registers C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 004090 6ee6 MOVWF 0xe6,0x0 004092 0e71 MOVLW 0x71 004094 6ee6 MOVWF 0xe6,0x0 004096 0e0f MOVLW 0xf 004098 6ee6 MOVWF 0xe6,0x0 00409a d814 RCALL 0x40c4 00409c 52e5 MOVF 0xe5,0x1,0x0 00409e 52e5 MOVF 0xe5,0x1,0x0 0040a0 52e5 MOVF 0xe5,0x1,0x0 0040a2 0e16 MOVLW 0x16 UEP0 = EP_CTRL|HSHK_EN; // Init EP0 as a Ctrl EP, see usbdrv.h C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040a4 6e70 MOVWF 0x70,0x0 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040a6 a668 BTFSS 0x68,0x3,0x0 while(UIRbits.TRNIF == 1) // Flush any pending transactions C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040a8 d002 BRA 0x40ae 0040ac d7fc BRA 0x40a6 0040aa 9668 BCF 0x68,0x3,0x0 UIRbits.TRNIF = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040ae 986d BCF 0x6d,0x4,0x0 UCONbits.PKTDIS = 0; // Make sure packet processing is enabled C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040b0 ec17 CALL 0x3c2e,0x0 USBPrepareForNextSetupTrf(); // Declared in usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040b2 f01e C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040b4 0101 MOVLB 0x1 usb_stat.RemoteWakeup = 0; // Default status flag to disable C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040b6 91d3 BCF 0xd3,0x0,0x1 0040b8 0101 MOVLB 0x1 usb_active_cfg = 0; // Clear active configuration C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040ba 6bd4 CLRF 0xd4,0x1 0040bc 0101 MOVLB 0x1 usb_device_state = DEFAULT_STATE; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040be 0e03 MOVLW 0x3 0040c0 6fd2 MOVWF 0xd2,0x1 0040c2 0012 RETURN 0x0 }//end USBProtocolResetHandler C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /* Auxiliary Function */ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040c4 cfd9 MOVFF 0xfd9,0xfe6 void ClearArray(byte* startAdr,byte count) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040c6 ffe6 0040c8 cfe1 MOVFF 0xfe1,0xfd9 0040ca ffd9 { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040cc 0efd MOVLW 0xfd *startAdr; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040ce cfdb MOVFF 0xfdb,0xfe9 0040d0 ffe9 0040d2 0efe MOVLW 0xfe 0040d4 cfdb MOVFF 0xfdb,0xfea 0040d6 ffea 0040d8 0efc MOVLW 0xfc while(count) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040da 50db MOVF 0xdb,0x0,0x0 0040dc e004 BZ 0x40e6 0040e4 d7f9 BRA 0x40d8 { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c _asm C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040de 6aee CLRF 0xee,0x0 clrf POSTINC0,0 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c _endasm C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040e0 0efc MOVLW 0xfc count--; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040e2 06db DECF 0xdb,0x1,0x0 }//end while C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040e6 52e5 MOVF 0xe5,0x1,0x0 }//end ClearArray C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 0040e8 cfe7 MOVFF 0xfe7,0xfd9 0040ea ffd9 0040ec 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /** EOF usbdrv.c *************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c /********************************************************************* C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c ********************************************************************* C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * FileName: usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Processor: PIC18 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Software License Agreement C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * license. C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Author Date Comment C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Rawin Rojvanit 11/19/04 Original. C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c ********************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c #include C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c #include "system\typedefs.h" C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c #include "system\usb\usb.h" C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c #include "io_cfg.h" // Required for self_power status C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /** V A R I A B L E S ********************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c #pragma udata C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\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\D_143\system\usb\usb9\usb9.c void USBStdGetDscHandler(void); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c void USBStdSetCfgHandler(void); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c void USBStdGetStatusHandler(void); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c void USBStdFeatureReqHandler(void); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /** D E C L A R A T I O N S **************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c #pragma code C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Function: void USBCheckStdRequest(void) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Overview: This routine checks the setup data packet to see if it C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * knows how to handle it C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c void USBCheckStdRequest(void) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c4e 0104 MOVLB 0x4 if(SetupPkt.RequestType != STANDARD) return; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c50 5120 MOVF 0x20,0x0,0x1 003c52 0b60 ANDLW 0x60 003c54 42e8 RRNCF 0xe8,0x1,0x0 003c56 42e8 RRNCF 0xe8,0x1,0x0 003c58 42e8 RRNCF 0xe8,0x1,0x0 003c5a 42e8 RRNCF 0xe8,0x1,0x0 003c5c 42e8 RRNCF 0xe8,0x1,0x0 003c5e 0900 IORLW 0x0 003c60 e001 BZ 0x3c64 003c62 d058 BRA 0x3d14 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c64 0104 MOVLB 0x4 switch(SetupPkt.bRequest) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c66 5121 MOVF 0x21,0x0,0x1 003c68 0a07 XORLW 0x7 003c6a e053 BZ 0x3d12 003c6c 0a0b XORLW 0xb 003c6e e051 BZ 0x3d12 003c70 0a07 XORLW 0x7 003c72 e042 BZ 0x3cf8 003c74 0a01 XORLW 0x1 003c76 e02c BZ 0x3cd0 003c78 0a0b XORLW 0xb 003c7a e028 BZ 0x3ccc 003c7c 0a02 XORLW 0x2 003c7e e026 BZ 0x3ccc 003c80 0a03 XORLW 0x3 003c82 e022 BZ 0x3cc8 003c84 0a08 XORLW 0x8 003c86 e012 BZ 0x3cac 003c88 0a01 XORLW 0x1 003c8a e00e BZ 0x3ca8 003c8c 0a0f XORLW 0xf 003c8e e00a BZ 0x3ca4 003c90 0a03 XORLW 0x3 003c92 e001 BZ 0x3c96 003c94 d03e BRA 0x3d12 { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case SET_ADR: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c96 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c98 0e01 MOVLW 0x1 003c9a 6fcb MOVWF 0xcb,0x1 003c9c 0101 MOVLB 0x1 usb_device_state = ADR_PENDING_STATE; // Update state only C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c9e 0e04 MOVLW 0x4 003ca0 6fd2 MOVWF 0xd2,0x1 /* See USBCtrlTrfInHandler() in usbctrltrf.c for the next step */ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ca2 d038 BRA 0x3d14 break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case GET_DSC: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ca4 d838 RCALL 0x3d16 USBStdGetDscHandler(); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ca6 d036 BRA 0x3d14 break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case SET_CFG: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ca8 d893 RCALL 0x3dd0 USBStdSetCfgHandler(); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003caa d034 BRA 0x3d14 break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case GET_CFG: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cac 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cae 0e01 MOVLW 0x1 003cb0 6fcb MOVWF 0xcb,0x1 003cb2 0101 MOVLB 0x1 pSrc.bRam = (byte*)&usb_active_cfg; // Set Source C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cb4 0ed4 MOVLW 0xd4 003cb6 6fcc MOVWF 0xcc,0x1 003cb8 0e01 MOVLW 0x1 003cba 6fcd MOVWF 0xcd,0x1 003cbc 0101 MOVLB 0x1 usb_stat.ctrl_trf_mem = _RAM; // Set memory type C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cbe 93d3 BCF 0xd3,0x1,0x1 003cc0 0101 MOVLB 0x1 LSB(wCount) = 1; // Set data count C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cc2 0e01 MOVLW 0x1 003cc4 6fd0 MOVWF 0xd0,0x1 003cc6 d026 BRA 0x3d14 break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case GET_STATUS: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cc8 d8ab RCALL 0x3e20 USBStdGetStatusHandler(); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cca d024 BRA 0x3d14 break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case CLR_FEATURE: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case SET_FEATURE: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ccc d8f9 RCALL 0x3ec0 USBStdFeatureReqHandler(); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cce d022 BRA 0x3d14 break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case GET_INTF: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cd0 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cd2 0e01 MOVLW 0x1 003cd4 6fcb MOVWF 0xcb,0x1 003cd6 0104 MOVLB 0x4 pSrc.bRam = (byte*)&usb_alt_intf+SetupPkt.bIntfID; // Set source C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cd8 5124 MOVF 0x24,0x0,0x1 003cda 0101 MOVLB 0x1 003cdc 6fcc MOVWF 0xcc,0x1 003cde 6bcd CLRF 0xcd,0x1 003ce0 0ed5 MOVLW 0xd5 003ce2 0101 MOVLB 0x1 003ce4 27cc ADDWF 0xcc,0x1,0x1 003ce6 0e01 MOVLW 0x1 003ce8 0101 MOVLB 0x1 003cea 23cd ADDWFC 0xcd,0x1,0x1 003cec 0101 MOVLB 0x1 usb_stat.ctrl_trf_mem = _RAM; // Set memory type C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cee 93d3 BCF 0xd3,0x1,0x1 003cf0 0101 MOVLB 0x1 LSB(wCount) = 1; // Set data count C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cf2 0e01 MOVLW 0x1 003cf4 6fd0 MOVWF 0xd0,0x1 003cf6 d00e BRA 0x3d14 break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case SET_INTF: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cf8 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cfa 0e01 MOVLW 0x1 003cfc 6fcb MOVWF 0xcb,0x1 003cfe 0104 MOVLB 0x4 usb_alt_intf[SetupPkt.bIntfID] = SetupPkt.bAltID; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d00 5124 MOVF 0x24,0x0,0x1 003d02 6aea CLRF 0xea,0x0 003d04 0fd5 ADDLW 0xd5 003d06 6ee9 MOVWF 0xe9,0x0 003d08 0e01 MOVLW 0x1 003d0a 22ea ADDWFC 0xea,0x1,0x0 003d0c c422 MOVFF 0x422,0xfef 003d0e ffef 003d10 d001 BRA 0x3d14 break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case SET_DSC: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case SYNCH_FRAME: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c default: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d12 d000 BRA 0x3d14 break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c }//end switch C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d14 0012 RETURN 0x0 }//end USBCheckStdRequest C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Function: void USBStdGetDscHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Overview: This routine handles the standard GET_DESCRIPTOR request. C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * It utilizes tables dynamically looks up descriptor size. C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * This routine should never have to be modified if the tables C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * in usbdsc.c are declared correctly. C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c void USBStdGetDscHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d16 0e80 MOVLW 0x80 if(SetupPkt.bmRequestType == 0x80) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d18 0104 MOVLB 0x4 003d1a 5d20 SUBWF 0x20,0x0,0x1 003d1c e158 BNZ 0x3dce { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d1e 0104 MOVLB 0x4 switch(SetupPkt.bDscType) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d20 5123 MOVF 0x23,0x0,0x1 003d22 0a03 XORLW 0x3 003d24 e034 BZ 0x3d8e 003d26 0a01 XORLW 0x1 003d28 e010 BZ 0x3d4a 003d2a 0a03 XORLW 0x3 003d2c e001 BZ 0x3d30 003d2e d04d BRA 0x3dca { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case DSC_DEV: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d30 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d32 0e01 MOVLW 0x1 003d34 6fcb MOVWF 0xcb,0x1 003d36 0101 MOVLB 0x1 pSrc.bRom = (rom byte*)&device_dsc; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d38 0e2e MOVLW 0x2e 003d3a 6fcc MOVWF 0xcc,0x1 003d3c 0e43 MOVLW 0x43 003d3e 6fcd MOVWF 0xcd,0x1 003d40 0e12 MOVLW 0x12 wCount._word = sizeof(device_dsc); // Set data count C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d42 0101 MOVLB 0x1 003d44 6fd0 MOVWF 0xd0,0x1 003d46 6bd1 CLRF 0xd1,0x1 003d48 d040 BRA 0x3dca break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case DSC_CFG: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d4a 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d4c 0e01 MOVLW 0x1 003d4e 6fcb MOVWF 0xcb,0x1 003d50 0104 MOVLB 0x4 pSrc.bRom = *(USB_CD_Ptr+SetupPkt.bDscIndex); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d52 5122 MOVF 0x22,0x0,0x1 003d54 6ef6 MOVWF 0xf6,0x0 003d56 6af7 CLRF 0xf7,0x0 003d58 90d8 BCF 0xd8,0x0,0x0 003d5a 36f6 RLCF 0xf6,0x1,0x0 003d5c 36f7 RLCF 0xf7,0x1,0x0 003d5e 0eef MOVLW 0xef 003d60 26f6 ADDWF 0xf6,0x1,0x0 003d62 0e43 MOVLW 0x43 003d64 22f7 ADDWFC 0xf7,0x1,0x0 003d66 0009 TBLRDPOSTINC 003d68 cff5 MOVFF 0xff5,0x1cc 003d6a f1cc 003d6c 000a TBLRDPOSTDEC 003d6e cff5 MOVFF 0xff5,0x1cd 003d70 f1cd 003d72 0e02 MOVLW 0x2 wCount._word = *(pSrc.wRom+1); // Set data count C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d74 0101 MOVLB 0x1 003d76 6af7 CLRF 0xf7,0x0 003d78 25cc ADDWF 0xcc,0x0,0x1 003d7a 6ef6 MOVWF 0xf6,0x0 003d7c 51cd MOVF 0xcd,0x0,0x1 003d7e 22f7 ADDWFC 0xf7,0x1,0x0 003d80 0009 TBLRDPOSTINC 003d82 cff5 MOVFF 0xff5,0x1d0 003d84 f1d0 003d86 000a TBLRDPOSTDEC 003d88 cff5 MOVFF 0xff5,0x1d1 003d8a f1d1 003d8c d01e BRA 0x3dca break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case DSC_STR: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d8e 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d90 0e01 MOVLW 0x1 003d92 6fcb MOVWF 0xcb,0x1 003d94 0104 MOVLB 0x4 pSrc.bRom = *(USB_SD_Ptr+SetupPkt.bDscIndex); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d96 5122 MOVF 0x22,0x0,0x1 003d98 6ef6 MOVWF 0xf6,0x0 003d9a 6af7 CLRF 0xf7,0x0 003d9c 90d8 BCF 0xd8,0x0,0x0 003d9e 36f6 RLCF 0xf6,0x1,0x0 003da0 36f7 RLCF 0xf7,0x1,0x0 003da2 0ef3 MOVLW 0xf3 003da4 26f6 ADDWF 0xf6,0x1,0x0 003da6 0e43 MOVLW 0x43 003da8 22f7 ADDWFC 0xf7,0x1,0x0 003daa 0009 TBLRDPOSTINC 003dac cff5 MOVFF 0xff5,0x1cc 003dae f1cc 003db0 000a TBLRDPOSTDEC 003db2 cff5 MOVFF 0xff5,0x1cd 003db4 f1cd 003db6 c1cc MOVFF 0x1cc,0xff6 wCount._word = *pSrc.bRom; // Set data count C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003db8 fff6 003dba c1cd MOVFF 0x1cd,0xff7 003dbc fff7 003dbe 0008 TBLRD 003dc0 50f5 MOVF 0xf5,0x0,0x0 003dc2 0101 MOVLB 0x1 003dc4 6fd0 MOVWF 0xd0,0x1 003dc6 6bd1 CLRF 0xd1,0x1 003dc8 d000 BRA 0x3dca break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c }//end switch C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003dca 0101 MOVLB 0x1 usb_stat.ctrl_trf_mem = _ROM; // Set memory type C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003dcc 83d3 BSF 0xd3,0x1,0x1 }//end if C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003dce 0012 RETURN 0x0 }//end USBStdGetDscHandler C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Function: void USBStdSetCfgHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Overview: This routine first disables all endpoints by clearing C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * UEP registers. It then configures (initializes) endpoints C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * specified in the modifiable section. C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c void USBStdSetCfgHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003dd0 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003dd2 0e01 MOVLW 0x1 003dd4 6fcb MOVWF 0xcb,0x1 003dd6 0e0f MOVLW 0xf mDisableEP1to15(); // See usbdrv.h C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003dd8 6ee6 MOVWF 0xe6,0x0 003dda 0e71 MOVLW 0x71 003ddc 6ee6 MOVWF 0xe6,0x0 003dde 0e0f MOVLW 0xf 003de0 6ee6 MOVWF 0xe6,0x0 003de2 ec62 CALL 0x40c4,0x0 003de4 f020 003de6 52e5 MOVF 0xe5,0x1,0x0 003de8 52e5 MOVF 0xe5,0x1,0x0 003dea 52e5 MOVF 0xe5,0x1,0x0 003dec 0e01 MOVLW 0x1 ClearArray((byte*)&usb_alt_intf,MAX_NUM_INT); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003dee 6ee6 MOVWF 0xe6,0x0 003df0 0ed5 MOVLW 0xd5 003df2 6ee6 MOVWF 0xe6,0x0 003df4 0e01 MOVLW 0x1 003df6 6ee6 MOVWF 0xe6,0x0 003df8 ec62 CALL 0x40c4,0x0 003dfa f020 003dfc 52e5 MOVF 0xe5,0x1,0x0 003dfe 52e5 MOVF 0xe5,0x1,0x0 003e00 52e5 MOVF 0xe5,0x1,0x0 003e02 c422 MOVFF 0x422,0x1d4 usb_active_cfg = SetupPkt.bCfgValue; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e04 f1d4 003e06 0104 MOVLB 0x4 if(SetupPkt.bCfgValue == 0) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e08 5122 MOVF 0x22,0x0,0x1 003e0a e104 BNZ 0x3e14 003e0c 0101 MOVLB 0x1 usb_device_state = ADDRESS_STATE; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e0e 0e05 MOVLW 0x5 003e10 6fd2 MOVWF 0xd2,0x1 003e12 d005 BRA 0x3e1e else C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e14 0101 MOVLB 0x1 usb_device_state = CONFIGURED_STATE; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e16 0e06 MOVLW 0x6 003e18 6fd2 MOVWF 0xd2,0x1 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /* Modifiable Section */ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c #if defined(USB_USE_CDC) // See autofiles\usbcfg.h C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e1a ec05 CALL 0x360a,0x0 CDCInitEP(); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e1c f01b #endif C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /* End modifiable section */ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c }//end if(SetupPkt.bcfgValue == 0) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e1e 0012 RETURN 0x0 }//end USBStdSetCfgHandler C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Function: void USBStdGetStatusHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Overview: This routine handles the standard GET_STATUS request C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c void USBStdGetStatusHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e20 0104 MOVLB 0x4 CtrlTrfData._byte0 = 0; // Initialize content C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e22 6b28 CLRF 0x28,0x1 003e24 0104 MOVLB 0x4 CtrlTrfData._byte1 = 0; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e26 6b29 CLRF 0x29,0x1 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e28 0104 MOVLB 0x4 switch(SetupPkt.Recipient) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e2a 5120 MOVF 0x20,0x0,0x1 003e2c 0b1f ANDLW 0x1f 003e2e 0a02 XORLW 0x2 003e30 e014 BZ 0x3e5a 003e32 0a03 XORLW 0x3 003e34 e00e BZ 0x3e52 003e36 0a01 XORLW 0x1 003e38 e001 BZ 0x3e3c 003e3a d034 BRA 0x3ea4 { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case RCPT_DEV: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e3c 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e3e 0e01 MOVLW 0x1 003e40 6fcb MOVWF 0xcb,0x1 /* C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * _byte0: bit0: Self-Powered Status [0] Bus-Powered [1] Self-Powered C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * bit1: RemoteWakeup [0] Disabled [1] Enabled C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c */ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c if(self_power == 1) // self_power defined in io_cfg.h C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e42 0104 MOVLB 0x4 CtrlTrfData._byte0|=0b000000001; // Set bit0 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e44 8128 BSF 0x28,0x0,0x1 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e46 0101 MOVLB 0x1 if(usb_stat.RemoteWakeup == 1) // usb_stat defined in usbmmap.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e48 a1d3 BTFSS 0xd3,0x0,0x1 003e4a d002 BRA 0x3e50 003e4c 0104 MOVLB 0x4 CtrlTrfData._byte0|=0b00000010; // Set bit1 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e4e 8328 BSF 0x28,0x1,0x1 003e50 d029 BRA 0x3ea4 break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case RCPT_INTF: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e52 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; // No data to update C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e54 0e01 MOVLW 0x1 003e56 6fcb MOVWF 0xcb,0x1 003e58 d025 BRA 0x3ea4 break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c case RCPT_EP: C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e5a 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e5c 0e01 MOVLW 0x1 003e5e 6fcb MOVWF 0xcb,0x1 /* C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * _byte0: bit0: Halt Status [0] Not Halted [1] Halted C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c */ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e60 0104 MOVLB 0x4 pDst.bRam = (byte*)&ep0Bo+(SetupPkt.EPNum*8)+(SetupPkt.EPDir*4); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e62 5124 MOVF 0x24,0x0,0x1 003e64 0b0f ANDLW 0xf 003e66 0d08 MULLW 0x8 003e68 50f3 MOVF 0xf3,0x0,0x0 003e6a 6a2b CLRF 0x2b,0x0 003e6c 0f00 ADDLW 0x0 003e6e 6e2a MOVWF 0x2a,0x0 003e70 0e04 MOVLW 0x4 003e72 222b ADDWFC 0x2b,0x1,0x0 003e74 0104 MOVLB 0x4 003e76 5124 MOVF 0x24,0x0,0x1 003e78 0b80 ANDLW 0x80 003e7a e001 BZ 0x3e7e 003e7c 0e01 MOVLW 0x1 003e7e 0d04 MULLW 0x4 003e80 50f3 MOVF 0xf3,0x0,0x0 003e82 0101 MOVLB 0x1 003e84 242a ADDWF 0x2a,0x0,0x0 003e86 6fce MOVWF 0xce,0x1 003e88 0e00 MOVLW 0x0 003e8a 202b ADDWFC 0x2b,0x0,0x0 003e8c 6fcf MOVWF 0xcf,0x1 003e8e c1ce MOVFF 0x1ce,0xfe9 if(*pDst.bRam & _BSTALL) // Use _BSTALL as a bit mask C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e90 ffe9 003e92 c1cf MOVFF 0x1cf,0xfea 003e94 ffea 003e96 50ef MOVF 0xef,0x0,0x0 003e98 0b04 ANDLW 0x4 003e9a e003 BZ 0x3ea2 003e9c 0104 MOVLB 0x4 CtrlTrfData._byte0=0x01;// Set bit0 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003e9e 0e01 MOVLW 0x1 003ea0 6f28 MOVWF 0x28,0x1 003ea2 d000 BRA 0x3ea4 break; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c }//end switch C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ea4 0101 MOVLB 0x1 if(ctrl_trf_session_owner == MUID_USB9) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ea6 05cb DECF 0xcb,0x0,0x1 003ea8 e10a BNZ 0x3ebe { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003eaa 0101 MOVLB 0x1 pSrc.bRam = (byte*)&CtrlTrfData; // Set Source C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003eac 0e28 MOVLW 0x28 003eae 6fcc MOVWF 0xcc,0x1 003eb0 0e04 MOVLW 0x4 003eb2 6fcd MOVWF 0xcd,0x1 003eb4 0101 MOVLB 0x1 usb_stat.ctrl_trf_mem = _RAM; // Set memory type C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003eb6 93d3 BCF 0xd3,0x1,0x1 003eb8 0101 MOVLB 0x1 LSB(wCount) = 2; // Set data count C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003eba 0e02 MOVLW 0x2 003ebc 6fd0 MOVWF 0xd0,0x1 }//end if(...) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ebe 0012 RETURN 0x0 }//end USBStdGetStatusHandler C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Function: void USBStdFeatureReqHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Overview: This routine handles the standard SET & CLEAR FEATURES C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * requests C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c void USBStdFeatureReqHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ec0 0104 MOVLB 0x4 if((SetupPkt.bFeature == DEVICE_REMOTE_WAKEUP)&& C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ec2 0522 DECF 0x22,0x0,0x1 003ec4 e111 BNZ 0x3ee8 (SetupPkt.Recipient == RCPT_DEV)) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ec6 0104 MOVLB 0x4 003ec8 5120 MOVF 0x20,0x0,0x1 003eca 0b1f ANDLW 0x1f 003ecc 0900 IORLW 0x0 003ece e10c BNZ 0x3ee8 { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ed0 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ed2 0e01 MOVLW 0x1 003ed4 6fcb MOVWF 0xcb,0x1 003ed6 0e03 MOVLW 0x3 if(SetupPkt.bRequest == SET_FEATURE) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ed8 0104 MOVLB 0x4 003eda 5d21 SUBWF 0x21,0x0,0x1 003edc e103 BNZ 0x3ee4 003ede 0101 MOVLB 0x1 usb_stat.RemoteWakeup = 1; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ee0 81d3 BSF 0xd3,0x0,0x1 003ee2 d002 BRA 0x3ee8 else C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ee4 0101 MOVLB 0x1 usb_stat.RemoteWakeup = 0; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ee6 91d3 BCF 0xd3,0x0,0x1 }//end if C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ee8 0104 MOVLB 0x4 if((SetupPkt.bFeature == ENDPOINT_HALT)&& C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003eea 5122 MOVF 0x22,0x0,0x1 003eec e13e BNZ 0x3f6a (SetupPkt.Recipient == RCPT_EP)&& C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003eee 0104 MOVLB 0x4 003ef0 5120 MOVF 0x20,0x0,0x1 003ef2 0b1f ANDLW 0x1f 003ef4 0802 SUBLW 0x2 003ef6 e139 BNZ 0x3f6a 003ef8 0104 MOVLB 0x4 (SetupPkt.EPNum != 0)) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003efa 5124 MOVF 0x24,0x0,0x1 003efc 0b0f ANDLW 0xf 003efe 0900 IORLW 0x0 003f00 e034 BZ 0x3f6a { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f02 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f04 0e01 MOVLW 0x1 003f06 6fcb MOVWF 0xcb,0x1 /* Must do address calculation here */ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f08 0104 MOVLB 0x4 pDst.bRam = (byte*)&ep0Bo+(SetupPkt.EPNum*8)+(SetupPkt.EPDir*4); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f0a 5124 MOVF 0x24,0x0,0x1 003f0c 0b0f ANDLW 0xf 003f0e 0d08 MULLW 0x8 003f10 50f3 MOVF 0xf3,0x0,0x0 003f12 6a2b CLRF 0x2b,0x0 003f14 0f00 ADDLW 0x0 003f16 6e2a MOVWF 0x2a,0x0 003f18 0e04 MOVLW 0x4 003f1a 222b ADDWFC 0x2b,0x1,0x0 003f1c 0104 MOVLB 0x4 003f1e 5124 MOVF 0x24,0x0,0x1 003f20 0b80 ANDLW 0x80 003f22 e001 BZ 0x3f26 003f24 0e01 MOVLW 0x1 003f26 0d04 MULLW 0x4 003f28 50f3 MOVF 0xf3,0x0,0x0 003f2a 0101 MOVLB 0x1 003f2c 242a ADDWF 0x2a,0x0,0x0 003f2e 6fce MOVWF 0xce,0x1 003f30 0e00 MOVLW 0x0 003f32 202b ADDWFC 0x2b,0x0,0x0 003f34 6fcf MOVWF 0xcf,0x1 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f36 0e03 MOVLW 0x3 if(SetupPkt.bRequest == SET_FEATURE) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f38 0104 MOVLB 0x4 003f3a 5d21 SUBWF 0x21,0x0,0x1 003f3c e107 BNZ 0x3f4c 003f3e 0e84 MOVLW 0x84 *pDst.bRam = _USIE|_BSTALL; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f40 c1ce MOVFF 0x1ce,0xfe9 003f42 ffe9 003f44 c1cf MOVFF 0x1cf,0xfea 003f46 ffea 003f48 6eef MOVWF 0xef,0x0 003f4a d00f BRA 0x3f6a else C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f4c 0104 MOVLB 0x4 if(SetupPkt.EPDir == 1) // IN C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f4e af24 BTFSS 0x24,0x7,0x1 003f50 d006 BRA 0x3f5e 003f52 c1ce MOVFF 0x1ce,0xfe9 *pDst.bRam = _UCPU; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f54 ffe9 003f56 c1cf MOVFF 0x1cf,0xfea 003f58 ffea 003f5a 6aef CLRF 0xef,0x0 003f5c d006 BRA 0x3f6a else C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f5e 0e88 MOVLW 0x88 *pDst.bRam = _USIE|_DAT0|_DTSEN; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f60 c1ce MOVFF 0x1ce,0xfe9 003f62 ffe9 003f64 c1cf MOVFF 0x1cf,0xfea 003f66 ffea 003f68 6eef MOVWF 0xef,0x0 }//end if C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c }//end if C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003f6a 0012 RETURN 0x0 }//end USBStdFeatureReqHandler C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /** EOF usb9.c ***************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c /********************************************************************* C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c ********************************************************************* C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * FileName: usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Processor: PIC18 C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Software License Agreement C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * license. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c ********************************************************************/ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /********************************************************************* C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * -usbdsc.c- C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * This file contains the USB descriptor information. It is used C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * in conjunction with the usbdsc.h file. When a descriptor is added C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * or removed from the main configuration descriptor, i.e. CFG01, C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * the user must also change the descriptor structure defined in C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * the usbdsc.h file. The structure is used to calculate the C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * descriptor size, i.e. sizeof(CFG01). C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * A typical configuration descriptor consists of: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * At least one configuration descriptor (USB_CFG_DSC) C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * One or more interface descriptors (USB_INTF_DSC) C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * One or more endpoint descriptors (USB_EP_DSC) C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Naming Convention: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * To resolve ambiguity, the naming convention are as followed: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * - USB_CFG_DSC type should be named cdxx, where xx is the C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * configuration number. This number should match the actual C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * index value of this configuration. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * - USB_INTF_DSC type should be named ia, where yy is the C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * interface number and zz is the alternate interface number. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * - USB_EP_DSC type should be named ep<##>_ia, where C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * ## is the endpoint number and d is the direction of transfer. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * The interface name should also be listed as a suffix to identify C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * which interface does the endpoint belong to. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Example: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * If a device has one configuration, two interfaces; interface 0 C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * has two endpoints (in and out), and interface 1 has one endpoint(in). C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Then the CFG01 structure in the usbdsc.h should be: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * #define CFG01 rom struct \ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * { USB_CFG_DSC cd01; \ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * USB_INTF_DSC i00a00; \ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * USB_EP_DSC ep01o_i00a00; \ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * USB_EP_DSC ep01i_i00a00; \ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * USB_INTF_DSC i01a00; \ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * USB_EP_DSC ep02i_i01a00; \ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * } cfg01 C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Note the hierarchy of the descriptors above, it follows the USB C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * specification requirement. All endpoints belonging to an interface C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * should be listed immediately after that interface. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * ------------------------------------------------------------------- C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Filling in the descriptor values in the usbdsc.c file: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * ------------------------------------------------------------------- C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Most items should be self-explanatory, however, a few will be C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * explained for clarification. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * [Configuration Descriptor(USB_CFG_DSC)] C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * The configuration attribute must always have the _DEFAULT C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * definition at the minimum. Additional options can be ORed C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * to the _DEFAULT attribute. Available options are _SELF and _RWU. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * These definitions are defined in the usbdefs_std_dsc.h file. The C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * _SELF tells the USB host that this device is self-powered. The C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * _RWU tells the USB host that this device supports Remote Wakeup. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * [Endpoint Descriptor(USB_EP_DSC)] C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Assume the following example: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * sizeof(USB_EP_DSC),DSC_EP,_EP01_OUT,_BULK,64,0x00 C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * The first two parameters are self-explanatory. They specify the C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * length of this endpoint descriptor (7) and the descriptor type. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * The next parameter identifies the endpoint, the definitions are C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * defined in usbdefs_std_dsc.h and has the following naming C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * convention: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * _EP<##>_ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * where ## is the endpoint number and dir is the direction of C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * transfer. The dir has the value of either 'OUT' or 'IN'. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * The next parameter identifies the type of the endpoint. Available C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * options are _BULK, _INT, _ISO, and _CTRL. The _CTRL is not C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * typically used because the default control transfer endpoint is C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * not defined in the USB descriptors. When _ISO option is used, C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * addition options can be ORed to _ISO. Example: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * _ISO|_AD|_FE C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * This describes the endpoint as an isochronous pipe with adaptive C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * and feedback attributes. See usbdefs_std_dsc.h and the USB C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * specification for details. The next parameter defines the size of C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * the endpoint. The last parameter in the polling interval. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * ------------------------------------------------------------------- C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Adding a USB String C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * ------------------------------------------------------------------- C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * A string descriptor array should have the following format: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * rom struct{byte bLength;byte bDscType;word string[size];}sdxxx={ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * sizeof(sdxxx),DSC_STR,}; C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * The above structure provides a means for the C compiler to C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * calculate the length of string descriptor sdxxx, where xxx is the C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * index number. The first two bytes of the descriptor are descriptor C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * length and type. The rest are string texts which must be C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * in the unicode format. The unicode format is achieved by declaring C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * each character as a word type. The whole text string is declared C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * as a word array with the number of characters equals to . C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * has to be manually counted and entered into the array C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * declaration. Let's study this through an example: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * if the string is "USB" , then the string descriptor should be: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * (Using index 02) C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * rom struct{byte bLength;byte bDscType;word string[3];}sd002={ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * sizeof(sd002),DSC_STR,'U','S','B'}; C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * A USB project may have multiple strings and the firmware supports C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * the management of multiple strings through a look-up table. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * The look-up table is defined as: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * rom const unsigned char *rom USB_SD_Ptr[]={&sd000,&sd001,&sd002}; C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * The above declaration has 3 strings, sd000, sd001, and sd002. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Strings can be removed or added. sd000 is a specialized string C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * descriptor. It defines the language code, usually this is C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * US English (0x0409). The index of the string must match the index C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * position of the USB_SD_Ptr array, &sd000 must be in position C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * USB_SD_Ptr[0], &sd001 must be in position USB_SD_Ptr[1] and so on. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * The look-up table USB_SD_Ptr is used by the get string handler C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * function in usb9.c. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * ------------------------------------------------------------------- C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * The look-up table scheme also applies to the configuration C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * descriptor. A USB device may have multiple configuration C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * descriptors, i.e. CFG01, CFG02, etc. To add a configuration C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * descriptor, user must implement a structure similar to CFG01. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * The next step is to add the configuration descriptor name, i.e. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * cfg01, cfg02,.., to the look-up table USB_CD_Ptr. USB_CD_Ptr[0] C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * is a dummy place holder since configuration 0 is the un-configured C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * state according to the definition in the USB specification. C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c ********************************************************************/ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /********************************************************************* C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Descriptor specific type definitions are defined in: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * system\usb\usbdefs\usbdefs_std_dsc.h C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * Configuration information is defined in: C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c * autofiles\usbcfg.h C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c ********************************************************************/ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /** I N C L U D E S *************************************************/ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c #include "system\typedefs.h" C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c #include "system\usb\usb.h" C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /** C O N S T A N T S ************************************************/ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c #pragma romdata C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /* Device Descriptor */ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c rom USB_DEV_DSC device_dsc= C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c { C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(USB_DEV_DSC), // Size of this descriptor in bytes C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c DSC_DEV, // DEVICE descriptor type C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0x0200, // USB Spec Release Number in BCD format C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c CDC_DEVICE, // Class Code C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0x00, // Subclass code C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0x00, // Protocol code C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c EP0_BUFF_SIZE, // Max packet size for EP0, see usbcfg.h C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0x04D8, // Vendor ID C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0x000A, // Product ID: CDC RS-232 Emulation Demo C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0x0000, // Device release number in BCD format C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0x01, // Manufacturer string index C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0x02, // Product string index C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0x00, // Device serial number string index C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0x01 // Number of possible configurations C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c }; C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /* Configuration 1 Descriptor */ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c CFG01= C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c { C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /* Configuration Descriptor */ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(USB_CFG_DSC), // Size of this descriptor in bytes C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c DSC_CFG, // CONFIGURATION descriptor type C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(cfg01), // Total length of data for this cfg C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 2, // Number of interfaces in this cfg C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 1, // Index value of this configuration C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0, // Configuration string index C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c _DEFAULT, // Attributes, see usbdefs_std_dsc.h C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 50, // Max power consumption (2X mA) C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /* Interface Descriptor */ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(USB_INTF_DSC), // Size of this descriptor in bytes C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c DSC_INTF, // INTERFACE descriptor type C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0, // Interface Number C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0, // Alternate Setting Number C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 1, // Number of endpoints in this intf C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c COMM_INTF, // Class code C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c ABSTRACT_CONTROL_MODEL, // Subclass code C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c V25TER, // Protocol code C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0, // Interface string index C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /* CDC Class-Specific Descriptors */ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(USB_CDC_HEADER_FN_DSC),CS_INTERFACE,DSC_FN_HEADER,0x0110, C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(USB_CDC_ACM_FN_DSC),CS_INTERFACE,DSC_FN_ACM,0x02, C:\Projects\UBW\FW\D_143\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\D_143\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\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /* Endpoint Descriptor */ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(USB_EP_DSC),DSC_EP,_EP02_IN,_INT,CDC_INT_EP_SIZE,0x02, C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /* Interface Descriptor */ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(USB_INTF_DSC), // Size of this descriptor in bytes C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c DSC_INTF, // INTERFACE descriptor type C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 1, // Interface Number C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0, // Alternate Setting Number C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 2, // Number of endpoints in this intf C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c DATA_INTF, // Class code C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0, // Subclass code C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c NO_PROTOCOL, // Protocol code C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 0, // Interface string index C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /* Endpoint Descriptors */ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(USB_EP_DSC),DSC_EP,_EP03_OUT,_BULK,CDC_BULK_OUT_EP_SIZE,0x00, C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(USB_EP_DSC),DSC_EP,_EP03_IN,_BULK,CDC_BULK_IN_EP_SIZE,0x00 C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c }; C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c rom struct{byte bLength;byte bDscType;word string[1];}sd000={ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(sd000),DSC_STR,0x0409}; C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c rom struct{byte bLength;byte bDscType;word string[25];}sd001={ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(sd001),DSC_STR, C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 'M','i','c','r','o','c','h','i','p',' ', C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 'T','e','c','h','n','o','l','o','g','y',' ','I','n','c','.'}; C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c rom struct{byte bLength;byte bDscType;word string[25];}sd002={ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c sizeof(sd002),DSC_STR, C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 'C','D','C',' ','R','S','-','2','3','2',' ', C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c 'E','m','u','l','a','t','i','o','n',' ','D','e','m','o'}; C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c rom const unsigned char *rom USB_CD_Ptr[]={&cfg01,&cfg01}; C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c rom const unsigned char *rom USB_SD_Ptr[]={&sd000,&sd001,&sd002}; C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c rom pFunc ClassReqHandler[1]= C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c { C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c &USBCheckCDCRequest C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c }; C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c #pragma code C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /** EOF usbdsc.c ****************************************************/ C:\Projects\UBW\FW\D_143\autofiles\usbdsc.c /********************************************************************* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c ********************************************************************* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * FileName: usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Processor: PIC18 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Software License Agreement C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * license. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Author Date Comment C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Rawin Rojvanit 11/19/04 Original. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c ********************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c #include C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c #include "system\typedefs.h" C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c #include "system\usb\usb.h" C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /** V A R I A B L E S ********************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c #pragma udata C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c byte ctrl_trf_state; // Control Transfer State C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c byte ctrl_trf_session_owner; // Current transfer session owner C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c POINTER pSrc; // Data source pointer C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c POINTER pDst; // Data destination pointer C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c WORD wCount; // Data counter C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\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\D_143\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlTrfSetupHandler(void); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlTrfOutHandler(void); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlTrfInHandler(void); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /** D E C L A R A T I O N S **************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c #pragma code C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlEPService(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: USTAT is loaded with a valid endpoint address. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Overview: USBCtrlEPService checks for three transaction types that C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * it knows how to service and services them: C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 1. EP0 SETUP C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 2. EP0 OUT C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 3. EP0 IN C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * It ignores all other types (i.e. EP1, EP2, etc.) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlEPService(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003914 506c MOVF 0x6c,0x0,0x0 if(USTAT == EP00_OUT) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003916 e002 BZ 0x391c 003918 0e00 MOVLW 0x0 00391a d001 BRA 0x391e 00391c 0e01 MOVLW 0x1 00391e 0900 IORLW 0x0 003920 e00b BZ 0x3938 { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003922 0104 MOVLB 0x4 if(ep0Bo.Stat.PID == SETUP_TOKEN) // EP0 SETUP C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003924 5100 MOVF 0x0,0x0,0x1 003926 0b3c ANDLW 0x3c 003928 42e8 RRNCF 0xe8,0x1,0x0 00392a 42e8 RRNCF 0xe8,0x1,0x0 00392c 080d SUBLW 0xd 00392e e102 BNZ 0x3934 003930 d80c RCALL 0x394a USBCtrlTrfSetupHandler(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003932 d001 BRA 0x3936 else // EP0 OUT C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003934 d842 RCALL 0x39ba USBCtrlTrfOutHandler(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c } C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003936 d008 BRA 0x3948 else if(USTAT == EP00_IN) // EP0 IN C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003938 506c MOVF 0x6c,0x0,0x0 00393a e002 BZ 0x3940 00393c 0e00 MOVLW 0x0 00393e d001 BRA 0x3942 003940 0e01 MOVLW 0x1 003942 0904 IORLW 0x4 003944 e001 BZ 0x3948 003946 d84b RCALL 0x39de USBCtrlTrfInHandler(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003948 0012 RETURN 0x0 }//end USBCtrlEPService C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlTrfSetupHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: SetupPkt buffer is loaded with valid USB Setup Data C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Overview: This routine is a task dispatcher and has 3 stages. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 1. It initializes the control transfer state machine. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 2. It calls on each of the module that may know how to C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * service the Setup Request from the host. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Module Example: USB9, HID, CDC, MSD, ... C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * As new classes are added, ClassReqHandler table in C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * usbdsc.c should be updated to call all available C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * class handlers. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 3. Once each of the modules has had a chance to check if C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * it is responsible for servicing the request, stage 3 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * then checks direction of the transfer to determine how C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * to prepare EP0 for the control transfer. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Refer to USBCtrlEPServiceComplete() for more details. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Note: Microchip USB Firmware has three different states for C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * the control transfer state machine: C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 1. WAIT_SETUP C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 2. CTRL_TRF_TX C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 3. CTRL_TRF_RX C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Refer to firmware manual to find out how one state C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * is transitioned to another. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * A Control Transfer is composed of many USB transactions. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * When transferring data over multiple transactions, C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * it is important to keep track of data source, data C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * destination, and data count. These three parameters are C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * stored in pSrc,pDst, and wCount. A flag is used to C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * note if the data source is from ROM or RAM. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00394a cfd9 MOVFF 0xfd9,0xfe6 void USBCtrlTrfSetupHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00394c ffe6 00394e cfe1 MOVFF 0xfe1,0xfd9 003950 ffd9 003952 52e6 MOVF 0xe6,0x1,0x0 { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c byte i; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /* Stage 1 */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003954 0101 MOVLB 0x1 ctrl_trf_state = WAIT_SETUP; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003956 6bca CLRF 0xca,0x1 003958 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_NULL; // Set owner to NULL C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00395a 6bcb CLRF 0xcb,0x1 00395c 0101 MOVLB 0x1 wCount._word = 0; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00395e 6bd0 CLRF 0xd0,0x1 003960 6bd1 CLRF 0xd1,0x1 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /* Stage 2 */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003962 ec27 CALL 0x3c4e,0x0 USBCheckStdRequest(); // See system\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003964 f01e C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003966 6adf CLRF 0xdf,0x0 for(i=0;i < (sizeof(ClassReqHandler)/sizeof(pFunc));i++) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003968 50df MOVF 0xdf,0x0,0x0 00396a 6e2a MOVWF 0x2a,0x0 00396c 6a2b CLRF 0x2b,0x0 00396e 0e01 MOVLW 0x1 003970 5c2a SUBWF 0x2a,0x0,0x0 003972 0e00 MOVLW 0x0 003974 582b SUBWFB 0x2b,0x0,0x0 003976 e21b BC 0x39ae 0039aa 2adf INCF 0xdf,0x1,0x0 0039ac d7dd BRA 0x3968 { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003978 0101 MOVLB 0x1 if(ctrl_trf_session_owner != MUID_NULL)break; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00397a 51cb MOVF 0xcb,0x0,0x1 00397c e001 BZ 0x3980 00397e d017 BRA 0x39ae 003980 6af7 CLRF 0xf7,0x0 ClassReqHandler[i](); // See autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003982 34df RLCF 0xdf,0x0,0x0 003984 0bfe ANDLW 0xfe 003986 36f7 RLCF 0xf7,0x1,0x0 003988 6ef6 MOVWF 0xf6,0x0 00398a 0ef9 MOVLW 0xf9 00398c 26f6 ADDWF 0xf6,0x1,0x0 00398e 0e43 MOVLW 0x43 003990 22f7 ADDWFC 0xf7,0x1,0x0 003992 0009 TBLRDPOSTINC 003994 cff5 MOVFF 0xff5,0x2a 003996 f02a 003998 0008 TBLRD 00399a cff5 MOVFF 0xff5,0x2b 00399c f02b 00399e d004 BRA 0x39a8 0039a0 c02b MOVFF 0x2b,0xffa 0039a2 fffa 0039a4 502a MOVF 0x2a,0x0,0x0 0039a6 6ef9 MOVWF 0xf9,0x0 0039a8 dffb RCALL 0x39a0 }//end while C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /* Stage 3 */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039ae d8f0 RCALL 0x3b90 USBCtrlEPServiceComplete(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039b0 52e5 MOVF 0xe5,0x1,0x0 }//end USBCtrlTrfSetupHandler C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039b2 52e5 MOVF 0xe5,0x1,0x0 0039b4 cfe7 MOVFF 0xfe7,0xfd9 0039b6 ffd9 0039b8 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlTrfOutHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Overview: This routine handles an OUT transaction according to C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * which control transfer state is currently active. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Note: Note that if the the control transfer was from C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * host to device, the session owner should be notified C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * at the end of each OUT transaction to service the C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * received data. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlTrfOutHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039ba 0e02 MOVLW 0x2 if(ctrl_trf_state == CTRL_TRF_RX) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039bc 0101 MOVLB 0x1 0039be 5dca SUBWF 0xca,0x0,0x1 0039c0 e10c BNZ 0x39da { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039c2 d8a4 RCALL 0x3b0c USBCtrlTrfRxService(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Don't have to worry about overwriting _KEEP bit C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * because if _KEEP was set, TRNIF would not have been C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * generated in the first place. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039c4 0104 MOVLB 0x4 if(ep0Bo.Stat.DTS == 0) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039c6 bd00 BTFSC 0x0,0x6,0x1 0039c8 d004 BRA 0x39d2 0039ca 0104 MOVLB 0x4 ep0Bo.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039cc 0ec8 MOVLW 0xc8 0039ce 6f00 MOVWF 0x0,0x1 0039d0 d003 BRA 0x39d8 else C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039d2 0104 MOVLB 0x4 ep0Bo.Stat._byte = _USIE|_DAT0|_DTSEN; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039d4 0e88 MOVLW 0x88 0039d6 6f00 MOVWF 0x0,0x1 } C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039d8 d001 BRA 0x39dc else // CTRL_TRF_TX C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039da d929 RCALL 0x3c2e USBPrepareForNextSetupTrf(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039dc 0012 RETURN 0x0 }//end USBCtrlTrfOutHandler C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlTrfInHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Overview: This routine handles an IN transaction according to C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * which control transfer state is currently active. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Note: A Set Address Request must not change the acutal address C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * of the device until the completion of the control C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * transfer. The end of the control transfer for Set Address C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Request is an IN transaction. Therefore it is necessary C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * to service this unique situation when the condition is C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * right. Macro mUSBCheckAdrPendingState is defined in C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * usb9.h and its function is to specifically service this C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * event. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlTrfInHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039de 0e04 MOVLW 0x4 mUSBCheckAdrPendingState(); // Must check if in ADR_PENDING_STATE C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039e0 0101 MOVLB 0x1 0039e2 5dd2 SUBWF 0xd2,0x0,0x1 0039e4 e10c BNZ 0x39fe 0039e6 c422 MOVFF 0x422,0xf6e 0039e8 ff6e 0039ea 506e MOVF 0x6e,0x0,0x0 0039ec 0800 SUBLW 0x0 0039ee e204 BC 0x39f8 0039f0 0101 MOVLB 0x1 0039f2 0e05 MOVLW 0x5 0039f4 6fd2 MOVWF 0xd2,0x1 0039f6 d003 BRA 0x39fe 0039f8 0101 MOVLB 0x1 0039fa 0e03 MOVLW 0x3 0039fc 6fd2 MOVWF 0xd2,0x1 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039fe 0101 MOVLB 0x1 if(ctrl_trf_state == CTRL_TRF_TX) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a00 05ca DECF 0xca,0x0,0x1 003a02 e10c BNZ 0x3a1c { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a04 d80d RCALL 0x3a20 USBCtrlTrfTxService(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a06 0104 MOVLB 0x4 if(ep0Bi.Stat.DTS == 0) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a08 bd04 BTFSC 0x4,0x6,0x1 003a0a d004 BRA 0x3a14 003a0c 0104 MOVLB 0x4 ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a0e 0ec8 MOVLW 0xc8 003a10 6f04 MOVWF 0x4,0x1 003a12 d003 BRA 0x3a1a else C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a14 0104 MOVLB 0x4 ep0Bi.Stat._byte = _USIE|_DAT0|_DTSEN; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a16 0e88 MOVLW 0x88 003a18 6f04 MOVWF 0x4,0x1 } C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a1a d001 BRA 0x3a1e else // CTRL_TRF_RX C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a1c d908 RCALL 0x3c2e USBPrepareForNextSetupTrf(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a1e 0012 RETURN 0x0 }//end USBCtrlTrfInHandler C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlTrfTxService(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: pSrc, wCount, and usb_stat.ctrl_trf_mem are setup properly. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Overview: This routine should be called from only two places. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * One from USBCtrlEPServiceComplete() and one from C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * USBCtrlTrfInHandler(). It takes care of managing a C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * transfer over multiple USB transactions. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Note: This routine works with isochronous endpoint larger than C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 256 bytes and is shown here as an example of how to deal C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * with BC9 and BC8. In reality, a control endpoint can never C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * be larger than 64 bytes. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a20 cfd9 MOVFF 0xfd9,0xfe6 void USBCtrlTrfTxService(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a22 ffe6 003a24 cfe1 MOVFF 0xfe1,0xfd9 003a26 ffd9 003a28 0e02 MOVLW 0x2 003a2a 26e1 ADDWF 0xe1,0x1,0x0 { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c WORD byte_to_send; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * First, have to figure out how many byte of data to send. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a2c 0101 MOVLB 0x1 if(wCount._word < EP0_BUFF_SIZE) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a2e 0e08 MOVLW 0x8 003a30 5dd0 SUBWF 0xd0,0x0,0x1 003a32 0e00 MOVLW 0x0 003a34 59d1 SUBWFB 0xd1,0x0,0x1 003a36 e205 BC 0x3a42 003a38 c1d0 MOVFF 0x1d0,0xfde byte_to_send._word = wCount._word; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a3a ffde 003a3c c1d1 MOVFF 0x1d1,0xfdd 003a3e ffdd 003a40 d003 BRA 0x3a48 else C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a42 0e08 MOVLW 0x8 byte_to_send._word = EP0_BUFF_SIZE; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a44 6ede MOVWF 0xde,0x0 003a46 6add CLRF 0xdd,0x0 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Next, load the number of bytes to send to BC9..0 in buffer descriptor C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a48 0104 MOVLB 0x4 ep0Bi.Stat.BC9 = 0; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a4a 9304 BCF 0x4,0x1,0x1 003a4c 0104 MOVLB 0x4 ep0Bi.Stat.BC8 = 0; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a4e 9104 BCF 0x4,0x0,0x1 003a50 0e01 MOVLW 0x1 ep0Bi.Stat._byte |= MSB(byte_to_send); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a52 50db MOVF 0xdb,0x0,0x0 003a54 0104 MOVLB 0x4 003a56 1304 IORWF 0x4,0x1,0x1 003a58 cfdf MOVFF 0xfdf,0x405 ep0Bi.Cnt = LSB(byte_to_send); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a5a f405 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Subtract the number of bytes just about to be sent from the total. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a5c 0e00 MOVLW 0x0 wCount._word = wCount._word - byte_to_send._word; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a5e 50db MOVF 0xdb,0x0,0x0 003a60 0101 MOVLB 0x1 003a62 5fd0 SUBWF 0xd0,0x1,0x1 003a64 0e01 MOVLW 0x1 003a66 50db MOVF 0xdb,0x0,0x0 003a68 0101 MOVLB 0x1 003a6a 5bd1 SUBWFB 0xd1,0x1,0x1 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a6c 0101 MOVLB 0x1 pDst.bRam = (byte*)&CtrlTrfData; // Set destination pointer C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a6e 0e28 MOVLW 0x28 003a70 6fce MOVWF 0xce,0x1 003a72 0e04 MOVLW 0x4 003a74 6fcf MOVWF 0xcf,0x1 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a76 0101 MOVLB 0x1 if(usb_stat.ctrl_trf_mem == _ROM) // Determine type of memory source C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a78 a3d3 BTFSS 0xd3,0x1,0x1 003a7a d020 BRA 0x3abc { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a7c cfd9 MOVFF 0xfd9,0xfe9 while(byte_to_send._word) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a7e ffe9 003a80 cfda MOVFF 0xfda,0xfea 003a82 ffea 003a84 50ee MOVF 0xee,0x0,0x0 003a86 10ed IORWF 0xed,0x0,0x0 003a88 e018 BZ 0x3aba 003ab8 d7e1 BRA 0x3a7c { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a8a c1cc MOVFF 0x1cc,0xff6 *pDst.bRam = *pSrc.bRom; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a8c fff6 003a8e c1cd MOVFF 0x1cd,0xff7 003a90 fff7 003a92 0008 TBLRD 003a94 50f5 MOVF 0xf5,0x0,0x0 003a96 c1ce MOVFF 0x1ce,0xfe9 003a98 ffe9 003a9a c1cf MOVFF 0x1cf,0xfea 003a9c ffea 003a9e 6eef MOVWF 0xef,0x0 003aa0 0101 MOVLB 0x1 pDst.bRam++; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003aa2 2bce INCF 0xce,0x1,0x1 003aa4 0e00 MOVLW 0x0 003aa6 23cf ADDWFC 0xcf,0x1,0x1 003aa8 0101 MOVLB 0x1 pSrc.bRom++; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003aaa 2bcc INCF 0xcc,0x1,0x1 003aac 0e00 MOVLW 0x0 003aae 23cd ADDWFC 0xcd,0x1,0x1 003ab0 06df DECF 0xdf,0x1,0x0 byte_to_send._word--; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003ab2 0e01 MOVLW 0x1 003ab4 e201 BC 0x3ab8 003ab6 06db DECF 0xdb,0x1,0x0 }//end while(byte_to_send._word) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c } C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003aba d01e BRA 0x3af8 else // RAM C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003abc cfd9 MOVFF 0xfd9,0xfe9 while(byte_to_send._word) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003abe ffe9 003ac0 cfda MOVFF 0xfda,0xfea 003ac2 ffea 003ac4 50ee MOVF 0xee,0x0,0x0 003ac6 10ed IORWF 0xed,0x0,0x0 003ac8 e017 BZ 0x3af8 003af6 d7e2 BRA 0x3abc { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003aca c1cc MOVFF 0x1cc,0xfe9 *pDst.bRam = *pSrc.bRam; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003acc ffe9 003ace c1cd MOVFF 0x1cd,0xfea 003ad0 ffea 003ad2 50ef MOVF 0xef,0x0,0x0 003ad4 c1ce MOVFF 0x1ce,0xfe9 003ad6 ffe9 003ad8 c1cf MOVFF 0x1cf,0xfea 003ada ffea 003adc 6eef MOVWF 0xef,0x0 003ade 0101 MOVLB 0x1 pDst.bRam++; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003ae0 2bce INCF 0xce,0x1,0x1 003ae2 0e00 MOVLW 0x0 003ae4 23cf ADDWFC 0xcf,0x1,0x1 003ae6 0101 MOVLB 0x1 pSrc.bRam++; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003ae8 2bcc INCF 0xcc,0x1,0x1 003aea 0e00 MOVLW 0x0 003aec 23cd ADDWFC 0xcd,0x1,0x1 003aee 06df DECF 0xdf,0x1,0x0 byte_to_send._word--; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003af0 0e01 MOVLW 0x1 003af2 e201 BC 0x3af6 003af4 06db DECF 0xdb,0x1,0x0 }//end while(byte_to_send._word) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c }//end if(usb_stat.ctrl_trf_mem == _ROM) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003af8 0e02 MOVLW 0x2 }//end USBCtrlTrfTxService C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003afa 5ce1 SUBWF 0xe1,0x0,0x0 003afc e202 BC 0x3b02 003afe 6ae1 CLRF 0xe1,0x0 003b00 52e5 MOVF 0xe5,0x1,0x0 003b02 6ee1 MOVWF 0xe1,0x0 003b04 52e5 MOVF 0xe5,0x1,0x0 003b06 cfe7 MOVFF 0xfe7,0xfd9 003b08 ffd9 003b0a 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlTrfRxService(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: pDst and wCount are setup properly. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * pSrc is always &CtrlTrfData C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * usb_stat.ctrl_trf_mem is always _RAM. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * wCount should be set to 0 at the start of each control C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * transfer. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Overview: *** This routine is only partially complete. Check for C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * new version of the firmware. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b0c cfd9 MOVFF 0xfd9,0xfe6 void USBCtrlTrfRxService(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b0e ffe6 003b10 cfe1 MOVFF 0xfe1,0xfd9 003b12 ffd9 003b14 0e02 MOVLW 0x2 003b16 26e1 ADDWF 0xe1,0x1,0x0 { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c WORD byte_to_read; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b18 0e03 MOVLW 0x3 MSB(byte_to_read) = 0x03 & ep0Bo.Stat._byte; // Filter out last 2 bits C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b1a 0104 MOVLB 0x4 003b1c 1500 ANDWF 0x0,0x0,0x1 003b1e 6ee7 MOVWF 0xe7,0x0 003b20 0e01 MOVLW 0x1 003b22 cfe7 MOVFF 0xfe7,0xfdb 003b24 ffdb 003b26 c401 MOVFF 0x401,0xfdf LSB(byte_to_read) = ep0Bo.Cnt; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b28 ffdf C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Accumulate total number of bytes read C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b2a 50de MOVF 0xde,0x0,0x0 wCount._word = wCount._word + byte_to_read._word; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b2c 0101 MOVLB 0x1 003b2e 27d0 ADDWF 0xd0,0x1,0x1 003b30 50dd MOVF 0xdd,0x0,0x0 003b32 0101 MOVLB 0x1 003b34 23d1 ADDWFC 0xd1,0x1,0x1 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b36 0101 MOVLB 0x1 pSrc.bRam = (byte*)&CtrlTrfData; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b38 0e28 MOVLW 0x28 003b3a 6fcc MOVWF 0xcc,0x1 003b3c 0e04 MOVLW 0x4 003b3e 6fcd MOVWF 0xcd,0x1 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b40 cfd9 MOVFF 0xfd9,0xfe9 while(byte_to_read._word) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b42 ffe9 003b44 cfda MOVFF 0xfda,0xfea 003b46 ffea 003b48 50ee MOVF 0xee,0x0,0x0 003b4a 10ed IORWF 0xed,0x0,0x0 003b4c e017 BZ 0x3b7c 003b7a d7e2 BRA 0x3b40 { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b4e c1cc MOVFF 0x1cc,0xfe9 *pDst.bRam = *pSrc.bRam; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b50 ffe9 003b52 c1cd MOVFF 0x1cd,0xfea 003b54 ffea 003b56 50ef MOVF 0xef,0x0,0x0 003b58 c1ce MOVFF 0x1ce,0xfe9 003b5a ffe9 003b5c c1cf MOVFF 0x1cf,0xfea 003b5e ffea 003b60 6eef MOVWF 0xef,0x0 003b62 0101 MOVLB 0x1 pDst.bRam++; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b64 2bce INCF 0xce,0x1,0x1 003b66 0e00 MOVLW 0x0 003b68 23cf ADDWFC 0xcf,0x1,0x1 003b6a 0101 MOVLB 0x1 pSrc.bRam++; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b6c 2bcc INCF 0xcc,0x1,0x1 003b6e 0e00 MOVLW 0x0 003b70 23cd ADDWFC 0xcd,0x1,0x1 003b72 06df DECF 0xdf,0x1,0x0 byte_to_read._word--; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b74 0e01 MOVLW 0x1 003b76 e201 BC 0x3b7a 003b78 06db DECF 0xdb,0x1,0x0 }//end while(byte_to_read._word) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b7c 0e02 MOVLW 0x2 }//end USBCtrlTrfRxService C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b7e 5ce1 SUBWF 0xe1,0x0,0x0 003b80 e202 BC 0x3b86 003b82 6ae1 CLRF 0xe1,0x0 003b84 52e5 MOVF 0xe5,0x1,0x0 003b86 6ee1 MOVWF 0xe1,0x0 003b88 52e5 MOVF 0xe5,0x1,0x0 003b8a cfe7 MOVFF 0xfe7,0xfd9 003b8c ffd9 003b8e 0012 RETURN 0x0 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBCtrlEPServiceComplete(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Overview: This routine wrap up the ramaining tasks in servicing C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * a Setup Request. Its main task is to set the endpoint C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * controls appropriately for a given situation. See code C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * below. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * There are three main scenarios: C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * a) There was no handler for the Request, in this case C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * a STALL should be sent out. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * b) The host has requested a read control transfer, C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * endpoints are required to be setup in a specific way. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * c) The host has requested a write control transfer, or C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * a control data stage is not required, endpoints are C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * required to be setup in a specific way. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Packet processing is resumed by clearing PKTDIS bit. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c void USBCtrlEPServiceComplete(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * PKTDIS bit is set when a Setup Transaction is received. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Clear to resume packet processing. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b90 986d BCF 0x6d,0x4,0x0 UCONbits.PKTDIS = 0; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b92 0101 MOVLB 0x1 if(ctrl_trf_session_owner == MUID_NULL) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b94 51cb MOVF 0xcb,0x0,0x1 003b96 e10f BNZ 0x3bb6 { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * If no one knows how to service this request then stall. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Must also prepare EP0 to receive the next SETUP transaction. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b98 0104 MOVLB 0x4 ep0Bo.Cnt = EP0_BUFF_SIZE; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003b9a 0e08 MOVLW 0x8 003b9c 6f01 MOVWF 0x1,0x1 003b9e 0104 MOVLB 0x4 ep0Bo.ADR = (byte*)&SetupPkt; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003ba0 0e20 MOVLW 0x20 003ba2 6f02 MOVWF 0x2,0x1 003ba4 0e04 MOVLW 0x4 003ba6 6f03 MOVWF 0x3,0x1 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003ba8 0104 MOVLB 0x4 ep0Bo.Stat._byte = _USIE|_BSTALL; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003baa 0e84 MOVLW 0x84 003bac 6f00 MOVWF 0x0,0x1 003bae 0104 MOVLB 0x4 ep0Bi.Stat._byte = _USIE|_BSTALL; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bb0 0e84 MOVLW 0x84 003bb2 6f04 MOVWF 0x4,0x1 } C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bb4 d03b BRA 0x3c2c else // A module has claimed ownership of the control transfer session. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bb6 0104 MOVLB 0x4 if(SetupPkt.DataDir == DEV_TO_HOST) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bb8 af20 BTFSS 0x20,0x7,0x1 003bba d025 BRA 0x3c06 { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bbc 0101 MOVLB 0x1 if(SetupPkt.wLength < wCount._word) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bbe 51d0 MOVF 0xd0,0x0,0x1 003bc0 0104 MOVLB 0x4 003bc2 5d26 SUBWF 0x26,0x0,0x1 003bc4 0101 MOVLB 0x1 003bc6 51d1 MOVF 0xd1,0x0,0x1 003bc8 0104 MOVLB 0x4 003bca 5927 SUBWFB 0x27,0x0,0x1 003bcc e204 BC 0x3bd6 003bce c426 MOVFF 0x426,0x1d0 wCount._word = SetupPkt.wLength; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bd0 f1d0 003bd2 c427 MOVFF 0x427,0x1d1 003bd4 f1d1 003bd6 df24 RCALL 0x3a20 USBCtrlTrfTxService(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bd8 0101 MOVLB 0x1 ctrl_trf_state = CTRL_TRF_TX; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bda 0e01 MOVLW 0x1 003bdc 6fca MOVWF 0xca,0x1 /* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Control Read: C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * ... | C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 1. Prepare OUT EP to respond to early termination C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * NOTE: C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * If something went wrong during the control transfer, C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * the last status stage may not be sent by the host. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * When this happens, two different things could happen C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * depending on the host. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * a) The host could send out a RESET. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * b) The host could send out a new SETUP transaction C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * without sending a RESET first. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * To properly handle case (b), the OUT EP must be setup C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * to receive either a zero length OUT transaction, or a C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * new SETUP transaction. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Since the SETUP transaction requires the DTS bit to be C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * DAT0 while the zero length OUT status requires the DTS C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * bit to be DAT1, the DTS bit check by the hardware should C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * be disabled. This way the SIE could accept either of C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * the two transactions. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Furthermore, the Cnt byte should be set to prepare for C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * the SETUP data (8-byte or more), and the buffer address C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * should be pointed to SetupPkt. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bde 0104 MOVLB 0x4 ep0Bo.Cnt = EP0_BUFF_SIZE; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003be0 0e08 MOVLW 0x8 003be2 6f01 MOVWF 0x1,0x1 003be4 0104 MOVLB 0x4 ep0Bo.ADR = (byte*)&SetupPkt; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003be6 0e20 MOVLW 0x20 003be8 6f02 MOVWF 0x2,0x1 003bea 0e04 MOVLW 0x4 003bec 6f03 MOVWF 0x3,0x1 003bee 0104 MOVLB 0x4 ep0Bo.Stat._byte = _USIE; // Note: DTSEN is 0! C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bf0 0e80 MOVLW 0x80 003bf2 6f00 MOVWF 0x0,0x1 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 2. Prepare IN EP to transfer data, Cnt should have C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * been initialized by responsible request owner. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bf4 0104 MOVLB 0x4 ep0Bi.ADR = (byte*)&CtrlTrfData; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003bf6 0e28 MOVLW 0x28 003bf8 6f06 MOVWF 0x6,0x1 003bfa 0e04 MOVLW 0x4 003bfc 6f07 MOVWF 0x7,0x1 003bfe 0104 MOVLB 0x4 ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c00 0ec8 MOVLW 0xc8 003c02 6f04 MOVWF 0x4,0x1 } C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c04 d013 BRA 0x3c2c else // (SetupPkt.DataDir == HOST_TO_DEV) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c06 0101 MOVLB 0x1 ctrl_trf_state = CTRL_TRF_RX; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c08 0e02 MOVLW 0x2 003c0a 6fca MOVWF 0xca,0x1 /* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Control Write: C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * ... | C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 1. Prepare IN EP to respond to early termination C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * This is the same as a Zero Length Packet Response C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * for control transfer without a data stage C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c0c 0104 MOVLB 0x4 ep0Bi.Cnt = 0; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c0e 6b05 CLRF 0x5,0x1 003c10 0104 MOVLB 0x4 ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c12 0ec8 MOVLW 0xc8 003c14 6f04 MOVWF 0x4,0x1 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /* C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * 2. Prepare OUT EP to receive data. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c */ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c16 0104 MOVLB 0x4 ep0Bo.Cnt = EP0_BUFF_SIZE; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c18 0e08 MOVLW 0x8 003c1a 6f01 MOVWF 0x1,0x1 003c1c 0104 MOVLB 0x4 ep0Bo.ADR = (byte*)&CtrlTrfData; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c1e 0e28 MOVLW 0x28 003c20 6f02 MOVWF 0x2,0x1 003c22 0e04 MOVLW 0x4 003c24 6f03 MOVWF 0x3,0x1 003c26 0104 MOVLB 0x4 ep0Bo.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c28 0ec8 MOVLW 0xc8 003c2a 6f00 MOVWF 0x0,0x1 }//end if(SetupPkt.DataDir == DEV_TO_HOST) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c }//end if(ctrl_trf_session_owner == MUID_NULL) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c2c 0012 RETURN 0x0 }//end USBCtrlEPServiceComplete C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /****************************************************************************** C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Function: void USBPrepareForNextSetupTrf(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * PreCondition: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Input: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Output: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Side Effects: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Overview: The routine forces EP0 OUT to be ready for a new Setup C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * transaction, and forces EP0 IN to be owned by CPU. C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c * Note: None C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c *****************************************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c void USBPrepareForNextSetupTrf(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c2e 0101 MOVLB 0x1 ctrl_trf_state = WAIT_SETUP; // See usbctrltrf.h C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c30 6bca CLRF 0xca,0x1 003c32 0104 MOVLB 0x4 ep0Bo.Cnt = EP0_BUFF_SIZE; // Defined in usbcfg.h C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c34 0e08 MOVLW 0x8 003c36 6f01 MOVWF 0x1,0x1 003c38 0104 MOVLB 0x4 ep0Bo.ADR = (byte*)&SetupPkt; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c3a 0e20 MOVLW 0x20 003c3c 6f02 MOVWF 0x2,0x1 003c3e 0e04 MOVLW 0x4 003c40 6f03 MOVWF 0x3,0x1 003c42 0104 MOVLB 0x4 ep0Bo.Stat._byte = _USIE|_DAT0|_DTSEN; // EP0 buff dsc init, see usbmmap.h C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c44 0e88 MOVLW 0x88 003c46 6f00 MOVWF 0x0,0x1 003c48 0104 MOVLB 0x4 ep0Bi.Stat._byte = _UCPU; // EP0 IN buffer initialization C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003c4a 6b04 CLRF 0x4,0x1 003c4c 0012 RETURN 0x0 }//end USBPrepareForNextSetupTrf C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /** EOF usbctrltrf.c *********************************************************/ C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c /********************************************************************* C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c * Microchip USB C18 Firmware Version 1.0 C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c ********************************************************************* C:\Projects\UBW\FW\D_143\user\user.c * FileName: user.c C:\Projects\UBW\FW\D_143\user\user.c * Dependencies: See INCLUDES section below C:\Projects\UBW\FW\D_143\user\user.c * Processor: PIC18 C:\Projects\UBW\FW\D_143\user\user.c * Compiler: C18 2.30.01+ C:\Projects\UBW\FW\D_143\user\user.c * Company: Microchip Technology, Inc. C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c * Software License Agreement C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c * The software supplied herewith by Microchip Technology Incorporated C:\Projects\UBW\FW\D_143\user\user.c * (the “Company”) for its PICmicro® Microcontroller is intended and C:\Projects\UBW\FW\D_143\user\user.c * supplied to you, the Company’s customer, for use solely and C:\Projects\UBW\FW\D_143\user\user.c * exclusively on Microchip PICmicro Microcontroller products. The C:\Projects\UBW\FW\D_143\user\user.c * software is owned by the Company and/or its supplier, and is C:\Projects\UBW\FW\D_143\user\user.c * protected under applicable copyright laws. All rights are reserved. C:\Projects\UBW\FW\D_143\user\user.c * Any use in violation of the foregoing restrictions may subject the C:\Projects\UBW\FW\D_143\user\user.c * user to criminal sanctions under applicable laws, as well as to C:\Projects\UBW\FW\D_143\user\user.c * civil liability for the breach of the terms and conditions of this C:\Projects\UBW\FW\D_143\user\user.c * license. C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c * THIS SOFTWARE IS PROVIDED IN AN “AS IS” CONDITION. NO WARRANTIES, C:\Projects\UBW\FW\D_143\user\user.c * WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED C:\Projects\UBW\FW\D_143\user\user.c * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A C:\Projects\UBW\FW\D_143\user\user.c * PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. THE COMPANY SHALL NOT, C:\Projects\UBW\FW\D_143\user\user.c * IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL OR C:\Projects\UBW\FW\D_143\user\user.c * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c * Author Date Comment C:\Projects\UBW\FW\D_143\user\user.c *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:\Projects\UBW\FW\D_143\user\user.c * Rawin Rojvanit 11/19/04 Original. C:\Projects\UBW\FW\D_143\user\user.c * Brian Schmalz 03/15/06 Added user code to impliment C:\Projects\UBW\FW\D_143\user\user.c * firmware version D v1.0 for UBW C:\Projects\UBW\FW\D_143\user\user.c * project. See www.greta.dhs.org/UBW C:\Projects\UBW\FW\D_143\user\user.c * Brian Schmalz 05/04/06 Starting version 1.1, which will C:\Projects\UBW\FW\D_143\user\user.c * include several fixes. See website. C:\Projects\UBW\FW\D_143\user\user.c * BPS 06/21/06 Starting v1.2 - C:\Projects\UBW\FW\D_143\user\user.c * - Fixed problem with I packets (from T command) filling up TX buffer C:\Projects\UBW\FW\D_143\user\user.c * and not letting any incoming commands be received. (strange) C:\Projects\UBW\FW\D_143\user\user.c * - Adding several commands - Analog inputs being the biggest set. C:\Projects\UBW\FW\D_143\user\user.c * - Also Byte read/Byte write (PEEK/POKE) anywhere in memory C:\Projects\UBW\FW\D_143\user\user.c * - Individual pin I/O and direction C:\Projects\UBW\FW\D_143\user\user.c * BPS 08/16/06 v1.3 - Fixed bug with USB startup C:\Projects\UBW\FW\D_143\user\user.c * BPS 09/09/06 v1.4 - Starting 1.4 C:\Projects\UBW\FW\D_143\user\user.c * - Fixed Microchip bug with early silicon - UCONbits.PKTDIS = 0; C:\Projects\UBW\FW\D_143\user\user.c * - Adding BO and BC commands for parallel output to graphics pannels C:\Projects\UBW\FW\D_143\user\user.c * BPS 12/06/06 v1.4 - More work on 1.4 C:\Projects\UBW\FW\D_143\user\user.c * - Re-wrote all I/O buffering code for increased speed and functionality C:\Projects\UBW\FW\D_143\user\user.c * - Re-wrote error handling code C:\Projects\UBW\FW\D_143\user\user.c * - Added delays to BC/BO commands to help Corey C:\Projects\UBW\FW\D_143\user\user.c * BPS 01/06/07 v1.4 - Added RC command for servos C:\Projects\UBW\FW\D_143\user\user.c * BPS 03/07/07 v1.4.1 - Changed blink rate for SFE C:\Projects\UBW\FW\D_143\user\user.c * BPS 05/24/07 v1.4.2 - Fixed RC command bug - it C:\Projects\UBW\FW\D_143\user\user.c * wouldn't shut off. C:\Projects\UBW\FW\D_143\user\user.c * C:\Projects\UBW\FW\D_143\user\user.c ********************************************************************/ C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c /** I N C L U D E S **********************************************************/ C:\Projects\UBW\FW\D_143\user\user.c #include C:\Projects\UBW\FW\D_143\user\user.c #include C:\Projects\UBW\FW\D_143\user\user.c #include C:\Projects\UBW\FW\D_143\user\user.c #include C:\Projects\UBW\FW\D_143\user\user.c #include C:\Projects\UBW\FW\D_143\user\user.c #include "system\typedefs.h" C:\Projects\UBW\FW\D_143\user\user.c #include "system\usb\usb.h" C:\Projects\UBW\FW\D_143\user\user.c #include "io_cfg.h" // I/O pin mapping C:\Projects\UBW\FW\D_143\user\user.c #include "user\user.h" C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c /** D E F I N E S ********************************************************/ C:\Projects\UBW\FW\D_143\user\user.c #define bitset(var,bitno) ((var) |= (1 << (bitno))) C:\Projects\UBW\FW\D_143\user\user.c #define bitclr(var,bitno) ((var) &= ~(1 << (bitno))) C:\Projects\UBW\FW\D_143\user\user.c #define bittst(var,bitno) (var& (1 << (bitno))) C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // For the RC command, we define a little data structure that holds the C:\Projects\UBW\FW\D_143\user\user.c // values assoicated with a particular servo connection C:\Projects\UBW\FW\D_143\user\user.c // It's port, pin, value (position) and state (INACTIVE, PRIMED or TIMING) C:\Projects\UBW\FW\D_143\user\user.c // Later on we make an array of these (19 elements long - 19 pins) to track C:\Projects\UBW\FW\D_143\user\user.c // the values of all of the servos. C:\Projects\UBW\FW\D_143\user\user.c typedef enum { C:\Projects\UBW\FW\D_143\user\user.c kOFF = 1 C:\Projects\UBW\FW\D_143\user\user.c ,kWAITING C:\Projects\UBW\FW\D_143\user\user.c ,kPRIMED C:\Projects\UBW\FW\D_143\user\user.c ,kTIMING C:\Projects\UBW\FW\D_143\user\user.c } tRC_state; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c #define kRC_DATA_SIZE 24 // In structs, since there are 3 ports of 8 bits each C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c #define kTX_BUF_SIZE 64 // In bytes C:\Projects\UBW\FW\D_143\user\user.c #define kRX_BUF_SIZE 64 // In bytes C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c #define kUSART_TX_BUF_SIZE 64 // In bytes C:\Projects\UBW\FW\D_143\user\user.c #define kUSART_RX_BUF_SIZE 64 // In bytes C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Enum for extract_num() function parameter C:\Projects\UBW\FW\D_143\user\user.c typedef enum { C:\Projects\UBW\FW\D_143\user\user.c kCHAR C:\Projects\UBW\FW\D_143\user\user.c ,kUCHAR C:\Projects\UBW\FW\D_143\user\user.c ,kINT C:\Projects\UBW\FW\D_143\user\user.c ,kUINT C:\Projects\UBW\FW\D_143\user\user.c ,kASCII_CHAR C:\Projects\UBW\FW\D_143\user\user.c ,kUCASE_ASCII_CHAR C:\Projects\UBW\FW\D_143\user\user.c } tExtractType; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c #define advance_RX_buf_out() \ C:\Projects\UBW\FW\D_143\user\user.c { \ C:\Projects\UBW\FW\D_143\user\user.c g_RX_buf_out++; \ C:\Projects\UBW\FW\D_143\user\user.c if (kRX_BUF_SIZE == g_RX_buf_out) \ C:\Projects\UBW\FW\D_143\user\user.c { \ C:\Projects\UBW\FW\D_143\user\user.c g_RX_buf_out = 0; \ C:\Projects\UBW\FW\D_143\user\user.c } \ C:\Projects\UBW\FW\D_143\user\user.c } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c #define kISR_FIFO_A_DEPTH 3 C:\Projects\UBW\FW\D_143\user\user.c #define kISR_FIFO_D_DEPTH 3 C:\Projects\UBW\FW\D_143\user\user.c #define kPR2_RELOAD 250 // For 1ms TMR2 tick C:\Projects\UBW\FW\D_143\user\user.c #define kCR 0x0D C:\Projects\UBW\FW\D_143\user\user.c #define kLF 0x0A C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // defines for the error_byte byte - each bit has a meaning C:\Projects\UBW\FW\D_143\user\user.c #define kERROR_BYTE_TX_BUF_OVERRUN 2 C:\Projects\UBW\FW\D_143\user\user.c #define kERROR_BYTE_RX_BUFFER_OVERRUN 3 C:\Projects\UBW\FW\D_143\user\user.c #define kERROR_BYTE_MISSING_PARAMETER 4 C:\Projects\UBW\FW\D_143\user\user.c #define kERROR_BYTE_PRINTED_ERROR 5 // We've already printed out an error C:\Projects\UBW\FW\D_143\user\user.c #define kERROR_BYTE_PARAMATER_OUTSIDE_LIMIT 6 C:\Projects\UBW\FW\D_143\user\user.c #define kERROR_BYTE_EXTRA_CHARACTERS 7 C:\Projects\UBW\FW\D_143\user\user.c #define kERROR_BYTE_UNKNOWN_COMMAND 8 // Part of command parser, not error handler C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c /** V A R I A B L E S ********************************************************/ C:\Projects\UBW\FW\D_143\user\user.c #pragma udata access fast_vars C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Rate variable - how fast does interrupt fire to capture inputs? C:\Projects\UBW\FW\D_143\user\user.c near unsigned int time_between_updates; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c near volatile unsigned int ISR_D_RepeatRate; // How many 1ms ticks between Digital updates C:\Projects\UBW\FW\D_143\user\user.c near volatile unsigned char ISR_D_FIFO_in; // In pointer C:\Projects\UBW\FW\D_143\user\user.c near volatile unsigned char ISR_D_FIFO_out; // Out pointer C:\Projects\UBW\FW\D_143\user\user.c near volatile unsigned char ISR_D_FIFO_length; // Current FIFO depth C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c near volatile unsigned int ISR_A_RepeatRate; // How many 1ms ticks between Analog updates C:\Projects\UBW\FW\D_143\user\user.c near volatile unsigned char ISR_A_FIFO_in; // In pointer C:\Projects\UBW\FW\D_143\user\user.c near volatile unsigned char ISR_A_FIFO_out; // Out pointer C:\Projects\UBW\FW\D_143\user\user.c near volatile unsigned char ISR_A_FIFO_length; // Current FIFO depth C:\Projects\UBW\FW\D_143\user\user.c near volatile unsigned char AnalogEnable; // Maximum ADC channel to convert C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // This byte has each of its bits used as a seperate error flag C:\Projects\UBW\FW\D_143\user\user.c near unsigned char error_byte; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // RC servo variables C:\Projects\UBW\FW\D_143\user\user.c // First the main array of data for each servo C:\Projects\UBW\FW\D_143\user\user.c near unsigned char g_RC_primed_ptr; C:\Projects\UBW\FW\D_143\user\user.c near unsigned char g_RC_next_ptr; C:\Projects\UBW\FW\D_143\user\user.c near unsigned char g_RC_timing_ptr; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Used only in LowISR C:\Projects\UBW\FW\D_143\user\user.c near unsigned int D_tick_counter; C:\Projects\UBW\FW\D_143\user\user.c near unsigned int A_tick_counter; C:\Projects\UBW\FW\D_143\user\user.c near unsigned char A_cur_channel; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // ROM strings C:\Projects\UBW\FW\D_143\user\user.c const rom char st_OK[] = {"OK\r\n"}; C:\Projects\UBW\FW\D_143\user\user.c const rom char st_LFCR[] = {"\r\n"}; C:\Projects\UBW\FW\D_143\user\user.c const rom char st_version[] = {"UBW FW D Version 1.4.3\r\n"}; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c #pragma udata ISR_buf=0x100 C:\Projects\UBW\FW\D_143\user\user.c volatile unsigned int ISR_A_FIFO[12][kISR_FIFO_A_DEPTH]; // Stores the most recent analog conversions C:\Projects\UBW\FW\D_143\user\user.c volatile unsigned char ISR_D_FIFO[3][kISR_FIFO_D_DEPTH]; // FIFO of actual data C:\Projects\UBW\FW\D_143\user\user.c volatile tRC_state g_RC_state[kRC_DATA_SIZE]; // Stores states for each pin for RC command C:\Projects\UBW\FW\D_143\user\user.c volatile unsigned int g_RC_value[kRC_DATA_SIZE]; // Stores reload values for TMR0 C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c #pragma udata com_buf=0x200 C:\Projects\UBW\FW\D_143\user\user.c // USB Transmit buffer for packets (back to PC) C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_TX_buf[kTX_BUF_SIZE]; C:\Projects\UBW\FW\D_143\user\user.c // USB Receiving buffer for commands as they come from PC C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_RX_buf[kRX_BUF_SIZE]; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // USART Receiving buffer for data coming from the USART C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_USART_RX_buf[kUSART_RX_BUF_SIZE]; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // USART Transmit buffer for data going to the USART C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_USART_TX_buf[kUSART_TX_BUF_SIZE]; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // These variables are in normal storage space C:\Projects\UBW\FW\D_143\user\user.c #pragma udata C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // These are used for the Fast Parallel Output routines C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_BO_init; C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_BO_strobe_mask; C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_BO_wait_mask; C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_BO_wait_delay; C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_BO_strobe_delay; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Pointers to USB transmit (back to PC) buffer C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_TX_buf_in; C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_TX_buf_out; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Pointers to USB receive (from PC) buffer C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_RX_buf_in; C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_RX_buf_out; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // In and out pointers to our USART input buffer C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_USART_RX_buf_in; C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_USART_RX_buf_out; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // In and out pointers to our USART output buffer C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_USART_TX_buf_in; C:\Projects\UBW\FW\D_143\user\user.c unsigned char g_USART_TX_buf_out; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // Normally set to TRUE. Able to set FALSE to not send "OK" message after packet recepetion C:\Projects\UBW\FW\D_143\user\user.c BOOL g_ack_enable; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c /** P R I V A T E P R O T O T Y P E S ***************************************/ C:\Projects\UBW\FW\D_143\user\user.c void BlinkUSBStatus (void); // Handles blinking the USB status LED C:\Projects\UBW\FW\D_143\user\user.c BOOL SwitchIsPressed (void); // Check to see if the user (PRG) switch is pressed C:\Projects\UBW\FW\D_143\user\user.c void parse_packet (void); // Take a full packet and dispatch it to the right function C:\Projects\UBW\FW\D_143\user\user.c signed short long extract_number (tExtractType type); // Pull a number paramter out of the packet C:\Projects\UBW\FW\D_143\user\user.c signed char extract_digit (signed short long * acc, unsigned char digits); // Pull a character out of the packet C:\Projects\UBW\FW\D_143\user\user.c void parse_R_packet (void); // R for resetting UBW C:\Projects\UBW\FW\D_143\user\user.c void parse_C_packet (void); // C for configuring I/O and analog pins C:\Projects\UBW\FW\D_143\user\user.c void parse_CX_packet (void); // CX For configuring serial port C:\Projects\UBW\FW\D_143\user\user.c void parse_O_packet (void); // O for output digital to pins C:\Projects\UBW\FW\D_143\user\user.c void parse_I_packet (void); // I for input digital from pins C:\Projects\UBW\FW\D_143\user\user.c void parse_V_packet (void); // V for printing version C:\Projects\UBW\FW\D_143\user\user.c void parse_A_packet (void); // A for requesting analog inputs C:\Projects\UBW\FW\D_143\user\user.c void parse_T_packet (void); // T for setting up timed I/O (digital or analog) C:\Projects\UBW\FW\D_143\user\user.c void parse_PI_packet (void); // PI for reading a single pin C:\Projects\UBW\FW\D_143\user\user.c void parse_PO_packet (void); // PO for setting a single pin state C:\Projects\UBW\FW\D_143\user\user.c void parse_PD_packet (void); // PD for setting a pin's direction C:\Projects\UBW\FW\D_143\user\user.c void parse_MR_packet (void); // MR for Memory Read C:\Projects\UBW\FW\D_143\user\user.c void parse_MW_packet (void); // MW for Memory Write C:\Projects\UBW\FW\D_143\user\user.c void parse_TX_packet (void); // TX for transmitting serial C:\Projects\UBW\FW\D_143\user\user.c void parse_RX_packet (void); // RX for receiving serial C:\Projects\UBW\FW\D_143\user\user.c void parse_RC_packet (void); // RC is for outputing RC servo pulses C:\Projects\UBW\FW\D_143\user\user.c void parse_BO_packet (void); // BO sends data to fast parallel output C:\Projects\UBW\FW\D_143\user\user.c void parse_BC_packet (void); // BC configures fast parallel outputs C:\Projects\UBW\FW\D_143\user\user.c void parse_BS_packet (void); // BS sends binary data to fast parallel output C:\Projects\UBW\FW\D_143\user\user.c void parse_CU_packet (void); // CU configures UBW (system wide parameters) C:\Projects\UBW\FW\D_143\user\user.c void parse_SS_packet (void); // SS Send SPI C:\Projects\UBW\FW\D_143\user\user.c void parse_RS_packet (void); // RS Receive SPI C:\Projects\UBW\FW\D_143\user\user.c void parse_CS_packet (void); // CS Configure SPI C:\Projects\UBW\FW\D_143\user\user.c void parse_SI_packet (void); // SI Send I2C C:\Projects\UBW\FW\D_143\user\user.c void parse_RI_packet (void); // RI Receive I2C C:\Projects\UBW\FW\D_143\user\user.c void parse_CI_packet (void); // CI Configure I2C C:\Projects\UBW\FW\D_143\user\user.c void check_and_send_TX_data (void); // See if there is any data to send to PC, and if so, do it C:\Projects\UBW\FW\D_143\user\user.c void print_ack (void); // Print "OK" after packet is parsed C:\Projects\UBW\FW\D_143\user\user.c int _user_putc (char c); // Our UBS based stream character printer C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c /** D E C L A R A T I O N S **************************************************/ C:\Projects\UBW\FW\D_143\user\user.c #pragma code C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c #pragma interruptlow low_ISR C:\Projects\UBW\FW\D_143\user\user.c 000844 cfd8 MOVFF 0xfd8,0xfe4 void low_ISR(void) C:\Projects\UBW\FW\D_143\user\user.c 000846 ffe4 000848 cfe0 MOVFF 0xfe0,0xfe4 00084a ffe4 00084c 6ee4 MOVWF 0xe4,0x0 00084e cfda MOVFF 0xfda,0xfe4 000850 ffe4 000852 cfe2 MOVFF 0xfe2,0xfda 000854 ffda 000856 cfe9 MOVFF 0xfe9,0xfe4 000858 ffe4 00085a cfea MOVFF 0xfea,0xfe4 00085c ffe4 00085e cff3 MOVFF 0xff3,0xfe4 000860 ffe4 000862 cff4 MOVFF 0xff4,0xfe4 000864 ffe4 000866 52e6 MOVF 0xe6,0x1,0x0 { C:\Projects\UBW\FW\D_143\user\user.c // Do we have a Timer2 interrupt? (1ms rate) C:\Projects\UBW\FW\D_143\user\user.c 000868 a29e BTFSS 0x9e,0x1,0x0 if (PIR1bits.TMR2IF) C:\Projects\UBW\FW\D_143\user\user.c 00086a d101 BRA 0xa6e { C:\Projects\UBW\FW\D_143\user\user.c // Clear the interrupt C:\Projects\UBW\FW\D_143\user\user.c 00086c 929e BCF 0x9e,0x1,0x0 PIR1bits.TMR2IF = 0; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // The most time critical part of this interrupt service routine is the C:\Projects\UBW\FW\D_143\user\user.c // handling of the RC command's servo output pulses. C:\Projects\UBW\FW\D_143\user\user.c // Each time we get this interrupt, we look to see if the next pin on the C:\Projects\UBW\FW\D_143\user\user.c // list has a value greater than zero. If so, we arm set it high and set C:\Projects\UBW\FW\D_143\user\user.c // it's state to PRIMED. Then we advance the pointers to the next pair. C:\Projects\UBW\FW\D_143\user\user.c 00086e 0e03 MOVLW 0x3 if (kPRIMED == g_RC_state[g_RC_primed_ptr]) C:\Projects\UBW\FW\D_143\user\user.c 000870 6e38 MOVWF 0x38,0x0 000872 500e MOVF 0xe,0x0,0x0 000874 6aea CLRF 0xea,0x0 000876 0f51 ADDLW 0x51 000878 6ee9 MOVWF 0xe9,0x0 00087a 0e01 MOVLW 0x1 00087c 22ea ADDWFC 0xea,0x1,0x0 00087e 50ef MOVF 0xef,0x0,0x0 000880 5c38 SUBWF 0x38,0x0,0x0 000882 e130 BNZ 0x8e4 { C:\Projects\UBW\FW\D_143\user\user.c // This is easy, throw the value into the timer C:\Projects\UBW\FW\D_143\user\user.c 000884 500e MOVF 0xe,0x0,0x0 TMR0H = g_RC_value[g_RC_primed_ptr] >> 8; C:\Projects\UBW\FW\D_143\user\user.c 000886 6ee9 MOVWF 0xe9,0x0 000888 6aea CLRF 0xea,0x0 00088a 90d8 BCF 0xd8,0x0,0x0 00088c 36e9 RLCF 0xe9,0x1,0x0 00088e 36ea RLCF 0xea,0x1,0x0 000890 0e69 MOVLW 0x69 000892 26e9 ADDWF 0xe9,0x1,0x0 000894 0e01 MOVLW 0x1 000896 22ea ADDWFC 0xea,0x1,0x0 000898 cfee MOVFF 0xfee,0x38 00089a f038 00089c cfef MOVFF 0xfef,0x39 00089e f039 0008a0 c039 MOVFF 0x39,0x38 0008a2 f038 0008a4 6a39 CLRF 0x39,0x0 0008a6 5038 MOVF 0x38,0x0,0x0 0008a8 6ed7 MOVWF 0xd7,0x0 0008aa 500e MOVF 0xe,0x0,0x0 TMR0L = g_RC_value[g_RC_primed_ptr] & 0xFF; C:\Projects\UBW\FW\D_143\user\user.c 0008ac 6ee9 MOVWF 0xe9,0x0 0008ae 6aea CLRF 0xea,0x0 0008b0 90d8 BCF 0xd8,0x0,0x0 0008b2 36e9 RLCF 0xe9,0x1,0x0 0008b4 36ea RLCF 0xea,0x1,0x0 0008b6 0e69 MOVLW 0x69 0008b8 26e9 ADDWF 0xe9,0x1,0x0 0008ba 0e01 MOVLW 0x1 0008bc 22ea ADDWFC 0xea,0x1,0x0 0008be cfee MOVFF 0xfee,0x38 0008c0 f038 0008c2 cfef MOVFF 0xfef,0x39 0008c4 f039 0008c6 5038 MOVF 0x38,0x0,0x0 0008c8 6ed6 MOVWF 0xd6,0x0 C:\Projects\UBW\FW\D_143\user\user.c // Then make sure the timer's interrupt enable is set C:\Projects\UBW\FW\D_143\user\user.c 0008ca 8af2 BSF 0xf2,0x5,0x0 INTCONbits.TMR0IE = 1; C:\Projects\UBW\FW\D_143\user\user.c // And be sure to clear the flag too C:\Projects\UBW\FW\D_143\user\user.c 0008cc 94f2 BCF 0xf2,0x2,0x0 INTCONbits.TMR0IF = 0; C:\Projects\UBW\FW\D_143\user\user.c // Turn on Timer0 C:\Projects\UBW\FW\D_143\user\user.c 0008ce 8ed5 BSF 0xd5,0x7,0x0 T0CONbits.TMR0ON = 1; C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c // And set this pin's state to timing C:\Projects\UBW\FW\D_143\user\user.c 0008d0 500e MOVF 0xe,0x0,0x0 g_RC_state[g_RC_primed_ptr] = kTIMING; C:\Projects\UBW\FW\D_143\user\user.c 0008d2 6aea CLRF 0xea,0x0 0008d4 0f51 ADDLW 0x51 0008d6 6ee9 MOVWF 0xe9,0x0 0008d8 0e01 MOVLW 0x1 0008da 22ea ADDWFC 0xea,0x1,0x0 0008dc 0e04 MOVLW 0x4 0008de 6eef MOVWF 0xef,0x0 C:\Projects\UBW\FW\D_143\user\user.c // Remember which pin is now timing C:\Projects\UBW\FW\D_143\user\user.c 0008e0 500e MOVF 0xe,0x0,0x0 g_RC_timing_ptr = g_RC_primed_ptr; C:\Projects\UBW\FW\D_143\user\user.c 0008e2 6e10 MOVWF 0x10,0x0 } C:\Projects\UBW\FW\D_143\user\user.c C:\Projects\UBW\FW\D_143\user\user.c 0008e4 0e02 MOVLW 0x2 if (kWAITING == g_RC_state[g_RC_next_ptr]) C:\Projects\UBW\FW\D_143\user\user.c 0008e6 6e38 MOVWF 0x38,0x0 0008e8 500f MOVF 0xf,0x0,0x0 0008ea 6aea CLRF 0xea,0x0 0008ec 0f51 ADDLW 0x51 0008ee 6ee9 MOVWF 0xe9,0x0 0008f0 0e01 MOVLW 0x1 0008f2 22ea ADDWFC 0xea,0x1,0x0 0008f4 50ef MOVF 0xef,0x0,0x0 0008f6 5c38 SUBWF 0x38,0x0,0x0 0008f8 e149 BNZ 0x98c { C:\Projects\UBW\FW\D_143\user\user.c // If the value is zero, then shut this pin off C:\Projects\UBW\FW\D_143\user\user.c // otherwise, prime it for sending a pulse C:\Projects\UBW\FW\D_143\user\user.c 0008fa 500f MOVF 0xf,0x0,0x0 if (0 == g_RC_value[g_RC_next_ptr]) C:\Projects\UBW\FW\D_143\user\user.c 0008fc 6ee9 MOVWF 0xe9,0x0 0008fe 6aea CLRF 0xea,0x0 000900 90d8 BCF 0xd8,0x0,0x0 000902 36e9 RLCF 0xe9,0x1,0x0 000904 36ea RLCF 0xea,0x1,0x0 000906 0e69 MOVLW 0x69 000908 26e9 ADDWF 0xe9,0x1,0x0 00090a 0e01 MOVLW 0x1 00090c 22ea ADDWFC 0xea,0x1,0x0 00090e 50ee MOVF 0xee,0x0,0x0 000910 10ed IORWF 0xed,0x0,0x0 000912 e109 BNZ 0x926 { C:\Projects\UBW\FW\D_143\user\user.c 000914 500f MOVF 0xf,0x0,0x0 g_RC_state[g_RC_next_ptr] = kOFF; C:\Projects\UBW\FW\D_143\user\user.c 000916 6aea CLRF 0xea,0x0 000918 0f51 ADDLW 0x51 00091a 6ee9 MOVWF 0xe9,0x0 00091c 0e01 MOVLW 0x1 00091e 22ea ADDWFC 0xea,0x1,0x0 000920 0e01 MOVLW 0x1 000922 6eef MOVWF 0xef,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 000924 d033 BRA 0x98c else C:\Projects\UBW\FW\D_143\user\user.c { C:\Projects\UBW\FW\D_143\user\user.c // Set the bit high C:\Projects\UBW\FW\D_143\user\user.c 000926 0e08 MOVLW 0x8 if (g_RC_next_ptr < 8) C:\Projects\UBW\FW\D_143\user\user.c 000928 5c0f SUBWF 0xf,0x0,0x0 00092a e20c BC 0x944 { C:\Projects\UBW\FW\D_143\user\user.c 00092c 0e07 MOVLW 0x7 bitset (LATA, g_RC_next_ptr & 0x7); C:\Projects\UBW\FW\D_143\user\user.c 00092e 140f ANDWF 0xf,0x0,0x0 000930 6e38 MOVWF 0x38,0x0 000932 0e01 MOVLW 0x1 000934 5238 MOVF 0x38,0x1,0x0 000936 e004 BZ 0x940 000938 46e8 RLNCF 0xe8,0x1,0x0 00093a 0bfe ANDLW 0xfe 00093c 0638 DECF 0x38,0x1,0x0 00093e e1fc BNZ 0x938 000940 1289 IORWF 0x89,0x1,0x0 } C:\Projects\UBW\FW\D_143\user\user.c 000942 d01a BRA 0x978 else if (g_RC_next_ptr < 16) C:\Projects\UBW\FW\D_143\user\user.c 000944 0e10 MOVLW 0x10 000946 5c0f SUBWF 0xf,0x0,0x0 000948 e20c BC 0x962 {