\r
USB_ControlRequest = (USB_Request_Header_t)\r
{\r
- bmRequestType: (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_DEVICE),\r
- bRequest: 0,\r
- wValue: 0,\r
- wIndex: 0,\r
- wLength: sizeof(CommandBuffer)\r
+ .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_DEVICE),\r
+ .bRequest = 0,\r
+ .wValue = 0,\r
+ .wIndex = 0,\r
+ .wLength = sizeof(CommandBuffer)\r
};\r
\r
memset(CommandBuffer, 0x00, sizeof(CommandBuffer));\r
\r
USB_ControlRequest = (USB_Request_Header_t)\r
{\r
- bmRequestType: (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE),\r
- bRequest: REQ_GetDeviceID,\r
- wValue: 0,\r
- wIndex: 0,\r
- wLength: sizeof(DeviceIDStringLength),\r
+ .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE),\r
+ .bRequest = REQ_GetDeviceID,\r
+ .wValue = 0,\r
+ .wIndex = 0,\r
+ .wLength = sizeof(DeviceIDStringLength),\r
};\r
\r
Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
{\r
USB_ControlRequest = (USB_Request_Header_t)\r
{\r
- bmRequestType: (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),\r
- bRequest: REQ_SoftReset,\r
- wValue: 0,\r
- wIndex: 0,\r
- wLength: 0,\r
+ .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),\r
+ .bRequest = REQ_SoftReset,\r
+ .wValue = 0,\r
+ .wIndex = 0,\r
+ .wLength = 0,\r
};\r
\r
Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
{\r
USB_ControlRequest = (USB_Request_Header_t)\r
{\r
- bmRequestType: (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_INTERFACE),\r
- bRequest: REQ_SetInterface,\r
- wValue: PrinterAltSetting,\r
- wIndex: PrinterInterfaceNumber,\r
- wLength: 0,\r
+ .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_INTERFACE),\r
+ .bRequest = REQ_SetInterface,\r
+ .wValue = PrinterAltSetting,\r
+ .wIndex = PrinterInterfaceNumber,\r
+ .wLength = 0,\r
};\r
\r
if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)\r
static inline void Joystick_Init(void)\r
{\r
// TODO: Initialize joystick port pins as inputs with pull-ups\r
- };\r
+ }\r
\r
static inline uint8_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT;\r
static inline uint8_t Joystick_GetStatus(void)\r
{\r
DDRD &= ~JOY_MASK;\r
PORTD |= JOY_MASK;\r
- };\r
+ }\r
\r
static inline uint8_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT;\r
static inline uint8_t Joystick_GetStatus(void)\r
\r
PORTF |= JOY_FMASK;\r
PORTC |= JOY_CMASK; \r
- };\r
+ }\r
\r
static inline uint8_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT;\r
static inline uint8_t Joystick_GetStatus(void)\r
\r
PORTB |= JOY_BMASK;\r
PORTE |= JOY_EMASK; \r
- };\r
+ }\r
\r
static inline uint8_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT;\r
static inline uint8_t Joystick_GetStatus(void)\r
DDRB &= ~JOY_BMASK;\r
\r
PORTB |= JOY_BMASK;\r
- };\r
+ }\r
\r
static inline uint8_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT;\r
static inline uint8_t Joystick_GetStatus(void)\r
\r
PORTB |= JOY_BMASK;\r
PORTE |= JOY_EMASK; \r
- };\r
+ }\r
\r
static inline uint8_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT;\r
static inline uint8_t Joystick_GetStatus(void)\r
\r
USB_ControlRequest = (USB_Request_Header_t)\r
{\r
- bmRequestType: (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_INTERFACE),\r
- bRequest: REQ_SetInterface,\r
- wValue: PRNTInterfaceInfo->State.AlternateSetting,\r
- wIndex: PRNTInterfaceInfo->State.InterfaceNumber,\r
- wLength: 0,\r
+ .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_INTERFACE),\r
+ .bRequest = REQ_SetInterface,\r
+ .wValue = PRNTInterfaceInfo->State.AlternateSetting,\r
+ .wIndex = PRNTInterfaceInfo->State.InterfaceNumber,\r
+ .wLength = 0,\r
};\r
\r
Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
{\r
USB_ControlRequest = (USB_Request_Header_t)\r
{\r
- bmRequestType: (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE),\r
- bRequest: REQ_GetPortStatus,\r
- wValue: 0,\r
- wIndex: PRNTInterfaceInfo->State.InterfaceNumber,\r
- wLength: sizeof(uint8_t),\r
+ .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE),\r
+ .bRequest = REQ_GetPortStatus,\r
+ .wValue = 0,\r
+ .wIndex = PRNTInterfaceInfo->State.InterfaceNumber,\r
+ .wLength = sizeof(uint8_t),\r
};\r
\r
Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
{\r
USB_ControlRequest = (USB_Request_Header_t)\r
{\r
- bmRequestType: (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),\r
- bRequest: REQ_SoftReset,\r
- wValue: 0,\r
- wIndex: PRNTInterfaceInfo->State.InterfaceNumber,\r
- wLength: 0,\r
+ .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),\r
+ .bRequest = REQ_SoftReset,\r
+ .wValue = 0,\r
+ .wIndex = PRNTInterfaceInfo->State.InterfaceNumber,\r
+ .wLength = 0,\r
};\r
\r
Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
\r
USB_ControlRequest = (USB_Request_Header_t)\r
{\r
- bmRequestType: (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE),\r
- bRequest: REQ_GetDeviceID,\r
- wValue: 0,\r
- wIndex: PRNTInterfaceInfo->State.InterfaceNumber,\r
- wLength: sizeof(DeviceIDStringLength),\r
+ .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE),\r
+ .bRequest = REQ_GetDeviceID,\r
+ .wValue = 0,\r
+ .wIndex = PRNTInterfaceInfo->State.InterfaceNumber,\r
+ .wLength = sizeof(DeviceIDStringLength),\r
};\r
\r
Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
{\r
uint16_t CurrDescriptorSize = DESCRIPTOR_CAST(*CurrConfigLoc, USB_Descriptor_Header_t).Size;\r
\r
- *CurrConfigLoc += CurrDescriptorSize;\r
+ *((uint8_t**)CurrConfigLoc) += CurrDescriptorSize;\r
*BytesRem -= CurrDescriptorSize;\r
}\r
\r
{\r
USB_ControlRequest = (USB_Request_Header_t)\r
{\r
- bmRequestType: (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),\r
- bRequest: REQ_GetDescriptor,\r
- wValue: (DTYPE_Device << 8),\r
- wIndex: 0,\r
- wLength: sizeof(USB_Descriptor_Device_t),\r
+ .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),\r
+ .bRequest = REQ_GetDescriptor,\r
+ .wValue = (DTYPE_Device << 8),\r
+ .wIndex = 0,\r
+ .wLength = sizeof(USB_Descriptor_Device_t),\r
};\r
\r
Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
{\r
USB_ControlRequest = (USB_Request_Header_t)\r
{\r
- bmRequestType: (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),\r
- bRequest: REQ_GetDescriptor,\r
- wValue: (DTYPE_String << 8) | Index,\r
- wIndex: 0,\r
- wLength: BufferLength,\r
+ .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),\r
+ .bRequest = REQ_GetDescriptor,\r
+ .wValue = (DTYPE_String << 8) | Index,\r
+ .wIndex = 0,\r
+ .wLength = BufferLength,\r
};\r
\r
Pipe_SelectPipe(PIPE_CONTROLPIPE);\r
return (4 << EPSIZE0);\r
else\r
return (5 << EPSIZE0);\r
- };\r
+ }\r
\r
#endif\r
\r
Endpoint_ClearOUT();\r
Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);\r
\r
- // TODO: Send read command here via PDI protocol\r
+ if (ReadMemory_XPROG_Params.MemoryType == XPRG_MEM_TYPE_USERSIG)\r
+ {\r
+ PDITarget_SendByte(PDI_CMD_STS | (PDI_DATSIZE_1BYTE << 2));\r
+ PDITarget_SendAddress(DATAMEM_BASE | DATAMEM_NVM_CMD);\r
+ PDITarget_SendByte(NVM_CMD_READUSERSIG);\r
+\r
+ \r
+ }\r
\r
Endpoint_Write_Byte(CMD_XPROG);\r
Endpoint_Write_Byte(XPRG_CMD_READ_MEM);\r
static void PDIProtocol_ReadCRC(void)\r
{\r
uint8_t ReturnStatus = XPRG_ERR_OK;\r
-\r
- uint8_t CRCType = Endpoint_Read_Byte();\r
\r
+ struct\r
+ {\r
+ uint8_t CRCType;\r
+ } ReadCRC_XPROG_Params;\r
+ \r
+ Endpoint_Read_Stream_LE(&ReadCRC_XPROG_Params, sizeof(ReadCRC_XPROG_Params));\r
Endpoint_ClearOUT();\r
Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);\r
\r
uint32_t MemoryCRC = 0;\r
+ uint8_t CRCReadCommand;\r
+\r
+ if (ReadCRC_XPROG_Params.CRCType == XPRG_CRC_APP)\r
+ CRCReadCommand = NVM_CMD_APPCRC;\r
+ else if (ReadCRC_XPROG_Params.CRCType == XPRG_CRC_BOOT)\r
+ CRCReadCommand = NVM_CMD_BOOTCRC;\r
+ else\r
+ CRCReadCommand = NVM_CMD_FLASHCRC;\r
+ \r
+ /* Set the NVM command to the correct CRC read command */\r
+ PDITarget_SendByte(PDI_CMD_STS | (PDI_DATSIZE_1BYTE << 2));\r
+ PDITarget_SendAddress(DATAMEM_BASE | DATAMEM_NVM_CMD);\r
+ PDITarget_SendByte(CRCReadCommand);\r
+\r
+ /* Set CMDEX bit in NVM CTRLA register to start the CRC generation */\r
+ PDITarget_SendByte(PDI_CMD_STS | (PDI_DATSIZE_1BYTE << 2));\r
+ PDITarget_SendAddress(DATAMEM_BASE | DATAMEM_NVM_CTRLA);\r
+ PDITarget_SendByte(1 << 0);\r
+\r
+ /* Wait until the NVM bus and controller is no longer busy */\r
+ PDITarget_WaitWhileNVMBusBusy();\r
+ PDITarget_WaitWhileNVMControllerBusy();\r
\r
- // TODO: Read device CRC for desired memory via PDI protocol\r
+ /* Read the three byte generated CRC value */\r
+ PDITarget_SendByte(PDI_CMD_LDS | (PDI_DATSIZE_3BYTES << 2));\r
+ PDITarget_SendAddress(DATAMEM_BASE | DATAMEM_NVM_DAT0);\r
+ MemoryCRC = PDITarget_ReceiveByte();\r
+ MemoryCRC |= ((uint16_t)PDITarget_ReceiveByte() << 8);\r
+ MemoryCRC |= ((uint32_t)PDITarget_ReceiveByte() << 16);\r
\r
Endpoint_Write_Byte(CMD_XPROG);\r
Endpoint_Write_Byte(XPRG_CMD_CRC);\r
for (;;)\r
{\r
PDITarget_SendByte(PDI_CMD_LDS | (PDI_DATSIZE_1BYTE << 2));\r
- PDITarget_SendAddress(DATAMEM_BASE | DATAMEM_NVM_BASE | 0x0F);\r
+ PDITarget_SendAddress(DATAMEM_BASE | DATAMEM_NVM_STATUS);\r
\r
if (!(PDITarget_ReceiveByte() & (1 << 7)))\r
return;\r
#define USER_SIGNATURE_BASE 0x008E0400\r
\r
#define DATAMEM_NVM_BASE 0x01C0\r
+ #define DATAMEM_NVM_ADDR0 (DATAMEM_NVM_BASE | 0x00)\r
+ #define DATAMEM_NVM_ADDR1 (DATAMEM_NVM_BASE | 0x01)\r
+ #define DATAMEM_NVM_ADDR2 (DATAMEM_NVM_BASE | 0x02)\r
+ #define DATAMEM_NVM_DAT0 (DATAMEM_NVM_BASE | 0x04)\r
+ #define DATAMEM_NVM_DAT1 (DATAMEM_NVM_BASE | 0x05)\r
+ #define DATAMEM_NVM_DAT2 (DATAMEM_NVM_BASE | 0x06)\r
+ #define DATAMEM_NVM_CMD (DATAMEM_NVM_BASE | 0x0A)\r
+ #define DATAMEM_NVM_CTRLA (DATAMEM_NVM_BASE | 0x0B)\r
+ #define DATAMEM_NVM_CTRLB (DATAMEM_NVM_BASE | 0x0C)\r
+ #define DATAMEM_NVM_INTCTRL (DATAMEM_NVM_BASE | 0x0D)\r
+ #define DATAMEM_NVM_STATUS (DATAMEM_NVM_BASE | 0x0F)\r
+ #define DATAMEM_NVM_LOCKBITS (DATAMEM_NVM_BASE | 0x10)\r
+ \r
+ #define NVM_CMD_APPCRC 0x38\r
+ #define NVM_CMD_BOOTCRC 0x39\r
+ #define NVM_CMD_FLASHCRC 0x78\r
+ #define NVM_CMD_READUSERSIG 0x03\r
\r
/* Function Prototypes: */\r
void PDITarget_EnableTargetPDI(void);\r
uint8_t PDITarget_ReceiveByte(void);\r
void PDITarget_SendBreak(void);\r
\r
- void PDITarget_SendAddress(uint32_t Address);\r
- bool PDITarget_WaitWhileNVMBusBusy(void);\r
- void PDITarget_WaitWhileNVMControllerBusy(void);\r
+ void PDITarget_SendAddress(uint32_t Address);\r
+ bool PDITarget_WaitWhileNVMBusBusy(void);\r
+ void PDITarget_WaitWhileNVMControllerBusy(void);\r
\r
#endif\r