changed bootloader back to using the minimal usb stack it came with because I have no idea how to get the bootloader code working with the full MLA HID USB stack
This commit is contained in:
@@ -2,23 +2,6 @@
|
|||||||
<configurationDescriptor version="65">
|
<configurationDescriptor version="65">
|
||||||
<logicalFolder name="root" displayName="root" projectFiles="true">
|
<logicalFolder name="root" displayName="root" projectFiles="true">
|
||||||
<logicalFolder name="f1" displayName="common_src" projectFiles="true">
|
<logicalFolder name="f1" displayName="common_src" projectFiles="true">
|
||||||
<logicalFolder name="framework" displayName="framework" projectFiles="true">
|
|
||||||
<logicalFolder name="usb" displayName="usb" projectFiles="true">
|
|
||||||
<logicalFolder name="inc" displayName="inc" projectFiles="true">
|
|
||||||
<itemPath>../../common_src/framework/usb/inc/usb.h</itemPath>
|
|
||||||
<itemPath>../../common_src/framework/usb/inc/usb_ch9.h</itemPath>
|
|
||||||
<itemPath>../../common_src/framework/usb/inc/usb_common.h</itemPath>
|
|
||||||
<itemPath>../../common_src/framework/usb/inc/usb_device.h</itemPath>
|
|
||||||
<itemPath>../../common_src/framework/usb/inc/usb_device_hid.h</itemPath>
|
|
||||||
<itemPath>../../common_src/framework/usb/inc/usb_hal.h</itemPath>
|
|
||||||
<itemPath>../../common_src/framework/usb/inc/usb_hal_pic18.h</itemPath>
|
|
||||||
</logicalFolder>
|
|
||||||
<logicalFolder name="src" displayName="src" projectFiles="true">
|
|
||||||
<itemPath>../../common_src/framework/usb/src/usb_device.c</itemPath>
|
|
||||||
<itemPath>../../common_src/framework/usb/src/usb_device_hid.c</itemPath>
|
|
||||||
</logicalFolder>
|
|
||||||
</logicalFolder>
|
|
||||||
</logicalFolder>
|
|
||||||
<itemPath>../../common_src/system.c</itemPath>
|
<itemPath>../../common_src/system.c</itemPath>
|
||||||
<itemPath>../../common_src/memory.h</itemPath>
|
<itemPath>../../common_src/memory.h</itemPath>
|
||||||
</logicalFolder>
|
</logicalFolder>
|
||||||
@@ -27,16 +10,25 @@
|
|||||||
projectFiles="true">
|
projectFiles="true">
|
||||||
<itemPath>../src/usb_config.h</itemPath>
|
<itemPath>../src/usb_config.h</itemPath>
|
||||||
<itemPath>../src/bootloader.h</itemPath>
|
<itemPath>../src/bootloader.h</itemPath>
|
||||||
|
<itemPath>../src/typedefs.h</itemPath>
|
||||||
</logicalFolder>
|
</logicalFolder>
|
||||||
<logicalFolder name="LinkerScript"
|
<logicalFolder name="LinkerScript"
|
||||||
displayName="Linker Files"
|
displayName="Linker Files"
|
||||||
projectFiles="true">
|
projectFiles="true">
|
||||||
</logicalFolder>
|
</logicalFolder>
|
||||||
|
<logicalFolder name="minimal_usb_driver"
|
||||||
|
displayName="minimal_usb_driver"
|
||||||
|
projectFiles="true">
|
||||||
|
<itemPath>../src/minimal_usb_driver/usb_device.c</itemPath>
|
||||||
|
<itemPath>../src/minimal_usb_driver/usb_device_hid.c</itemPath>
|
||||||
|
<itemPath>../src/minimal_usb_driver/usb.h</itemPath>
|
||||||
|
<itemPath>../src/minimal_usb_driver/usb_device.h</itemPath>
|
||||||
|
<itemPath>../src/minimal_usb_driver/usb_device_hid.h</itemPath>
|
||||||
|
</logicalFolder>
|
||||||
<logicalFolder name="SourceFiles"
|
<logicalFolder name="SourceFiles"
|
||||||
displayName="Source Files"
|
displayName="Source Files"
|
||||||
projectFiles="true">
|
projectFiles="true">
|
||||||
<itemPath>../src/usb_descriptors.c</itemPath>
|
<itemPath>../src/usb_descriptors.c</itemPath>
|
||||||
<itemPath>../src/usb_events.c</itemPath>
|
|
||||||
<itemPath>../src/main.c</itemPath>
|
<itemPath>../src/main.c</itemPath>
|
||||||
<itemPath>../src/bootloader.c</itemPath>
|
<itemPath>../src/bootloader.c</itemPath>
|
||||||
<itemPath>../src/VectorRemap.asm</itemPath>
|
<itemPath>../src/VectorRemap.asm</itemPath>
|
||||||
@@ -100,7 +92,7 @@
|
|||||||
<property key="define-macros" value=""/>
|
<property key="define-macros" value=""/>
|
||||||
<property key="disable-optimizations" value="true"/>
|
<property key="disable-optimizations" value="true"/>
|
||||||
<property key="extra-include-directories"
|
<property key="extra-include-directories"
|
||||||
value="..\src;..\..\common_src\framework\usb\inc;..\..\common_src"/>
|
value="..\src;..\..\common_src;..\src\minimal_usb_driver"/>
|
||||||
<property key="favor-optimization-for" value="-speed,+space"/>
|
<property key="favor-optimization-for" value="-speed,+space"/>
|
||||||
<property key="garbage-collect-data" value="true"/>
|
<property key="garbage-collect-data" value="true"/>
|
||||||
<property key="garbage-collect-functions" value="true"/>
|
<property key="garbage-collect-functions" value="true"/>
|
||||||
@@ -139,7 +131,7 @@
|
|||||||
<property key="calibrate-oscillator-value" value="0x3400"/>
|
<property key="calibrate-oscillator-value" value="0x3400"/>
|
||||||
<property key="clear-bss" value="true"/>
|
<property key="clear-bss" value="true"/>
|
||||||
<property key="code-model-external" value="wordwrite"/>
|
<property key="code-model-external" value="wordwrite"/>
|
||||||
<property key="code-model-rom" value="default,-2080-7FFF"/>
|
<property key="code-model-rom" value="default,-2000-7FFF"/>
|
||||||
<property key="create-html-files" value="false"/>
|
<property key="create-html-files" value="false"/>
|
||||||
<property key="data-model-ram" value=""/>
|
<property key="data-model-ram" value=""/>
|
||||||
<property key="data-model-size-of-double" value="32"/>
|
<property key="data-model-size-of-double" value="32"/>
|
||||||
|
|||||||
@@ -20,14 +20,14 @@
|
|||||||
;//High priority interrupt vector remapping
|
;//High priority interrupt vector remapping
|
||||||
PSECT HiVector,class=CODE,delta=1,abs
|
PSECT HiVector,class=CODE,delta=1,abs
|
||||||
org 0x08
|
org 0x08
|
||||||
goto 0x2088 ;Resides at 0x0008 (hardware high priority interrupt vector), and causes PC to jump to 0x2008 upon a high priority interrupt event
|
goto 0x2008 ;Resides at 0x0008 (hardware high priority interrupt vector), and causes PC to jump to 0x2008 upon a high priority interrupt event
|
||||||
|
|
||||||
|
|
||||||
;//Low priority interrupt vector remapping, as well as bootloader mode absolute
|
;//Low priority interrupt vector remapping, as well as bootloader mode absolute
|
||||||
;//entry point (located at 0x001C).
|
;//entry point (located at 0x001C).
|
||||||
PSECT LoVector,class=CODE,delta=1,abs
|
PSECT LoVector,class=CODE,delta=1,abs
|
||||||
org 0x18
|
org 0x18
|
||||||
goto 0x2098 ;Resides at 0x0018 (hardware low priority interrupt vector), and causes PC to jump to 0x2018 upon a low priority interrupt event
|
goto 0x2018 ;Resides at 0x0018 (hardware low priority interrupt vector), and causes PC to jump to 0x2018 upon a low priority interrupt event
|
||||||
goto 0x30 ;Resides at 0x001C //Serves as absolute entry point from application program into the bootloader mode
|
goto 0x30 ;Resides at 0x001C //Serves as absolute entry point from application program into the bootloader mode
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
#include "bootloader.h"
|
|
||||||
#include <xc.h>
|
|
||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
#include "usb_device_hid.h"
|
#include "bootloader.h"
|
||||||
|
|
||||||
|
|
||||||
#undef uint24_t
|
|
||||||
#define uint24_t uint32_t
|
|
||||||
|
|
||||||
//The bootloader version, which the bootloader PC application can do extended query to get.
|
//The bootloader version, which the bootloader PC application can do extended query to get.
|
||||||
//Value provided is expected to be in the format of BOOTLOADER_VERSION_MAJOR.BOOTLOADER_VERSION_MINOR
|
//Value provided is expected to be in the format of BOOTLOADER_VERSION_MAJOR.BOOTLOADER_VERSION_MINOR
|
||||||
@@ -145,8 +142,8 @@ typedef union
|
|||||||
};
|
};
|
||||||
} PacketToFromPC;
|
} PacketToFromPC;
|
||||||
|
|
||||||
PacketToFromPC PacketFromPC __at(0x42C);
|
PacketToFromPC PacketFromPC;
|
||||||
PacketToFromPC PacketToPC __at(0x46C);
|
PacketToFromPC PacketToPC;
|
||||||
unsigned char ProgrammingBuffer[ERASE_PAGE_SIZE];
|
unsigned char ProgrammingBuffer[ERASE_PAGE_SIZE];
|
||||||
unsigned char BootState;
|
unsigned char BootState;
|
||||||
unsigned int ErasePageTracker;
|
unsigned int ErasePageTracker;
|
||||||
@@ -154,9 +151,6 @@ unsigned char BufferedDataIndex;
|
|||||||
uint24_t ProgrammedPointer;
|
uint24_t ProgrammedPointer;
|
||||||
unsigned char ConfigsLockValue;
|
unsigned char ConfigsLockValue;
|
||||||
|
|
||||||
USB_VOLATILE USB_HANDLE txHandle;
|
|
||||||
USB_VOLATILE USB_HANDLE rxHandle;
|
|
||||||
|
|
||||||
void WriteFlashBlock(void);
|
void WriteFlashBlock(void);
|
||||||
void WriteConfigBits(void);
|
void WriteConfigBits(void);
|
||||||
void WriteEEPROM(void);
|
void WriteEEPROM(void);
|
||||||
@@ -173,10 +167,6 @@ void UserInit(void)
|
|||||||
ProgrammedPointer = INVALID_ADDRESS;
|
ProgrammedPointer = INVALID_ADDRESS;
|
||||||
BufferedDataIndex = 0;
|
BufferedDataIndex = 0;
|
||||||
ConfigsLockValue = 1;
|
ConfigsLockValue = 1;
|
||||||
|
|
||||||
USBEnableEndpoint(HID_EP, USB_IN_ENABLED|USB_OUT_ENABLED|USB_HANDSHAKE_ENABLED|USB_DISALLOW_SETUP);
|
|
||||||
rxHandle = HIDRxPacket(HID_EP, (uint8_t *)&PacketFromPC, USB_PACKET_SIZE);
|
|
||||||
txHandle = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
@@ -218,12 +208,11 @@ void ProcessIO(void)
|
|||||||
{
|
{
|
||||||
//We are currently in the IDLE state waiting for a command from the
|
//We are currently in the IDLE state waiting for a command from the
|
||||||
//PC software on the USB host.
|
//PC software on the USB host.
|
||||||
if(!HIDRxHandleBusy(rxHandle)) //Did we receive a command?
|
if(!mHIDRxIsBusy()) //Did we receive a command?
|
||||||
{
|
{
|
||||||
//We received a new command from the host. Copy the OUT packet from
|
//We received a new command from the host. Copy the OUT packet from
|
||||||
//the host into a local buffer for processing.
|
//the host into a local buffer for processing.
|
||||||
rxHandle = HIDRxPacket(HID_EP, (uint8_t *)&PacketFromPC, USB_PACKET_SIZE); //Also re-arms the OUT endpoint to be able to receive the next packet
|
HIDRxReport((char *)&PacketFromPC, USB_PACKET_SIZE); //Also re-arms the OUT endpoint to be able to receive the next packet
|
||||||
//HIDRxReport((char *)&PacketFromPC, USB_PACKET_SIZE); //Also re-arms the OUT endpoint to be able to receive the next packet
|
|
||||||
BootState = NOT_IDLE; //Set flag letting state machine know it has a command that needs processing.
|
BootState = NOT_IDLE; //Set flag letting state machine know it has a command that needs processing.
|
||||||
|
|
||||||
//Pre-initialize a response packet buffer (only used for some commands)
|
//Pre-initialize a response packet buffer (only used for some commands)
|
||||||
@@ -240,7 +229,7 @@ void ProcessIO(void)
|
|||||||
case QUERY_DEVICE:
|
case QUERY_DEVICE:
|
||||||
//Make sure the USB IN endpoint buffer is available, then load
|
//Make sure the USB IN endpoint buffer is available, then load
|
||||||
//up a query response packet to send to the host.
|
//up a query response packet to send to the host.
|
||||||
if(!HIDTxHandleBusy(txHandle))
|
if(!mHIDTxIsBusy())
|
||||||
{
|
{
|
||||||
//Prepare a response packet, which lets the PC software know about the memory ranges of this device.
|
//Prepare a response packet, which lets the PC software know about the memory ranges of this device.
|
||||||
PacketToPC.Command = QUERY_DEVICE;
|
PacketToPC.Command = QUERY_DEVICE;
|
||||||
@@ -266,7 +255,7 @@ void ProcessIO(void)
|
|||||||
//Init pad bytes to 0x00... Already done after we received the QUERY_DEVICE command (just after calling HIDRxReport()).
|
//Init pad bytes to 0x00... Already done after we received the QUERY_DEVICE command (just after calling HIDRxReport()).
|
||||||
|
|
||||||
//Now send the packet to the USB host software, assuming the USB endpoint is available/ready to accept new data.
|
//Now send the packet to the USB host software, assuming the USB endpoint is available/ready to accept new data.
|
||||||
txHandle = HIDTxPacket(HID_EP, (uint8_t *)&PacketToPC, USB_PACKET_SIZE);
|
HIDTxReport((char *)&PacketToPC, USB_PACKET_SIZE);
|
||||||
BootState = IDLE;
|
BootState = IDLE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -390,9 +379,9 @@ void ProcessIO(void)
|
|||||||
|
|
||||||
//Assuming the USB IN (to host) buffer is available/ready, copy the
|
//Assuming the USB IN (to host) buffer is available/ready, copy the
|
||||||
//data over so it can get sent to the USB host software.
|
//data over so it can get sent to the USB host software.
|
||||||
if(!HIDTxHandleBusy(txHandle))
|
if(!mHIDTxIsBusy())
|
||||||
{
|
{
|
||||||
txHandle = HIDTxPacket(HID_EP, (uint8_t *)&PacketToPC, USB_PACKET_SIZE);
|
HIDTxReport((char *)&PacketToPC, USB_PACKET_SIZE);
|
||||||
BootState = IDLE;
|
BootState = IDLE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -428,9 +417,9 @@ void ProcessIO(void)
|
|||||||
PacketToPC.Config7HMask = 0xFF;
|
PacketToPC.Config7HMask = 0xFF;
|
||||||
|
|
||||||
//Now actually command USB to send the packet to the host
|
//Now actually command USB to send the packet to the host
|
||||||
if(!HIDTxHandleBusy(txHandle))
|
if(!mHIDTxIsBusy())
|
||||||
{
|
{
|
||||||
txHandle = HIDTxPacket(HID_EP, (uint8_t *)&PacketToPC, USB_PACKET_SIZE);
|
HIDTxReport((char *)&PacketToPC, USB_PACKET_SIZE);
|
||||||
BootState = IDLE; //Packet will be sent, go back to idle state ready for next command from host
|
BootState = IDLE; //Packet will be sent, go back to idle state ready for next command from host
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -38,9 +38,9 @@ void ProcessIO(void);
|
|||||||
//#define REMAPPED_APPLICATION_LOW_ISR_VECTOR APP_FW_MEMORY_OFFSET + 0x18 //See VectorRemap.asm
|
//#define REMAPPED_APPLICATION_LOW_ISR_VECTOR APP_FW_MEMORY_OFFSET + 0x18 //See VectorRemap.asm
|
||||||
#define BOOTLOADER_ABSOLUTE_ENTRY_ADDRESS BOOTLOADER_ENTRYPOINT //Execute a "goto 0x001C" inline assembly instruction, if you want to enter the bootloader mode from the application via software
|
#define BOOTLOADER_ABSOLUTE_ENTRY_ADDRESS BOOTLOADER_ENTRYPOINT //Execute a "goto 0x001C" inline assembly instruction, if you want to enter the bootloader mode from the application via software
|
||||||
|
|
||||||
#define APP_SIGNATURE_ADDRESS APP_FW_MEMORY_OFFSET + 0x06 //0x1C06 and 0x1C07 contains the "signature" WORD, indicating successful erase/program/verify operation
|
//#define APP_SIGNATURE_ADDRESS APP_FW_MEMORY_OFFSET + 0x06 //0x1C06 and 0x1C07 contains the "signature" WORD, indicating successful erase/program/verify operation
|
||||||
#define APP_SIGNATURE_VALUE 0x600D //leet "GOOD", implying that the erase/program was a success and the bootloader intentionally programmed the APP_SIGNATURE_ADDRESS with this value
|
//#define APP_SIGNATURE_VALUE 0x600D //leet "GOOD", implying that the erase/program was a success and the bootloader intentionally programmed the APP_SIGNATURE_ADDRESS with this value
|
||||||
#define APP_VERSION_ADDRESS APP_FW_MEMORY_OFFSET + 0x16 //0x1C16 and 0x1C17 should contain the application image firmware version number
|
//#define APP_VERSION_ADDRESS APP_FW_MEMORY_OFFSET + 0x16 //0x1C16 and 0x1C17 should contain the application image firmware version number
|
||||||
|
|
||||||
#endif /* BOOTLOADER_ */
|
#endif /* BOOTLOADER_ */
|
||||||
|
|
||||||
|
|||||||
@@ -5,15 +5,18 @@
|
|||||||
* Created on August 9, 2019, 6:14 PM
|
* Created on August 9, 2019, 6:14 PM
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xc.h>
|
|
||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
#include "bootloader.h"
|
#include "bootloader.h"
|
||||||
|
|
||||||
|
unsigned int uint_delay_counter;
|
||||||
|
|
||||||
/* Private prototypes */
|
/* Private prototypes */
|
||||||
void main(void);
|
void main(void);
|
||||||
void BootMain(void);
|
void BootMain(void);
|
||||||
|
void InitializeSystem(void);
|
||||||
|
|
||||||
const unsigned int FlashSignatureWord __at(APP_SIGNATURE_ADDRESS) = APP_SIGNATURE_VALUE;
|
const unsigned int FlashSignatureWord __at(APP_SIGNATURE_ADDRESS) = APP_SIGNATURE_VALUE;
|
||||||
|
//const unsigned int FlashSignatureWord __at(APP_SIGNATURE_ADDRESS) = APP_SIGNATURE_VALUE;
|
||||||
|
|
||||||
void main(void)
|
void main(void)
|
||||||
{
|
{
|
||||||
@@ -24,7 +27,7 @@ void main(void)
|
|||||||
|
|
||||||
// normal operation: verify the firmware signature is valid. if it isn't enter
|
// normal operation: verify the firmware signature is valid. if it isn't enter
|
||||||
// bootloader (fw update) mode so valid firmware can be flashed
|
// bootloader (fw update) mode so valid firmware can be flashed
|
||||||
//DoFlashSignatureCheck:
|
DoFlashSignatureCheck:
|
||||||
//Check if the application region flash signature is valid
|
//Check if the application region flash signature is valid
|
||||||
if(*(const unsigned int*)APP_SIGNATURE_ADDRESS == APP_SIGNATURE_VALUE)
|
if(*(const unsigned int*)APP_SIGNATURE_ADDRESS == APP_SIGNATURE_VALUE)
|
||||||
{
|
{
|
||||||
@@ -62,12 +65,8 @@ void BootMain(void) __at(0x30)
|
|||||||
// any C initialized user variables (idata memory sections). Therefore, the above is all
|
// any C initialized user variables (idata memory sections). Therefore, the above is all
|
||||||
// the initialization that is required.
|
// the initialization that is required.
|
||||||
|
|
||||||
// initialize the USB framework
|
//Call other initialization code and (re)enable the USB module
|
||||||
USBDeviceInit();
|
InitializeSystem();
|
||||||
USBDeviceAttach();
|
|
||||||
|
|
||||||
// initialize the bootloader
|
|
||||||
UserInit();
|
|
||||||
|
|
||||||
//Execute main loop
|
//Execute main loop
|
||||||
while(1)
|
while(1)
|
||||||
@@ -80,4 +79,195 @@ void BootMain(void) __at(0x30)
|
|||||||
ProcessIO(); //This is where all the actual bootloader related data transfer/self programming takes
|
ProcessIO(); //This is where all the actual bootloader related data transfer/self programming takes
|
||||||
//place see ProcessIO() function in the BootPIC[xxxx].c file.
|
//place see ProcessIO() function in the BootPIC[xxxx].c file.
|
||||||
}//end while
|
}//end while
|
||||||
|
}
|
||||||
|
|
||||||
|
void InitializeSystem(void)
|
||||||
|
{
|
||||||
|
UserInit();
|
||||||
|
USBDeviceInit();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ******************************************************************************************************
|
||||||
|
// ************** USB Callback Functions ****************************************************************
|
||||||
|
// ******************************************************************************************************
|
||||||
|
// The USB firmware stack will call the callback functions USBCBxxx() in response to certain USB related
|
||||||
|
// events. For example, if the host PC is powering down, it will stop sending out Start of Frame (SOF)
|
||||||
|
// packets to your device. In response to this, all USB devices are supposed to decrease their power
|
||||||
|
// consumption from the USB Vbus to <2.5mA* each. The USB module detects this condition (which according
|
||||||
|
// to the USB specifications is 3+ms of no bus activity/SOF packets) and then calls the USBCBSuspend()
|
||||||
|
// function. You should modify these callback functions to take appropriate actions for each of these
|
||||||
|
// conditions. For example, in the USBCBSuspend(), you may wish to add code that will decrease power
|
||||||
|
// consumption from Vbus to <2.5mA (such as by clock switching, turning off LEDs, putting the
|
||||||
|
// microcontroller to sleep, etc.). Then, in the USBCBWakeFromSuspend() function, you may then wish to
|
||||||
|
// add code that undoes the power saving things done in the USBCBSuspend() function.
|
||||||
|
//
|
||||||
|
// Note *: The "usb_20.pdf" specs indicate 500uA or 2.5mA, depending upon device classification. However,
|
||||||
|
// the USB-IF has officially issued an ECN (engineering change notice) changing this to 2.5mA for all
|
||||||
|
// devices. Make sure to re-download the latest specifications to get all of the newest ECNs.
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Function: void USBCBWakeFromSuspend(void)
|
||||||
|
*
|
||||||
|
* PreCondition: None
|
||||||
|
*
|
||||||
|
* Input: None
|
||||||
|
*
|
||||||
|
* Output: None
|
||||||
|
*
|
||||||
|
* Side Effects: None
|
||||||
|
*
|
||||||
|
* Overview: The host may put USB peripheral devices in low power
|
||||||
|
* suspend mode (by "sending" 3+ms of idle). Once in suspend
|
||||||
|
* mode, the host may wake the device back up by sending non-
|
||||||
|
* idle state signalling.
|
||||||
|
*
|
||||||
|
* This call back is invoked when a wakeup from USB suspend
|
||||||
|
* is detected.
|
||||||
|
*
|
||||||
|
* Note: Before returning from this function, make sure that the
|
||||||
|
* oscillator settings are fully compatible with USB module
|
||||||
|
* operation.
|
||||||
|
* If using the two-speed startup feature, wakeup and execution
|
||||||
|
* will occur before the main oscillator + PLL has had a chance
|
||||||
|
* to start. Device will run from INTOSC (no PLL). However, the
|
||||||
|
* USB module cannot be clocked and receive correct USB data when
|
||||||
|
* it is not clocked with the correct frequency clock source.
|
||||||
|
* Therefore, when using two-speed startup, should execute software
|
||||||
|
* delay to prevent any other code from executing until the main
|
||||||
|
* oscillator is ready.
|
||||||
|
* The host will allow at least 10ms for USB "resume recovery", during
|
||||||
|
* which it will not try to communicate with the device.
|
||||||
|
*****************************************************************************/
|
||||||
|
void USBCBWakeFromSuspend(void)
|
||||||
|
{
|
||||||
|
//This code delays ~5ms @ 8MHz to execute (using C18 3.21 with full
|
||||||
|
//optimizations enabled), but takes much less time at 48MHz. This delay
|
||||||
|
//is to make sure the PLL is enabled and locked, in case two speed startup
|
||||||
|
//was enabled
|
||||||
|
DelayRoutine(0x300); //Device will switch clocks (if using two-speed startup) while executing this delay function
|
||||||
|
|
||||||
|
//Primary oscillator and PLL should be running by now.
|
||||||
|
|
||||||
|
//Do not return from this function until the oscillator is correctly configured and
|
||||||
|
//running in a USB compatible mode/frequency.
|
||||||
|
|
||||||
|
|
||||||
|
//Additional code for re-enabling I/O pins and increasing power draw from VBUS
|
||||||
|
//may be placed here (up to the maximum of 100mA [when unconfigured] or the
|
||||||
|
//amount specified in the configuration descriptor (when configured).
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Function: void USBCBSuspend(void)
|
||||||
|
*
|
||||||
|
* PreCondition: None
|
||||||
|
*
|
||||||
|
* Input: None
|
||||||
|
*
|
||||||
|
* Output: None
|
||||||
|
*
|
||||||
|
* Side Effects: None
|
||||||
|
*
|
||||||
|
* Overview: Call back that is invoked when a USB suspend is detected
|
||||||
|
*
|
||||||
|
* Note: None
|
||||||
|
*****************************************************************************/
|
||||||
|
void USBCBSuspend(void)
|
||||||
|
{
|
||||||
|
Sleep(); // Go to sleep, wake up when a USB activity event occurs
|
||||||
|
//If using the WDT, should go back to sleep if awoke by WDT instead of USBIF
|
||||||
|
while((USBIF_FLAG == 0) && (RCONbits.TO == 0)) //If using the WDT, should go back to sleep if awoke by WDT instead of USBIF
|
||||||
|
{
|
||||||
|
Sleep(); //Entry into sleep clears WDT count, much like executing ClrWdt() instruction
|
||||||
|
}
|
||||||
|
|
||||||
|
//After the USB suspend event ends, you should re-configure your I/O pins
|
||||||
|
//for normal operation mode (which is allowed to consume more current).
|
||||||
|
//However, it is recommended to put this code in the USBCBWakeFromSuspend()
|
||||||
|
//function instead of here (so that this function will work with either
|
||||||
|
//sleeping or clock switching to a lower frequency).
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
* Function: void USBCBInitEP(uint8_t ConfigurationIndex)
|
||||||
|
*
|
||||||
|
* PreCondition: None
|
||||||
|
*
|
||||||
|
* Input: None
|
||||||
|
*
|
||||||
|
* Output: None
|
||||||
|
*
|
||||||
|
* Side Effects: None
|
||||||
|
*
|
||||||
|
* Overview: This function is called when the device becomes
|
||||||
|
* initialized, which occurs after the host sends a
|
||||||
|
* SET_CONFIGURATION request. This
|
||||||
|
* callback function should initialize the endpoints
|
||||||
|
* for the device's usage according to the current
|
||||||
|
* configuration.
|
||||||
|
*
|
||||||
|
* Note: If the host ever "unconfigures" the device, it will
|
||||||
|
* set the configuration to '0'. In this case, this
|
||||||
|
* callback gets called with ConfigurationIndex == 0, where
|
||||||
|
* the firmware should disable all non-EP0 endpoints (until
|
||||||
|
* the next non-zero SET_CONFIGURATION request is received,
|
||||||
|
* which will cause this callback to execute again).
|
||||||
|
*******************************************************************/
|
||||||
|
void USBCBInitEP(uint8_t ConfigurationIndex)
|
||||||
|
{
|
||||||
|
//Check what configuration "index" the host has requested us to select.
|
||||||
|
//Configuration index 0 is special and represents that the device should be
|
||||||
|
//un-configured. However, when the host sets the configuration (with index
|
||||||
|
//matching the valid/implemented configuration from the configuration descriptor),
|
||||||
|
//the firmware should enable the application endpoints associated with that
|
||||||
|
//configuration, and (re)initialize all application state variables associated
|
||||||
|
//with the USB application endpoints operation.
|
||||||
|
if(ConfigurationIndex == 1) //This application only implements one configuration, with index == 1.
|
||||||
|
{
|
||||||
|
//The host sent us a non-zero set configuration index. In this
|
||||||
|
//case we should prepare the application endpoints to be ready
|
||||||
|
//to use, and to (re-)initialize any application variables associated
|
||||||
|
//with the endpoints.
|
||||||
|
HIDInitEP();
|
||||||
|
|
||||||
|
//(Re-)Initialize the application variables associated with the USB interface
|
||||||
|
UserInit(); // See BootPIC[xxxx].c. Initializes the bootloader firmware state machine variables.
|
||||||
|
}
|
||||||
|
//else the host set the configuration back to 0 (indicating unconfigured), or
|
||||||
|
//to some higher (non-implemented value). In either case, we don't need to
|
||||||
|
//do anything specifically, unless the application requires some kind of
|
||||||
|
//"safe shutdown" code to execute after the host has deconfigured the device.
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************************************
|
||||||
|
* Function: void USBCBCheckOtherReq(void)
|
||||||
|
*
|
||||||
|
* PreCondition: None
|
||||||
|
*
|
||||||
|
* Input: None
|
||||||
|
*
|
||||||
|
* Output: None
|
||||||
|
*
|
||||||
|
* Side Effects: None
|
||||||
|
*
|
||||||
|
* Overview: This function is called when the USB stack receives a
|
||||||
|
* new control transfer SETUP packet from the host. The
|
||||||
|
* USB stack handles normal USB "Chapter 9" requests internally,
|
||||||
|
* but some control transfer requests are class specific. In
|
||||||
|
* order to handle these class specific requests, you must call
|
||||||
|
* the class handler's firmware control transfer handler function.
|
||||||
|
* If implementing a composite device with multiple classes
|
||||||
|
* implemented, call each of the handlers in the below callback.
|
||||||
|
*
|
||||||
|
* Note: None
|
||||||
|
*******************************************************************/
|
||||||
|
void USBCBCheckOtherReq(void)
|
||||||
|
{
|
||||||
|
USBCheckHIDRequest();
|
||||||
}
|
}
|
||||||
55
bootloader/src/minimal_usb_driver/usb.h
Normal file
55
bootloader/src/minimal_usb_driver/usb.h
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
Copyright 2016 Microchip Technology Inc. (www.microchip.com)
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
To request to license the code under the MLA license (www.microchip.com/mla_license),
|
||||||
|
please contact mla_licensing@microchip.com
|
||||||
|
*******************************************************************************/
|
||||||
|
#ifndef USB_H
|
||||||
|
#define USB_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* usb.h provides a centralize way to include all files
|
||||||
|
* required by Microchip USB Firmware.
|
||||||
|
*
|
||||||
|
* The order of inclusion is important.
|
||||||
|
* Dependency conflicts are resolved by the correct ordering.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "typedefs.h"
|
||||||
|
#include "usb_config.h"
|
||||||
|
#include "usb_device.h"
|
||||||
|
|
||||||
|
#if defined(USB_USE_HID) // See usb_config.h
|
||||||
|
#include "usb_device_hid.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
//These callback functions belong in your main.c (or equivalent) file. The USB
|
||||||
|
//stack will call these callback functions in response to specific USB bus events,
|
||||||
|
//such as entry into USB suspend mode, exit from USB suspend mode, and upon
|
||||||
|
//receiving the "set configuration" control tranfer request, which marks the end
|
||||||
|
//of the USB enumeration sequence and the start of normal application run mode (and
|
||||||
|
//where application related variables and endpoints may need to get (re)-initialized.
|
||||||
|
void USBCBSuspend(void);
|
||||||
|
void USBCBWakeFromSuspend(void);
|
||||||
|
void USBCBInitEP(uint8_t ConfigurationIndex);
|
||||||
|
void USBCBCheckOtherReq(void);
|
||||||
|
|
||||||
|
|
||||||
|
//API renaming wrapper functions
|
||||||
|
#define HIDTxHandleBusy(a) {mHIDTxIsBusy()}
|
||||||
|
#define HIDRxHandleBusy(a) {mHIDRxIsBusy()}
|
||||||
|
|
||||||
|
#endif //USB_H
|
||||||
1625
bootloader/src/minimal_usb_driver/usb_device.c
Normal file
1625
bootloader/src/minimal_usb_driver/usb_device.c
Normal file
File diff suppressed because it is too large
Load Diff
699
bootloader/src/minimal_usb_driver/usb_device.h
Normal file
699
bootloader/src/minimal_usb_driver/usb_device.h
Normal file
@@ -0,0 +1,699 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
Copyright 2016 Microchip Technology Inc. (www.microchip.com)
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
To request to license the code under the MLA license (www.microchip.com/mla_license),
|
||||||
|
please contact mla_licensing@microchip.com
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _USB_DEVICE_H
|
||||||
|
#define _USB_DEVICE_H
|
||||||
|
|
||||||
|
/** I N C L U D E S **********************************************************/
|
||||||
|
#include "usb.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//Hardware abstraction. The USBIF and USBIE bits reside in different registers
|
||||||
|
//on different USB microcontrollers.
|
||||||
|
#if defined(__18F45K50) || defined(__18F25K50) || defined(__18F24K50) || defined(__18LF45K50) || defined(__18LF25K50) || defined(__18LF24K50)
|
||||||
|
#define USBIF_FLAG PIR3bits.USBIF
|
||||||
|
#define USBIE_BIT PIE3bits.USBIE
|
||||||
|
#else
|
||||||
|
#define USBIF_FLAG PIR2bits.USBIF
|
||||||
|
#define USBIE_BIT PIE2bits.USBIE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/** D E F I N I T I O N S ****************************************************/
|
||||||
|
/******************************************************************************
|
||||||
|
* Standard Request Codes
|
||||||
|
* USB 2.0 Spec Ref Table 9-4
|
||||||
|
*****************************************************************************/
|
||||||
|
#define GET_STATUS 0
|
||||||
|
#define CLR_FEATURE 1
|
||||||
|
#define SET_FEATURE 3
|
||||||
|
#define SET_ADR 5
|
||||||
|
#define GET_DSC 6
|
||||||
|
#define SET_DSC 7
|
||||||
|
#define GET_CFG 8
|
||||||
|
#define SET_CFG 9
|
||||||
|
#define GET_INTF 10
|
||||||
|
#define SET_INTF 11
|
||||||
|
#define SYNCH_FRAME 12
|
||||||
|
|
||||||
|
/* Standard Feature Selectors */
|
||||||
|
#define DEVICE_REMOTE_WAKEUP 0x01
|
||||||
|
#define ENDPOINT_HALT 0x00
|
||||||
|
|
||||||
|
|
||||||
|
/* UCFG Initialization Parameters */
|
||||||
|
#define _PPBM0 0x00 // Pingpong Buffer Mode 0 - ping pong bufferring disabled
|
||||||
|
#define _PPBM1 0x01 // Pingpong Buffer Mode 1 - ping pong on EP0 OUT only
|
||||||
|
#define _PPBM2 0x02 // Pingpong Buffer Mode 2 - ping pong on all endpoints
|
||||||
|
#define _LS 0x00 // Use Low-Speed USB Mode
|
||||||
|
#define _FS 0x04 // Use Full-Speed USB Mode
|
||||||
|
#define _TRINT 0x00 // Use internal transceiver
|
||||||
|
#define _TREXT 0x08 // Use external transceiver
|
||||||
|
#define _PUEN 0x10 // Use internal pull-up resistor
|
||||||
|
#define _OEMON 0x40 // Use SIE output indicator
|
||||||
|
#define _UTEYE 0x80 // Use Eye-Pattern test
|
||||||
|
|
||||||
|
/* UEPn Initialization Parameters */
|
||||||
|
#define EP_CTRL 0x06 // Cfg Control pipe for this ep
|
||||||
|
#define EP_OUT 0x0C // Cfg OUT only pipe for this ep
|
||||||
|
#define EP_IN 0x0A // Cfg IN only pipe for this ep
|
||||||
|
#define EP_OUT_IN 0x0E // Cfg both OUT & IN pipes for this ep
|
||||||
|
#define HSHK_EN 0x10 // Enable handshake packet
|
||||||
|
// Handshake should be disable for isoch
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* USB - PICmicro Endpoint Definitions
|
||||||
|
* PICmicro EP Address Format: X:EP3:EP2:EP1:EP0:DIR:PPBI:X
|
||||||
|
* This is used when checking the value read from USTAT
|
||||||
|
*
|
||||||
|
* NOTE: These definitions are not used in the descriptors.
|
||||||
|
* EP addresses used in the descriptors have different format and
|
||||||
|
* are defined in: usb_device.h
|
||||||
|
*****************************************************************************/
|
||||||
|
#define OUT 0
|
||||||
|
#define IN 1
|
||||||
|
|
||||||
|
#define PIC_EP_NUM_MASK 0b01111000
|
||||||
|
#define PIC_EP_DIR_MASK 0b00000100
|
||||||
|
|
||||||
|
#define EP00_OUT ((0x00<<3)|(OUT<<2))
|
||||||
|
#define EP00_IN ((0x00<<3)|(IN<<2))
|
||||||
|
#define EP01_OUT ((0x01<<3)|(OUT<<2))
|
||||||
|
#define EP01_IN ((0x01<<3)|(IN<<2))
|
||||||
|
#define EP02_OUT ((0x02<<3)|(OUT<<2))
|
||||||
|
#define EP02_IN ((0x02<<3)|(IN<<2))
|
||||||
|
#define EP03_OUT ((0x03<<3)|(OUT<<2))
|
||||||
|
#define EP03_IN ((0x03<<3)|(IN<<2))
|
||||||
|
#define EP04_OUT ((0x04<<3)|(OUT<<2))
|
||||||
|
#define EP04_IN ((0x04<<3)|(IN<<2))
|
||||||
|
#define EP05_OUT ((0x05<<3)|(OUT<<2))
|
||||||
|
#define EP05_IN ((0x05<<3)|(IN<<2))
|
||||||
|
#define EP06_OUT ((0x06<<3)|(OUT<<2))
|
||||||
|
#define EP06_IN ((0x06<<3)|(IN<<2))
|
||||||
|
#define EP07_OUT ((0x07<<3)|(OUT<<2))
|
||||||
|
#define EP07_IN ((0x07<<3)|(IN<<2))
|
||||||
|
#define EP08_OUT ((0x08<<3)|(OUT<<2))
|
||||||
|
#define EP08_IN ((0x08<<3)|(IN<<2))
|
||||||
|
#define EP09_OUT ((0x09<<3)|(OUT<<2))
|
||||||
|
#define EP09_IN ((0x09<<3)|(IN<<2))
|
||||||
|
#define EP10_OUT ((0x0A<<3)|(OUT<<2))
|
||||||
|
#define EP10_IN ((0x0A<<3)|(IN<<2))
|
||||||
|
#define EP11_OUT ((0x0B<<3)|(OUT<<2))
|
||||||
|
#define EP11_IN ((0x0B<<3)|(IN<<2))
|
||||||
|
#define EP12_OUT ((0x0C<<3)|(OUT<<2))
|
||||||
|
#define EP12_IN ((0x0C<<3)|(IN<<2))
|
||||||
|
#define EP13_OUT ((0x0D<<3)|(OUT<<2))
|
||||||
|
#define EP13_IN ((0x0D<<3)|(IN<<2))
|
||||||
|
#define EP14_OUT ((0x0E<<3)|(OUT<<2))
|
||||||
|
#define EP14_IN ((0x0E<<3)|(IN<<2))
|
||||||
|
#define EP15_OUT ((0x0F<<3)|(OUT<<2))
|
||||||
|
#define EP15_IN ((0x0F<<3)|(IN<<2))
|
||||||
|
|
||||||
|
#define EP0_OUT_EVEN_BDT_INDEX 0
|
||||||
|
#define EP0_OUT_ODD_BDT_INDEX 1
|
||||||
|
|
||||||
|
|
||||||
|
/* Buffer Descriptor Status Register Initialization Parameters */
|
||||||
|
#define _BSTALL 0x04 //Buffer Stall enable
|
||||||
|
#define _DTSEN 0x08 //Data Toggle Synch enable
|
||||||
|
#define _INCDIS 0x10 //Address increment disable
|
||||||
|
#define _KEN 0x20 //SIE keeps buff descriptors enable
|
||||||
|
#define _DAT0 0x00 //DATA0 packet expected next
|
||||||
|
#define _DAT1 0x40 //DATA1 packet expected next
|
||||||
|
#define _DTSMASK 0x40 //DTS Mask
|
||||||
|
#define _USIE 0x80 //SIE owns buffer
|
||||||
|
#define _UCPU 0x00 //CPU owns buffer
|
||||||
|
|
||||||
|
/* USB Device States - To be used with [byte usb_device_state] */
|
||||||
|
#define DETACHED_STATE 0
|
||||||
|
#define ATTACHED_STATE 1
|
||||||
|
#define POWERED_STATE 2
|
||||||
|
#define DEFAULT_STATE 3
|
||||||
|
#define ADR_PENDING_STATE 4
|
||||||
|
#define ADDRESS_STATE 5
|
||||||
|
#define CONFIGURED_STATE 6
|
||||||
|
|
||||||
|
/* Memory Types for Control Transfer - used in USB_DEVICE_STATUS */
|
||||||
|
#define _RAM 0
|
||||||
|
#define _ROM 1
|
||||||
|
|
||||||
|
/* Descriptor Types */
|
||||||
|
#define DSC_DEV 0x01
|
||||||
|
#define DSC_CFG 0x02
|
||||||
|
#define DSC_STR 0x03
|
||||||
|
#define DSC_INTF 0x04
|
||||||
|
#define DSC_EP 0x05
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* USB Endpoint Definitions
|
||||||
|
* USB Standard EP Address Format: DIR:X:X:X:EP3:EP2:EP1:EP0
|
||||||
|
* This is used in the descriptors. See usb_descriptors.c
|
||||||
|
*
|
||||||
|
* NOTE: Do not use these values for checking against USTAT.
|
||||||
|
* To check against USTAT, use values defined in "usb_device.h"
|
||||||
|
*****************************************************************************/
|
||||||
|
#define _EP01_OUT 0x01
|
||||||
|
#define _EP01_IN 0x81
|
||||||
|
#define _EP02_OUT 0x02
|
||||||
|
#define _EP02_IN 0x82
|
||||||
|
#define _EP03_OUT 0x03
|
||||||
|
#define _EP03_IN 0x83
|
||||||
|
#define _EP04_OUT 0x04
|
||||||
|
#define _EP04_IN 0x84
|
||||||
|
#define _EP05_OUT 0x05
|
||||||
|
#define _EP05_IN 0x85
|
||||||
|
#define _EP06_OUT 0x06
|
||||||
|
#define _EP06_IN 0x86
|
||||||
|
#define _EP07_OUT 0x07
|
||||||
|
#define _EP07_IN 0x87
|
||||||
|
#define _EP08_OUT 0x08
|
||||||
|
#define _EP08_IN 0x88
|
||||||
|
#define _EP09_OUT 0x09
|
||||||
|
#define _EP09_IN 0x89
|
||||||
|
#define _EP10_OUT 0x0A
|
||||||
|
#define _EP10_IN 0x8A
|
||||||
|
#define _EP11_OUT 0x0B
|
||||||
|
#define _EP11_IN 0x8B
|
||||||
|
#define _EP12_OUT 0x0C
|
||||||
|
#define _EP12_IN 0x8C
|
||||||
|
#define _EP13_OUT 0x0D
|
||||||
|
#define _EP13_IN 0x8D
|
||||||
|
#define _EP14_OUT 0x0E
|
||||||
|
#define _EP14_IN 0x8E
|
||||||
|
#define _EP15_OUT 0x0F
|
||||||
|
#define _EP15_IN 0x8F
|
||||||
|
|
||||||
|
/* Configuration Attributes */
|
||||||
|
#define _DEFAULT 0x01<<7 //Default Value (Bit 7 is set)
|
||||||
|
#define _SELF 0x01<<6 //Self-powered (Supports if set)
|
||||||
|
#define _RWU 0x01<<5 //Remote Wakeup (Supports if set)
|
||||||
|
|
||||||
|
/* Endpoint Transfer Type */
|
||||||
|
#define _CTRL 0x00 //Control Transfer
|
||||||
|
#define _ISO 0x01 //Isochronous Transfer
|
||||||
|
#define _BULK 0x02 //Bulk Transfer
|
||||||
|
#define _INT 0x03 //Interrupt Transfer
|
||||||
|
|
||||||
|
/* Isochronous Endpoint Synchronization Type */
|
||||||
|
#define _NS 0x00<<2 //No Synchronization
|
||||||
|
#define _AS 0x01<<2 //Asynchronous
|
||||||
|
#define _AD 0x02<<2 //Adaptive
|
||||||
|
#define _SY 0x03<<2 //Synchronous
|
||||||
|
|
||||||
|
/* Isochronous Endpoint Usage Type */
|
||||||
|
#define _DE 0x00<<4 //Data endpoint
|
||||||
|
#define _FE 0x01<<4 //Feedback endpoint
|
||||||
|
#define _IE 0x02<<4 //Implicit feedback Data endpoint
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** T Y P E S ****************************************************************/
|
||||||
|
typedef union _USB_DEVICE_STATUS
|
||||||
|
{
|
||||||
|
uint8_t _byte;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
unsigned RemoteWakeup:1;// [0]Disabled [1]Enabled: See usb_device.c,usb9.c
|
||||||
|
unsigned ctrl_trf_mem:1;// [0]RAM [1]ROM
|
||||||
|
};
|
||||||
|
} USB_DEVICE_STATUS;
|
||||||
|
|
||||||
|
typedef union _BD_STAT
|
||||||
|
{
|
||||||
|
uint8_t _byte;
|
||||||
|
struct{
|
||||||
|
unsigned BC8:1;
|
||||||
|
unsigned BC9:1;
|
||||||
|
unsigned BSTALL:1; //Buffer Stall Enable
|
||||||
|
unsigned DTSEN:1; //Data Toggle Synch Enable
|
||||||
|
unsigned INCDIS:1; //Address Increment Disable
|
||||||
|
unsigned KEN:1; //BD Keep Enable
|
||||||
|
unsigned DTS:1; //Data Toggle Synch Value
|
||||||
|
unsigned UOWN:1; //USB Ownership
|
||||||
|
};
|
||||||
|
struct{
|
||||||
|
unsigned :2;
|
||||||
|
unsigned PID0:1;
|
||||||
|
unsigned PID1:1;
|
||||||
|
unsigned PID2:1;
|
||||||
|
unsigned PID3:1;
|
||||||
|
unsigned :2;
|
||||||
|
};
|
||||||
|
struct{
|
||||||
|
unsigned :2;
|
||||||
|
unsigned PID:4; //Packet Identifier
|
||||||
|
unsigned :2;
|
||||||
|
};
|
||||||
|
} BD_STAT; //Buffer Descriptor Status Register
|
||||||
|
|
||||||
|
typedef union _BDT
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
BD_STAT Stat;
|
||||||
|
uint8_t Cnt;
|
||||||
|
uint8_t ADRL; //Buffer Address Low
|
||||||
|
uint8_t ADRH; //Buffer Address High
|
||||||
|
};
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
uint8_t* ADR; //Buffer Address
|
||||||
|
};
|
||||||
|
} BDT; //Buffer Descriptor Table
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* CTRL_TRF_SETUP:
|
||||||
|
*
|
||||||
|
* Every setup packet has 8 bytes.
|
||||||
|
* However, the buffer size has to equal the EP0_BUFF_SIZE value specified
|
||||||
|
* in usb_config.h
|
||||||
|
* The value of EP0_BUFF_SIZE can be 8, 16, 32, or 64.
|
||||||
|
*
|
||||||
|
* First 8 bytes are defined to be directly addressable to improve speed
|
||||||
|
* and reduce code size.
|
||||||
|
* Bytes beyond the 8th byte have to be accessed using indirect addressing.
|
||||||
|
*****************************************************************************/
|
||||||
|
typedef union _CTRL_TRF_SETUP
|
||||||
|
{
|
||||||
|
/** Array for indirect addressing ****************************************/
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint8_t _byte[EP0_BUFF_SIZE];
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Standard Device Requests *********************************************/
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint8_t bmRequestType;
|
||||||
|
uint8_t bRequest;
|
||||||
|
uint16_t wValue;
|
||||||
|
uint16_t wIndex;
|
||||||
|
uint16_t wLength;
|
||||||
|
};
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
WORD_VAL W_Value;
|
||||||
|
WORD_VAL W_Index;
|
||||||
|
WORD_VAL W_Length;
|
||||||
|
};
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
unsigned Recipient:5; //Device,Interface,Endpoint,Other
|
||||||
|
unsigned RequestType:2; //Standard,Class,Vendor,Reserved
|
||||||
|
unsigned DataDir:1; //Host-to-device,Device-to-host
|
||||||
|
unsigned :8;
|
||||||
|
uint8_t bFeature; //DEVICE_REMOTE_WAKEUP,ENDPOINT_HALT
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
};
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
uint8_t bDscIndex; //For Configuration and String DSC Only
|
||||||
|
uint8_t bDscType; //Device,Configuration,String
|
||||||
|
uint16_t wLangID; //Language ID
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
};
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
uint8_t bDevADR; //Device Address 0-127
|
||||||
|
uint8_t bDevADRH; //Must equal zero
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
};
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
uint8_t bCfgValue; //Configuration Value 0-255
|
||||||
|
uint8_t bCfgRSD; //Must equal zero (Reserved)
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
};
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
uint8_t bAltID; //Alternate Setting Value 0-255
|
||||||
|
uint8_t bAltID_H; //Must equal zero
|
||||||
|
uint8_t bIntfID; //Interface Number Value 0-255
|
||||||
|
uint8_t bIntfID_H; //Must equal zero
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
};
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
uint8_t bEPID; //Endpoint ID (Number & Direction)
|
||||||
|
uint8_t bEPID_H; //Must equal zero
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
};
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
unsigned EPNum:4; //Endpoint Number 0-15
|
||||||
|
unsigned :3;
|
||||||
|
unsigned EPDir:1; //Endpoint Direction: 0-OUT, 1-IN
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
unsigned :8;
|
||||||
|
};
|
||||||
|
/** End: Standard Device Requests ****************************************/
|
||||||
|
|
||||||
|
} CTRL_TRF_SETUP;
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* CTRL_TRF_DATA:
|
||||||
|
*
|
||||||
|
* Buffer size has to equal the EP0_BUFF_SIZE value specified
|
||||||
|
* in usb_config.h
|
||||||
|
* The value of EP0_BUFF_SIZE can be 8, 16, 32, or 64.
|
||||||
|
*
|
||||||
|
* First 8 bytes are defined to be directly addressable to improve speed
|
||||||
|
* and reduce code size.
|
||||||
|
* Bytes beyond the 8th byte have to be accessed using indirect addressing.
|
||||||
|
*****************************************************************************/
|
||||||
|
typedef union _CTRL_TRF_DATA
|
||||||
|
{
|
||||||
|
/** Array for indirect addressing ****************************************/
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint8_t _byte[EP0_BUFF_SIZE];
|
||||||
|
};
|
||||||
|
|
||||||
|
/** First 8-byte direct addressing ***************************************/
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint8_t _byte0;
|
||||||
|
uint8_t _byte1;
|
||||||
|
uint8_t _byte2;
|
||||||
|
uint8_t _byte3;
|
||||||
|
uint8_t _byte4;
|
||||||
|
uint8_t _byte5;
|
||||||
|
uint8_t _byte6;
|
||||||
|
uint8_t _byte7;
|
||||||
|
};
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
uint16_t _word0;
|
||||||
|
uint16_t _word1;
|
||||||
|
uint16_t _word2;
|
||||||
|
uint16_t _word3;
|
||||||
|
};
|
||||||
|
|
||||||
|
} CTRL_TRF_DATA;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* USB Device Descriptor Structure
|
||||||
|
*****************************************************************************/
|
||||||
|
typedef struct _USB_DEV_DSC
|
||||||
|
{
|
||||||
|
uint8_t bLength; uint8_t bDscType; uint16_t bcdUSB;
|
||||||
|
uint8_t bDevCls; uint8_t bDevSubCls; uint8_t bDevProtocol;
|
||||||
|
uint8_t bMaxPktSize0; uint16_t idVendor; uint16_t idProduct;
|
||||||
|
uint16_t bcdDevice; uint8_t iMFR; uint8_t iProduct;
|
||||||
|
uint8_t iSerialNum; uint8_t bNumCfg;
|
||||||
|
} USB_DEV_DSC;
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* USB Configuration Descriptor Structure
|
||||||
|
*****************************************************************************/
|
||||||
|
typedef struct _USB_CFG_DSC
|
||||||
|
{
|
||||||
|
uint8_t bLength; uint8_t bDscType; uint16_t wTotalLength;
|
||||||
|
uint8_t bNumIntf; uint8_t bCfgValue; uint8_t iCfg;
|
||||||
|
uint8_t bmAttributes; uint8_t bMaxPower;
|
||||||
|
} USB_CFG_DSC;
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* USB Interface Descriptor Structure
|
||||||
|
*****************************************************************************/
|
||||||
|
typedef struct _USB_INTF_DSC
|
||||||
|
{
|
||||||
|
uint8_t bLength; uint8_t bDscType; uint8_t bIntfNum;
|
||||||
|
uint8_t bAltSetting; uint8_t bNumEPs; uint8_t bIntfCls;
|
||||||
|
uint8_t bIntfSubCls; uint8_t bIntfProtocol; uint8_t iIntf;
|
||||||
|
} USB_INTF_DSC;
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* USB Endpoint Descriptor Structure
|
||||||
|
*****************************************************************************/
|
||||||
|
typedef struct _USB_EP_DSC
|
||||||
|
{
|
||||||
|
uint8_t bLength; uint8_t bDscType; uint8_t bEPAdr;
|
||||||
|
uint8_t bmAttributes; uint16_t wMaxPktSize; uint8_t bInterval;
|
||||||
|
} USB_EP_DSC;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Macro: void mInitializeUSBDriver(void)
|
||||||
|
*
|
||||||
|
* PreCondition: None
|
||||||
|
*
|
||||||
|
* Input: None
|
||||||
|
*
|
||||||
|
* Output: None
|
||||||
|
*
|
||||||
|
* Side Effects: None
|
||||||
|
*
|
||||||
|
* Overview: Configures the USB module, definition of UCFG_VAL can be
|
||||||
|
* found in usb_config.h
|
||||||
|
*
|
||||||
|
* This register determines: USB Speed, On-chip pull-up
|
||||||
|
* resistor selection, On-chip tranceiver selection, bus
|
||||||
|
* eye pattern generation mode, Ping-pong buffering mode
|
||||||
|
* selection.
|
||||||
|
*
|
||||||
|
* Note: None
|
||||||
|
*****************************************************************************/
|
||||||
|
#define mInitializeUSBDriver() {UCFG = UCFG_VAL; \
|
||||||
|
usb_device_state = DETACHED_STATE; \
|
||||||
|
USBProtocolResetHandler();}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Macro: void mDisableEP1to15(void)
|
||||||
|
*
|
||||||
|
* PreCondition: None
|
||||||
|
*
|
||||||
|
* Input: None
|
||||||
|
*
|
||||||
|
* Output: None
|
||||||
|
*
|
||||||
|
* Side Effects: None
|
||||||
|
*
|
||||||
|
* Overview: This macro disables all endpoints except EP0.
|
||||||
|
* This macro should be called when the host sends a RESET
|
||||||
|
* signal or a SET_CONFIGURATION request.
|
||||||
|
*
|
||||||
|
* Note: None
|
||||||
|
*****************************************************************************/
|
||||||
|
//#if defined(__18F14K50) || defined(__18F13K50) || defined(__18LF14K50) || defined(__18LF13K50)
|
||||||
|
// #define mDisableEP1to15() ClearArray((uint8_t*)&UEP1,7);
|
||||||
|
//#else
|
||||||
|
// #define mDisableEP1to15() ClearArray((uint8_t*)&UEP1,15);
|
||||||
|
//#endif
|
||||||
|
|
||||||
|
//Using below instead to save code space. Dedicated bootloader project,
|
||||||
|
//will never use UEP3+, therefore no need to really mess with those registers
|
||||||
|
#define mDisableEP1to7() UEP1=0x00;UEP2=0x00;UEP3=0x00;\
|
||||||
|
UEP4=0x00;UEP5=0x00;UEP6=0x00;UEP7=0x00;
|
||||||
|
// UEP8=0x00;UEP9=0x00;UEP10=0x00;UEP11=0x00;\
|
||||||
|
// UEP12=0x00;UEP13=0x00;UEP14=0x00;UEP15=0x00;
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Macro: void mUSBBufferReady(buffer_dsc)
|
||||||
|
*
|
||||||
|
* PreCondition: IN Endpoint: Buffer is loaded and ready to be sent.
|
||||||
|
* OUT Endpoint: Buffer is free to be written to by SIE.
|
||||||
|
*
|
||||||
|
* Input: byte buffer_dsc: Root name of the buffer descriptor group.
|
||||||
|
* i.e. ep0Bo, ep1Bi, ... Declared in usbmmap.c
|
||||||
|
* Names can be remapped for readability, see examples in
|
||||||
|
* usb_config.h (#define HID_BD_OUT ep1Bo)
|
||||||
|
*
|
||||||
|
* Output: None
|
||||||
|
*
|
||||||
|
* Side Effects: None
|
||||||
|
*
|
||||||
|
* Overview: This macro should be called each time after:
|
||||||
|
* 1. A non-EP0 IN endpoint buffer is populated with data.
|
||||||
|
* 2. A non-EP0 OUT endpoint buffer is read.
|
||||||
|
* This macro turns the buffer ownership to SIE for servicing.
|
||||||
|
* It also toggles the DTS bit for synchronization.
|
||||||
|
*
|
||||||
|
* Note: None
|
||||||
|
*****************************************************************************/
|
||||||
|
#define mUSBBufferReady(buffer_dsc) \
|
||||||
|
{ \
|
||||||
|
buffer_dsc.Stat._byte &= _DTSMASK; /* Save only DTS bit */ \
|
||||||
|
buffer_dsc.Stat.DTS = !buffer_dsc.Stat.DTS; /* Toggle DTS bit */ \
|
||||||
|
buffer_dsc.Stat._byte |= _DTSEN; /* Configure other settings */ \
|
||||||
|
buffer_dsc.Stat._byte |= _USIE; /* Turn ownership to SIE */ \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** D E F I N I T I O N S ****************************************************/
|
||||||
|
/*
|
||||||
|
* MUID = Microchip USB Class ID
|
||||||
|
* Used to identify which of the USB classes owns the current
|
||||||
|
* session of control transfer over EP0
|
||||||
|
*/
|
||||||
|
#define MUID_NULL 0
|
||||||
|
#define MUID_USB9 1
|
||||||
|
#define MUID_HID 2
|
||||||
|
#define MUID_CDC 3
|
||||||
|
|
||||||
|
|
||||||
|
/* Control Transfer States */
|
||||||
|
#define WAIT_SETUP 0
|
||||||
|
#define CTRL_TRF_TX 1
|
||||||
|
#define CTRL_TRF_RX 2
|
||||||
|
|
||||||
|
/* Short Packet States - Used by Control Transfer Read - CTRL_TRF_TX */
|
||||||
|
#define SHORT_PKT_NOT_SENT 0
|
||||||
|
#define SHORT_PKT_PENDING 1
|
||||||
|
#define SHORT_PKT_SENT 2
|
||||||
|
|
||||||
|
/* USB PID: Token Types - See chapter 8 in the USB specification */
|
||||||
|
#define SETUP_TOKEN 0b00001101
|
||||||
|
#define OUT_TOKEN 0b00000001
|
||||||
|
#define IN_TOKEN 0b00001001
|
||||||
|
|
||||||
|
/* bmRequestType Definitions */
|
||||||
|
#define HOST_TO_DEV 0
|
||||||
|
#define DEV_TO_HOST 1
|
||||||
|
|
||||||
|
#define STANDARD 0x00
|
||||||
|
#define CLASS 0x01
|
||||||
|
#define VENDOR 0x02
|
||||||
|
|
||||||
|
#define RCPT_DEV 0
|
||||||
|
#define RCPT_INTF 1
|
||||||
|
#define RCPT_EP 2
|
||||||
|
#define RCPT_OTH 3
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** E X T E R N S ************************************************************/
|
||||||
|
extern uint8_t ctrl_trf_session_owner;
|
||||||
|
extern POINTER pSrc;
|
||||||
|
extern POINTER pDst;
|
||||||
|
extern WORD_VAL wCount;
|
||||||
|
extern uint8_t usb_device_state;
|
||||||
|
extern USB_DEVICE_STATUS usb_stat;
|
||||||
|
extern uint8_t usb_active_cfg;
|
||||||
|
extern uint8_t usb_alt_intf[MAX_NUM_INT];
|
||||||
|
|
||||||
|
extern volatile BDT ep0Bo; //Endpoint #0 BD Out
|
||||||
|
extern volatile BDT ep0Bi; //Endpoint #0 BD In
|
||||||
|
extern volatile BDT ep1Bo; //Endpoint #1 BD Out
|
||||||
|
extern volatile BDT ep1Bi; //Endpoint #1 BD In
|
||||||
|
extern volatile BDT ep2Bo; //Endpoint #2 BD Out
|
||||||
|
extern volatile BDT ep2Bi; //Endpoint #2 BD In
|
||||||
|
extern volatile BDT ep3Bo; //Endpoint #3 BD Out
|
||||||
|
extern volatile BDT ep3Bi; //Endpoint #3 BD In
|
||||||
|
extern volatile BDT ep4Bo; //Endpoint #4 BD Out
|
||||||
|
extern volatile BDT ep4Bi; //Endpoint #4 BD In
|
||||||
|
extern volatile BDT ep5Bo; //Endpoint #5 BD Out
|
||||||
|
extern volatile BDT ep5Bi; //Endpoint #5 BD In
|
||||||
|
extern volatile BDT ep6Bo; //Endpoint #6 BD Out
|
||||||
|
extern volatile BDT ep6Bi; //Endpoint #6 BD In
|
||||||
|
extern volatile BDT ep7Bo; //Endpoint #7 BD Out
|
||||||
|
extern volatile BDT ep7Bi; //Endpoint #7 BD In
|
||||||
|
extern volatile BDT ep8Bo; //Endpoint #8 BD Out
|
||||||
|
extern volatile BDT ep8Bi; //Endpoint #8 BD In
|
||||||
|
extern volatile BDT ep9Bo; //Endpoint #9 BD Out
|
||||||
|
extern volatile BDT ep9Bi; //Endpoint #9 BD In
|
||||||
|
extern volatile BDT ep10Bo; //Endpoint #10 BD Out
|
||||||
|
extern volatile BDT ep10Bi; //Endpoint #10 BD In
|
||||||
|
extern volatile BDT ep11Bo; //Endpoint #11 BD Out
|
||||||
|
extern volatile BDT ep11Bi; //Endpoint #11 BD In
|
||||||
|
extern volatile BDT ep12Bo; //Endpoint #12 BD Out
|
||||||
|
extern volatile BDT ep12Bi; //Endpoint #12 BD In
|
||||||
|
extern volatile BDT ep13Bo; //Endpoint #13 BD Out
|
||||||
|
extern volatile BDT ep13Bi; //Endpoint #13 BD In
|
||||||
|
extern volatile BDT ep14Bo; //Endpoint #14 BD Out
|
||||||
|
extern volatile BDT ep14Bi; //Endpoint #14 BD In
|
||||||
|
extern volatile BDT ep15Bo; //Endpoint #15 BD Out
|
||||||
|
extern volatile BDT ep15Bi; //Endpoint #15 BD In
|
||||||
|
|
||||||
|
extern CTRL_TRF_SETUP SetupPkt;
|
||||||
|
volatile extern CTRL_TRF_DATA CtrlTrfData;
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(USB_USE_HID)
|
||||||
|
extern volatile unsigned char hid_report_out[HID_INT_OUT_EP_SIZE];
|
||||||
|
extern volatile unsigned char hid_report_in[HID_INT_IN_EP_SIZE];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
extern ROM USB_DEV_DSC device_dsc;
|
||||||
|
extern ROM uint8_t CFG01[CONFIG_DESC_TOTAL_LEN];
|
||||||
|
extern ROM const unsigned char *ROM USB_CD_Ptr[];
|
||||||
|
extern ROM unsigned char* ROM USB_SD_Ptr[];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** P U B L I C P R O T O T Y P E S *****************************************/
|
||||||
|
void USBDeviceInit(void);
|
||||||
|
void USBCheckBusStatus(void);
|
||||||
|
void USBSoftAttach(void);
|
||||||
|
void USBSoftDetach(void);
|
||||||
|
void USBDeviceTasks(void);
|
||||||
|
void USBDisableWithLongDelay(void);
|
||||||
|
void DelayRoutine(unsigned int DelayAmount);
|
||||||
|
void ClearWatchdog(void);
|
||||||
|
#define USBGetDeviceState() usb_device_state
|
||||||
|
#define USBIsDeviceSuspended() UCONbits.SUSPND
|
||||||
|
|
||||||
|
|
||||||
|
#endif //_USB_DEVICE_H
|
||||||
302
bootloader/src/minimal_usb_driver/usb_device_hid.c
Normal file
302
bootloader/src/minimal_usb_driver/usb_device_hid.c
Normal file
@@ -0,0 +1,302 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
Copyright 2016 Microchip Technology Inc. (www.microchip.com)
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
To request to license the code under the MLA license (www.microchip.com/mla_license),
|
||||||
|
please contact mla_licensing@microchip.com
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
/** I N C L U D E S **********************************************************/
|
||||||
|
#include "usb.h"
|
||||||
|
|
||||||
|
#ifdef USB_USE_HID
|
||||||
|
|
||||||
|
/** V A R I A B L E S ********************************************************/
|
||||||
|
#ifndef __XC8__
|
||||||
|
#pragma udata
|
||||||
|
#endif
|
||||||
|
uint8_t idle_rate;
|
||||||
|
uint8_t active_protocol; // [0] Boot Protocol [1] Report Protocol
|
||||||
|
uint8_t hid_rpt_rx_len;
|
||||||
|
|
||||||
|
/** P R I V A T E P R O T O T Y P E S ***************************************/
|
||||||
|
void HIDGetReportHandler(void);
|
||||||
|
void HIDSetReportHandler(void);
|
||||||
|
|
||||||
|
/** D E C L A R A T I O N S **************************************************/
|
||||||
|
#ifndef __XC8__
|
||||||
|
#pragma code
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** C L A S S S P E C I F I C R E Q ****************************************/
|
||||||
|
/******************************************************************************
|
||||||
|
* 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)
|
||||||
|
{
|
||||||
|
if(SetupPkt.Recipient != RCPT_INTF) return;
|
||||||
|
if(SetupPkt.bIntfID != HID_INTF_ID) return;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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)
|
||||||
|
{
|
||||||
|
switch(SetupPkt.bDscType)
|
||||||
|
{
|
||||||
|
case DSC_HID:
|
||||||
|
ctrl_trf_session_owner = MUID_HID;
|
||||||
|
pSrc.bRom = &CFG01[18]; //18 is a magic number (offset from start of configuration descriptor, to the start of the HID descriptor)
|
||||||
|
wCount.Val = sizeof(USB_HID_DSC);
|
||||||
|
break;
|
||||||
|
case DSC_RPT:
|
||||||
|
ctrl_trf_session_owner = MUID_HID;
|
||||||
|
mUSBGetHIDRptDscAdr(pSrc.bRom); // See usb_config.h
|
||||||
|
mUSBGetHIDRptDscSize(wCount.Val); // See usb_config.h
|
||||||
|
break;
|
||||||
|
case DSC_PHY:
|
||||||
|
// ctrl_trf_session_owner = MUID_HID;
|
||||||
|
break;
|
||||||
|
}//end switch(SetupPkt.bDscType)
|
||||||
|
usb_stat.ctrl_trf_mem = _ROM;
|
||||||
|
}//end if(SetupPkt.bRequest == GET_DSC)
|
||||||
|
|
||||||
|
if(SetupPkt.RequestType != CLASS) return;
|
||||||
|
switch(SetupPkt.bRequest)
|
||||||
|
{
|
||||||
|
case GET_REPORT:
|
||||||
|
HIDGetReportHandler();
|
||||||
|
break;
|
||||||
|
case SET_REPORT:
|
||||||
|
HIDSetReportHandler();
|
||||||
|
break;
|
||||||
|
case GET_IDLE:
|
||||||
|
ctrl_trf_session_owner = MUID_HID;
|
||||||
|
pSrc.bRam = (uint8_t*)&idle_rate; // Set source
|
||||||
|
usb_stat.ctrl_trf_mem = _RAM; // Set memory type
|
||||||
|
wCount.v[0] = 1; // Set data count
|
||||||
|
break;
|
||||||
|
case SET_IDLE:
|
||||||
|
ctrl_trf_session_owner = MUID_HID;
|
||||||
|
//idle_rate = MSB(SetupPkt.W_Value);
|
||||||
|
idle_rate = SetupPkt.W_Value.v[1];
|
||||||
|
break;
|
||||||
|
case GET_PROTOCOL:
|
||||||
|
ctrl_trf_session_owner = MUID_HID;
|
||||||
|
pSrc.bRam = (uint8_t*)&active_protocol;// Set source
|
||||||
|
usb_stat.ctrl_trf_mem = _RAM; // Set memory type
|
||||||
|
wCount.v[0] = 1; // Set data count
|
||||||
|
break;
|
||||||
|
case SET_PROTOCOL:
|
||||||
|
ctrl_trf_session_owner = MUID_HID;
|
||||||
|
//active_protocol = LSB(SetupPkt.W_Value);
|
||||||
|
active_protocol = SetupPkt.W_Value.v[0];
|
||||||
|
break;
|
||||||
|
}//end switch(SetupPkt.bRequest)
|
||||||
|
|
||||||
|
}//end USBCheckHIDRequest
|
||||||
|
|
||||||
|
void HIDGetReportHandler(void)
|
||||||
|
{
|
||||||
|
// ctrl_trf_session_owner = MUID_HID;
|
||||||
|
}//end HIDGetReportHandler
|
||||||
|
|
||||||
|
void HIDSetReportHandler(void)
|
||||||
|
{
|
||||||
|
// ctrl_trf_session_owner = MUID_HID;
|
||||||
|
// pDst.bRam = (byte*)&hid_report_out;
|
||||||
|
}//end HIDSetReportHandler
|
||||||
|
|
||||||
|
/** U S E R A P I ***********************************************************/
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Function: void HIDInitEP(void)
|
||||||
|
*
|
||||||
|
* PreCondition: None
|
||||||
|
*
|
||||||
|
* Input: None
|
||||||
|
*
|
||||||
|
* Output: None
|
||||||
|
*
|
||||||
|
* Side Effects: None
|
||||||
|
*
|
||||||
|
* Overview: HIDInitEP initializes HID endpoints, buffer descriptors,
|
||||||
|
* internal state-machine, and variables.
|
||||||
|
* It should be called after the USB host has sent out a
|
||||||
|
* SET_CONFIGURATION request.
|
||||||
|
* See USBStdSetCfgHandler() in usb9.c for examples.
|
||||||
|
*
|
||||||
|
* Note: None
|
||||||
|
*****************************************************************************/
|
||||||
|
void HIDInitEP(void)
|
||||||
|
{
|
||||||
|
hid_rpt_rx_len =0;
|
||||||
|
|
||||||
|
HID_UEP = EP_OUT_IN|HSHK_EN; // Enable 2 data pipes
|
||||||
|
|
||||||
|
//Arm the OUT interrupt endpoint so the host can send the first packet of data.
|
||||||
|
HID_BD_OUT.Cnt = sizeof(hid_report_out); // Set buffer size
|
||||||
|
HID_BD_OUT.ADR = (uint8_t*)&hid_report_out; // Set buffer address
|
||||||
|
HID_BD_OUT.Stat._byte = _DAT0|_DTSEN; // Set status
|
||||||
|
HID_BD_OUT.Stat._byte |= _USIE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Do not have to init Cnt of IN pipes here.
|
||||||
|
* Reason: Number of bytes to send to the host
|
||||||
|
* varies from one transaction to
|
||||||
|
* another. Cnt should equal the exact
|
||||||
|
* number of bytes to transmit for
|
||||||
|
* a given IN transaction.
|
||||||
|
* This number of bytes will only
|
||||||
|
* be known right before the data is
|
||||||
|
* sent.
|
||||||
|
*/
|
||||||
|
HID_BD_IN.ADR = (uint8_t*)&hid_report_in; // Set buffer address
|
||||||
|
HID_BD_IN.Stat._byte = _UCPU|_DAT1; // Set status
|
||||||
|
|
||||||
|
}//end HIDInitEP
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Function: void HIDTxReport(char *buffer, byte len)
|
||||||
|
*
|
||||||
|
* PreCondition: mHIDTxIsBusy() must return false.
|
||||||
|
*
|
||||||
|
* Value of 'len' must be equal to or smaller than
|
||||||
|
* HID_INT_IN_EP_SIZE
|
||||||
|
* For an interrupt endpoint, the largest buffer size is
|
||||||
|
* 64 bytes.
|
||||||
|
*
|
||||||
|
* Input: buffer : Pointer to the starting location of data bytes
|
||||||
|
* len : Number of bytes to be transferred
|
||||||
|
*
|
||||||
|
* Output: None
|
||||||
|
*
|
||||||
|
* Side Effects: None
|
||||||
|
*
|
||||||
|
* Overview: Use this macro to transfer data located in data memory.
|
||||||
|
*
|
||||||
|
* Remember: mHIDTxIsBusy() must return false before user
|
||||||
|
* can call this function.
|
||||||
|
* Unexpected behavior will occur if this function is called
|
||||||
|
* when mHIDTxIsBusy() == 0
|
||||||
|
*
|
||||||
|
* Typical Usage:
|
||||||
|
* if(!mHIDTxIsBusy())
|
||||||
|
* HIDTxReport(buffer, 3);
|
||||||
|
*
|
||||||
|
* Note: None
|
||||||
|
*****************************************************************************/
|
||||||
|
void HIDTxReport(char *buffer, uint8_t len)
|
||||||
|
{
|
||||||
|
uint8_t i;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Value of len should be equal to or smaller than HID_INT_IN_EP_SIZE.
|
||||||
|
* This check forces the value of len to meet the precondition.
|
||||||
|
*/
|
||||||
|
if(len > HID_INT_IN_EP_SIZE)
|
||||||
|
len = HID_INT_IN_EP_SIZE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copy data from user's buffer to a USB module accessible RAM packet buffer
|
||||||
|
*/
|
||||||
|
for (i = 0; i < len; i++)
|
||||||
|
hid_report_in[i] = buffer[i];
|
||||||
|
|
||||||
|
HID_BD_IN.Cnt = len;
|
||||||
|
mUSBBufferReady(HID_BD_IN);
|
||||||
|
|
||||||
|
}//end HIDTxReport
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Function: byte HIDRxReport(char *buffer, byte len)
|
||||||
|
*
|
||||||
|
* PreCondition: Value of input argument 'len' should be smaller than the
|
||||||
|
* maximum endpoint size responsible for receiving report
|
||||||
|
* data from USB host for HID class.
|
||||||
|
* Input argument 'buffer' should point to a buffer area that
|
||||||
|
* is bigger or equal to the size specified by 'len'.
|
||||||
|
*
|
||||||
|
* Input: buffer : Pointer to where received bytes are to be stored
|
||||||
|
* len : The number of bytes expected.
|
||||||
|
*
|
||||||
|
* Output: The number of bytes copied to buffer.
|
||||||
|
*
|
||||||
|
* Side Effects: Publicly accessible variable hid_rpt_rx_len is updated
|
||||||
|
* with the number of bytes copied to buffer.
|
||||||
|
* Once HIDRxReport is called, subsequent retrieval of
|
||||||
|
* hid_rpt_rx_len can be done by calling macro
|
||||||
|
* mHIDGetRptRxLength().
|
||||||
|
*
|
||||||
|
* Overview: HIDRxReport copies a string of bytes received through
|
||||||
|
* USB HID OUT endpoint to a user's specified location.
|
||||||
|
* It is a non-blocking function. It does not wait
|
||||||
|
* for data if there is no data available. Instead it returns
|
||||||
|
* '0' to notify the caller that there is no data available.
|
||||||
|
*
|
||||||
|
* Note: If the actual number of bytes received is larger than the
|
||||||
|
* number of bytes expected (len), only the expected number
|
||||||
|
* of bytes specified will be copied to buffer.
|
||||||
|
* If the actual number of bytes received is smaller than the
|
||||||
|
* number of bytes expected (len), only the actual number
|
||||||
|
* of bytes received will be copied to buffer.
|
||||||
|
*****************************************************************************/
|
||||||
|
uint8_t HIDRxReport(char *buffer, uint8_t len)
|
||||||
|
{
|
||||||
|
hid_rpt_rx_len = 0;
|
||||||
|
|
||||||
|
if(!mHIDRxIsBusy())
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Adjust the expected number of bytes to equal
|
||||||
|
* the actual number of bytes received.
|
||||||
|
*/
|
||||||
|
if(len > HID_BD_OUT.Cnt)
|
||||||
|
len = HID_BD_OUT.Cnt;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copy data from dual-ram buffer to user's buffer
|
||||||
|
*/
|
||||||
|
for(hid_rpt_rx_len = 0; hid_rpt_rx_len < len; hid_rpt_rx_len++)
|
||||||
|
buffer[hid_rpt_rx_len] = hid_report_out[hid_rpt_rx_len];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Prepare dual-ram buffer for next OUT transaction
|
||||||
|
*/
|
||||||
|
HID_BD_OUT.Cnt = sizeof(hid_report_out);
|
||||||
|
mUSBBufferReady(HID_BD_OUT);
|
||||||
|
}//end if
|
||||||
|
|
||||||
|
return hid_rpt_rx_len;
|
||||||
|
|
||||||
|
}//end HIDRxReport
|
||||||
|
|
||||||
|
#endif //def USB_USE_HID
|
||||||
|
|
||||||
|
/** EOF hid.c ***************************************************************/
|
||||||
163
bootloader/src/minimal_usb_driver/usb_device_hid.h
Normal file
163
bootloader/src/minimal_usb_driver/usb_device_hid.h
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
Copyright 2016 Microchip Technology Inc. (www.microchip.com)
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
To request to license the code under the MLA license (www.microchip.com/mla_license),
|
||||||
|
please contact mla_licensing@microchip.com
|
||||||
|
*******************************************************************************/
|
||||||
|
#ifndef HID_H
|
||||||
|
#define HID_H
|
||||||
|
|
||||||
|
/** I N C L U D E S **********************************************************/
|
||||||
|
#include "typedefs.h"
|
||||||
|
|
||||||
|
/** D E F I N I T I O N S ****************************************************/
|
||||||
|
|
||||||
|
/* Class-Specific Requests */
|
||||||
|
#define GET_REPORT 0x01
|
||||||
|
#define GET_IDLE 0x02
|
||||||
|
#define GET_PROTOCOL 0x03
|
||||||
|
#define SET_REPORT 0x09
|
||||||
|
#define SET_IDLE 0x0A
|
||||||
|
#define SET_PROTOCOL 0x0B
|
||||||
|
|
||||||
|
/* Class Descriptor Types */
|
||||||
|
#define DSC_HID 0x21
|
||||||
|
#define DSC_RPT 0x22
|
||||||
|
#define DSC_PHY 0x23
|
||||||
|
|
||||||
|
/* Protocol Selection */
|
||||||
|
#define BOOT_PROTOCOL 0x00
|
||||||
|
#define RPT_PROTOCOL 0x01
|
||||||
|
|
||||||
|
|
||||||
|
/* HID Interface Class Code */
|
||||||
|
#define HID_INTF 0x03
|
||||||
|
|
||||||
|
/* HID Interface Class SubClass Codes */
|
||||||
|
#define BOOT_INTF_SUBCLASS 0x01
|
||||||
|
|
||||||
|
/* HID Interface Class Protocol Codes */
|
||||||
|
#define HID_PROTOCOL_NONE 0x00
|
||||||
|
#define HID_PROTOCOL_KEYBOAD 0x01
|
||||||
|
#define HID_PROTOCOL_MOUSE 0x02
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Macro: (bit) mHIDRxIsBusy(void)
|
||||||
|
*
|
||||||
|
* PreCondition: None
|
||||||
|
*
|
||||||
|
* Input: None
|
||||||
|
*
|
||||||
|
* Output: None
|
||||||
|
*
|
||||||
|
* Side Effects: None
|
||||||
|
*
|
||||||
|
* Overview: This macro is used to check if HID OUT endpoint is
|
||||||
|
* busy (owned by SIE) or not.
|
||||||
|
* Typical Usage: if(mHIDRxIsBusy())
|
||||||
|
*
|
||||||
|
* Note: None
|
||||||
|
*****************************************************************************/
|
||||||
|
#define mHIDRxIsBusy() HID_BD_OUT.Stat.UOWN
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Macro: (bit) mHIDTxIsBusy(void)
|
||||||
|
*
|
||||||
|
* PreCondition: None
|
||||||
|
*
|
||||||
|
* Input: None
|
||||||
|
*
|
||||||
|
* Output: None
|
||||||
|
*
|
||||||
|
* Side Effects: None
|
||||||
|
*
|
||||||
|
* Overview: This macro is used to check if HID IN endpoint is
|
||||||
|
* busy (owned by SIE) or not.
|
||||||
|
* Typical Usage: if(mHIDTxIsBusy())
|
||||||
|
*
|
||||||
|
* Note: None
|
||||||
|
*****************************************************************************/
|
||||||
|
#define mHIDTxIsBusy() HID_BD_IN.Stat.UOWN
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* Macro: uint8_t mHIDGetRptRxLength(void)
|
||||||
|
*
|
||||||
|
* PreCondition: None
|
||||||
|
*
|
||||||
|
* Input: None
|
||||||
|
*
|
||||||
|
* Output: mHIDGetRptRxLength returns hid_rpt_rx_len
|
||||||
|
*
|
||||||
|
* Side Effects: None
|
||||||
|
*
|
||||||
|
* Overview: mHIDGetRptRxLength is used to retrieve the number of bytes
|
||||||
|
* copied to user's buffer by the most recent call to
|
||||||
|
* HIDRxReport function.
|
||||||
|
*
|
||||||
|
* Note: None
|
||||||
|
*****************************************************************************/
|
||||||
|
#define mHIDGetRptRxLength() hid_rpt_rx_len
|
||||||
|
|
||||||
|
|
||||||
|
/* HID macros */
|
||||||
|
#define mUSBGetHIDDscAdr(ptr) \
|
||||||
|
{ \
|
||||||
|
if(usb_active_cfg == 1) \
|
||||||
|
ptr = (ROM uint8_t*)&cfg01.hid_i00a00; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define mUSBGetHIDRptDscAdr(ptr) \
|
||||||
|
{ \
|
||||||
|
if(usb_active_cfg == 1) \
|
||||||
|
ptr = (ROM uint8_t*)&hid_rpt01; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define mUSBGetHIDRptDscSize(count) \
|
||||||
|
{ \
|
||||||
|
if(usb_active_cfg == 1) \
|
||||||
|
count = sizeof(hid_rpt01); \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** S T R U C T U R E S ******************************************************/
|
||||||
|
typedef struct _USB_HID_DSC_HEADER
|
||||||
|
{
|
||||||
|
uint8_t bDscType;
|
||||||
|
uint16_t wDscLength;
|
||||||
|
} USB_HID_DSC_HEADER;
|
||||||
|
|
||||||
|
typedef struct _USB_HID_DSC
|
||||||
|
{
|
||||||
|
uint8_t bLength; uint8_t bDscType; uint16_t bcdHID;
|
||||||
|
uint8_t bCountryCode; uint8_t bNumDsc;
|
||||||
|
USB_HID_DSC_HEADER hid_dsc_header[HID_NUM_OF_DSC];
|
||||||
|
/*
|
||||||
|
* HID_NUM_OF_DSC is defined in autofiles\usb_config.h
|
||||||
|
*/
|
||||||
|
} USB_HID_DSC;
|
||||||
|
|
||||||
|
/** E X T E R N S ************************************************************/
|
||||||
|
extern uint8_t hid_rpt_rx_len;
|
||||||
|
extern ROM uint8_t hid_rpt01[HID_RPT01_SIZE];
|
||||||
|
|
||||||
|
|
||||||
|
/** P U B L I C P R O T O T Y P E S *****************************************/
|
||||||
|
void HIDInitEP(void);
|
||||||
|
void USBCheckHIDRequest(void);
|
||||||
|
void HIDTxReport(char *buffer, uint8_t len);
|
||||||
|
uint8_t HIDRxReport(char *buffer, uint8_t len);
|
||||||
|
|
||||||
|
#endif //HID_H
|
||||||
425
bootloader/src/typedefs.h
Normal file
425
bootloader/src/typedefs.h
Normal file
@@ -0,0 +1,425 @@
|
|||||||
|
/*******************************************************************************
|
||||||
|
Copyright 2016 Microchip Technology Inc. (www.microchip.com)
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
To request to license the code under the MLA license (www.microchip.com/mla_license),
|
||||||
|
please contact mla_licensing@microchip.com
|
||||||
|
*******************************************************************************/
|
||||||
|
|
||||||
|
#ifndef __CUSTOMIZED_TYPE_DEFS_H_
|
||||||
|
#define __CUSTOMIZED_TYPE_DEFS_H_
|
||||||
|
|
||||||
|
#include <xc.h>
|
||||||
|
#define ROM const
|
||||||
|
#define rom
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#ifndef Nop()
|
||||||
|
#define Nop() {asm("NOP");}
|
||||||
|
#endif
|
||||||
|
#ifndef ClrWdt()
|
||||||
|
#define ClrWdt() {asm("CLRWDT");}
|
||||||
|
#endif
|
||||||
|
#ifndef Reset()
|
||||||
|
#define Reset() {asm("RESET");}
|
||||||
|
#endif
|
||||||
|
#ifndef Sleep()
|
||||||
|
#define Sleep() {asm("SLEEP");}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define __EXTENSION
|
||||||
|
|
||||||
|
#if !defined(__PACKED)
|
||||||
|
#define __PACKED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* get compiler defined type definitions (NULL, size_t, etc) */
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifndef TRUE
|
||||||
|
#define TRUE 1
|
||||||
|
#endif
|
||||||
|
#ifndef FALSE
|
||||||
|
#define FALSE 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define PUBLIC /* Function attributes */
|
||||||
|
#define PROTECTED
|
||||||
|
#define PRIVATE static
|
||||||
|
|
||||||
|
/* INT is processor specific in length may vary in size */
|
||||||
|
typedef signed int INT;
|
||||||
|
typedef signed char INT8;
|
||||||
|
typedef signed short int INT16;
|
||||||
|
typedef signed long int INT32;
|
||||||
|
|
||||||
|
/* UINT is processor specific in length may vary in size */
|
||||||
|
typedef unsigned int UINT;
|
||||||
|
typedef unsigned char UINT8;
|
||||||
|
typedef unsigned short int UINT16;
|
||||||
|
typedef unsigned long int UINT32; /* other name for 32-bit integer */
|
||||||
|
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
UINT8 Val;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
__EXTENSION UINT8 b0:1;
|
||||||
|
__EXTENSION UINT8 b1:1;
|
||||||
|
__EXTENSION UINT8 b2:1;
|
||||||
|
__EXTENSION UINT8 b3:1;
|
||||||
|
__EXTENSION UINT8 b4:1;
|
||||||
|
__EXTENSION UINT8 b5:1;
|
||||||
|
__EXTENSION UINT8 b6:1;
|
||||||
|
__EXTENSION UINT8 b7:1;
|
||||||
|
} bits;
|
||||||
|
} UINT8_VAL, UINT8_BITS;
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
UINT16 Val;
|
||||||
|
UINT8 v[2] __PACKED;
|
||||||
|
struct __PACKED
|
||||||
|
{
|
||||||
|
UINT8 LB;
|
||||||
|
UINT8 HB;
|
||||||
|
} byte;
|
||||||
|
struct __PACKED
|
||||||
|
{
|
||||||
|
__EXTENSION UINT8 b0:1;
|
||||||
|
__EXTENSION UINT8 b1:1;
|
||||||
|
__EXTENSION UINT8 b2:1;
|
||||||
|
__EXTENSION UINT8 b3:1;
|
||||||
|
__EXTENSION UINT8 b4:1;
|
||||||
|
__EXTENSION UINT8 b5:1;
|
||||||
|
__EXTENSION UINT8 b6:1;
|
||||||
|
__EXTENSION UINT8 b7:1;
|
||||||
|
__EXTENSION UINT8 b8:1;
|
||||||
|
__EXTENSION UINT8 b9:1;
|
||||||
|
__EXTENSION UINT8 b10:1;
|
||||||
|
__EXTENSION UINT8 b11:1;
|
||||||
|
__EXTENSION UINT8 b12:1;
|
||||||
|
__EXTENSION UINT8 b13:1;
|
||||||
|
__EXTENSION UINT8 b14:1;
|
||||||
|
__EXTENSION UINT8 b15:1;
|
||||||
|
} bits;
|
||||||
|
} UINT16_VAL, UINT16_BITS;
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
UINT32 Val;
|
||||||
|
UINT16 w[2] __PACKED;
|
||||||
|
UINT8 v[4] __PACKED;
|
||||||
|
struct __PACKED
|
||||||
|
{
|
||||||
|
UINT16 LW;
|
||||||
|
UINT16 HW;
|
||||||
|
} word;
|
||||||
|
struct __PACKED
|
||||||
|
{
|
||||||
|
UINT8 LB;
|
||||||
|
UINT8 HB;
|
||||||
|
UINT8 UB;
|
||||||
|
UINT8 MB;
|
||||||
|
} byte;
|
||||||
|
struct __PACKED
|
||||||
|
{
|
||||||
|
UINT16_VAL low;
|
||||||
|
UINT16_VAL high;
|
||||||
|
}wordUnion;
|
||||||
|
struct __PACKED
|
||||||
|
{
|
||||||
|
__EXTENSION UINT8 b0:1;
|
||||||
|
__EXTENSION UINT8 b1:1;
|
||||||
|
__EXTENSION UINT8 b2:1;
|
||||||
|
__EXTENSION UINT8 b3:1;
|
||||||
|
__EXTENSION UINT8 b4:1;
|
||||||
|
__EXTENSION UINT8 b5:1;
|
||||||
|
__EXTENSION UINT8 b6:1;
|
||||||
|
__EXTENSION UINT8 b7:1;
|
||||||
|
__EXTENSION UINT8 b8:1;
|
||||||
|
__EXTENSION UINT8 b9:1;
|
||||||
|
__EXTENSION UINT8 b10:1;
|
||||||
|
__EXTENSION UINT8 b11:1;
|
||||||
|
__EXTENSION UINT8 b12:1;
|
||||||
|
__EXTENSION UINT8 b13:1;
|
||||||
|
__EXTENSION UINT8 b14:1;
|
||||||
|
__EXTENSION UINT8 b15:1;
|
||||||
|
__EXTENSION UINT8 b16:1;
|
||||||
|
__EXTENSION UINT8 b17:1;
|
||||||
|
__EXTENSION UINT8 b18:1;
|
||||||
|
__EXTENSION UINT8 b19:1;
|
||||||
|
__EXTENSION UINT8 b20:1;
|
||||||
|
__EXTENSION UINT8 b21:1;
|
||||||
|
__EXTENSION UINT8 b22:1;
|
||||||
|
__EXTENSION UINT8 b23:1;
|
||||||
|
__EXTENSION UINT8 b24:1;
|
||||||
|
__EXTENSION UINT8 b25:1;
|
||||||
|
__EXTENSION UINT8 b26:1;
|
||||||
|
__EXTENSION UINT8 b27:1;
|
||||||
|
__EXTENSION UINT8 b28:1;
|
||||||
|
__EXTENSION UINT8 b29:1;
|
||||||
|
__EXTENSION UINT8 b30:1;
|
||||||
|
__EXTENSION UINT8 b31:1;
|
||||||
|
} bits;
|
||||||
|
} UINT32_VAL;
|
||||||
|
|
||||||
|
/***********************************************************************************/
|
||||||
|
|
||||||
|
/* Alternate definitions */
|
||||||
|
typedef void VOID;
|
||||||
|
|
||||||
|
typedef char CHAR8;
|
||||||
|
typedef unsigned char UCHAR8;
|
||||||
|
|
||||||
|
typedef unsigned char BYTE; /* 8-bit unsigned */
|
||||||
|
typedef unsigned short int WORD; /* 16-bit unsigned */
|
||||||
|
typedef unsigned long DWORD; /* 32-bit unsigned */
|
||||||
|
//typedef unsigned long long QWORD; /* 64-bit unsigned */
|
||||||
|
typedef signed char CHAR; /* 8-bit signed */
|
||||||
|
typedef signed short int SHORT; /* 16-bit signed */
|
||||||
|
typedef signed long LONG; /* 32-bit signed */
|
||||||
|
//typedef signed long long LONGLONG; /* 64-bit signed */
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
BYTE Val;
|
||||||
|
struct __PACKED
|
||||||
|
{
|
||||||
|
__EXTENSION BYTE b0:1;
|
||||||
|
__EXTENSION BYTE b1:1;
|
||||||
|
__EXTENSION BYTE b2:1;
|
||||||
|
__EXTENSION BYTE b3:1;
|
||||||
|
__EXTENSION BYTE b4:1;
|
||||||
|
__EXTENSION BYTE b5:1;
|
||||||
|
__EXTENSION BYTE b6:1;
|
||||||
|
__EXTENSION BYTE b7:1;
|
||||||
|
} bits;
|
||||||
|
} BYTE_VAL, BYTE_BITS;
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
WORD Val;
|
||||||
|
BYTE v[2] __PACKED;
|
||||||
|
struct __PACKED
|
||||||
|
{
|
||||||
|
BYTE LB;
|
||||||
|
BYTE HB;
|
||||||
|
} byte;
|
||||||
|
struct __PACKED
|
||||||
|
{
|
||||||
|
__EXTENSION BYTE b0:1;
|
||||||
|
__EXTENSION BYTE b1:1;
|
||||||
|
__EXTENSION BYTE b2:1;
|
||||||
|
__EXTENSION BYTE b3:1;
|
||||||
|
__EXTENSION BYTE b4:1;
|
||||||
|
__EXTENSION BYTE b5:1;
|
||||||
|
__EXTENSION BYTE b6:1;
|
||||||
|
__EXTENSION BYTE b7:1;
|
||||||
|
__EXTENSION BYTE b8:1;
|
||||||
|
__EXTENSION BYTE b9:1;
|
||||||
|
__EXTENSION BYTE b10:1;
|
||||||
|
__EXTENSION BYTE b11:1;
|
||||||
|
__EXTENSION BYTE b12:1;
|
||||||
|
__EXTENSION BYTE b13:1;
|
||||||
|
__EXTENSION BYTE b14:1;
|
||||||
|
__EXTENSION BYTE b15:1;
|
||||||
|
} bits;
|
||||||
|
} WORD_VAL, WORD_BITS;
|
||||||
|
|
||||||
|
typedef union
|
||||||
|
{
|
||||||
|
DWORD Val;
|
||||||
|
WORD w[2] __PACKED;
|
||||||
|
BYTE v[4] __PACKED;
|
||||||
|
struct __PACKED
|
||||||
|
{
|
||||||
|
WORD LW;
|
||||||
|
WORD HW;
|
||||||
|
} word;
|
||||||
|
struct __PACKED
|
||||||
|
{
|
||||||
|
BYTE LB;
|
||||||
|
BYTE HB;
|
||||||
|
BYTE UB;
|
||||||
|
BYTE MB;
|
||||||
|
} byte;
|
||||||
|
struct __PACKED
|
||||||
|
{
|
||||||
|
WORD_VAL low;
|
||||||
|
WORD_VAL high;
|
||||||
|
}wordUnion;
|
||||||
|
struct __PACKED
|
||||||
|
{
|
||||||
|
__EXTENSION BYTE b0:1;
|
||||||
|
__EXTENSION BYTE b1:1;
|
||||||
|
__EXTENSION BYTE b2:1;
|
||||||
|
__EXTENSION BYTE b3:1;
|
||||||
|
__EXTENSION BYTE b4:1;
|
||||||
|
__EXTENSION BYTE b5:1;
|
||||||
|
__EXTENSION BYTE b6:1;
|
||||||
|
__EXTENSION BYTE b7:1;
|
||||||
|
__EXTENSION BYTE b8:1;
|
||||||
|
__EXTENSION BYTE b9:1;
|
||||||
|
__EXTENSION BYTE b10:1;
|
||||||
|
__EXTENSION BYTE b11:1;
|
||||||
|
__EXTENSION BYTE b12:1;
|
||||||
|
__EXTENSION BYTE b13:1;
|
||||||
|
__EXTENSION BYTE b14:1;
|
||||||
|
__EXTENSION BYTE b15:1;
|
||||||
|
__EXTENSION BYTE b16:1;
|
||||||
|
__EXTENSION BYTE b17:1;
|
||||||
|
__EXTENSION BYTE b18:1;
|
||||||
|
__EXTENSION BYTE b19:1;
|
||||||
|
__EXTENSION BYTE b20:1;
|
||||||
|
__EXTENSION BYTE b21:1;
|
||||||
|
__EXTENSION BYTE b22:1;
|
||||||
|
__EXTENSION BYTE b23:1;
|
||||||
|
__EXTENSION BYTE b24:1;
|
||||||
|
__EXTENSION BYTE b25:1;
|
||||||
|
__EXTENSION BYTE b26:1;
|
||||||
|
__EXTENSION BYTE b27:1;
|
||||||
|
__EXTENSION BYTE b28:1;
|
||||||
|
__EXTENSION BYTE b29:1;
|
||||||
|
__EXTENSION BYTE b30:1;
|
||||||
|
__EXTENSION BYTE b31:1;
|
||||||
|
} bits;
|
||||||
|
} DWORD_VAL;
|
||||||
|
|
||||||
|
/* MPLAB C Compiler for PIC18 does not support 64-bit integers */
|
||||||
|
/*typedef union
|
||||||
|
{
|
||||||
|
QWORD Val;
|
||||||
|
DWORD d[2] __PACKED;
|
||||||
|
WORD w[4] __PACKED;
|
||||||
|
BYTE v[8] __PACKED;
|
||||||
|
struct __PACKED
|
||||||
|
{
|
||||||
|
DWORD LD;
|
||||||
|
DWORD HD;
|
||||||
|
} dword;
|
||||||
|
struct __PACKED
|
||||||
|
{
|
||||||
|
WORD LW;
|
||||||
|
WORD HW;
|
||||||
|
WORD UW;
|
||||||
|
WORD MW;
|
||||||
|
} word;
|
||||||
|
struct __PACKED
|
||||||
|
{
|
||||||
|
__EXTENSION BYTE b0:1;
|
||||||
|
__EXTENSION BYTE b1:1;
|
||||||
|
__EXTENSION BYTE b2:1;
|
||||||
|
__EXTENSION BYTE b3:1;
|
||||||
|
__EXTENSION BYTE b4:1;
|
||||||
|
__EXTENSION BYTE b5:1;
|
||||||
|
__EXTENSION BYTE b6:1;
|
||||||
|
__EXTENSION BYTE b7:1;
|
||||||
|
__EXTENSION BYTE b8:1;
|
||||||
|
__EXTENSION BYTE b9:1;
|
||||||
|
__EXTENSION BYTE b10:1;
|
||||||
|
__EXTENSION BYTE b11:1;
|
||||||
|
__EXTENSION BYTE b12:1;
|
||||||
|
__EXTENSION BYTE b13:1;
|
||||||
|
__EXTENSION BYTE b14:1;
|
||||||
|
__EXTENSION BYTE b15:1;
|
||||||
|
__EXTENSION BYTE b16:1;
|
||||||
|
__EXTENSION BYTE b17:1;
|
||||||
|
__EXTENSION BYTE b18:1;
|
||||||
|
__EXTENSION BYTE b19:1;
|
||||||
|
__EXTENSION BYTE b20:1;
|
||||||
|
__EXTENSION BYTE b21:1;
|
||||||
|
__EXTENSION BYTE b22:1;
|
||||||
|
__EXTENSION BYTE b23:1;
|
||||||
|
__EXTENSION BYTE b24:1;
|
||||||
|
__EXTENSION BYTE b25:1;
|
||||||
|
__EXTENSION BYTE b26:1;
|
||||||
|
__EXTENSION BYTE b27:1;
|
||||||
|
__EXTENSION BYTE b28:1;
|
||||||
|
__EXTENSION BYTE b29:1;
|
||||||
|
__EXTENSION BYTE b30:1;
|
||||||
|
__EXTENSION BYTE b31:1;
|
||||||
|
__EXTENSION BYTE b32:1;
|
||||||
|
__EXTENSION BYTE b33:1;
|
||||||
|
__EXTENSION BYTE b34:1;
|
||||||
|
__EXTENSION BYTE b35:1;
|
||||||
|
__EXTENSION BYTE b36:1;
|
||||||
|
__EXTENSION BYTE b37:1;
|
||||||
|
__EXTENSION BYTE b38:1;
|
||||||
|
__EXTENSION BYTE b39:1;
|
||||||
|
__EXTENSION BYTE b40:1;
|
||||||
|
__EXTENSION BYTE b41:1;
|
||||||
|
__EXTENSION BYTE b42:1;
|
||||||
|
__EXTENSION BYTE b43:1;
|
||||||
|
__EXTENSION BYTE b44:1;
|
||||||
|
__EXTENSION BYTE b45:1;
|
||||||
|
__EXTENSION BYTE b46:1;
|
||||||
|
__EXTENSION BYTE b47:1;
|
||||||
|
__EXTENSION BYTE b48:1;
|
||||||
|
__EXTENSION BYTE b49:1;
|
||||||
|
__EXTENSION BYTE b50:1;
|
||||||
|
__EXTENSION BYTE b51:1;
|
||||||
|
__EXTENSION BYTE b52:1;
|
||||||
|
__EXTENSION BYTE b53:1;
|
||||||
|
__EXTENSION BYTE b54:1;
|
||||||
|
__EXTENSION BYTE b55:1;
|
||||||
|
__EXTENSION BYTE b56:1;
|
||||||
|
__EXTENSION BYTE b57:1;
|
||||||
|
__EXTENSION BYTE b58:1;
|
||||||
|
__EXTENSION BYTE b59:1;
|
||||||
|
__EXTENSION BYTE b60:1;
|
||||||
|
__EXTENSION BYTE b61:1;
|
||||||
|
__EXTENSION BYTE b62:1;
|
||||||
|
__EXTENSION BYTE b63:1;
|
||||||
|
} bits;
|
||||||
|
} QWORD_VAL;
|
||||||
|
*/
|
||||||
|
#undef __EXTENSION
|
||||||
|
|
||||||
|
#ifndef uint24_t
|
||||||
|
#define uint24_t uint32_t
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef void(*pFunc)(void);
|
||||||
|
|
||||||
|
typedef union _POINTER
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
BYTE bLow;
|
||||||
|
BYTE bHigh;
|
||||||
|
//BYTE bUpper;
|
||||||
|
};
|
||||||
|
uint16_t _word; // bLow & bHigh
|
||||||
|
|
||||||
|
//pFunc _pFunc; // Usage: ptr.pFunc(); Init: ptr.pFunc = &<Function>;
|
||||||
|
|
||||||
|
BYTE* bRam; // Ram byte pointer: 2 bytes pointer pointing
|
||||||
|
// to 1 byte of data
|
||||||
|
uint16_t* wRam; // Ram word poitner: 2 bytes poitner pointing
|
||||||
|
// to 2 bytes of data
|
||||||
|
|
||||||
|
ROM BYTE* bRom; // Size depends on compiler setting
|
||||||
|
ROM WORD* wRom;
|
||||||
|
//ROM near BYTE* nbRom; // Near = 2 bytes pointer
|
||||||
|
//ROM near uint16_t* nwRom;
|
||||||
|
//ROM far BYTE* fbRom; // Far = 3 bytes pointer
|
||||||
|
//ROM far uint16_t* fwRom;
|
||||||
|
} POINTER;
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __CUSTOMIZED_TYPE_DEFS_H_ */
|
||||||
@@ -1,180 +1,89 @@
|
|||||||
/*************************************************************************
|
/*******************************************************************************
|
||||||
* Copyright (C) 2019 by Justin Byers
|
Copyright 2016 Microchip Technology Inc. (www.microchip.com)
|
||||||
*
|
|
||||||
* This file is part of clubdance_v2.
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
*
|
you may not use this file except in compliance with the License.
|
||||||
* clubdance_v2 is free software: you can redistribute it and/or modify
|
You may obtain a copy of the License at
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
Unless required by applicable law or agreed to in writing, software
|
||||||
* clubdance_v2 is distributed in the hope that it will be useful,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
See the License for the specific language governing permissions and
|
||||||
* GNU General Public License for more details.
|
limitations under the License.
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
To request to license the code under the MLA license (www.microchip.com/mla_license),
|
||||||
* along with clubdance_v2. If not, see <https://www.gnu.org/licenses/>.
|
please contact mla_licensing@microchip.com
|
||||||
*************************************************************************/
|
*******************************************************************************/
|
||||||
/**
|
|
||||||
* @file usb_config.h
|
|
||||||
* @author Justin Byers
|
|
||||||
* @date 6 Aug 2019
|
|
||||||
* @brief Configuration of the MLA USB framework.
|
|
||||||
*
|
|
||||||
* Descriptor specific type definitions are defined in: usbd.h
|
|
||||||
*/
|
|
||||||
#ifndef USBCFG_H
|
#ifndef USBCFG_H
|
||||||
#define USBCFG_H
|
#define USBCFG_H
|
||||||
|
|
||||||
#include <usb_ch9.h>
|
//----------------------------------------------------------------------------------------------------------
|
||||||
|
//User configurable options
|
||||||
|
//----------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
/** DEFINITIONS ****************************************************/
|
//When defined/enabled, this option allows the boot up code to check an I/O pin
|
||||||
#define USB_EP0_BUFF_SIZE 8 // Valid Options: 8, 16, 32, or 64 bytes.
|
//(as defined by the sw2() macro in HardwareProfile.h), and if logic low, execution
|
||||||
// Using larger options take more SRAM, but
|
//stays within the bootloader, allowing the user to update the firmware. If this
|
||||||
// does not provide much advantage in most types
|
//option is not enabled, then the only method of entering the bootloader will
|
||||||
// of applications. Exceptions to this, are applications
|
//be from the application firmware project, by executing a goto 0x001C operation.
|
||||||
// that use EP0 IN or OUT for sending large amounts of
|
//Enabling the I/O pin to enter the bootloader is recommended, since it is more
|
||||||
// application related data.
|
//robust/recoverable (compared to software only entry into the bootloader), in
|
||||||
|
//the event of a failed erase/program/verify operation, or an otherwise corrupted
|
||||||
#define USB_MAX_NUM_INT 1 //Set this number to match the maximum interface number used in the descriptors for this firmware project
|
//application firmware image is loaded.
|
||||||
#define USB_MAX_EP_NUMBER 1 //Set this number to match the maximum endpoint number used in the descriptors for this firmware project
|
#define ENABLE_IO_PIN_CHECK_BOOTLOADER_ENTRY //Uncomment if you wish to enable I/O pin entry method into bootloader mode
|
||||||
|
//Make sure proper sw2() macro definition is provided in HardwareProfile.h
|
||||||
|
|
||||||
//Device descriptor - if these two definitions are not defined then
|
//Option to allow blinking of LED to show USB bus status. May be optionally
|
||||||
// a const USB_DEVICE_DESCRIPTOR variable by the exact name of device_dsc
|
//commented out to save code space (and/or if there are no LEDs available on
|
||||||
// must exist.
|
//the actual target application board). If this option is uncommented, you must
|
||||||
#define USB_USER_DEVICE_DESCRIPTOR &device_dsc
|
//provide the proper LED pin definitions in the HardwareProfile.h file.
|
||||||
#define USB_USER_DEVICE_DESCRIPTOR_INCLUDE extern const USB_DEVICE_DESCRIPTOR device_dsc
|
#define ENABLE_USB_LED_BLINK_STATUS
|
||||||
|
|
||||||
//Configuration descriptors - if these two definitions do not exist then
|
|
||||||
// a const BYTE *const variable named exactly USB_CD_Ptr[] must exist.
|
|
||||||
#define USB_USER_CONFIG_DESCRIPTOR USB_CD_Ptr
|
|
||||||
#define USB_USER_CONFIG_DESCRIPTOR_INCLUDE extern const uint8_t *const USB_CD_Ptr[]
|
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//USB VBUS sensing and USB Bus/Self power sensing options.
|
||||||
//Select an endpoint ping-pong bufferring mode. Some microcontrollers only
|
//---------------------------------------------------------
|
||||||
//support certain modes. For most applications, it is recommended to use either
|
//#define USE_SELF_POWER_SENSE_IO //Leave commented if device is bus powered only (or self powered only, uncomment for some types of dual powered devices)
|
||||||
//the USB_PING_PONG__FULL_PING_PONG or USB_PING_PONG__EP0_OUT_ONLY options.
|
//#define USE_USB_BUS_SENSE_IO //If the device is self powered, this needs to uncommented if making a fully compliant USB design
|
||||||
//The other settings are supported on some devices, but they are not
|
|
||||||
//recommended, as they offer inferior control transfer timing performance.
|
|
||||||
//See inline code comments in usb_device.c for additional details.
|
|
||||||
//Enabling ping pong bufferring on an endpoint generally increases firmware
|
|
||||||
//overhead somewhat, but when both buffers are used simultaneously in the
|
|
||||||
//firmware, can offer better sustained bandwidth, especially for OUT endpoints.
|
|
||||||
//------------------------------------------------------
|
|
||||||
//#define USB_PING_PONG_MODE USB_PING_PONG__NO_PING_PONG //Not recommended
|
|
||||||
//#define USB_PING_PONG_MODE USB_PING_PONG__FULL_PING_PONG //A good all around setting
|
|
||||||
#define USB_PING_PONG_MODE USB_PING_PONG__EP0_OUT_ONLY //Another good setting
|
|
||||||
//#define USB_PING_PONG_MODE USB_PING_PONG__ALL_BUT_EP0 //Not recommended
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
//Select a USB stack operating mode. In the USB_INTERRUPT mode, the USB stack
|
|
||||||
//main task handler gets called only when necessary as an interrupt handler.
|
//----------------------------------------------------------------------------------------------------------
|
||||||
//This can potentially minimize CPU utilization, but adds context saving
|
//Other semi-configurable settings that tell the USB stack how to operate (but usually don't need changing)
|
||||||
//and restoring overhead associated with interrupts, which can potentially
|
//----------------------------------------------------------------------------------------------------------
|
||||||
//decrease performance.
|
#define MAX_EP_NUMBER 1 // EP0 and EP1 are the only EPs used in this application
|
||||||
//When the USB_POLLING mode is selected, the USB stack main task handler
|
#define MAX_NUM_INT 1 // For tracking Alternate Setting - make sure this matches the number of interfaces implemented in the device
|
||||||
//(ex: USBDeviceTasks()) must be called periodically by the application firmware
|
#define EP0_BUFF_SIZE 8 // Valid Options: 8, 16, 32, or 64 bytes.
|
||||||
//at a minimum rate as described in the inline code comments in usb_device.c.
|
// There is little advantage in using
|
||||||
//------------------------------------------------------
|
// more than 8 bytes on EP0 IN/OUT in most cases.
|
||||||
#define USB_POLLING
|
#define USB_MAX_NUM_CONFIG_DSC 1 // Number of configurations that this firmware implements
|
||||||
//#define USB_INTERRUPT
|
//#define ENABLE_CONTROL_TRANSFERS_WITH_OUT_DATA_STAGE //Commented out to save code size, since this bootloader firmware doesn't use OUT control transfers with data stage
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
#define CONFIG_DESC_TOTAL_LEN 41 //Make sure this matches the size of your configuration descriptor + all subordinate
|
||||||
|
//descriptors returned by the get descriptor(configuration) request
|
||||||
|
|
||||||
/* Parameter definitions are defined in usb_device.h */
|
/* Parameter definitions are defined in usb_device.h */
|
||||||
#define USB_PULLUP_OPTION USB_PULLUP_ENABLE
|
#define MODE_PP _PPBM1 //This code is only written to support _PPBM1 mode only (ping pong on EP0 OUT buffer only). Do not change.
|
||||||
//#define USB_PULLUP_OPTION USB_PULLUP_DISABLED
|
#define UCFG_VAL _PUEN|_TRINT|_FS|MODE_PP
|
||||||
|
|
||||||
#define USB_TRANSCEIVER_OPTION USB_INTERNAL_TRANSCEIVER
|
//Device class and endpoint definitions
|
||||||
//External Transceiver support is not available on all product families. Please
|
|
||||||
// refer to the product family datasheet for more information if this feature
|
|
||||||
// is available on the target processor.
|
|
||||||
//#define USB_TRANSCEIVER_OPTION USB_EXTERNAL_TRANSCEIVER
|
|
||||||
|
|
||||||
#define USB_SPEED_OPTION USB_FULL_SPEED
|
|
||||||
//#define USB_SPEED_OPTION USB_LOW_SPEED //(this mode is only supported on some microcontrollers)
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------------------------
|
|
||||||
//Option to enable auto-arming of the status stage of control transfers, if no
|
|
||||||
//"progress" has been made for the USB_STATUS_STAGE_TIMEOUT value.
|
|
||||||
//If progress is made (any successful transactions completing on EP0 IN or OUT)
|
|
||||||
//the timeout counter gets reset to the USB_STATUS_STAGE_TIMEOUT value.
|
|
||||||
//
|
|
||||||
//During normal control transfer processing, the USB stack or the application
|
|
||||||
//firmware will call USBCtrlEPAllowStatusStage() as soon as the firmware is finished
|
|
||||||
//processing the control transfer. Therefore, the status stage completes as
|
|
||||||
//quickly as is physically possible. The USB_ENABLE_STATUS_STAGE_TIMEOUTS
|
|
||||||
//feature, and the USB_STATUS_STAGE_TIMEOUT value are only relevant, when:
|
|
||||||
//1. The application uses the USBDeferStatusStage() API function, but never calls
|
|
||||||
// USBCtrlEPAllowStatusStage(). Or:
|
|
||||||
//2. The application uses host to device (OUT) control transfers with data stage,
|
|
||||||
// and some abnormal error occurs, where the host might try to abort the control
|
|
||||||
// transfer, before it has sent all of the data it claimed it was going to send.
|
|
||||||
//
|
|
||||||
//If the application firmware never uses the USBDeferStatusStage() API function,
|
|
||||||
//and it never uses host to device control transfers with data stage, then
|
|
||||||
//it is not required to enable the USB_ENABLE_STATUS_STAGE_TIMEOUTS feature.
|
|
||||||
|
|
||||||
#define USB_ENABLE_STATUS_STAGE_TIMEOUTS //Comment this out to disable this feature.
|
|
||||||
|
|
||||||
//Section 9.2.6 of the USB 2.0 specifications indicate that:
|
|
||||||
//1. Control transfers with no data stage: Status stage must complete within
|
|
||||||
// 50ms of the start of the control transfer.
|
|
||||||
//2. Control transfers with (IN) data stage: Status stage must complete within
|
|
||||||
// 50ms of sending the last IN data packet in fullfilment of the data stage.
|
|
||||||
//3. Control transfers with (OUT) data stage: No specific status stage timing
|
|
||||||
// requirement. However, the total time of the entire control transfer (ex:
|
|
||||||
// including the OUT data stage and IN status stage) must not exceed 5 seconds.
|
|
||||||
//
|
|
||||||
//Therefore, if the USB_ENABLE_STATUS_STAGE_TIMEOUTS feature is used, it is suggested
|
|
||||||
//to set the USB_STATUS_STAGE_TIMEOUT value to timeout in less than 50ms. If the
|
|
||||||
//USB_ENABLE_STATUS_STAGE_TIMEOUTS feature is not enabled, then the USB_STATUS_STAGE_TIMEOUT
|
|
||||||
//parameter is not relevant.
|
|
||||||
|
|
||||||
#define USB_STATUS_STAGE_TIMEOUT (uint8_t)45 //Approximate timeout in milliseconds, except when
|
|
||||||
//USB_POLLING mode is used, and USBDeviceTasks() is called at < 1kHz
|
|
||||||
//In this special case, the timeout becomes approximately:
|
|
||||||
//Timeout(in milliseconds) = ((1000 * (USB_STATUS_STAGE_TIMEOUT - 1)) / (USBDeviceTasks() polling frequency in Hz))
|
|
||||||
//------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#define USB_SUPPORT_DEVICE
|
|
||||||
|
|
||||||
#define USB_NUM_STRING_DESCRIPTORS 3 //Set this number to match the total number of string descriptors that are implemented in the usb_descriptors.c file
|
|
||||||
|
|
||||||
/*******************************************************************
|
|
||||||
* Event disable options
|
|
||||||
* Enable a definition to suppress a specific event. By default
|
|
||||||
* all events are sent.
|
|
||||||
*******************************************************************/
|
|
||||||
//#define USB_DISABLE_SUSPEND_HANDLER
|
|
||||||
//#define USB_DISABLE_WAKEUP_FROM_SUSPEND_HANDLER
|
|
||||||
//#define USB_DISABLE_SOF_HANDLER
|
|
||||||
//#define USB_DISABLE_TRANSFER_TERMINATED_HANDLER
|
|
||||||
//#define USB_DISABLE_ERROR_HANDLER
|
|
||||||
//#define USB_DISABLE_NONSTANDARD_EP0_REQUEST_HANDLER
|
|
||||||
//#define USB_DISABLE_SET_DESCRIPTOR_HANDLER
|
|
||||||
//#define USB_DISABLE_SET_CONFIGURATION_HANDLER
|
|
||||||
//#define USB_DISABLE_TRANSFER_COMPLETE_HANDLER
|
|
||||||
|
|
||||||
/** DEVICE CLASS USAGE *********************************************/
|
|
||||||
#define USB_USE_HID
|
#define USB_USE_HID
|
||||||
|
|
||||||
/** ENDPOINTS ALLOCATION *******************************************/
|
|
||||||
|
|
||||||
/* HID */
|
/* HID */
|
||||||
#define HID_INTF_ID 0x00
|
#define HID_INTF_ID 0x00
|
||||||
|
#define HID_UEP UEP1
|
||||||
|
#define HID_BD_OUT ep1Bo
|
||||||
#define HID_INT_OUT_EP_SIZE 64
|
#define HID_INT_OUT_EP_SIZE 64
|
||||||
|
#define HID_BD_IN ep1Bi
|
||||||
#define HID_INT_IN_EP_SIZE 64
|
#define HID_INT_IN_EP_SIZE 64
|
||||||
#define HID_NUM_OF_DSC 1
|
#define HID_NUM_OF_DSC 1 //Just the Report descriptor (no physical descriptor present)
|
||||||
#define HID_RPT01_SIZE 29
|
#define HID_RPT01_SIZE 29 //Make sure this matches the size of your HID report descriptor
|
||||||
|
|
||||||
|
|
||||||
#define HID_EP 1
|
|
||||||
#define HID_IN_EP HID_EP
|
|
||||||
#define HID_OUT_EP HID_EP
|
|
||||||
|
|
||||||
/** DEFINITIONS ****************************************************/
|
|
||||||
|
|
||||||
#endif //USBCFG_H
|
#endif //USBCFG_H
|
||||||
|
|||||||
@@ -17,142 +17,159 @@ To request to license the code under the MLA license (www.microchip.com/mla_lice
|
|||||||
please contact mla_licensing@microchip.com
|
please contact mla_licensing@microchip.com
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
|
|
||||||
/********************************************************************
|
|
||||||
-usb_descriptors.c-
|
|
||||||
-------------------------------------------------------------------
|
|
||||||
Filling in the descriptor values in the usb_descriptors.c file:
|
|
||||||
-------------------------------------------------------------------
|
|
||||||
|
|
||||||
[Device Descriptors]
|
|
||||||
The device descriptor is defined as a USB_DEVICE_DESCRIPTOR type.
|
|
||||||
This type is defined in usb_ch9.h Each entry into this structure
|
|
||||||
needs to be the correct length for the data type of the entry.
|
|
||||||
|
|
||||||
[Configuration Descriptors]
|
|
||||||
The configuration descriptor was changed in v2.x from a structure
|
|
||||||
to a uint8_t array. Given that the configuration is now a byte array
|
|
||||||
each byte of multi-byte fields must be listed individually. This
|
|
||||||
means that for fields like the total size of the configuration where
|
|
||||||
the field is a 16-bit value "64,0," is the correct entry for a
|
|
||||||
configuration that is only 64 bytes long and not "64," which is one
|
|
||||||
too few bytes.
|
|
||||||
|
|
||||||
The configuration attribute must always have the _DEFAULT
|
|
||||||
definition at the minimum. Additional options can be ORed
|
|
||||||
to the _DEFAULT attribute. Available options are _SELF and _RWU.
|
|
||||||
These definitions are defined in the usb_device.h file. The
|
|
||||||
_SELF tells the USB host that this device is self-powered. The
|
|
||||||
_RWU tells the USB host that this device supports Remote Wakeup.
|
|
||||||
|
|
||||||
[Endpoint Descriptors]
|
|
||||||
Like the configuration descriptor, the endpoint descriptors were
|
|
||||||
changed in v2.x of the stack from a structure to a uint8_t array. As
|
|
||||||
endpoint descriptors also has a field that are multi-byte entities,
|
|
||||||
please be sure to specify both bytes of the field. For example, for
|
|
||||||
the endpoint size an endpoint that is 64 bytes needs to have the size
|
|
||||||
defined as "64,0," instead of "64,"
|
|
||||||
|
|
||||||
Take the following example:
|
|
||||||
// Endpoint Descriptor //
|
|
||||||
0x07, //the size of this descriptor //
|
|
||||||
USB_DESCRIPTOR_ENDPOINT, //Endpoint Descriptor
|
|
||||||
_EP02_IN, //EndpointAddress
|
|
||||||
_INT, //Attributes
|
|
||||||
0x08,0x00, //size (note: 2 bytes)
|
|
||||||
0x02, //Interval
|
|
||||||
|
|
||||||
The first two parameters are self-explanatory. They specify the
|
|
||||||
length of this endpoint descriptor (7) and the descriptor type.
|
|
||||||
The next parameter identifies the endpoint, the definitions are
|
|
||||||
defined in usb_device.h and has the following naming
|
|
||||||
convention:
|
|
||||||
_EP<##>_<dir>
|
|
||||||
where ## is the endpoint number and dir is the direction of
|
|
||||||
transfer. The dir has the value of either 'OUT' or 'IN'.
|
|
||||||
The next parameter identifies the type of the endpoint. Available
|
|
||||||
options are _BULK, _INT, _ISO, and _CTRL. The _CTRL is not
|
|
||||||
typically used because the default control transfer endpoint is
|
|
||||||
not defined in the USB descriptors. When _ISO option is used,
|
|
||||||
addition options can be ORed to _ISO. Example:
|
|
||||||
_ISO|_AD|_FE
|
|
||||||
This describes the endpoint as an isochronous pipe with adaptive
|
|
||||||
and feedback attributes. See usb_device.h and the USB
|
|
||||||
specification for details. The next parameter defines the size of
|
|
||||||
the endpoint. The last parameter in the polling interval.
|
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
|
||||||
Adding a USB String
|
|
||||||
-------------------------------------------------------------------
|
|
||||||
A string descriptor array should have the following format:
|
|
||||||
|
|
||||||
rom struct{byte bLength;byte bDscType;word string[size];}sdxxx={
|
|
||||||
sizeof(sdxxx),DSC_STR,<text>};
|
|
||||||
|
|
||||||
The above structure provides a means for the C compiler to
|
|
||||||
calculate the length of string descriptor sdxxx, where xxx is the
|
|
||||||
index number. The first two bytes of the descriptor are descriptor
|
|
||||||
length and type. The rest <text> are string texts which must be
|
|
||||||
in the unicode format. The unicode format is achieved by declaring
|
|
||||||
each character as a word type. The whole text string is declared
|
|
||||||
as a word array with the number of characters equals to <size>.
|
|
||||||
<size> has to be manually counted and entered into the array
|
|
||||||
declaration. Let's study this through an example:
|
|
||||||
if the string is "USB" , then the string descriptor should be:
|
|
||||||
(Using index 02)
|
|
||||||
rom struct{byte bLength;byte bDscType;word string[3];}sd002={
|
|
||||||
sizeof(sd002),DSC_STR,'U','S','B'};
|
|
||||||
|
|
||||||
A USB project may have multiple strings and the firmware supports
|
|
||||||
the management of multiple strings through a look-up table.
|
|
||||||
The look-up table is defined as:
|
|
||||||
rom const unsigned char *rom USB_SD_Ptr[]={&sd000,&sd001,&sd002};
|
|
||||||
|
|
||||||
The above declaration has 3 strings, sd000, sd001, and sd002.
|
|
||||||
Strings can be removed or added. sd000 is a specialized string
|
|
||||||
descriptor. It defines the language code, usually this is
|
|
||||||
US English (0x0409). The index of the string must match the index
|
|
||||||
position of the USB_SD_Ptr array, &sd000 must be in position
|
|
||||||
USB_SD_Ptr[0], &sd001 must be in position USB_SD_Ptr[1] and so on.
|
|
||||||
The look-up table USB_SD_Ptr is used by the get string handler
|
|
||||||
function.
|
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
|
||||||
|
|
||||||
The look-up table scheme also applies to the configuration
|
|
||||||
descriptor. A USB device may have multiple configuration
|
|
||||||
descriptors, i.e. CFG01, CFG02, etc. To add a configuration
|
|
||||||
descriptor, user must implement a structure similar to CFG01.
|
|
||||||
The next step is to add the configuration descriptor name, i.e.
|
|
||||||
cfg01, cfg02,.., to the look-up table USB_CD_Ptr. USB_CD_Ptr[0]
|
|
||||||
is a dummy place holder since configuration 0 is the un-configured
|
|
||||||
state according to the definition in the USB specification.
|
|
||||||
|
|
||||||
********************************************************************/
|
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
* Descriptor specific type definitions are defined in:
|
* -usb_descriptors.c-
|
||||||
* usb_device.h
|
* This file contains the USB descriptor information. It is used
|
||||||
|
* in conjunction with the usb_descriptors.h file. When a descriptor is added
|
||||||
|
* or removed from the main configuration descriptor, i.e. CFG01,
|
||||||
|
* the user must also change the descriptor structure defined in
|
||||||
|
* the usb_descriptors.h file. The structure is used to calculate the
|
||||||
|
* descriptor size, i.e. sizeof(CFG01).
|
||||||
|
*
|
||||||
|
* A typical configuration descriptor consists of:
|
||||||
|
* At least one configuration descriptor (USB_CFG_DSC)
|
||||||
|
* One or more interface descriptors (USB_INTF_DSC)
|
||||||
|
* One or more endpoint descriptors (USB_EP_DSC)
|
||||||
|
*
|
||||||
|
* Naming Convention:
|
||||||
|
* To resolve ambiguity, the naming convention are as followed:
|
||||||
|
* - USB_CFG_DSC type should be named cdxx, where xx is the
|
||||||
|
* configuration number. This number should match the actual
|
||||||
|
* index value of this configuration.
|
||||||
|
* - USB_INTF_DSC type should be named i<yy>a<zz>, where yy is the
|
||||||
|
* interface number and zz is the alternate interface number.
|
||||||
|
* - USB_EP_DSC type should be named ep<##><d>_i<yy>a<zz>, where
|
||||||
|
* ## is the endpoint number and d is the direction of transfer.
|
||||||
|
* The interface name should also be listed as a suffix to identify
|
||||||
|
* which interface does the endpoint belong to.
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* If a device has one configuration, two interfaces; interface 0
|
||||||
|
* has two endpoints (in and out), and interface 1 has one endpoint(in).
|
||||||
|
* Then the CFG01 structure in the usb_descriptors.h should be:
|
||||||
|
*
|
||||||
|
* #define CFG01 ROM struct \
|
||||||
|
* { USB_CFG_DSC cd01; \
|
||||||
|
* USB_INTF_DSC i00a00; \
|
||||||
|
* USB_EP_DSC ep01o_i00a00; \
|
||||||
|
* USB_EP_DSC ep01i_i00a00; \
|
||||||
|
* USB_INTF_DSC i01a00; \
|
||||||
|
* USB_EP_DSC ep02i_i01a00; \
|
||||||
|
* } cfg01
|
||||||
|
*
|
||||||
|
* Note the hierarchy of the descriptors above, it follows the USB
|
||||||
|
* specification requirement. All endpoints belonging to an interface
|
||||||
|
* should be listed immediately after that interface.
|
||||||
|
*
|
||||||
|
* -------------------------------------------------------------------
|
||||||
|
* Filling in the descriptor values in the usb_descriptors.c file:
|
||||||
|
* -------------------------------------------------------------------
|
||||||
|
* Most items should be self-explanatory, however, a few will be
|
||||||
|
* explained for clarification.
|
||||||
|
*
|
||||||
|
* [Configuration Descriptor(USB_CFG_DSC)]
|
||||||
|
* The configuration attribute must always have the _DEFAULT
|
||||||
|
* definition at the minimum. Additional options can be ORed
|
||||||
|
* to the _DEFAULT attribute. Available options are _SELF and _RWU.
|
||||||
|
* These definitions are defined in the usb_device.h file. The
|
||||||
|
* _SELF tells the USB host that this device is self-powered. The
|
||||||
|
* _RWU tells the USB host that this device supports Remote Wakeup.
|
||||||
|
*
|
||||||
|
* [Endpoint Descriptor(USB_EP_DSC)]
|
||||||
|
* Assume the following example:
|
||||||
|
* sizeof(USB_EP_DSC),DSC_EP,_EP01_OUT,_BULK,64,0x00
|
||||||
|
*
|
||||||
|
* The first two parameters are self-explanatory. They specify the
|
||||||
|
* length of this endpoint descriptor (7) and the descriptor type.
|
||||||
|
* The next parameter identifies the endpoint, the definitions are
|
||||||
|
* defined in usb_device.h and has the following naming
|
||||||
|
* convention:
|
||||||
|
* _EP<##>_<dir>
|
||||||
|
* where ## is the endpoint number and dir is the direction of
|
||||||
|
* transfer. The dir has the value of either 'OUT' or 'IN'.
|
||||||
|
* The next parameter identifies the type of the endpoint. Available
|
||||||
|
* options are _BULK, _INT, _ISO, and _CTRL. The _CTRL is not
|
||||||
|
* typically used because the default control transfer endpoint is
|
||||||
|
* not defined in the USB descriptors. When _ISO option is used,
|
||||||
|
* addition options can be ORed to _ISO. Example:
|
||||||
|
* _ISO|_AD|_FE
|
||||||
|
* This describes the endpoint as an isochronous pipe with adaptive
|
||||||
|
* and feedback attributes. See usb_device.h and the USB
|
||||||
|
* specification for details. The next parameter defines the size of
|
||||||
|
* the endpoint. The last parameter in the polling interval.
|
||||||
|
*
|
||||||
|
* -------------------------------------------------------------------
|
||||||
|
* Adding a USB String
|
||||||
|
* -------------------------------------------------------------------
|
||||||
|
* A string descriptor array should have the following format:
|
||||||
|
*
|
||||||
|
* ROM struct{uint8_t bLength;uint8_t bDscType;uint16_t string[size];}sdxxx={
|
||||||
|
* sizeof(sdxxx),DSC_STR,<text>};
|
||||||
|
*
|
||||||
|
* The above structure provides a means for the C compiler to
|
||||||
|
* calculate the length of string descriptor sdxxx, where xxx is the
|
||||||
|
* index number. The first two bytes of the descriptor are descriptor
|
||||||
|
* length and type. The rest <text> are string texts which must be
|
||||||
|
* in the unicode format. The unicode format is achieved by declaring
|
||||||
|
* each character as a word type. The whole text string is declared
|
||||||
|
* as a word array with the number of characters equals to <size>.
|
||||||
|
* <size> has to be manually counted and entered into the array
|
||||||
|
* declaration. Let's study this through an example:
|
||||||
|
* if the string is "USB" , then the string descriptor should be:
|
||||||
|
* (Using index 02)
|
||||||
|
* ROM struct{byte bLength;uint8_t bDscType;uint16_t string[3];}sd002={
|
||||||
|
* sizeof(sd002),DSC_STR,'U','S','B'};
|
||||||
|
*
|
||||||
|
* A USB project may have multiple strings and the firmware supports
|
||||||
|
* the management of multiple strings through a look-up table.
|
||||||
|
* The look-up table is defined as:
|
||||||
|
* ROM const unsigned char *ROM USB_SD_Ptr[]={&sd000,&sd001,&sd002};
|
||||||
|
*
|
||||||
|
* The above declaration has 3 strings, sd000, sd001, and sd002.
|
||||||
|
* Strings can be removed or added. sd000 is a specialized string
|
||||||
|
* descriptor. It defines the language code, usually this is
|
||||||
|
* US English (0x0409). The index of the string must match the index
|
||||||
|
* position of the USB_SD_Ptr array, &sd000 must be in position
|
||||||
|
* USB_SD_Ptr[0], &sd001 must be in position USB_SD_Ptr[1] and so on.
|
||||||
|
* The look-up table USB_SD_Ptr is used by the get string handler
|
||||||
|
* function in usb9.c.
|
||||||
|
*
|
||||||
|
* -------------------------------------------------------------------
|
||||||
|
*
|
||||||
|
* The look-up table scheme also applies to the configuration
|
||||||
|
* descriptor. A USB device may have multiple configuration
|
||||||
|
* descriptors, i.e. CFG01, CFG02, etc. To add a configuration
|
||||||
|
* descriptor, user must implement a structure similar to CFG01.
|
||||||
|
* The next step is to add the configuration descriptor name, i.e.
|
||||||
|
* cfg01, cfg02,.., to the look-up table USB_CD_Ptr. USB_CD_Ptr[0]
|
||||||
|
* is a dummy place holder since configuration 0 is the un-configured
|
||||||
|
* state according to the definition in the USB specification.
|
||||||
*
|
*
|
||||||
* Configuration options are defined in:
|
|
||||||
* usb_config.h
|
|
||||||
********************************************************************/
|
********************************************************************/
|
||||||
|
|
||||||
/** INCLUDES *******************************************************/
|
|
||||||
|
|
||||||
|
/** I N C L U D E S *************************************************/
|
||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
#include "usb_device_hid.h"
|
|
||||||
|
|
||||||
|
/** C O N S T A N T S ************************************************/
|
||||||
|
#ifndef __XC8__
|
||||||
|
#pragma romdata
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Device Descriptor */
|
/* Device Descriptor */
|
||||||
const USB_DEVICE_DESCRIPTOR device_dsc=
|
ROM USB_DEV_DSC device_dsc=
|
||||||
{
|
{
|
||||||
0x12, // Size of this descriptor in bytes
|
sizeof(USB_DEV_DSC), // Size of this descriptor in bytes
|
||||||
USB_DESCRIPTOR_DEVICE, // DEVICE descriptor type
|
DSC_DEV, // DEVICE descriptor type
|
||||||
0x0200, // USB Spec Release Number in BCD format
|
0x0200, // USB Spec Release Number in BCD format
|
||||||
0x00, // Class Code
|
0x00, // Class Code
|
||||||
0x00, // Subclass code
|
0x00, // Subclass code
|
||||||
0x00, // Protocol code
|
0x00, // Protocol code
|
||||||
USB_EP0_BUFF_SIZE, // Max packet size for EP0, see usb_config.h
|
EP0_BUFF_SIZE, // Max packet size for EP0, see usb_config.h
|
||||||
0x04D8, // Vendor ID, see usb_config.h
|
0x04D8, // Vendor ID: Microchip
|
||||||
0x003C, // Product ID, see usb_config.h
|
0x003C, // Product ID: HID Bootloader
|
||||||
0x0101, // Device release number in BCD format
|
0x0101, // Device release number in BCD format
|
||||||
0x01, // Manufacturer string index
|
0x01, // Manufacturer string index
|
||||||
0x02, // Product string index
|
0x02, // Product string index
|
||||||
@@ -160,13 +177,13 @@ const USB_DEVICE_DESCRIPTOR device_dsc=
|
|||||||
0x01 // Number of possible configurations
|
0x01 // Number of possible configurations
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Configuration 1 Descriptor */
|
/* Configuration 1 Descriptors */
|
||||||
const uint8_t configDescriptor1[]={
|
ROM uint8_t CFG01[CONFIG_DESC_TOTAL_LEN]={
|
||||||
/* Configuration Descriptor */
|
/* Configuration Descriptor */
|
||||||
0x09,//sizeof(USB_CFG_DSC), // Size of this descriptor in bytes
|
sizeof(USB_CFG_DSC), // Size of this descriptor in bytes
|
||||||
USB_DESCRIPTOR_CONFIGURATION, // CONFIGURATION descriptor type
|
DSC_CFG, // CONFIGURATION descriptor type
|
||||||
0x29, // Total length of data for this cfg - LSB
|
(uint8_t)CONFIG_DESC_TOTAL_LEN, // Total length of data for this cfg - LSB
|
||||||
0x00, // Total length of data for this cfg - MSB
|
(uint8_t)(CONFIG_DESC_TOTAL_LEN>>8), // Total length of data for this cfg - MSB
|
||||||
1, // Number of interfaces in this cfg
|
1, // Number of interfaces in this cfg
|
||||||
1, // Index value of this configuration
|
1, // Index value of this configuration
|
||||||
0, // Configuration string index
|
0, // Configuration string index
|
||||||
@@ -174,78 +191,65 @@ const uint8_t configDescriptor1[]={
|
|||||||
50, // Max power consumption (2X mA)
|
50, // Max power consumption (2X mA)
|
||||||
|
|
||||||
/* Interface Descriptor */
|
/* Interface Descriptor */
|
||||||
0x09,//sizeof(USB_INTF_DSC), // Size of this descriptor in bytes
|
sizeof(USB_INTF_DSC), // Size of this descriptor in bytes
|
||||||
USB_DESCRIPTOR_INTERFACE, // INTERFACE descriptor type
|
DSC_INTF, // INTERFACE descriptor type
|
||||||
0, // Interface Number
|
0, // Interface Number
|
||||||
0, // Alternate Setting Number
|
0, // Alternate Setting Number
|
||||||
2, // Number of endpoints in this intf
|
2, // Number of endpoints in this intf
|
||||||
HID_INTF, // Class code
|
HID_INTF, // Class code
|
||||||
0, // Subclass code
|
0, // Subclass code, no subclass
|
||||||
0, // Protocol code
|
0, // Protocol code, no protocol
|
||||||
0, // Interface string index
|
0, // Interface string index
|
||||||
|
|
||||||
/* HID Class-Specific Descriptor */
|
/* HID Class-Specific Descriptor */
|
||||||
0x09,//sizeof(USB_HID_DSC)+3, // Size of this descriptor in bytes RRoj hack
|
sizeof(USB_HID_DSC), // Size of this descriptor in bytes
|
||||||
DSC_HID, // HID descriptor type
|
DSC_HID, // HID descriptor type
|
||||||
0x11, // HID Spec Release Number in BCD format (0x0111 = v1.11) - LSB
|
0x11, // HID Spec Release Number in BCD format (0x0111 = v1.11) - LSB
|
||||||
0x01, // HID Spec Release Number in BCD format (0x0111 = v1.11) - MSB
|
0x01, // HID Spec Release Number in BCD format (0x0111 = v1.11) - MSB
|
||||||
0x00, // Country Code (0x00 for Not supported)
|
0x00, // Country Code (0x00 for Not supported)
|
||||||
HID_NUM_OF_DSC, // Number of class descriptors, see usbcfg.h
|
HID_NUM_OF_DSC, // Number of class descriptors, see usb_config.h
|
||||||
DSC_RPT, // Report descriptor type
|
DSC_RPT, // Report descriptor type
|
||||||
DESC_CONFIG_WORD(HID_RPT01_SIZE), //sizeof(hid_rpt01), // Size of the report descriptor
|
(uint8_t)HID_RPT01_SIZE, // Size of the report descriptor - LSB
|
||||||
|
(uint8_t)((uint16_t)HID_RPT01_SIZE >> 8), // Size of the report descriptor - MSB
|
||||||
|
|
||||||
|
/* Endpoint Descriptor */
|
||||||
|
sizeof(USB_EP_DSC), //Endpoint descriptor size
|
||||||
|
DSC_EP, //Type of descriptor (endpoint)
|
||||||
|
_EP01_IN, //Endpoint number + direction
|
||||||
|
_INT, //Endpoint transfer type implemented
|
||||||
|
HID_INT_IN_EP_SIZE, //LSB - endpoint size
|
||||||
|
0x00, //MSB - endpoint size
|
||||||
|
0x01, //bInterval
|
||||||
|
|
||||||
/* Endpoint Descriptor */
|
/* Endpoint Descriptor */
|
||||||
0x07,/*sizeof(USB_EP_DSC)*/
|
sizeof(USB_EP_DSC), //Endpoint descriptor size
|
||||||
USB_DESCRIPTOR_ENDPOINT, //Endpoint Descriptor
|
DSC_EP, //Type of descriptor (endpoint)
|
||||||
_EP01_IN, //EndpointAddress
|
_EP01_OUT, //Endpoint number + direction
|
||||||
_INTERRUPT, //Attributes
|
_INT, //Endpoint transfer type implemented
|
||||||
DESC_CONFIG_WORD(HID_INT_IN_EP_SIZE), //size
|
HID_INT_OUT_EP_SIZE, //LSB - endpoint size
|
||||||
0x01, //Interval
|
0x00, //MSB - endpoint size
|
||||||
|
0x01 //bInterval
|
||||||
/* Endpoint Descriptor */
|
|
||||||
0x07,/*sizeof(USB_EP_DSC)*/
|
|
||||||
USB_DESCRIPTOR_ENDPOINT, //Endpoint Descriptor
|
|
||||||
_EP01_OUT, //EndpointAddress
|
|
||||||
_INTERRUPT, //Attributes
|
|
||||||
DESC_CONFIG_WORD(HID_INT_OUT_EP_SIZE), //size
|
|
||||||
0x01, //Interval
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ROM struct{uint8_t bLength;uint8_t bDscType;uint16_t string[1];}sd000={
|
||||||
|
sizeof(sd000),DSC_STR,0x0409};
|
||||||
|
|
||||||
//Language code string descriptor
|
ROM struct{uint8_t bLength;uint8_t bDscType;uint16_t string[25];}sd001={
|
||||||
const struct{uint8_t bLength;uint8_t bDscType;uint16_t string[1];}sd000={
|
sizeof(sd001),DSC_STR,
|
||||||
sizeof(sd000),USB_DESCRIPTOR_STRING,{0x0409
|
'M','i','c','r','o','c','h','i','p',' ',
|
||||||
}};
|
'T','e','c','h','n','o','l','o','g','y',' ','I','n','c','.'};
|
||||||
|
|
||||||
//Manufacturer string descriptor
|
ROM struct{uint8_t bLength;uint8_t bDscType;uint16_t string[18];}sd002={
|
||||||
const struct{uint8_t bLength;uint8_t bDscType;uint16_t string[25];}sd001={
|
sizeof(sd002),DSC_STR,
|
||||||
sizeof(sd001),USB_DESCRIPTOR_STRING,
|
'H','I','D',' ','U','S','B',' ','B','o','o',
|
||||||
{'M','i','c','r','o','c','h','i','p',' ',
|
't','l','o','a','d','e','r'};
|
||||||
'T','e','c','h','n','o','l','o','g','y',' ','I','n','c','.'
|
|
||||||
}};
|
|
||||||
|
|
||||||
//Product string descriptor
|
ROM uint8_t hid_rpt01[HID_RPT01_SIZE]=
|
||||||
const struct{uint8_t bLength;uint8_t bDscType;uint16_t string[18];}sd002={
|
// First byte in each row is the "item". First byte's two least significant
|
||||||
sizeof(sd002),USB_DESCRIPTOR_STRING,
|
// bits are the number of data bytes that follow, but encoded (0=0, 1=1, 2=2, 3=4 bytes).
|
||||||
{'H','I','D',' ','U','S','B',' ','B','o','o',
|
// bSize should match number of bytes that follow, or REPORT descriptor parser won't work. The bytes
|
||||||
't','l','o','a','d','e','r'
|
// that follow in each item line are data bytes
|
||||||
}};
|
|
||||||
|
|
||||||
//Array of configuration descriptors
|
|
||||||
const uint8_t *const USB_CD_Ptr[]=
|
|
||||||
{
|
{
|
||||||
(const uint8_t *const)&configDescriptor1
|
|
||||||
};
|
|
||||||
|
|
||||||
//Array of string descriptors
|
|
||||||
const uint8_t *const USB_SD_Ptr[]=
|
|
||||||
{
|
|
||||||
(const uint8_t *const)&sd000,
|
|
||||||
(const uint8_t *const)&sd001,
|
|
||||||
(const uint8_t *const)&sd002
|
|
||||||
};
|
|
||||||
|
|
||||||
const struct{uint8_t report[HID_RPT01_SIZE];}hid_rpt01={{
|
|
||||||
0x06, 0x00, 0xFF, // Usage Page = 0xFF00 (Vendor Defined Page 1)
|
0x06, 0x00, 0xFF, // Usage Page = 0xFF00 (Vendor Defined Page 1)
|
||||||
0x09, 0x01, // Usage (Vendor Usage 1)
|
0x09, 0x01, // Usage (Vendor Usage 1)
|
||||||
0xA1, 0x01, // Collection (Application)
|
0xA1, 0x01, // Collection (Application)
|
||||||
@@ -260,7 +264,19 @@ const struct{uint8_t report[HID_RPT01_SIZE];}hid_rpt01={{
|
|||||||
0x29, 0x40, // Usage Maximum //64 output usages total (0x01 to 0x40)
|
0x29, 0x40, // Usage Maximum //64 output usages total (0x01 to 0x40)
|
||||||
0x91, 0x00, // Output (Data, Array, Abs): Instantiates output packet fields. Uses same report size and count as "Input" fields, since nothing new/different was specified to the parser since the "Input" item.
|
0x91, 0x00, // Output (Data, Array, Abs): Instantiates output packet fields. Uses same report size and count as "Input" fields, since nothing new/different was specified to the parser since the "Input" item.
|
||||||
0xC0 // End Collection
|
0xC0 // End Collection
|
||||||
}
|
};
|
||||||
};
|
|
||||||
/** EOF usb_descriptors.c ***************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
|
ROM unsigned char* ROM USB_SD_Ptr[]=
|
||||||
|
{
|
||||||
|
(ROM const unsigned char *ROM)&sd000,
|
||||||
|
(ROM const unsigned char *ROM)&sd001,
|
||||||
|
(ROM const unsigned char *ROM)&sd002
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __XC8__
|
||||||
|
#pragma code
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** EOF usb_descriptors.c ****************************************************/
|
||||||
|
|||||||
@@ -1,85 +0,0 @@
|
|||||||
#include "usb.h"
|
|
||||||
#include "usb_device_hid.h"
|
|
||||||
#include "bootloader.h"
|
|
||||||
|
|
||||||
/*******************************************************************
|
|
||||||
* Function: bool USER_USB_CALLBACK_EVENT_HANDLER(
|
|
||||||
* USB_EVENT event, void *pdata, uint16_t size)
|
|
||||||
*
|
|
||||||
* PreCondition: None
|
|
||||||
*
|
|
||||||
* Input: USB_EVENT event - the type of event
|
|
||||||
* void *pdata - pointer to the event data
|
|
||||||
* uint16_t size - size of the event data
|
|
||||||
*
|
|
||||||
* Output: None
|
|
||||||
*
|
|
||||||
* Side Effects: None
|
|
||||||
*
|
|
||||||
* Overview: This function is called from the USB stack to
|
|
||||||
* notify a user application that a USB event
|
|
||||||
* occured. This callback is in interrupt context
|
|
||||||
* when the USB_INTERRUPT option is selected.
|
|
||||||
*
|
|
||||||
* Note: None
|
|
||||||
*******************************************************************/
|
|
||||||
bool USER_USB_CALLBACK_EVENT_HANDLER(USB_EVENT event, void *pdata, uint16_t size)
|
|
||||||
{
|
|
||||||
switch( (int) event )
|
|
||||||
{
|
|
||||||
case EVENT_TRANSFER:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EVENT_SOF:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EVENT_SUSPEND:
|
|
||||||
//Call the hardware platform specific handler for suspend events for
|
|
||||||
//possible further action (like optionally going reconfiguring the application
|
|
||||||
//for lower power states and going to sleep during the suspend event). This
|
|
||||||
//would normally be done in USB compliant bus powered applications, although
|
|
||||||
//no further processing is needed for purely self powered applications that
|
|
||||||
//don't consume power from the host.
|
|
||||||
//asm("SLEEP"); // sleep right now, execution starts on next line when woken up
|
|
||||||
// we have been woken up. if the watchdog was the cause go back to sleep
|
|
||||||
//while ((PIR2bits.USBIF == 0) && (RCONbits.TO == 0))
|
|
||||||
//{
|
|
||||||
// asm("SLEEP");
|
|
||||||
//}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EVENT_RESUME:
|
|
||||||
// restore any hardware states (i.e. IO pin config) that were changed on suspend
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EVENT_CONFIGURED:
|
|
||||||
// When the device is configured, we should (re)initialize our state variables
|
|
||||||
UserInit();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EVENT_SET_DESCRIPTOR:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EVENT_EP0_REQUEST:
|
|
||||||
/* We have received a non-standard USB request. The HID driver
|
|
||||||
* needs to check to see if the request was for it. */
|
|
||||||
USBCheckHIDRequest();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EVENT_BUS_ERROR:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EVENT_TRANSFER_TERMINATED:
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
End of File
|
|
||||||
*/
|
|
||||||
|
|
||||||
@@ -334,7 +334,7 @@ typedef union __USTAT
|
|||||||
#define USBHALGetLastDirection(stat) stat.direction
|
#define USBHALGetLastDirection(stat) stat.direction
|
||||||
#define USBHALGetLastPingPong(stat) stat.ping_pong
|
#define USBHALGetLastPingPong(stat) stat.ping_pong
|
||||||
|
|
||||||
|
/*
|
||||||
typedef union _POINTER
|
typedef union _POINTER
|
||||||
{
|
{
|
||||||
struct
|
struct
|
||||||
@@ -359,7 +359,7 @@ typedef union _POINTER
|
|||||||
//rom far byte* fbRom; // Far = 3 bytes pointer
|
//rom far byte* fbRom; // Far = 3 bytes pointer
|
||||||
//rom far word* fwRom;
|
//rom far word* fwRom;
|
||||||
} POINTER;
|
} POINTER;
|
||||||
|
*/
|
||||||
// *****************************************************************************
|
// *****************************************************************************
|
||||||
// *****************************************************************************
|
// *****************************************************************************
|
||||||
// Section: Interface Routines
|
// Section: Interface Routines
|
||||||
|
|||||||
@@ -27,11 +27,15 @@
|
|||||||
#ifndef MEMORY_
|
#ifndef MEMORY_
|
||||||
#define MEMORY_
|
#define MEMORY_
|
||||||
|
|
||||||
#define APP_FW_MEMORY_OFFSET 0x2080
|
#define APP_FW_MEMORY_OFFSET 0x2000
|
||||||
|
|
||||||
#define BOOTLOADER_ENTRYPOINT 0x001C
|
#define BOOTLOADER_ENTRYPOINT 0x001C
|
||||||
|
|
||||||
#define APP_FW_VERSION_ADDRESS (APP_FW_MEMORY_OFFSET + 0x0016)
|
#define APP_FW_VERSION_ADDRESS (APP_FW_MEMORY_OFFSET + 0x16)
|
||||||
|
|
||||||
|
#define APP_SIGNATURE_ADDRESS (APP_FW_MEMORY_OFFSET + 0x06) //0x1C06 and 0x1C07 contains the "signature" WORD, indicating successful erase/program/verify operation
|
||||||
|
#define APP_SIGNATURE_VALUE 0x600D //leet "GOOD", implying that the erase/program was a success and the bootloader intentionally programmed the APP_SIGNATURE_ADDRESS with this value
|
||||||
|
#define APP_VERSION_ADDRESS APP_FW_VERSION_ADDRESS //0x1C16 and 0x1C17 should contain the application image firmware version number
|
||||||
|
|
||||||
#endif /* MEMORY_ */
|
#endif /* MEMORY_ */
|
||||||
|
|
||||||
|
|||||||
@@ -95,16 +95,46 @@
|
|||||||
<makeCustomizationNormalizeHexFile>false</makeCustomizationNormalizeHexFile>
|
<makeCustomizationNormalizeHexFile>false</makeCustomizationNormalizeHexFile>
|
||||||
</makeCustomizationType>
|
</makeCustomizationType>
|
||||||
<item path="../../common_src/framework/usb/src/usb_device_hid.c"
|
<item path="../../common_src/framework/usb/src/usb_device_hid.c"
|
||||||
ex="true"
|
ex="false"
|
||||||
overriding="false">
|
overriding="false">
|
||||||
|
<HI-TECH-COMP>
|
||||||
|
</HI-TECH-COMP>
|
||||||
|
<HI-TECH-LINK>
|
||||||
|
</HI-TECH-LINK>
|
||||||
|
<XC8-config-global>
|
||||||
|
</XC8-config-global>
|
||||||
</item>
|
</item>
|
||||||
<item path="../src/dancepad.c" ex="true" overriding="false">
|
<item path="../src/dancepad.c" ex="false" overriding="false">
|
||||||
|
<HI-TECH-COMP>
|
||||||
|
</HI-TECH-COMP>
|
||||||
|
<HI-TECH-LINK>
|
||||||
|
</HI-TECH-LINK>
|
||||||
|
<XC8-config-global>
|
||||||
|
</XC8-config-global>
|
||||||
</item>
|
</item>
|
||||||
<item path="../src/interrupts.c" ex="true" overriding="false">
|
<item path="../src/interrupts.c" ex="false" overriding="false">
|
||||||
|
<HI-TECH-COMP>
|
||||||
|
</HI-TECH-COMP>
|
||||||
|
<HI-TECH-LINK>
|
||||||
|
</HI-TECH-LINK>
|
||||||
|
<XC8-config-global>
|
||||||
|
</XC8-config-global>
|
||||||
</item>
|
</item>
|
||||||
<item path="../src/padhal.c" ex="true" overriding="false">
|
<item path="../src/padhal.c" ex="false" overriding="false">
|
||||||
|
<HI-TECH-COMP>
|
||||||
|
</HI-TECH-COMP>
|
||||||
|
<HI-TECH-LINK>
|
||||||
|
</HI-TECH-LINK>
|
||||||
|
<XC8-config-global>
|
||||||
|
</XC8-config-global>
|
||||||
</item>
|
</item>
|
||||||
<item path="../src/usb_events.c" ex="true" overriding="false">
|
<item path="../src/usb_events.c" ex="false" overriding="false">
|
||||||
|
<HI-TECH-COMP>
|
||||||
|
</HI-TECH-COMP>
|
||||||
|
<HI-TECH-LINK>
|
||||||
|
</HI-TECH-LINK>
|
||||||
|
<XC8-config-global>
|
||||||
|
</XC8-config-global>
|
||||||
</item>
|
</item>
|
||||||
<HI-TECH-COMP>
|
<HI-TECH-COMP>
|
||||||
<property key="additional-warnings" value="true"/>
|
<property key="additional-warnings" value="true"/>
|
||||||
@@ -142,7 +172,7 @@
|
|||||||
</HI-TECH-COMP>
|
</HI-TECH-COMP>
|
||||||
<HI-TECH-LINK>
|
<HI-TECH-LINK>
|
||||||
<property key="additional-options-checksum" value=""/>
|
<property key="additional-options-checksum" value=""/>
|
||||||
<property key="additional-options-code-offset" value="2080"/>
|
<property key="additional-options-code-offset" value="0x2000"/>
|
||||||
<property key="additional-options-command-line" value=""/>
|
<property key="additional-options-command-line" value=""/>
|
||||||
<property key="additional-options-errata" value=""/>
|
<property key="additional-options-errata" value=""/>
|
||||||
<property key="additional-options-extend-address" value="false"/>
|
<property key="additional-options-extend-address" value="false"/>
|
||||||
@@ -153,7 +183,7 @@
|
|||||||
<property key="calibrate-oscillator-value" value="0x3400"/>
|
<property key="calibrate-oscillator-value" value="0x3400"/>
|
||||||
<property key="clear-bss" value="true"/>
|
<property key="clear-bss" value="true"/>
|
||||||
<property key="code-model-external" value="wordwrite"/>
|
<property key="code-model-external" value="wordwrite"/>
|
||||||
<property key="code-model-rom" value="default,-0-207F,-2086-2087,-2096-2097"/>
|
<property key="code-model-rom" value="default,-0-1FFF,-2006-2007,-2016-2017"/>
|
||||||
<property key="create-html-files" value="false"/>
|
<property key="create-html-files" value="false"/>
|
||||||
<property key="data-model-ram" value=""/>
|
<property key="data-model-ram" value=""/>
|
||||||
<property key="data-model-size-of-double" value="32"/>
|
<property key="data-model-size-of-double" value="32"/>
|
||||||
@@ -264,7 +294,6 @@
|
|||||||
<archiverTool>
|
<archiverTool>
|
||||||
</archiverTool>
|
</archiverTool>
|
||||||
<loading>
|
<loading>
|
||||||
<loadableFile>../../bootloader/clubdance_v2_bootloader.X/dist/default/production/clubdance_v2_bootloader.X.production.hex</loadableFile>
|
|
||||||
<useAlternateLoadableFile>false</useAlternateLoadableFile>
|
<useAlternateLoadableFile>false</useAlternateLoadableFile>
|
||||||
<parseOnProdLoad>false</parseOnProdLoad>
|
<parseOnProdLoad>false</parseOnProdLoad>
|
||||||
<alternateLoadableFile></alternateLoadableFile>
|
<alternateLoadableFile></alternateLoadableFile>
|
||||||
|
|||||||
@@ -24,33 +24,33 @@
|
|||||||
*/
|
*/
|
||||||
#pragma warning disable 1510
|
#pragma warning disable 1510
|
||||||
|
|
||||||
//#include "usb.h"
|
#include "usb.h"
|
||||||
//#include "padhal.h"
|
#include "padhal.h"
|
||||||
//#include "dancepad.h"
|
#include "dancepad.h"
|
||||||
#include "memory.h"
|
#include "memory.h"
|
||||||
|
|
||||||
//#ifdef LINK_FOR_BOOTLOADER
|
#ifdef LINK_FOR_BOOTLOADER
|
||||||
// only define this if building fw to be used with the bootloader
|
// only define this if building fw to be used with the bootloader
|
||||||
const unsigned int VersionWord __at(APP_FW_VERSION_ADDRESS) = 0x0100;
|
const uint16_t VersionWord __at(0x2016) = 0x0100;
|
||||||
//#endif
|
#endif
|
||||||
|
|
||||||
void main(void)
|
void main(void)
|
||||||
{
|
{
|
||||||
// initialize sensor HAL & the dancepad driver
|
// initialize sensor HAL & the dancepad driver
|
||||||
/*PADHAL_Initialize();
|
PADHAL_Initialize();
|
||||||
DANCEPAD_Initialize();
|
DANCEPAD_Initialize();
|
||||||
|
|
||||||
// initialize the USB framework
|
// initialize the USB framework
|
||||||
USBDeviceInit();
|
USBDeviceInit();
|
||||||
USBDeviceAttach();*/
|
USBDeviceAttach();
|
||||||
|
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
// do nothing if: not connected to USB host, or the host put us in suspend state
|
// do nothing if: not connected to USB host, or the host put us in suspend state
|
||||||
//if((USBGetDeviceState() < CONFIGURED_STATE) | USBIsDeviceSuspended())
|
if((USBGetDeviceState() < CONFIGURED_STATE) | USBIsDeviceSuspended())
|
||||||
// continue;
|
continue;
|
||||||
|
|
||||||
// run application specific tasks
|
// run application specific tasks
|
||||||
//DANCEPAD_Tasks();
|
DANCEPAD_Tasks();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,8 +80,8 @@
|
|||||||
//(ex: USBDeviceTasks()) must be called periodically by the application firmware
|
//(ex: USBDeviceTasks()) must be called periodically by the application firmware
|
||||||
//at a minimum rate as described in the inline code comments in usb_device.c.
|
//at a minimum rate as described in the inline code comments in usb_device.c.
|
||||||
//------------------------------------------------------
|
//------------------------------------------------------
|
||||||
#define USB_POLLING
|
//#define USB_POLLING
|
||||||
//#define USB_INTERRUPT
|
#define USB_INTERRUPT
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
/* Parameter definitions are defined in usb_device.h */
|
/* Parameter definitions are defined in usb_device.h */
|
||||||
|
|||||||
Reference in New Issue
Block a user