MP2COD 4.12, COFF to COD File Converter Copyright (c) 2007 Microchip Technology Inc. Listing File Generated: Tue Aug 28 22:40:25 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 004544 d805 RCALL 0x4550 InitializeSystem(); C:\Projects\UBW\FW\D_143\main.c 00454c d7fc BRA 0x4546 while(1) C:\Projects\UBW\FW\D_143\main.c { C:\Projects\UBW\FW\D_143\main.c 004546 d811 RCALL 0x456a USBTasks(); // USB Tasks C:\Projects\UBW\FW\D_143\main.c 004548 ec8f CALL 0xd1e,0x0 ProcessIO(); // See user\user.c & .h C:\Projects\UBW\FW\D_143\main.c 00454a f006 }//end while C:\Projects\UBW\FW\D_143\main.c 00454e 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 004550 0e0f MOVLW 0xf ADCON1 |= 0x0F; // Default all pins to digital C:\Projects\UBW\FW\D_143\main.c 004552 12c1 IORWF 0xc1,0x1,0x0 C:\Projects\UBW\FW\D_143\main.c 004554 0e14 MOVLW 0x14 mInitializeUSBDriver(); // See usbdrv.h C:\Projects\UBW\FW\D_143\main.c 004556 6e6f MOVWF 0x6f,0x0 004558 0101 MOVLB 0x1 00455a 6bd2 CLRF 0xd2,0x1 00455c 0101 MOVLB 0x1 00455e 6bd3 CLRF 0xd3,0x1 004560 0101 MOVLB 0x1 004562 6bd4 CLRF 0xd4,0x1 C:\Projects\UBW\FW\D_143\main.c 004564 ecc4 CALL 0xb88,0x0 UserInit(); // See user.c & .h C:\Projects\UBW\FW\D_143\main.c 004566 f005 C:\Projects\UBW\FW\D_143\main.c 004568 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 00456a eccd CALL 0x3d9a,0x0 USBCheckBusStatus(); // Must use polling method C:\Projects\UBW\FW\D_143\main.c 00456c f01e 00456e be6f BTFSC 0x6f,0x7,0x0 if(UCFGbits.UTEYE!=1) C:\Projects\UBW\FW\D_143\main.c 004570 d002 BRA 0x4576 004572 eced CALL 0x3dda,0x0 USBDriverService(); // Interrupt or polling method C:\Projects\UBW\FW\D_143\main.c 004574 f01e C:\Projects\UBW\FW\D_143\main.c #if defined(USB_USE_CDC) C:\Projects\UBW\FW\D_143\main.c 004576 ec17 CALL 0x362e,0x0 CDCTxService(); C:\Projects\UBW\FW\D_143\main.c 004578 f01b #endif C:\Projects\UBW\FW\D_143\main.c C:\Projects\UBW\FW\D_143\main.c 00457a 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 003d9a a66d BTFSS 0x6d,0x3,0x0 if(UCONbits.USBEN == 0) // Is the module off? C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003d9c d810 RCALL 0x3dbe 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 003d9e d002 BRA 0x3da4 else C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003da0 b66d BTFSC 0x6d,0x3,0x0 if(UCONbits.USBEN == 1) // Is the module on? C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003da2 d814 RCALL 0x3dcc 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 003da4 0101 MOVLB 0x1 if(usb_device_state == ATTACHED_STATE) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003da6 05d2 DECF 0xd2,0x0,0x1 003da8 e109 BNZ 0x3dbc { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003daa ba6d BTFSC 0x6d,0x5,0x0 if(!UCONbits.SE0) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003dac d007 BRA 0x3dbc { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003dae 6a68 CLRF 0x68,0x0 UIR = 0; // Clear all USB interrupts C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003db0 6a69 CLRF 0x69,0x0 UIE = 0; // Mask all USB interrupts C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003db2 8069 BSF 0x69,0x0,0x0 UIEbits.URSTIE = 1; // Unmask RESET interrupt C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003db4 8869 BSF 0x69,0x4,0x0 UIEbits.IDLEIE = 1; // Unmask IDLE interrupt C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003db6 0101 MOVLB 0x1 usb_device_state = POWERED_STATE; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003db8 0e02 MOVLW 0x2 003dba 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 003dbc 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 003dbe 6a6d CLRF 0x6d,0x0 UCON = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003dc0 6a69 CLRF 0x69,0x0 UIE = 0; // Mask all USB interrupts C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003dc2 866d BSF 0x6d,0x3,0x0 UCONbits.USBEN = 1; // Enable module & attach to bus C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003dc4 0101 MOVLB 0x1 usb_device_state = ATTACHED_STATE; // Defined in usbmmap.c & .h C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003dc6 0e01 MOVLW 0x1 003dc8 6fd2 MOVWF 0xd2,0x1 003dca 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 003dcc 6a6d CLRF 0x6d,0x0 UCON = 0; // Disable module & detach from bus C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003dce 6a69 CLRF 0x69,0x0 UIE = 0; // Mask all USB interrupts C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003dd0 0101 MOVLB 0x1 usb_device_state = DETACHED_STATE; // Defined in usbmmap.c & .h C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003dd2 6bd2 CLRF 0xd2,0x1 003dd4 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 003dd6 dffa RCALL 0x3dcc USBModuleDisable(); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003dd8 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 003dda 0101 MOVLB 0x1 if(usb_device_state == DETACHED_STATE) return; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003ddc 51d2 MOVF 0xd2,0x0,0x1 003dde e101 BNZ 0x3de2 003de0 d03a BRA 0x3e56 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 003de2 5068 MOVF 0x68,0x0,0x0 if(UIRbits.ACTVIF && UIEbits.ACTVIE) USBWakeFromSuspend(); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003de4 0b04 ANDLW 0x4 003de6 e004 BZ 0x3df0 003de8 5069 MOVF 0x69,0x0,0x0 003dea 0b04 ANDLW 0x4 003dec e001 BZ 0x3df0 003dee d83c RCALL 0x3e68 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 003df0 b26d BTFSC 0x6d,0x1,0x0 if(UCONbits.SUSPND==1) return; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003df2 d031 BRA 0x3e56 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 003df4 5068 MOVF 0x68,0x0,0x0 if(UIRbits.URSTIF && UIEbits.URSTIE) USBProtocolResetHandler(); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003df6 0b01 ANDLW 0x1 003df8 e004 BZ 0x3e02 003dfa 5069 MOVF 0x69,0x0,0x0 003dfc 0b01 ANDLW 0x1 003dfe e001 BZ 0x3e02 003e00 d856 RCALL 0x3eae 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 003e02 5068 MOVF 0x68,0x0,0x0 if(UIRbits.IDLEIF && UIEbits.IDLEIE) USBSuspend(); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003e04 0b10 ANDLW 0x10 003e06 e004 BZ 0x3e10 003e08 5069 MOVF 0x69,0x0,0x0 003e0a 0b10 ANDLW 0x10 003e0c e001 BZ 0x3e10 003e0e d824 RCALL 0x3e58 003e10 5068 MOVF 0x68,0x0,0x0 if(UIRbits.SOFIF && UIEbits.SOFIE) USB_SOF_Handler(); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003e12 0b40 ANDLW 0x40 003e14 e004 BZ 0x3e1e 003e16 5069 MOVF 0x69,0x0,0x0 003e18 0b40 ANDLW 0x40 003e1a e001 BZ 0x3e1e 003e1c d83d RCALL 0x3e98 003e1e 5068 MOVF 0x68,0x0,0x0 if(UIRbits.STALLIF && UIEbits.STALLIE) USBStallHandler(); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003e20 0b20 ANDLW 0x20 003e22 e004 BZ 0x3e2c 003e24 5069 MOVF 0x69,0x0,0x0 003e26 0b20 ANDLW 0x20 003e28 e001 BZ 0x3e2c 003e2a d838 RCALL 0x3e9c 003e2c 5068 MOVF 0x68,0x0,0x0 if(UIRbits.UERRIF && UIEbits.UERRIE) USBErrorHandler(); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003e2e 0b02 ANDLW 0x2 003e30 e004 BZ 0x3e3a 003e32 5069 MOVF 0x69,0x0,0x0 003e34 0b02 ANDLW 0x2 003e36 e001 BZ 0x3e3a 003e38 d838 RCALL 0x3eaa 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 003e3a 0e03 MOVLW 0x3 if(usb_device_state < DEFAULT_STATE) return; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003e3c 0101 MOVLB 0x1 003e3e 5dd2 SUBWF 0xd2,0x0,0x1 003e40 e201 BC 0x3e44 003e42 d009 BRA 0x3e56 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 003e44 5068 MOVF 0x68,0x0,0x0 if(UIRbits.TRNIF && UIEbits.TRNIE) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003e46 0b08 ANDLW 0x8 003e48 e006 BZ 0x3e56 003e4a 5069 MOVF 0x69,0x0,0x0 003e4c 0b08 ANDLW 0x8 003e4e e003 BZ 0x3e56 { 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 003e50 eca1 CALL 0x3742,0x0 USBCtrlEPService(); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003e52 f01b 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 003e54 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 003e56 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 003e58 8469 BSF 0x69,0x2,0x0 UIEbits.ACTVIE = 1; // Enable bus activity interrupt C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003e5a 9868 BCF 0x68,0x4,0x0 UIRbits.IDLEIF = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003e5c 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 003e5e 9aa1 BCF 0xa1,0x5,0x0 PIR2bits.USBIF = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003e60 8aa0 BSF 0xa0,0x5,0x0 PIE2bits.USBIE = 1; // Set USB wakeup source C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003e62 0003 SLEEP Sleep(); // Goto sleep C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003e64 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 003e66 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 003e68 926d BCF 0x6d,0x1,0x0 UCONbits.SUSPND = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003e6a 9469 BCF 0x69,0x2,0x0 UIEbits.ACTVIE = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003e6c 9468 BCF 0x68,0x2,0x0 UIRbits.ACTVIF = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003e6e 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 003e70 0101 MOVLB 0x1 if(usb_stat.RemoteWakeup == 1) // Check if RemoteWakeup function C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003e72 a1d3 BTFSS 0xd3,0x0,0x1 003e74 d010 BRA 0x3e96 { // has been enabled by the host. C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003e76 dff8 RCALL 0x3e68 USBWakeFromSuspend(); // Unsuspend USB modue C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003e78 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 003e7a 0101 MOVLB 0x1 delay_count = 1800U; // Set RESUME line for 1-13 ms C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003e7c 0e08 MOVLW 0x8 003e7e 6fda MOVWF 0xda,0x1 003e80 0e07 MOVLW 0x7 003e82 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 003e84 0101 MOVLB 0x1 delay_count--; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003e86 07da DECF 0xda,0x1,0x1 003e88 0e00 MOVLW 0x0 003e8a 5bdb SUBWFB 0xdb,0x1,0x1 003e8c 0101 MOVLB 0x1 }while(delay_count); C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003e8e 51da MOVF 0xda,0x0,0x1 003e90 11db IORWF 0xdb,0x0,0x1 003e92 e1f8 BNZ 0x3e84 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 003e94 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 003e96 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 003e98 9c68 BCF 0x68,0x6,0x0 UIRbits.SOFIF = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003e9a 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 003e9c a070 BTFSS 0x70,0x0,0x0 if(UEP0bits.EPSTALL == 1) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003e9e d003 BRA 0x3ea6 { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003ea0 ec2e CALL 0x3a5c,0x0 USBPrepareForNextSetupTrf(); // Firmware work-around C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003ea2 f01d 003ea4 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 003ea6 9a68 BCF 0x68,0x5,0x0 UIRbits.STALLIF = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003ea8 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 003eaa 9268 BCF 0x68,0x1,0x0 UIRbits.UERRIF = 0; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003eac 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 003eae 6a6a CLRF 0x6a,0x0 UEIR = 0; // Clear all USB error flags C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003eb0 6a68 CLRF 0x68,0x0 UIR = 0; // Clears all USB interrupts C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003eb2 0e9f MOVLW 0x9f UEIE = 0b10011111; // Unmask all USB error interrupts C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003eb4 6e6b MOVWF 0x6b,0x0 003eb6 0e7b MOVLW 0x7b UIE = 0b01111011; // Enable all interrupts except ACTVIE C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003eb8 6e69 MOVWF 0x69,0x0 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003eba 6a6e CLRF 0x6e,0x0 UADDR = 0x00; // Reset to default address C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003ebc 0e0f MOVLW 0xf mDisableEP1to15(); // Reset all non-EP0 UEPn registers C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003ebe 6ee6 MOVWF 0xe6,0x0 003ec0 0e71 MOVLW 0x71 003ec2 6ee6 MOVWF 0xe6,0x0 003ec4 0e0f MOVLW 0xf 003ec6 6ee6 MOVWF 0xe6,0x0 003ec8 d814 RCALL 0x3ef2 003eca 52e5 MOVF 0xe5,0x1,0x0 003ecc 52e5 MOVF 0xe5,0x1,0x0 003ece 52e5 MOVF 0xe5,0x1,0x0 003ed0 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 003ed2 6e70 MOVWF 0x70,0x0 C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003ed4 a668 BTFSS 0x68,0x3,0x0 while(UIRbits.TRNIF == 1) // Flush any pending transactions C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003ed6 d002 BRA 0x3edc 003eda d7fc BRA 0x3ed4 003ed8 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 003edc 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 003ede ec2e CALL 0x3a5c,0x0 USBPrepareForNextSetupTrf(); // Declared in usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003ee0 f01d C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003ee2 0101 MOVLB 0x1 usb_stat.RemoteWakeup = 0; // Default status flag to disable C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003ee4 91d3 BCF 0xd3,0x0,0x1 003ee6 0101 MOVLB 0x1 usb_active_cfg = 0; // Clear active configuration C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003ee8 6bd4 CLRF 0xd4,0x1 003eea 0101 MOVLB 0x1 usb_device_state = DEFAULT_STATE; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003eec 0e03 MOVLW 0x3 003eee 6fd2 MOVWF 0xd2,0x1 003ef0 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 003ef2 cfd9 MOVFF 0xfd9,0xfe6 void ClearArray(byte* startAdr,byte count) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003ef4 ffe6 003ef6 cfe1 MOVFF 0xfe1,0xfd9 003ef8 ffd9 { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003efa 0efd MOVLW 0xfd *startAdr; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003efc cfdb MOVFF 0xfdb,0xfe9 003efe ffe9 003f00 0efe MOVLW 0xfe 003f02 cfdb MOVFF 0xfdb,0xfea 003f04 ffea 003f06 0efc MOVLW 0xfc while(count) C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f08 50db MOVF 0xdb,0x0,0x0 003f0a e004 BZ 0x3f14 003f12 d7f9 BRA 0x3f06 { C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c _asm C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f0c 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 003f0e 0efc MOVLW 0xfc count--; C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f10 06db DECF 0xdb,0x1,0x0 }//end while C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f14 52e5 MOVF 0xe5,0x1,0x0 }//end ClearArray C:\Projects\UBW\FW\D_143\system\usb\usbdrv\usbdrv.c 003f16 cfe7 MOVFF 0xfe7,0xfd9 003f18 ffd9 003f1a 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 003a7c 0104 MOVLB 0x4 if(SetupPkt.RequestType != STANDARD) return; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003a7e 5120 MOVF 0x20,0x0,0x1 003a80 0b60 ANDLW 0x60 003a82 42e8 RRNCF 0xe8,0x1,0x0 003a84 42e8 RRNCF 0xe8,0x1,0x0 003a86 42e8 RRNCF 0xe8,0x1,0x0 003a88 42e8 RRNCF 0xe8,0x1,0x0 003a8a 42e8 RRNCF 0xe8,0x1,0x0 003a8c 0900 IORLW 0x0 003a8e e001 BZ 0x3a92 003a90 d058 BRA 0x3b42 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003a92 0104 MOVLB 0x4 switch(SetupPkt.bRequest) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003a94 5121 MOVF 0x21,0x0,0x1 003a96 0a07 XORLW 0x7 003a98 e053 BZ 0x3b40 003a9a 0a0b XORLW 0xb 003a9c e051 BZ 0x3b40 003a9e 0a07 XORLW 0x7 003aa0 e042 BZ 0x3b26 003aa2 0a01 XORLW 0x1 003aa4 e02c BZ 0x3afe 003aa6 0a0b XORLW 0xb 003aa8 e028 BZ 0x3afa 003aaa 0a02 XORLW 0x2 003aac e026 BZ 0x3afa 003aae 0a03 XORLW 0x3 003ab0 e022 BZ 0x3af6 003ab2 0a08 XORLW 0x8 003ab4 e012 BZ 0x3ada 003ab6 0a01 XORLW 0x1 003ab8 e00e BZ 0x3ad6 003aba 0a0f XORLW 0xf 003abc e00a BZ 0x3ad2 003abe 0a03 XORLW 0x3 003ac0 e001 BZ 0x3ac4 003ac2 d03e BRA 0x3b40 { 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 003ac4 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ac6 0e01 MOVLW 0x1 003ac8 6fcb MOVWF 0xcb,0x1 003aca 0101 MOVLB 0x1 usb_device_state = ADR_PENDING_STATE; // Update state only C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003acc 0e04 MOVLW 0x4 003ace 6fd2 MOVWF 0xd2,0x1 /* See USBCtrlTrfInHandler() in usbctrltrf.c for the next step */ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ad0 d038 BRA 0x3b42 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 003ad2 d838 RCALL 0x3b44 USBStdGetDscHandler(); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ad4 d036 BRA 0x3b42 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 003ad6 d893 RCALL 0x3bfe USBStdSetCfgHandler(); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ad8 d034 BRA 0x3b42 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 003ada 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003adc 0e01 MOVLW 0x1 003ade 6fcb MOVWF 0xcb,0x1 003ae0 0101 MOVLB 0x1 pSrc.bRam = (byte*)&usb_active_cfg; // Set Source C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ae2 0ed4 MOVLW 0xd4 003ae4 6fcc MOVWF 0xcc,0x1 003ae6 0e01 MOVLW 0x1 003ae8 6fcd MOVWF 0xcd,0x1 003aea 0101 MOVLB 0x1 usb_stat.ctrl_trf_mem = _RAM; // Set memory type C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003aec 93d3 BCF 0xd3,0x1,0x1 003aee 0101 MOVLB 0x1 LSB(wCount) = 1; // Set data count C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003af0 0e01 MOVLW 0x1 003af2 6fd0 MOVWF 0xd0,0x1 003af4 d026 BRA 0x3b42 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 003af6 d8ab RCALL 0x3c4e USBStdGetStatusHandler(); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003af8 d024 BRA 0x3b42 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 003afa d8f9 RCALL 0x3cee USBStdFeatureReqHandler(); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003afc d022 BRA 0x3b42 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 003afe 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003b00 0e01 MOVLW 0x1 003b02 6fcb MOVWF 0xcb,0x1 003b04 0104 MOVLB 0x4 pSrc.bRam = (byte*)&usb_alt_intf+SetupPkt.bIntfID; // Set source C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003b06 5124 MOVF 0x24,0x0,0x1 003b08 0101 MOVLB 0x1 003b0a 6fcc MOVWF 0xcc,0x1 003b0c 6bcd CLRF 0xcd,0x1 003b0e 0ed5 MOVLW 0xd5 003b10 0101 MOVLB 0x1 003b12 27cc ADDWF 0xcc,0x1,0x1 003b14 0e01 MOVLW 0x1 003b16 0101 MOVLB 0x1 003b18 23cd ADDWFC 0xcd,0x1,0x1 003b1a 0101 MOVLB 0x1 usb_stat.ctrl_trf_mem = _RAM; // Set memory type C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003b1c 93d3 BCF 0xd3,0x1,0x1 003b1e 0101 MOVLB 0x1 LSB(wCount) = 1; // Set data count C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003b20 0e01 MOVLW 0x1 003b22 6fd0 MOVWF 0xd0,0x1 003b24 d00e BRA 0x3b42 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 003b26 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003b28 0e01 MOVLW 0x1 003b2a 6fcb MOVWF 0xcb,0x1 003b2c 0104 MOVLB 0x4 usb_alt_intf[SetupPkt.bIntfID] = SetupPkt.bAltID; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003b2e 5124 MOVF 0x24,0x0,0x1 003b30 6aea CLRF 0xea,0x0 003b32 0fd5 ADDLW 0xd5 003b34 6ee9 MOVWF 0xe9,0x0 003b36 0e01 MOVLW 0x1 003b38 22ea ADDWFC 0xea,0x1,0x0 003b3a c422 MOVFF 0x422,0xfef 003b3c ffef 003b3e d001 BRA 0x3b42 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 003b40 d000 BRA 0x3b42 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 003b42 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 003b44 0e80 MOVLW 0x80 if(SetupPkt.bmRequestType == 0x80) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003b46 0104 MOVLB 0x4 003b48 5d20 SUBWF 0x20,0x0,0x1 003b4a e158 BNZ 0x3bfc { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003b4c 0104 MOVLB 0x4 switch(SetupPkt.bDscType) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003b4e 5123 MOVF 0x23,0x0,0x1 003b50 0a03 XORLW 0x3 003b52 e034 BZ 0x3bbc 003b54 0a01 XORLW 0x1 003b56 e010 BZ 0x3b78 003b58 0a03 XORLW 0x3 003b5a e001 BZ 0x3b5e 003b5c d04d BRA 0x3bf8 { 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 003b5e 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003b60 0e01 MOVLW 0x1 003b62 6fcb MOVWF 0xcb,0x1 003b64 0101 MOVLB 0x1 pSrc.bRom = (rom byte*)&device_dsc; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003b66 0e52 MOVLW 0x52 003b68 6fcc MOVWF 0xcc,0x1 003b6a 0e41 MOVLW 0x41 003b6c 6fcd MOVWF 0xcd,0x1 003b6e 0e12 MOVLW 0x12 wCount._word = sizeof(device_dsc); // Set data count C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003b70 0101 MOVLB 0x1 003b72 6fd0 MOVWF 0xd0,0x1 003b74 6bd1 CLRF 0xd1,0x1 003b76 d040 BRA 0x3bf8 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 003b78 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003b7a 0e01 MOVLW 0x1 003b7c 6fcb MOVWF 0xcb,0x1 003b7e 0104 MOVLB 0x4 pSrc.bRom = *(USB_CD_Ptr+SetupPkt.bDscIndex); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003b80 5122 MOVF 0x22,0x0,0x1 003b82 6ef6 MOVWF 0xf6,0x0 003b84 6af7 CLRF 0xf7,0x0 003b86 90d8 BCF 0xd8,0x0,0x0 003b88 36f6 RLCF 0xf6,0x1,0x0 003b8a 36f7 RLCF 0xf7,0x1,0x0 003b8c 0e13 MOVLW 0x13 003b8e 26f6 ADDWF 0xf6,0x1,0x0 003b90 0e42 MOVLW 0x42 003b92 22f7 ADDWFC 0xf7,0x1,0x0 003b94 0009 TBLRDPOSTINC 003b96 cff5 MOVFF 0xff5,0x1cc 003b98 f1cc 003b9a 000a TBLRDPOSTDEC 003b9c cff5 MOVFF 0xff5,0x1cd 003b9e f1cd 003ba0 0e02 MOVLW 0x2 wCount._word = *(pSrc.wRom+1); // Set data count C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ba2 0101 MOVLB 0x1 003ba4 6af7 CLRF 0xf7,0x0 003ba6 25cc ADDWF 0xcc,0x0,0x1 003ba8 6ef6 MOVWF 0xf6,0x0 003baa 51cd MOVF 0xcd,0x0,0x1 003bac 22f7 ADDWFC 0xf7,0x1,0x0 003bae 0009 TBLRDPOSTINC 003bb0 cff5 MOVFF 0xff5,0x1d0 003bb2 f1d0 003bb4 000a TBLRDPOSTDEC 003bb6 cff5 MOVFF 0xff5,0x1d1 003bb8 f1d1 003bba d01e BRA 0x3bf8 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 003bbc 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003bbe 0e01 MOVLW 0x1 003bc0 6fcb MOVWF 0xcb,0x1 003bc2 0104 MOVLB 0x4 pSrc.bRom = *(USB_SD_Ptr+SetupPkt.bDscIndex); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003bc4 5122 MOVF 0x22,0x0,0x1 003bc6 6ef6 MOVWF 0xf6,0x0 003bc8 6af7 CLRF 0xf7,0x0 003bca 90d8 BCF 0xd8,0x0,0x0 003bcc 36f6 RLCF 0xf6,0x1,0x0 003bce 36f7 RLCF 0xf7,0x1,0x0 003bd0 0e17 MOVLW 0x17 003bd2 26f6 ADDWF 0xf6,0x1,0x0 003bd4 0e42 MOVLW 0x42 003bd6 22f7 ADDWFC 0xf7,0x1,0x0 003bd8 0009 TBLRDPOSTINC 003bda cff5 MOVFF 0xff5,0x1cc 003bdc f1cc 003bde 000a TBLRDPOSTDEC 003be0 cff5 MOVFF 0xff5,0x1cd 003be2 f1cd 003be4 c1cc MOVFF 0x1cc,0xff6 wCount._word = *pSrc.bRom; // Set data count C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003be6 fff6 003be8 c1cd MOVFF 0x1cd,0xff7 003bea fff7 003bec 0008 TBLRD 003bee 50f5 MOVF 0xf5,0x0,0x0 003bf0 0101 MOVLB 0x1 003bf2 6fd0 MOVWF 0xd0,0x1 003bf4 6bd1 CLRF 0xd1,0x1 003bf6 d000 BRA 0x3bf8 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 003bf8 0101 MOVLB 0x1 usb_stat.ctrl_trf_mem = _ROM; // Set memory type C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003bfa 83d3 BSF 0xd3,0x1,0x1 }//end if C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003bfc 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 003bfe 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c00 0e01 MOVLW 0x1 003c02 6fcb MOVWF 0xcb,0x1 003c04 0e0f MOVLW 0xf mDisableEP1to15(); // See usbdrv.h C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c06 6ee6 MOVWF 0xe6,0x0 003c08 0e71 MOVLW 0x71 003c0a 6ee6 MOVWF 0xe6,0x0 003c0c 0e0f MOVLW 0xf 003c0e 6ee6 MOVWF 0xe6,0x0 003c10 ec79 CALL 0x3ef2,0x0 003c12 f01f 003c14 52e5 MOVF 0xe5,0x1,0x0 003c16 52e5 MOVF 0xe5,0x1,0x0 003c18 52e5 MOVF 0xe5,0x1,0x0 003c1a 0e01 MOVLW 0x1 ClearArray((byte*)&usb_alt_intf,MAX_NUM_INT); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c1c 6ee6 MOVWF 0xe6,0x0 003c1e 0ed5 MOVLW 0xd5 003c20 6ee6 MOVWF 0xe6,0x0 003c22 0e01 MOVLW 0x1 003c24 6ee6 MOVWF 0xe6,0x0 003c26 ec79 CALL 0x3ef2,0x0 003c28 f01f 003c2a 52e5 MOVF 0xe5,0x1,0x0 003c2c 52e5 MOVF 0xe5,0x1,0x0 003c2e 52e5 MOVF 0xe5,0x1,0x0 003c30 c422 MOVFF 0x422,0x1d4 usb_active_cfg = SetupPkt.bCfgValue; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c32 f1d4 003c34 0104 MOVLB 0x4 if(SetupPkt.bCfgValue == 0) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c36 5122 MOVF 0x22,0x0,0x1 003c38 e104 BNZ 0x3c42 003c3a 0101 MOVLB 0x1 usb_device_state = ADDRESS_STATE; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c3c 0e05 MOVLW 0x5 003c3e 6fd2 MOVWF 0xd2,0x1 003c40 d005 BRA 0x3c4c else C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c42 0101 MOVLB 0x1 usb_device_state = CONFIGURED_STATE; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c44 0e06 MOVLW 0x6 003c46 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 003c48 ec1c CALL 0x3438,0x0 CDCInitEP(); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c4a f01a #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 003c4c 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 003c4e 0104 MOVLB 0x4 CtrlTrfData._byte0 = 0; // Initialize content C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c50 6b28 CLRF 0x28,0x1 003c52 0104 MOVLB 0x4 CtrlTrfData._byte1 = 0; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c54 6b29 CLRF 0x29,0x1 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c56 0104 MOVLB 0x4 switch(SetupPkt.Recipient) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c58 5120 MOVF 0x20,0x0,0x1 003c5a 0b1f ANDLW 0x1f 003c5c 0a02 XORLW 0x2 003c5e e014 BZ 0x3c88 003c60 0a03 XORLW 0x3 003c62 e00e BZ 0x3c80 003c64 0a01 XORLW 0x1 003c66 e001 BZ 0x3c6a 003c68 d034 BRA 0x3cd2 { 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 003c6a 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c6c 0e01 MOVLW 0x1 003c6e 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 003c70 0104 MOVLB 0x4 CtrlTrfData._byte0|=0b000000001; // Set bit0 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c72 8128 BSF 0x28,0x0,0x1 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c74 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 003c76 a1d3 BTFSS 0xd3,0x0,0x1 003c78 d002 BRA 0x3c7e 003c7a 0104 MOVLB 0x4 CtrlTrfData._byte0|=0b00000010; // Set bit1 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c7c 8328 BSF 0x28,0x1,0x1 003c7e d029 BRA 0x3cd2 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 003c80 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; // No data to update C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c82 0e01 MOVLW 0x1 003c84 6fcb MOVWF 0xcb,0x1 003c86 d025 BRA 0x3cd2 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 003c88 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c8a 0e01 MOVLW 0x1 003c8c 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 003c8e 0104 MOVLB 0x4 pDst.bRam = (byte*)&ep0Bo+(SetupPkt.EPNum*8)+(SetupPkt.EPDir*4); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003c90 5124 MOVF 0x24,0x0,0x1 003c92 0b0f ANDLW 0xf 003c94 0d08 MULLW 0x8 003c96 50f3 MOVF 0xf3,0x0,0x0 003c98 6a2b CLRF 0x2b,0x0 003c9a 0f00 ADDLW 0x0 003c9c 6e2a MOVWF 0x2a,0x0 003c9e 0e04 MOVLW 0x4 003ca0 222b ADDWFC 0x2b,0x1,0x0 003ca2 0104 MOVLB 0x4 003ca4 5124 MOVF 0x24,0x0,0x1 003ca6 0b80 ANDLW 0x80 003ca8 e001 BZ 0x3cac 003caa 0e01 MOVLW 0x1 003cac 0d04 MULLW 0x4 003cae 50f3 MOVF 0xf3,0x0,0x0 003cb0 0101 MOVLB 0x1 003cb2 242a ADDWF 0x2a,0x0,0x0 003cb4 6fce MOVWF 0xce,0x1 003cb6 0e00 MOVLW 0x0 003cb8 202b ADDWFC 0x2b,0x0,0x0 003cba 6fcf MOVWF 0xcf,0x1 003cbc 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 003cbe ffe9 003cc0 c1cf MOVFF 0x1cf,0xfea 003cc2 ffea 003cc4 50ef MOVF 0xef,0x0,0x0 003cc6 0b04 ANDLW 0x4 003cc8 e003 BZ 0x3cd0 003cca 0104 MOVLB 0x4 CtrlTrfData._byte0=0x01;// Set bit0 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ccc 0e01 MOVLW 0x1 003cce 6f28 MOVWF 0x28,0x1 003cd0 d000 BRA 0x3cd2 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 003cd2 0101 MOVLB 0x1 if(ctrl_trf_session_owner == MUID_USB9) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cd4 05cb DECF 0xcb,0x0,0x1 003cd6 e10a BNZ 0x3cec { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cd8 0101 MOVLB 0x1 pSrc.bRam = (byte*)&CtrlTrfData; // Set Source C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cda 0e28 MOVLW 0x28 003cdc 6fcc MOVWF 0xcc,0x1 003cde 0e04 MOVLW 0x4 003ce0 6fcd MOVWF 0xcd,0x1 003ce2 0101 MOVLB 0x1 usb_stat.ctrl_trf_mem = _RAM; // Set memory type C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ce4 93d3 BCF 0xd3,0x1,0x1 003ce6 0101 MOVLB 0x1 LSB(wCount) = 2; // Set data count C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003ce8 0e02 MOVLW 0x2 003cea 6fd0 MOVWF 0xd0,0x1 }//end if(...) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cec 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 003cee 0104 MOVLB 0x4 if((SetupPkt.bFeature == DEVICE_REMOTE_WAKEUP)&& C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cf0 0522 DECF 0x22,0x0,0x1 003cf2 e111 BNZ 0x3d16 (SetupPkt.Recipient == RCPT_DEV)) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cf4 0104 MOVLB 0x4 003cf6 5120 MOVF 0x20,0x0,0x1 003cf8 0b1f ANDLW 0x1f 003cfa 0900 IORLW 0x0 003cfc e10c BNZ 0x3d16 { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003cfe 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_USB9; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d00 0e01 MOVLW 0x1 003d02 6fcb MOVWF 0xcb,0x1 003d04 0e03 MOVLW 0x3 if(SetupPkt.bRequest == SET_FEATURE) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d06 0104 MOVLB 0x4 003d08 5d21 SUBWF 0x21,0x0,0x1 003d0a e103 BNZ 0x3d12 003d0c 0101 MOVLB 0x1 usb_stat.RemoteWakeup = 1; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d0e 81d3 BSF 0xd3,0x0,0x1 003d10 d002 BRA 0x3d16 else C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d12 0101 MOVLB 0x1 usb_stat.RemoteWakeup = 0; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d14 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 003d16 0104 MOVLB 0x4 if((SetupPkt.bFeature == ENDPOINT_HALT)&& C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d18 5122 MOVF 0x22,0x0,0x1 003d1a e13e BNZ 0x3d98 (SetupPkt.Recipient == RCPT_EP)&& C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d1c 0104 MOVLB 0x4 003d1e 5120 MOVF 0x20,0x0,0x1 003d20 0b1f ANDLW 0x1f 003d22 0802 SUBLW 0x2 003d24 e139 BNZ 0x3d98 003d26 0104 MOVLB 0x4 (SetupPkt.EPNum != 0)) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d28 5124 MOVF 0x24,0x0,0x1 003d2a 0b0f ANDLW 0xf 003d2c 0900 IORLW 0x0 003d2e e034 BZ 0x3d98 { 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 /* Must do address calculation here */ C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d36 0104 MOVLB 0x4 pDst.bRam = (byte*)&ep0Bo+(SetupPkt.EPNum*8)+(SetupPkt.EPDir*4); C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d38 5124 MOVF 0x24,0x0,0x1 003d3a 0b0f ANDLW 0xf 003d3c 0d08 MULLW 0x8 003d3e 50f3 MOVF 0xf3,0x0,0x0 003d40 6a2b CLRF 0x2b,0x0 003d42 0f00 ADDLW 0x0 003d44 6e2a MOVWF 0x2a,0x0 003d46 0e04 MOVLW 0x4 003d48 222b ADDWFC 0x2b,0x1,0x0 003d4a 0104 MOVLB 0x4 003d4c 5124 MOVF 0x24,0x0,0x1 003d4e 0b80 ANDLW 0x80 003d50 e001 BZ 0x3d54 003d52 0e01 MOVLW 0x1 003d54 0d04 MULLW 0x4 003d56 50f3 MOVF 0xf3,0x0,0x0 003d58 0101 MOVLB 0x1 003d5a 242a ADDWF 0x2a,0x0,0x0 003d5c 6fce MOVWF 0xce,0x1 003d5e 0e00 MOVLW 0x0 003d60 202b ADDWFC 0x2b,0x0,0x0 003d62 6fcf MOVWF 0xcf,0x1 C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d64 0e03 MOVLW 0x3 if(SetupPkt.bRequest == SET_FEATURE) C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d66 0104 MOVLB 0x4 003d68 5d21 SUBWF 0x21,0x0,0x1 003d6a e107 BNZ 0x3d7a 003d6c 0e84 MOVLW 0x84 *pDst.bRam = _USIE|_BSTALL; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d6e c1ce MOVFF 0x1ce,0xfe9 003d70 ffe9 003d72 c1cf MOVFF 0x1cf,0xfea 003d74 ffea 003d76 6eef MOVWF 0xef,0x0 003d78 d00f BRA 0x3d98 else C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c { C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d7a 0104 MOVLB 0x4 if(SetupPkt.EPDir == 1) // IN C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d7c af24 BTFSS 0x24,0x7,0x1 003d7e d006 BRA 0x3d8c 003d80 c1ce MOVFF 0x1ce,0xfe9 *pDst.bRam = _UCPU; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d82 ffe9 003d84 c1cf MOVFF 0x1cf,0xfea 003d86 ffea 003d88 6aef CLRF 0xef,0x0 003d8a d006 BRA 0x3d98 else C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d8c 0e88 MOVLW 0x88 *pDst.bRam = _USIE|_DAT0|_DTSEN; C:\Projects\UBW\FW\D_143\system\usb\usb9\usb9.c 003d8e c1ce MOVFF 0x1ce,0xfe9 003d90 ffe9 003d92 c1cf MOVFF 0x1cf,0xfea 003d94 ffea 003d96 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 003d98 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 003742 506c MOVF 0x6c,0x0,0x0 if(USTAT == EP00_OUT) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003744 e002 BZ 0x374a 003746 0e00 MOVLW 0x0 003748 d001 BRA 0x374c 00374a 0e01 MOVLW 0x1 00374c 0900 IORLW 0x0 00374e e00b BZ 0x3766 { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003750 0104 MOVLB 0x4 if(ep0Bo.Stat.PID == SETUP_TOKEN) // EP0 SETUP C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003752 5100 MOVF 0x0,0x0,0x1 003754 0b3c ANDLW 0x3c 003756 42e8 RRNCF 0xe8,0x1,0x0 003758 42e8 RRNCF 0xe8,0x1,0x0 00375a 080d SUBLW 0xd 00375c e102 BNZ 0x3762 00375e d80c RCALL 0x3778 USBCtrlTrfSetupHandler(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003760 d001 BRA 0x3764 else // EP0 OUT C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003762 d842 RCALL 0x37e8 USBCtrlTrfOutHandler(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c } C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003764 d008 BRA 0x3776 else if(USTAT == EP00_IN) // EP0 IN C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003766 506c MOVF 0x6c,0x0,0x0 003768 e002 BZ 0x376e 00376a 0e00 MOVLW 0x0 00376c d001 BRA 0x3770 00376e 0e01 MOVLW 0x1 003770 0904 IORLW 0x4 003772 e001 BZ 0x3776 003774 d84b RCALL 0x380c USBCtrlTrfInHandler(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003776 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 003778 cfd9 MOVFF 0xfd9,0xfe6 void USBCtrlTrfSetupHandler(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00377a ffe6 00377c cfe1 MOVFF 0xfe1,0xfd9 00377e ffd9 003780 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 003782 0101 MOVLB 0x1 ctrl_trf_state = WAIT_SETUP; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003784 6bca CLRF 0xca,0x1 003786 0101 MOVLB 0x1 ctrl_trf_session_owner = MUID_NULL; // Set owner to NULL C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003788 6bcb CLRF 0xcb,0x1 00378a 0101 MOVLB 0x1 wCount._word = 0; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00378c 6bd0 CLRF 0xd0,0x1 00378e 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 003790 ec3e CALL 0x3a7c,0x0 USBCheckStdRequest(); // See system\usb9\usb9.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003792 f01d C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003794 6adf CLRF 0xdf,0x0 for(i=0;i < (sizeof(ClassReqHandler)/sizeof(pFunc));i++) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003796 50df MOVF 0xdf,0x0,0x0 003798 6e2a MOVWF 0x2a,0x0 00379a 6a2b CLRF 0x2b,0x0 00379c 0e01 MOVLW 0x1 00379e 5c2a SUBWF 0x2a,0x0,0x0 0037a0 0e00 MOVLW 0x0 0037a2 582b SUBWFB 0x2b,0x0,0x0 0037a4 e21b BC 0x37dc 0037d8 2adf INCF 0xdf,0x1,0x0 0037da d7dd BRA 0x3796 { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0037a6 0101 MOVLB 0x1 if(ctrl_trf_session_owner != MUID_NULL)break; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0037a8 51cb MOVF 0xcb,0x0,0x1 0037aa e001 BZ 0x37ae 0037ac d017 BRA 0x37dc 0037ae 6af7 CLRF 0xf7,0x0 ClassReqHandler[i](); // See autofiles\usbdsc.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0037b0 34df RLCF 0xdf,0x0,0x0 0037b2 0bfe ANDLW 0xfe 0037b4 36f7 RLCF 0xf7,0x1,0x0 0037b6 6ef6 MOVWF 0xf6,0x0 0037b8 0e1d MOVLW 0x1d 0037ba 26f6 ADDWF 0xf6,0x1,0x0 0037bc 0e42 MOVLW 0x42 0037be 22f7 ADDWFC 0xf7,0x1,0x0 0037c0 0009 TBLRDPOSTINC 0037c2 cff5 MOVFF 0xff5,0x2a 0037c4 f02a 0037c6 0008 TBLRD 0037c8 cff5 MOVFF 0xff5,0x2b 0037ca f02b 0037cc d004 BRA 0x37d6 0037ce c02b MOVFF 0x2b,0xffa 0037d0 fffa 0037d2 502a MOVF 0x2a,0x0,0x0 0037d4 6ef9 MOVWF 0xf9,0x0 0037d6 dffb RCALL 0x37ce }//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 0037dc d8f0 RCALL 0x39be USBCtrlEPServiceComplete(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0037de 52e5 MOVF 0xe5,0x1,0x0 }//end USBCtrlTrfSetupHandler C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0037e0 52e5 MOVF 0xe5,0x1,0x0 0037e2 cfe7 MOVFF 0xfe7,0xfd9 0037e4 ffd9 0037e6 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 0037e8 0e02 MOVLW 0x2 if(ctrl_trf_state == CTRL_TRF_RX) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0037ea 0101 MOVLB 0x1 0037ec 5dca SUBWF 0xca,0x0,0x1 0037ee e10c BNZ 0x3808 { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0037f0 d8a4 RCALL 0x393a 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 0037f2 0104 MOVLB 0x4 if(ep0Bo.Stat.DTS == 0) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0037f4 bd00 BTFSC 0x0,0x6,0x1 0037f6 d004 BRA 0x3800 0037f8 0104 MOVLB 0x4 ep0Bo.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0037fa 0ec8 MOVLW 0xc8 0037fc 6f00 MOVWF 0x0,0x1 0037fe d003 BRA 0x3806 else C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003800 0104 MOVLB 0x4 ep0Bo.Stat._byte = _USIE|_DAT0|_DTSEN; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003802 0e88 MOVLW 0x88 003804 6f00 MOVWF 0x0,0x1 } C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003806 d001 BRA 0x380a else // CTRL_TRF_TX C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003808 d929 RCALL 0x3a5c USBPrepareForNextSetupTrf(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00380a 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 00380c 0e04 MOVLW 0x4 mUSBCheckAdrPendingState(); // Must check if in ADR_PENDING_STATE C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00380e 0101 MOVLB 0x1 003810 5dd2 SUBWF 0xd2,0x0,0x1 003812 e10c BNZ 0x382c 003814 c422 MOVFF 0x422,0xf6e 003816 ff6e 003818 506e MOVF 0x6e,0x0,0x0 00381a 0800 SUBLW 0x0 00381c e204 BC 0x3826 00381e 0101 MOVLB 0x1 003820 0e05 MOVLW 0x5 003822 6fd2 MOVWF 0xd2,0x1 003824 d003 BRA 0x382c 003826 0101 MOVLB 0x1 003828 0e03 MOVLW 0x3 00382a 6fd2 MOVWF 0xd2,0x1 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00382c 0101 MOVLB 0x1 if(ctrl_trf_state == CTRL_TRF_TX) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00382e 05ca DECF 0xca,0x0,0x1 003830 e10c BNZ 0x384a { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003832 d80d RCALL 0x384e USBCtrlTrfTxService(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003834 0104 MOVLB 0x4 if(ep0Bi.Stat.DTS == 0) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003836 bd04 BTFSC 0x4,0x6,0x1 003838 d004 BRA 0x3842 00383a 0104 MOVLB 0x4 ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00383c 0ec8 MOVLW 0xc8 00383e 6f04 MOVWF 0x4,0x1 003840 d003 BRA 0x3848 else C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003842 0104 MOVLB 0x4 ep0Bi.Stat._byte = _USIE|_DAT0|_DTSEN; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003844 0e88 MOVLW 0x88 003846 6f04 MOVWF 0x4,0x1 } C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003848 d001 BRA 0x384c else // CTRL_TRF_RX C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00384a d908 RCALL 0x3a5c USBPrepareForNextSetupTrf(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00384c 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 00384e cfd9 MOVFF 0xfd9,0xfe6 void USBCtrlTrfTxService(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003850 ffe6 003852 cfe1 MOVFF 0xfe1,0xfd9 003854 ffd9 003856 0e02 MOVLW 0x2 003858 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 00385a 0101 MOVLB 0x1 if(wCount._word < EP0_BUFF_SIZE) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00385c 0e08 MOVLW 0x8 00385e 5dd0 SUBWF 0xd0,0x0,0x1 003860 0e00 MOVLW 0x0 003862 59d1 SUBWFB 0xd1,0x0,0x1 003864 e205 BC 0x3870 003866 c1d0 MOVFF 0x1d0,0xfde byte_to_send._word = wCount._word; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003868 ffde 00386a c1d1 MOVFF 0x1d1,0xfdd 00386c ffdd 00386e d003 BRA 0x3876 else C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003870 0e08 MOVLW 0x8 byte_to_send._word = EP0_BUFF_SIZE; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003872 6ede MOVWF 0xde,0x0 003874 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 003876 0104 MOVLB 0x4 ep0Bi.Stat.BC9 = 0; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003878 9304 BCF 0x4,0x1,0x1 00387a 0104 MOVLB 0x4 ep0Bi.Stat.BC8 = 0; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00387c 9104 BCF 0x4,0x0,0x1 00387e 0e01 MOVLW 0x1 ep0Bi.Stat._byte |= MSB(byte_to_send); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003880 50db MOVF 0xdb,0x0,0x0 003882 0104 MOVLB 0x4 003884 1304 IORWF 0x4,0x1,0x1 003886 cfdf MOVFF 0xfdf,0x405 ep0Bi.Cnt = LSB(byte_to_send); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003888 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 00388a 0e00 MOVLW 0x0 wCount._word = wCount._word - byte_to_send._word; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00388c 50db MOVF 0xdb,0x0,0x0 00388e 0101 MOVLB 0x1 003890 5fd0 SUBWF 0xd0,0x1,0x1 003892 0e01 MOVLW 0x1 003894 50db MOVF 0xdb,0x0,0x0 003896 0101 MOVLB 0x1 003898 5bd1 SUBWFB 0xd1,0x1,0x1 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00389a 0101 MOVLB 0x1 pDst.bRam = (byte*)&CtrlTrfData; // Set destination pointer C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00389c 0e28 MOVLW 0x28 00389e 6fce MOVWF 0xce,0x1 0038a0 0e04 MOVLW 0x4 0038a2 6fcf MOVWF 0xcf,0x1 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0038a4 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 0038a6 a3d3 BTFSS 0xd3,0x1,0x1 0038a8 d020 BRA 0x38ea { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0038aa cfd9 MOVFF 0xfd9,0xfe9 while(byte_to_send._word) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0038ac ffe9 0038ae cfda MOVFF 0xfda,0xfea 0038b0 ffea 0038b2 50ee MOVF 0xee,0x0,0x0 0038b4 10ed IORWF 0xed,0x0,0x0 0038b6 e018 BZ 0x38e8 0038e6 d7e1 BRA 0x38aa { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0038b8 c1cc MOVFF 0x1cc,0xff6 *pDst.bRam = *pSrc.bRom; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0038ba fff6 0038bc c1cd MOVFF 0x1cd,0xff7 0038be fff7 0038c0 0008 TBLRD 0038c2 50f5 MOVF 0xf5,0x0,0x0 0038c4 c1ce MOVFF 0x1ce,0xfe9 0038c6 ffe9 0038c8 c1cf MOVFF 0x1cf,0xfea 0038ca ffea 0038cc 6eef MOVWF 0xef,0x0 0038ce 0101 MOVLB 0x1 pDst.bRam++; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0038d0 2bce INCF 0xce,0x1,0x1 0038d2 0e00 MOVLW 0x0 0038d4 23cf ADDWFC 0xcf,0x1,0x1 0038d6 0101 MOVLB 0x1 pSrc.bRom++; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0038d8 2bcc INCF 0xcc,0x1,0x1 0038da 0e00 MOVLW 0x0 0038dc 23cd ADDWFC 0xcd,0x1,0x1 0038de 06df DECF 0xdf,0x1,0x0 byte_to_send._word--; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0038e0 0e01 MOVLW 0x1 0038e2 e201 BC 0x38e6 0038e4 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 0038e8 d01e BRA 0x3926 else // RAM C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0038ea cfd9 MOVFF 0xfd9,0xfe9 while(byte_to_send._word) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0038ec ffe9 0038ee cfda MOVFF 0xfda,0xfea 0038f0 ffea 0038f2 50ee MOVF 0xee,0x0,0x0 0038f4 10ed IORWF 0xed,0x0,0x0 0038f6 e017 BZ 0x3926 003924 d7e2 BRA 0x38ea { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0038f8 c1cc MOVFF 0x1cc,0xfe9 *pDst.bRam = *pSrc.bRam; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0038fa ffe9 0038fc c1cd MOVFF 0x1cd,0xfea 0038fe ffea 003900 50ef MOVF 0xef,0x0,0x0 003902 c1ce MOVFF 0x1ce,0xfe9 003904 ffe9 003906 c1cf MOVFF 0x1cf,0xfea 003908 ffea 00390a 6eef MOVWF 0xef,0x0 00390c 0101 MOVLB 0x1 pDst.bRam++; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00390e 2bce INCF 0xce,0x1,0x1 003910 0e00 MOVLW 0x0 003912 23cf ADDWFC 0xcf,0x1,0x1 003914 0101 MOVLB 0x1 pSrc.bRam++; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003916 2bcc INCF 0xcc,0x1,0x1 003918 0e00 MOVLW 0x0 00391a 23cd ADDWFC 0xcd,0x1,0x1 00391c 06df DECF 0xdf,0x1,0x0 byte_to_send._word--; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00391e 0e01 MOVLW 0x1 003920 e201 BC 0x3924 003922 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 003926 0e02 MOVLW 0x2 }//end USBCtrlTrfTxService C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003928 5ce1 SUBWF 0xe1,0x0,0x0 00392a e202 BC 0x3930 00392c 6ae1 CLRF 0xe1,0x0 00392e 52e5 MOVF 0xe5,0x1,0x0 003930 6ee1 MOVWF 0xe1,0x0 003932 52e5 MOVF 0xe5,0x1,0x0 003934 cfe7 MOVFF 0xfe7,0xfd9 003936 ffd9 003938 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 00393a cfd9 MOVFF 0xfd9,0xfe6 void USBCtrlTrfRxService(void) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00393c ffe6 00393e cfe1 MOVFF 0xfe1,0xfd9 003940 ffd9 003942 0e02 MOVLW 0x2 003944 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 003946 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 003948 0104 MOVLB 0x4 00394a 1500 ANDWF 0x0,0x0,0x1 00394c 6ee7 MOVWF 0xe7,0x0 00394e 0e01 MOVLW 0x1 003950 cfe7 MOVFF 0xfe7,0xfdb 003952 ffdb 003954 c401 MOVFF 0x401,0xfdf LSB(byte_to_read) = ep0Bo.Cnt; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003956 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 003958 50de MOVF 0xde,0x0,0x0 wCount._word = wCount._word + byte_to_read._word; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00395a 0101 MOVLB 0x1 00395c 27d0 ADDWF 0xd0,0x1,0x1 00395e 50dd MOVF 0xdd,0x0,0x0 003960 0101 MOVLB 0x1 003962 23d1 ADDWFC 0xd1,0x1,0x1 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003964 0101 MOVLB 0x1 pSrc.bRam = (byte*)&CtrlTrfData; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003966 0e28 MOVLW 0x28 003968 6fcc MOVWF 0xcc,0x1 00396a 0e04 MOVLW 0x4 00396c 6fcd MOVWF 0xcd,0x1 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00396e cfd9 MOVFF 0xfd9,0xfe9 while(byte_to_read._word) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003970 ffe9 003972 cfda MOVFF 0xfda,0xfea 003974 ffea 003976 50ee MOVF 0xee,0x0,0x0 003978 10ed IORWF 0xed,0x0,0x0 00397a e017 BZ 0x39aa 0039a8 d7e2 BRA 0x396e { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00397c c1cc MOVFF 0x1cc,0xfe9 *pDst.bRam = *pSrc.bRam; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00397e ffe9 003980 c1cd MOVFF 0x1cd,0xfea 003982 ffea 003984 50ef MOVF 0xef,0x0,0x0 003986 c1ce MOVFF 0x1ce,0xfe9 003988 ffe9 00398a c1cf MOVFF 0x1cf,0xfea 00398c ffea 00398e 6eef MOVWF 0xef,0x0 003990 0101 MOVLB 0x1 pDst.bRam++; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003992 2bce INCF 0xce,0x1,0x1 003994 0e00 MOVLW 0x0 003996 23cf ADDWFC 0xcf,0x1,0x1 003998 0101 MOVLB 0x1 pSrc.bRam++; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 00399a 2bcc INCF 0xcc,0x1,0x1 00399c 0e00 MOVLW 0x0 00399e 23cd ADDWFC 0xcd,0x1,0x1 0039a0 06df DECF 0xdf,0x1,0x0 byte_to_read._word--; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039a2 0e01 MOVLW 0x1 0039a4 e201 BC 0x39a8 0039a6 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 0039aa 0e02 MOVLW 0x2 }//end USBCtrlTrfRxService C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039ac 5ce1 SUBWF 0xe1,0x0,0x0 0039ae e202 BC 0x39b4 0039b0 6ae1 CLRF 0xe1,0x0 0039b2 52e5 MOVF 0xe5,0x1,0x0 0039b4 6ee1 MOVWF 0xe1,0x0 0039b6 52e5 MOVF 0xe5,0x1,0x0 0039b8 cfe7 MOVFF 0xfe7,0xfd9 0039ba ffd9 0039bc 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 0039be 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 0039c0 0101 MOVLB 0x1 if(ctrl_trf_session_owner == MUID_NULL) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039c2 51cb MOVF 0xcb,0x0,0x1 0039c4 e10f BNZ 0x39e4 { 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 0039c6 0104 MOVLB 0x4 ep0Bo.Cnt = EP0_BUFF_SIZE; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039c8 0e08 MOVLW 0x8 0039ca 6f01 MOVWF 0x1,0x1 0039cc 0104 MOVLB 0x4 ep0Bo.ADR = (byte*)&SetupPkt; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039ce 0e20 MOVLW 0x20 0039d0 6f02 MOVWF 0x2,0x1 0039d2 0e04 MOVLW 0x4 0039d4 6f03 MOVWF 0x3,0x1 C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039d6 0104 MOVLB 0x4 ep0Bo.Stat._byte = _USIE|_BSTALL; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039d8 0e84 MOVLW 0x84 0039da 6f00 MOVWF 0x0,0x1 0039dc 0104 MOVLB 0x4 ep0Bi.Stat._byte = _USIE|_BSTALL; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039de 0e84 MOVLW 0x84 0039e0 6f04 MOVWF 0x4,0x1 } C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039e2 d03b BRA 0x3a5a 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 0039e4 0104 MOVLB 0x4 if(SetupPkt.DataDir == DEV_TO_HOST) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039e6 af20 BTFSS 0x20,0x7,0x1 0039e8 d025 BRA 0x3a34 { C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039ea 0101 MOVLB 0x1 if(SetupPkt.wLength < wCount._word) C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039ec 51d0 MOVF 0xd0,0x0,0x1 0039ee 0104 MOVLB 0x4 0039f0 5d26 SUBWF 0x26,0x0,0x1 0039f2 0101 MOVLB 0x1 0039f4 51d1 MOVF 0xd1,0x0,0x1 0039f6 0104 MOVLB 0x4 0039f8 5927 SUBWFB 0x27,0x0,0x1 0039fa e204 BC 0x3a04 0039fc c426 MOVFF 0x426,0x1d0 wCount._word = SetupPkt.wLength; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 0039fe f1d0 003a00 c427 MOVFF 0x427,0x1d1 003a02 f1d1 003a04 df24 RCALL 0x384e USBCtrlTrfTxService(); C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a06 0101 MOVLB 0x1 ctrl_trf_state = CTRL_TRF_TX; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a08 0e01 MOVLW 0x1 003a0a 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 003a0c 0104 MOVLB 0x4 ep0Bo.Cnt = EP0_BUFF_SIZE; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a0e 0e08 MOVLW 0x8 003a10 6f01 MOVWF 0x1,0x1 003a12 0104 MOVLB 0x4 ep0Bo.ADR = (byte*)&SetupPkt; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a14 0e20 MOVLW 0x20 003a16 6f02 MOVWF 0x2,0x1 003a18 0e04 MOVLW 0x4 003a1a 6f03 MOVWF 0x3,0x1 003a1c 0104 MOVLB 0x4 ep0Bo.Stat._byte = _USIE; // Note: DTSEN is 0! C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a1e 0e80 MOVLW 0x80 003a20 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 003a22 0104 MOVLB 0x4 ep0Bi.ADR = (byte*)&CtrlTrfData; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a24 0e28 MOVLW 0x28 003a26 6f06 MOVWF 0x6,0x1 003a28 0e04 MOVLW 0x4 003a2a 6f07 MOVWF 0x7,0x1 003a2c 0104 MOVLB 0x4 ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a2e 0ec8 MOVLW 0xc8 003a30 6f04 MOVWF 0x4,0x1 } C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a32 d013 BRA 0x3a5a 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 003a34 0101 MOVLB 0x1 ctrl_trf_state = CTRL_TRF_RX; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a36 0e02 MOVLW 0x2 003a38 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 003a3a 0104 MOVLB 0x4 ep0Bi.Cnt = 0; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a3c 6b05 CLRF 0x5,0x1 003a3e 0104 MOVLB 0x4 ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a40 0ec8 MOVLW 0xc8 003a42 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 003a44 0104 MOVLB 0x4 ep0Bo.Cnt = EP0_BUFF_SIZE; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a46 0e08 MOVLW 0x8 003a48 6f01 MOVWF 0x1,0x1 003a4a 0104 MOVLB 0x4 ep0Bo.ADR = (byte*)&CtrlTrfData; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a4c 0e28 MOVLW 0x28 003a4e 6f02 MOVWF 0x2,0x1 003a50 0e04 MOVLW 0x4 003a52 6f03 MOVWF 0x3,0x1 003a54 0104 MOVLB 0x4 ep0Bo.Stat._byte = _USIE|_DAT1|_DTSEN; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a56 0ec8 MOVLW 0xc8 003a58 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 003a5a 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 003a5c 0101 MOVLB 0x1 ctrl_trf_state = WAIT_SETUP; // See usbctrltrf.h C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a5e 6bca CLRF 0xca,0x1 003a60 0104 MOVLB 0x4 ep0Bo.Cnt = EP0_BUFF_SIZE; // Defined in usbcfg.h C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a62 0e08 MOVLW 0x8 003a64 6f01 MOVWF 0x1,0x1 003a66 0104 MOVLB 0x4 ep0Bo.ADR = (byte*)&SetupPkt; C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a68 0e20 MOVLW 0x20 003a6a 6f02 MOVWF 0x2,0x1 003a6c 0e04 MOVLW 0x4 003a6e 6f03 MOVWF 0x3,0x1 003a70 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 003a72 0e88 MOVLW 0x88 003a74 6f00 MOVWF 0x0,0x1 003a76 0104 MOVLB 0x4 ep0Bi.Stat._byte = _UCPU; // EP0 IN buffer initialization C:\Projects\UBW\FW\D_143\system\usb\usbctrltrf\usbctrltrf.c 003a78 6b04 CLRF 0x4,0x1 003a7a 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 * BPS 08/28/07 v1.4.3 - Allowed UBW to run without C:\Projects\UBW\FW\D_143\user\user.c * usb connected. 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