implement timestamp usb control requests

This commit is contained in:
Hubert Denkmair 2016-05-04 20:52:12 +02:00
parent fad29b3160
commit 38512d1a11
2 changed files with 25 additions and 3 deletions

View File

@ -130,7 +130,10 @@ enum gs_usb_breq {
GS_USB_BREQ_MODE, GS_USB_BREQ_MODE,
GS_USB_BREQ_BERR, GS_USB_BREQ_BERR,
GS_USB_BREQ_BT_CONST, GS_USB_BREQ_BT_CONST,
GS_USB_BREQ_DEVICE_CONFIG GS_USB_BREQ_DEVICE_CONFIG,
CANDLELIGHT_TIMESTAMP_GET = 0x40,
CANDLELIGHT_TIMESTAMP_ENABLE = 0x41,
}; };
enum gs_can_mode { enum gs_can_mode {

View File

@ -34,6 +34,7 @@ THE SOFTWARE.
#include "usbd_ioreq.h" #include "usbd_ioreq.h"
#include "gs_usb.h" #include "gs_usb.h"
#include "can.h" #include "can.h"
#include "timer.h"
#define CAN_DATA_MAX_PACKET_SIZE 32 /* Endpoint IN & OUT Packet size */ #define CAN_DATA_MAX_PACKET_SIZE 32 /* Endpoint IN & OUT Packet size */
#define CAN_CMD_PACKET_SIZE 64 /* Control Endpoint Packet size */ #define CAN_CMD_PACKET_SIZE 64 /* Control Endpoint Packet size */
@ -65,6 +66,9 @@ typedef struct {
led_data_t *leds; led_data_t *leds;
bool dfu_detach_requested; bool dfu_detach_requested;
bool send_timestamps;
uint32_t sof_timestamp_us;
} USBD_GS_CAN_HandleTypeDef __attribute__ ((aligned (4))); } USBD_GS_CAN_HandleTypeDef __attribute__ ((aligned (4)));
static uint8_t USBD_GS_CAN_Start(USBD_HandleTypeDef *pdev, uint8_t cfgidx); static uint8_t USBD_GS_CAN_Start(USBD_HandleTypeDef *pdev, uint8_t cfgidx);
@ -75,7 +79,7 @@ static uint8_t USBD_GS_CAN_DataIn(USBD_HandleTypeDef *pdev, uint8_t epnum);
static uint8_t *USBD_GS_CAN_GetCfgDesc(uint16_t *len); static uint8_t *USBD_GS_CAN_GetCfgDesc(uint16_t *len);
static uint8_t USBD_GS_CAN_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum); static uint8_t USBD_GS_CAN_DataOut(USBD_HandleTypeDef *pdev, uint8_t epnum);
static uint8_t *USBD_GS_CAN_GetStrDesc(USBD_HandleTypeDef *pdev, uint8_t index, uint16_t *length); static uint8_t *USBD_GS_CAN_GetStrDesc(USBD_HandleTypeDef *pdev, uint8_t index, uint16_t *length);
static uint8_t USBD_GS_CAN_SOF(struct _USBD_HandleTypeDef *pdev);
/* CAN interface class callbacks structure */ /* CAN interface class callbacks structure */
USBD_ClassTypeDef USBD_GS_CAN = { USBD_ClassTypeDef USBD_GS_CAN = {
@ -86,7 +90,7 @@ USBD_ClassTypeDef USBD_GS_CAN = {
USBD_GS_CAN_EP0_RxReady, USBD_GS_CAN_EP0_RxReady,
USBD_GS_CAN_DataIn, USBD_GS_CAN_DataIn,
USBD_GS_CAN_DataOut, USBD_GS_CAN_DataOut,
NULL, // SOF USBD_GS_CAN_SOF,
NULL, // IsoInComplete NULL, // IsoInComplete
NULL, // IsoOutComplete NULL, // IsoOutComplete
USBD_GS_CAN_GetCfgDesc, USBD_GS_CAN_GetCfgDesc,
@ -333,6 +337,11 @@ static uint8_t USBD_GS_CAN_DeInit(USBD_HandleTypeDef *pdev, uint8_t cfgidx)
return USBD_OK; return USBD_OK;
} }
static uint8_t USBD_GS_CAN_SOF(struct _USBD_HandleTypeDef *pdev)
{
USBD_GS_CAN_HandleTypeDef *hcan = (USBD_GS_CAN_HandleTypeDef*) pdev->pClassData;
hcan->sof_timestamp_us = timer_get();
}
void USBD_GS_CAN_SetChannel(USBD_HandleTypeDef *pdev, uint8_t channel, can_data_t* handle) { void USBD_GS_CAN_SetChannel(USBD_HandleTypeDef *pdev, uint8_t channel, can_data_t* handle) {
USBD_GS_CAN_HandleTypeDef *hcan = (USBD_GS_CAN_HandleTypeDef*) pdev->pClassData; USBD_GS_CAN_HandleTypeDef *hcan = (USBD_GS_CAN_HandleTypeDef*) pdev->pClassData;
@ -453,6 +462,16 @@ static uint8_t USBD_GS_CAN_Config_Request(USBD_HandleTypeDef *pdev, USBD_SetupRe
USBD_CtlSendData(pdev, hcan->ep0_buf, req->wLength); USBD_CtlSendData(pdev, hcan->ep0_buf, req->wLength);
break; break;
case CANDLELIGHT_TIMESTAMP_ENABLE:
hcan->send_timestamps = req->wValue != 0;
break;
case CANDLELIGHT_TIMESTAMP_GET:
memcpy(hcan->ep0_buf, &hcan->sof_timestamp_us, sizeof(hcan->sof_timestamp_us));
USBD_CtlSendData(pdev, hcan->ep0_buf, sizeof(hcan->sof_timestamp_us));
break;
default: default:
USBD_CtlError(pdev, req); USBD_CtlError(pdev, req);
} }