Hello everyone.
I always try to use microde studio for many of my projects because of the speed and ease of reading the code, with its disadvantages such as higher space usage per program and a very small community, I use it because its benefits are greater. among my projects I need to create a composite device, searching the internet I have not found precise information on this topic, not even an example.
I have worked on this and I have achieved something that is close to achieving it,
At this point I think I need to properly address the second device endpoints.
I have analyzed pbppic18.mac USBOUT-->L?CALL PutUSB and the respective usb_dev.asm where I find that I can address correctly without modifying the code because the required Endpoint has been correctly stored in FSR0L. Despite my poor understanding, I have so far modified the usb_mem.asm, usb_dev.inc, and usb_hid.asm files.
The result of this has been that the PC recognizes the composite device correctly and interface 0 communicates (with some easily fixable glitches), but interface 1 is not heard. I think this potential problem is in usb_hid.asm, because invoking endpoint 82 I think it sends to both endpoints 81 and 82, causing me to lose data on device 0 and abort receiving from device 1
I need some help to find a solution to this problem, if you can help with any contribution I will be very grateful
DES_FirmAC01.bas
usb_hid.asmCode:' USB descriptors for a HID device 'USBMEMORYADDRESS Con $400 ' USB RAM starts here (set in device header file) USBMEMORYSIZE Con 256 ' USB RAM size in bytes USBReservedMemory Var Byte[USBMEMORYSIZE] USBMEMORYADDRESS ' Reserve memory used by USB assembler code goto hid_desc_end ' Skip over all of the USB assembler code asm #define USB_EP0_BUFF_SIZE 8 ; 8, 16, 32, or 64 #define USB_MAX_NUM_INT 2 ; For tracking Alternate Setting #define USB_MAX_EP_NUMBER 2 ; UEP1 #define NUM_CONFIGURATIONS 1 #define NUM_INTERFACES 2 #define UCFG_VAL USB_PULLUP_ENABLE|USB_INTERNAL_TRANSCEIVER|USB_FULL_SPEED|USB_PING_PONG__NO_PING_PONG ;#define UCFG_VAL USB_PULLUP_ENABLE|USB_INTERNAL_TRANSCEIVER|USB_LOW_SPEED|USB_PING_PONG__NO_PING_PONG ;#define USE_SELF_POWER_SENSE_IO ;#define USE_USB_BUS_SENSE_IO #define USB_POLLING ; HID ; Endpoints Allocation #define HID_INTF_ID 0x00 #define HID_EP 1 #define HID_INT_OUT_EP_SIZE 16 #define HID_INT_IN_EP_SIZE 16 #define HID_DEV_INTF_ID 0x01 #define HID_DEV_EP 2 #define HID_DEV_INT_OUT_EP_SIZE 16 #define HID_DEV_INT_IN_EP_SIZE 16 #define HID_NUM_OF_DSC 1 include "usb_hid.asm" ; Include rest of USB files, starting with HID class code ; ****************************************************************** ; This table is polled by the host immediately after USB Reset has been released. ; This table defines the maximum packet size EP0 can take. ; See section 9.6.1 of the Rev 1.0 USB specification. ; These fields are application DEPENDENT. Modify these to meet ; your specifications. ; ****************************************************************** DeviceDescriptor retlw (EndDeviceDescriptor-DeviceDescriptor)/2 ; bLength Length of this descriptor retlw USB_DESCRIPTOR_DEVICE ; bDescType This is a DEVICE descriptor retlw 0x00 ; bcdUSBUSB Revision 1.10 (low byte) retlw 0x02 ; high byte retlw 0x00 ; bDeviceClass zero means each interface operates independently retlw 0x00 ; bDeviceSubClass retlw 0x00 ; bDeviceProtocol retlw USB_EP0_BUFF_SIZE ; bMaxPacketSize for EP0 ; idVendor (low byte, high byte) retlw 0xD9 retlw 0x04 ; idProduct (low byte, high byte) retlw 0x3C retlw 0x00 retlw 0x00 ; bcdDevice (low byte) retlw 0x01 ; (high byte) retlw 0x01 ; iManufacturer (string index) retlw 0x02 ; iProduct (string index) retlw 0x03 ; iSerialNumber (string index) retlw NUM_CONFIGURATIONS ; bNumConfigurations EndDeviceDescriptor ; ****************************************************************** ; This table is retrieved by the host after the address has been set. ; This table defines the configurations available for the device. ; See section 9.6.2 of the Rev 1.0 USB specification (page 184). ; These fields are application DEPENDENT. ; Modify these to meet your specifications. ; ****************************************************************** ; Configuration pointer table USB_CD_Ptr Configs db low Config1, high Config1 db upper Config1, 0 ; Configuration Descriptor Config1 retlw (Interface1-Config1)/2 ; bLength Length of this descriptor retlw USB_DESCRIPTOR_CONFIGURATION ; bDescType 2=CONFIGURATION Config1Len retlw low ((EndConfig1 - Config1)/2) ; Length of this configuration retlw high ((EndConfig1 - Config1)/2) retlw NUM_INTERFACES ; bNumInterfaces Number of interfaces retlw 0x01 ; bConfigValue Configuration Value retlw 0x00 ; iConfig (string index) retlw _DEFAULT|_SELF ; bmAttributes attributes - bus powered retlw 0x32 ; Max power consumption (2X mA) Interface1 retlw (HIDDescriptor1-Interface1)/2 ; length of descriptor retlw USB_DESCRIPTOR_INTERFACE retlw 0x00 ; number of interface, 0 based array retlw 0x00 ; alternate setting retlw 0x01 ; number of endpoints used in this interface retlw 0x03 ; interface class - assigned by the USB retlw 0x00 ; boot device retlw 0x00 ; interface protocol retlw 0x04 ; index to string descriptor that describes this interface HIDDescriptor1 retlw (Endpoint1In-HIDDescriptor1)/2 ; descriptor size (9 bytes) retlw DSC_HID ; descriptor type (HID) retlw 0x11 ; HID class release number (1.11) retlw 0x01 retlw 0x00 ; Localized country code (none) retlw 0x01 ; # of HID class descriptor to follow (1) retlw 0x22 ; Report descriptor type (HID) ReportDescriptor1Len retlw low ((EndReportDescriptor1-ReportDescriptor1)/2) retlw high ((EndReportDescriptor1-ReportDescriptor1)/2) Endpoint1In retlw (Interface2-Endpoint1In)/2 ; length of descriptor retlw USB_DESCRIPTOR_ENDPOINT retlw HID_EP|_EP_IN ; EP1, In retlw _INT ; Interrupt retlw low (HID_INT_IN_EP_SIZE) ; This should be the size of the endpoint buffer retlw high (HID_INT_IN_EP_SIZE) retlw 0x01 ; Polling interval ;EndPoint1Out ; retlw (Interface2-EndPoint1Out)/2 ; Length of this Endpoint Descriptor ; retlw USB_DESCRIPTOR_ENDPOINT ; bDescriptorType = 5 for Endpoint Descriptor ; retlw HID_EP|_EP_OUT ; Endpoint number & direction ; retlw _INT ; Transfer type supported by this Endpoint ; retlw low (HID_INT_OUT_EP_SIZE) ; This should be the size of the endpoint buffer ; retlw high (HID_INT_OUT_EP_SIZE) ; retlw 0x01 ; Polling interval Interface2 retlw (HIDDescriptor2-Interface2)/2 ; length of descriptor retlw USB_DESCRIPTOR_INTERFACE ; INTERFACE descriptor type retlw 0x01 ; number of interface, 0 based array retlw 0x00 ; alternate setting retlw 0x01 ; number of endpoints used in this interface retlw 0x03 ; interface class - assigned by the USB retlw 0x00 ; boot device retlw 0x00 ; interface protocol retlw 0x04 ; index to string descriptor that describes this interface HIDDescriptor2 retlw (Endpoint2In-HIDDescriptor2)/2 ; descriptor size (9 bytes) retlw DSC_HID ; descriptor type (HID) retlw 0x11 ; HID class release number (1.11) retlw 0x01 retlw 0x00 ; Localized country code (none) retlw 0x01 ; # of HID class descriptor to follow (1) retlw 0x22 ; Report descriptor type (HID) ReportDescriptor2Len retlw low ((EndReportDescriptor2-ReportDescriptor2)/2) retlw high ((EndReportDescriptor2-ReportDescriptor2)/2) Endpoint2In retlw (EndConfig1-Endpoint2In)/2 ; length of descriptor retlw USB_DESCRIPTOR_ENDPOINT retlw HID_DEV_EP|_EP_IN ; EP2, In retlw _INT ; Interrupt retlw low (HID_DEV_INT_IN_EP_SIZE) ; This should be the size of the endpoint buffer retlw high (HID_DEV_INT_IN_EP_SIZE) retlw 0x01 ; Polling interval ;EndPoint2Out ; retlw (EndConfig1-EndPoint2Out)/2 ; Length of this Endpoint Descriptor ; retlw USB_DESCRIPTOR_ENDPOINT ; bDescriptorType = 5 for Endpoint Descriptor ; retlw HID_DEV_EP|_EP_OUT ; Endpoint number & direction ; retlw _INT ; Transfer type supported by this Endpoint ; retlw low (HID_DEV_INT_OUT_EP_SIZE) ; This should be the size of the endpoint buffer ; retlw high (HID_DEV_INT_OUT_EP_SIZE) ; retlw 0x01 ; Polling interval EndConfig1 ReportDescriptor1 retlw 0x05 ; USAGE_PAGE (generic desktop Choose the usage page "mouse" is on retlw 0x01 ; LOW retlw 0x09 ; USAGE Device is a Gamepad retlw 0x05 ; LOW retlw 0xA1 ; COLLECTION (APPLICATION) retlw 0x01 ; LOW retlw 0x85 ; REPORT_ID (1 Pad1) retlw 0x01 ; LOW retlw 0xA1 ; Colection Physycal retlw 0x00 ; LOW retlw 0x09 ; usage x retlw 0x30 ; retlw 0x09 ; usage y retlw 0x31 ; retlw 0x15 ; logical minimun 0 retlw 0x00 ; retlw 0x26 ; logical maximun 1023 retlw 0xFF ; retlw 0x03 ; retlw 0x35 ; Physical Minimum (0) retlw 0x00 ; retlw 0x46 ; Physical Maximum (1023) retlw 0xFF ; retlw 0x03 ; retlw 0x95 ; REPORT_COUNT 2 retlw 0x02 ; retlw 0x75 ; report size 16 retlw 0x10 ; retlw 0x81 ; data,var,abs retlw 0x02 ; retlw 0xC0 ; END_COLLECTION ;****************************************** retlw 0xA1 ; Colection Physycal retlw 0x00 ; LOW retlw 0x09 ; usage Rx retlw 0x33 ; retlw 0x09 ; usage Ry retlw 0x34 ; retlw 0x15 ; logical minimun 0 retlw 0x00 ; retlw 0x26 ; logical maximun 2047 retlw 0xFF ; retlw 0x03 ; retlw 0x35 ; Physical Minimum (0) retlw 0x00 ; retlw 0x46 ; Physical Maximum (2047) retlw 0xFF ; retlw 0x03 ; retlw 0x95 ; REPORT_COUNT 2 retlw 0x02 ; retlw 0x75 ; report size 16 retlw 0x10 ; retlw 0x81 ; data,var,abs retlw 0x02 ; retlw 0xC0 ; END_COLLECTION ;****************************************** retlw 0x05 ; USAGE_PAGE (Button) retlw 0x09 ; low retlw 0x19 ; Usage Minimum (Button 1) retlw 0x01 ; retlw 0x29 ; Usage Maximum (Button 13) retlw 0x0D ; retlw 0x95 ; report count 13 retlw 0x0D ; retlw 0x75 ; report size 1 retlw 0x01 ; retlw 0x81 ; input data,var,abs retlw 0x02 ; retlw 0x95 ; report count 1 retlw 0x01 ; retlw 0x75 ; report size 3 retlw 0x03 ; retlw 0x81 ; input Cnst,var,abs retlw 0x01 ; retlw 0xC0 ; END_COLLECTION ;*********************************************************************** ;* GamePAD 2 * ;*********************************************************************** retlw 0x05 ; USAGE_PAGE (generic desktop Choose the usage page "mouse" is on retlw 0x01 ; LOW retlw 0x09 ; USAGE Device is a Gamepad retlw 0x05 ; LOW retlw 0xA1 ; COLLECTION (APPLICATION) retlw 0x01 ; LOW retlw 0x85 ; REPORT_ID (1 Pad1) retlw 0x02 ; LOW retlw 0xA1 ; Colection Physycal retlw 0x00 ; LOW retlw 0x09 ; usage x retlw 0x30 ; retlw 0x09 ; usage y retlw 0x31 ; retlw 0x15 ; logical minimun 0 retlw 0x00 ; retlw 0x26 ; logical maximun 1023 retlw 0xFF ; retlw 0x03 ; retlw 0x35 ; Physical Minimum (0) retlw 0x00 ; retlw 0x46 ; Physical Maximum (1023) retlw 0xFF ; retlw 0x03 ; retlw 0x95 ; REPORT_COUNT 2 retlw 0x02 ; retlw 0x75 ; report size 16 retlw 0x10 ; retlw 0x81 ; data,var,abs retlw 0x02 ; retlw 0xC0 ; END_COLLECTION ;****************************************** retlw 0xA1 ; Colection Physycal retlw 0x00 ; LOW retlw 0x09 ; usage Rx retlw 0x33 ; retlw 0x09 ; usage Ry retlw 0x34 ; retlw 0x15 ; logical minimun 0 retlw 0x00 ; retlw 0x26 ; logical maximun 2047 retlw 0xFF ; retlw 0x03 ; retlw 0x35 ; Physical Minimum (0) retlw 0x00 ; retlw 0x46 ; Physical Maximum (2047) retlw 0xFF ; retlw 0x03 ; retlw 0x95 ; REPORT_COUNT 2 retlw 0x02 ; retlw 0x75 ; report size 16 retlw 0x10 ; retlw 0x81 ; data,var,abs retlw 0x02 ; retlw 0xC0 ; END_COLLECTION ;****************************************** retlw 0x05 ; USAGE_PAGE (Button) retlw 0x09 ; low retlw 0x19 ; Usage Minimum (Button 1) retlw 0x01 ; retlw 0x29 ; Usage Maximum (Button 13) retlw 0x0E ; retlw 0x95 ; report count 13 retlw 0x0E ; retlw 0x75 ; report size 1 retlw 0x01 ; retlw 0x81 ; input data,var,abs retlw 0x02 ; retlw 0x95 ; report count 1 retlw 0x01 ; retlw 0x75 ; report size 2 retlw 0x02 ; retlw 0x81 ; input Cnst,var,abs retlw 0x01 ; retlw 0xC0 ; END_COLLECTION EndReportDescriptor1 ReportDescriptor2 ;*************************************** ;* Mouse Emu * ;*************************************** retlw 0x05 ; USAGE_PAGE (generic desktop) retlw 0x01 ; LOW retlw 0x09 ; USAGE Mouse retlw 0x02 ; LOW retlw 0xA1 ; COLLECTION (APPLICATION) retlw 0x01 ; LOW retlw 0x85 ; REPORT_ID (1) retlw 0x01 ; LOW retlw 0x09 ; USAGE_PAGE (Pointer) retlw 0x01 ; LOW retlw 0xA1 ; COLLECTION (Physical) retlw 0x00 ; retlw 0x05 ; USAGE_PAGE (Button) retlw 0x09 ; retlw 0x19 ; Usage Minimum (Button 1) retlw 0x01 ; retlw 0x29 ; Usage Maximum (Button 2) retlw 0x02 ; retlw 0x15 ; logical minimun retlw 0x00 ; retlw 0x25 ; logical maximun retlw 0x01 ; retlw 0x75 ; report size 1 retlw 0x01 ; retlw 0x95 ; report count 3 retlw 0x02 ; retlw 0x81 ; input (Data,Var,Abs,NWrp,Lin,Pref,NNul,Bit) retlw 0x02 ; retlw 0x95 ; report count 3 retlw 0x06 ; retlw 0x81 ; input (Data,Var,Abs) retlw 0x03 ; retlw 0x05 ; USAGE_PAGE (Generic Desktop) retlw 0x01 ; LOW retlw 0x09 ; Usage(X) retlw 0x30 ; retlw 0x09 ; Usage(Y) retlw 0x31 ; retlw 0x15 ; logical minimun (-127) retlw 0x81 ; retlw 0x25 ; logical maximun (127) retlw 0x7F ; retlw 0x75 ; report size 8 retlw 0x08 ; retlw 0x95 ; report count 2 retlw 0x02 ; retlw 0x81 ; INPUT (Data,Var,Rel) retlw 0x06 ; retlw 0xC0 ; END_COLLECTION retlw 0xC0 ; END_COLLECTION ;*************************************** ;* Keyboard Emu * ;*************************************** ;*************************************** ;* Volume Control * ;*************************************** retlw 0x05 ; USAGE_PAGE (Consumer Devices) retlw 0x0C ; LOW retlw 0x09 ; USAGE (Consumer Control) retlw 0x01 ; LOW retlw 0xA1 ; COLLECTION (APPLICATION) retlw 0x01 ; LOW retlw 0x85 ; REPORT_ID (2 Media) retlw 0x02 ; LOW retlw 0x19 ; Usage Minimum (0x00) retlw 0x00 ; retlw 0x2A ; Usage Maximum (0xAC format) retlw 0x3C ; retlw 0x02 retlw 0x15 ; logical minimun retlw 0x00 ; retlw 0x26 ; logical maximun (572) retlw 0x3C ; retlw 0x02 ; retlw 0x95 ; report count 1 retlw 0x01 ; retlw 0x75 ; report size 16 retlw 0x10 ; retlw 0x81 ; input (Data,Var,Abs) retlw 0x00 ; retlw 0xC0 ; END_COLLECTION EndReportDescriptor2 ; String pointer table USB_SD_Ptr Strings db low String0, high String0 db upper String0, 0 db low String1, high String1 db upper String1, 0 db low String2, high String2 db upper String2, 0 db low String3, high String3 db upper String3, 0 String0 retlw (String1-String0)/2 ; Length of string retlw USB_DESCRIPTOR_STRING ; Descriptor type 3 retlw 0x09 ; Language ID (as defined by MS 0x0409) retlw 0x04 ; company name String1 retlw (String2-String1)/2 retlw USB_DESCRIPTOR_STRING retlw 'D' retlw 0x00 retlw 'C' retlw 0x00 retlw 'L' retlw 0x00 retlw '.' retlw 0x00 ; product name String2 retlw (String3-String2)/2 retlw USB_DESCRIPTOR_STRING retlw 'P' retlw 0x00 retlw 'B' retlw 0x00 retlw 'J' retlw 0x00 retlw 'U' retlw 0x00 retlw 'I' retlw 0x00 retlw '3' retlw 0x00 retlw '2' retlw 0x00 retlw 'I' retlw 0x00 retlw 'A' retlw 0x00 retlw '8' retlw 0x00 retlw 'O' retlw 0x00 retlw '2' retlw 0x00 retlw '4' retlw 0x00 ; serial number String3 retlw (String4-String3)/2 retlw USB_DESCRIPTOR_STRING retlw 'D' retlw 0x00 retlw 'J' retlw 0x00 retlw 'C' retlw 0x00 retlw '0' retlw 0x00 retlw '0' retlw 0x00 retlw '2' retlw 0x00 retlw '2' retlw 0x00 String4 retlw (String5-String4)/2 retlw USB_DESCRIPTOR_STRING retlw 'A' retlw 0x00 retlw 'R' retlw 0x00 retlw 'C' retlw 0x00 retlw 'A' retlw 0x00 retlw 'D' retlw 0x00 retlw 'E' retlw 0x00 retlw ' ' retlw 0x00 retlw 'J' retlw 0x00 retlw 'A' retlw 0x00 retlw 'M' retlw 0x00 retlw 'M' retlw 0x00 retlw 'A' retlw 0x00 String5 endasm hid_desc_end
Code:; usb_hid.asm ;******************************************************************** ; File Description: ; Change History: ; Rev Date Description ; 1.0 11/19/2004 Initial release ; 2.1 02/26/2007 Updated for simplicity and to use common ; coding style ;*******************************************************************/ ;/** INCLUDES *******************************************************/ ;#include "GenericTypeDefs.h" ;#include "Compiler.h" ;#include "usb_config.h" ;#include "./USB/usb_device.h" ;#include "./USB/usb_function_hid.h" ;/** VARIABLES ******************************************************/ ;#pragma udata ;BYTE idle_rate; ;BYTE active_protocol; // [0] Boot Protocol [1] Report Protocol ;BYTE hid_rpt_rx_len; ;/** PRIVATE PROTOTYPES *********************************************/ ;void HIDGetReportHandler(void); ;void HIDSetReportHandler(void); ;/** DECLARATIONS ***************************************************/ ;#pragma code ;/** CLASS SPECIFIC REQUESTS ****************************************/ ;/******************************************************************** ; * Function: void USBCheckHIDRequest(void) ; * ; * PreCondition: None ; * ; * Input: None ; * ; * Output: None ; * ; * Side Effects: None ; * ; * Overview: This routine checks the setup data packet to see ; * if it knows how to handle it ; * ; * Note: None ; *******************************************************************/ ;//void USBCheckHIDRequest(void) USBCheckHIDRequest ;//{ movlb high _USBMEMORYADDRESS ; Point to proper bank ;// if(SetupPkt.Recipient != RCPT_INTF) return; movf SetupPkt, W ; Recipient = RCPT_INTF? andlw 0x1f ; Mask to lower 5 bits sublw RCPT_INTF bnz USBCheckHIDRequestExit ; No ;// if((SetupPkt.bIntfID != HID_INTF_ID)&& movlw HID_INTF_ID ; IntfID = HID_INTF_ID? cpfseq SetupPkt + bIntfID ;// (SetupPkt.bIntfID != HID_DEV_INTF_ID)) return; movlw HID_DEV_INTF_ID ; IntfID = HID_DEV_INTF_ID? cpfseq SetupPkt + bIntfID USBCheckHIDRequestExit return ; No ; /* ; * There are two standard requests that hid.c may support. ; * 1. GET_DSC(DSC_HID,DSC_RPT,DSC_PHY); ; * 2. SET_DSC(DSC_HID,DSC_RPT,DSC_PHY); ; */ ;// if(SetupPkt.bRequest == GET_DSC) movlw GET_DSC ; Request = GET_DSC? cpfseq SetupPkt + bRequest bra USBCheckHIDRequestClass ; No ;// { ;// switch(SetupPkt.bDescriptorType) ;// { ;// case DSC_HID: movlw DSC_HID ; DescriptorType = DSC_HID? cpfseq SetupPkt + bDescriptorType bra USBCheckHIDRequest1 ; No ;// if(USBActiveConfiguration == 1) movlw 1 ; USBActiveConfiguration = 1? cpfseq USBActiveConfiguration bra USBCheckHIDRequestClass ; No ;// { ;// USBEP0SendROMPtr( ;// (ROM BYTE*)&configDescriptor1 + 18, ;// sizeof(USB_HID_DSC)+3, // RRoj hack ;// USB_EP0_INCLUDE_ZERO); movlw HID_INTF_ID ; IntfID = HID_INTF_ID? cpfseq SetupPkt + bIntfID bra USBHdesc2 ; Use HIDDescriptor2 mSetSourcePointer HIDDescriptor1 mGetRomTableCount ; Set wCount ;// clrf info bcf info, ctrl_trf_mem ; Indicate ROM bsf info, includeZero ; Include a trailing zero packet bsf info, busy bra USBCheckHIDRequestClass USBHdesc2 mSetSourcePointer HIDDescriptor2 mGetRomTableCount ; Set wCount ;// clrf info bcf info, ctrl_trf_mem ; Indicate ROM bsf info, includeZero ; Include a trailing zero packet bsf info, busy bra USBCheckHIDRequestClass ;// } ;// break; USBCheckHIDRequest1 ; case DSC_RPT: movlw DSC_RPT ; DescriptorType = DSC_RPT? cpfseq SetupPkt + bDescriptorType bra USBCheckHIDRequest2 ; No ; if(USBActiveConfiguration == 1) movlw 1 ; USBActiveConfiguration = 1? cpfseq USBActiveConfiguration bra USBCheckHIDRequestClass ; No ; { ; USBEP0SendROMPtr( ; (ROM BYTE*)&hid_rpt01, ; sizeof(hid_rpt01), //See usbcfg.h ; USB_EP0_INCLUDE_ZERO); movlw HID_INTF_ID ; IntfID = HID_INTF_ID? cpfseq SetupPkt + bIntfID bra USBRDasc2 ; Use ReportDescriptor2 mSetSourcePointer ReportDescriptor1 movlw low (ReportDescriptor1Len) ; Set wCount movwf TBLPTRL movlw high (ReportDescriptor1Len) movwf TBLPTRH movlw upper (ReportDescriptor1Len) movwf TBLPTRU tblrd *+ ; Read count low movff TABLAT, inCount tblrd *+ ; Skip next tblrd * ; Read count high movff TABLAT, inCount + 1 ;// clrf info bcf info, ctrl_trf_mem ; Indicate ROM bsf info, includeZero ; Include a trailing zero packet bsf info, busy bra USBCheckHIDRequestClass USBRDasc2 mSetSourcePointer ReportDescriptor2 movlw low (ReportDescriptor1Len) ; Set wCount movwf TBLPTRL movlw high (ReportDescriptor1Len) movwf TBLPTRH movlw upper (ReportDescriptor1Len) movwf TBLPTRU tblrd *+ ; Read count low movff TABLAT, inCount tblrd *+ ; Skip next tblrd * ; Read count high movff TABLAT, inCount + 1 ;// clrf info bcf info, ctrl_trf_mem ; Indicate ROM bsf info, includeZero ; Include a trailing zero packet bsf info, busy bra USBCheckHIDRequestClass ;// } ;// break;
https://drive.google.com/file/d/1J_o...ew?usp=sharing





Bookmarks