From e039f79db7c6f902c91c08d3fcc8770eca333c89 Mon Sep 17 00:00:00 2001 From: Ben Gardiner Date: Sat, 29 Nov 2025 12:28:35 -0500 Subject: [PATCH 1/4] gs_usb: don't report GS_CAN_FEATURE_HW_TIMESTAMP because it isn't supported --- firmware/RAMNV1/Core/Inc/ramn_config.h | 1 + firmware/RAMNV1/Core/Src/ramn_gsusb.c | 4 ++-- .../USBClass/Composite/gs_usb/usbd_gs_usb.c | 1 - 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/firmware/RAMNV1/Core/Inc/ramn_config.h b/firmware/RAMNV1/Core/Inc/ramn_config.h index 2abeb5e..d2e1e88 100644 --- a/firmware/RAMNV1/Core/Inc/ramn_config.h +++ b/firmware/RAMNV1/Core/Inc/ramn_config.h @@ -49,6 +49,7 @@ // Current implementation is experimental: // - Error frames are not reported // - CAN-FD is not supported +// - HW timestamps are not supported // - Due to clock differences, bit timings are not respected (but equivalent baudrates are used) // Try increasing _Min_Stack_Size if you run into issues //#define ENABLE_GSUSB diff --git a/firmware/RAMNV1/Core/Src/ramn_gsusb.c b/firmware/RAMNV1/Core/Src/ramn_gsusb.c index 9922610..4e06758 100644 --- a/firmware/RAMNV1/Core/Src/ramn_gsusb.c +++ b/firmware/RAMNV1/Core/Src/ramn_gsusb.c @@ -47,7 +47,7 @@ RAMN_Result_t RAMN_GSUSB_ProcessRX(FDCAN_RxHeaderTypeDef *canRxHeader, uint8_t * frameData->channel = 0; frameData->flags = 0; frameData->can_dlc = canRxHeader->DataLength; - frameData->timestamp_us = 0; + frameData->timestamp_us = 0; // RAMN gs_usb does not support GS_CAN_FEATURE_HW_TIMESTAMP if (!(frameData->can_id & CAN_RTR_FLAG)) RAMN_memcpy(frameData->data, canRxData, frameData->can_dlc); @@ -88,7 +88,7 @@ RAMN_Result_t RAMN_GSUSB_ProcessTX(FDCAN_TxHeaderTypeDef *canTxHeader, uint8_t * frameData->echo_id = 0xFFFFFFFF; frameData->channel = 0; frameData->can_dlc = canTxHeader->DataLength; - frameData->timestamp_us = 0; + frameData->timestamp_us = 0; // timestamps are ignored on send RAMN_memcpy(frameData->data, canRxData, frameData->can_dlc); // Send to task diff --git a/firmware/RAMNV1/Middlewares/ST/STM32_USB_Device_Library/USBClass/Composite/gs_usb/usbd_gs_usb.c b/firmware/RAMNV1/Middlewares/ST/STM32_USB_Device_Library/USBClass/Composite/gs_usb/usbd_gs_usb.c index 904deed..c18befa 100644 --- a/firmware/RAMNV1/Middlewares/ST/STM32_USB_Device_Library/USBClass/Composite/gs_usb/usbd_gs_usb.c +++ b/firmware/RAMNV1/Middlewares/ST/STM32_USB_Device_Library/USBClass/Composite/gs_usb/usbd_gs_usb.c @@ -59,7 +59,6 @@ static const struct gs_device_config gscan_dconf = { const struct gs_device_bt_const gscan_btconst = { GS_CAN_FEATURE_LISTEN_ONLY // supported features | GS_CAN_FEATURE_LOOP_BACK - | GS_CAN_FEATURE_HW_TIMESTAMP | GS_CAN_FEATURE_IDENTIFY | GS_CAN_FEATURE_USER_ID | GS_CAN_FEATURE_PAD_PKTS_TO_MAX_PKT_SIZE, From 58023310557cf9882b51507ebe1a14d0c107ac93 Mon Sep 17 00:00:00 2001 From: Ben Gardiner Date: Sat, 29 Nov 2025 12:29:40 -0500 Subject: [PATCH 2/4] gs_usb: correct the GS_CAN_MODE_s --- .../USBClass/Composite/gs_usb/usbd_gs_usb.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/firmware/RAMNV1/Middlewares/ST/STM32_USB_Device_Library/USBClass/Composite/gs_usb/usbd_gs_usb.h b/firmware/RAMNV1/Middlewares/ST/STM32_USB_Device_Library/USBClass/Composite/gs_usb/usbd_gs_usb.h index f157123..6d1b165 100644 --- a/firmware/RAMNV1/Middlewares/ST/STM32_USB_Device_Library/USBClass/Composite/gs_usb/usbd_gs_usb.h +++ b/firmware/RAMNV1/Middlewares/ST/STM32_USB_Device_Library/USBClass/Composite/gs_usb/usbd_gs_usb.h @@ -43,10 +43,9 @@ THE SOFTWARE. #define GS_CAN_MODE_NORMAL 0 #define GS_CAN_MODE_LISTEN_ONLY (1<<0) #define GS_CAN_MODE_INTERNAL_LOOP_BACK (1<<1) -#define GS_CAN_MODE_EXTERNAL_LOOP_BACK (1<<2) -#define GS_CAN_MODE_TRIPLE_SAMPLE (1<<3) -#define GS_CAN_MODE_ONE_SHOT (1<<4) -#define GS_CAN_MODE_HW_TIMESTAMP (1<<5) +#define GS_CAN_MODE_TRIPLE_SAMPLE (1<<2) +#define GS_CAN_MODE_ONE_SHOT (1<<3) +#define GS_CAN_MODE_HW_TIMESTAMP (1<<4) #define GS_CAN_MODE_PAD_PKTS_TO_MAX_PKT_SIZE (1<<7) From dbb6201c3de112bb14827d2c9c85508e23650fbe Mon Sep 17 00:00:00 2001 From: Ben Gardiner Date: Sat, 29 Nov 2025 12:43:09 -0500 Subject: [PATCH 3/4] slcan: document timestamps and units --- firmware/RAMNV1/Core/Src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/RAMNV1/Core/Src/main.c b/firmware/RAMNV1/Core/Src/main.c index cdc1e6a..82a6b7e 100644 --- a/firmware/RAMNV1/Core/Src/main.c +++ b/firmware/RAMNV1/Core/Src/main.c @@ -1656,7 +1656,7 @@ void RAMN_ReceiveCANFunc(void *argument) if (RAMN_USB_Config.slcan_enableTimestamp != 0U) { - index += uint16toASCII(xTaskGetTickCount() % 0xEA60,&slCAN_USBTxBuffer[index]); + index += uint16toASCII((xTaskGetTickCount() * (1000 /*ms per sec*/ / configTICK_RATE_HZ) ) % 0xEA60 /* 60,000 ms*/,&slCAN_USBTxBuffer[index]); } if ((RAMN_USB_Config.addESIFlag != 0U) && (CANRxHeader.FDFormat == FDCAN_FD_CAN) && (CANRxHeader.ErrorStateIndicator == FDCAN_ESI_PASSIVE)) From 5e7861e71f7db952a161e0566316bec39a34d3b3 Mon Sep 17 00:00:00 2001 From: Ben Gardiner Date: Sat, 29 Nov 2025 12:43:46 -0500 Subject: [PATCH 4/4] gs_usb: add GS_CAN_FEATURE_HW_TIMESTAMP --- firmware/RAMNV1/Core/Inc/ramn_config.h | 1 - firmware/RAMNV1/Core/Src/ramn_gsusb.c | 2 +- .../USBClass/Composite/gs_usb/usbd_gs_usb.c | 1 + 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/firmware/RAMNV1/Core/Inc/ramn_config.h b/firmware/RAMNV1/Core/Inc/ramn_config.h index d2e1e88..2abeb5e 100644 --- a/firmware/RAMNV1/Core/Inc/ramn_config.h +++ b/firmware/RAMNV1/Core/Inc/ramn_config.h @@ -49,7 +49,6 @@ // Current implementation is experimental: // - Error frames are not reported // - CAN-FD is not supported -// - HW timestamps are not supported // - Due to clock differences, bit timings are not respected (but equivalent baudrates are used) // Try increasing _Min_Stack_Size if you run into issues //#define ENABLE_GSUSB diff --git a/firmware/RAMNV1/Core/Src/ramn_gsusb.c b/firmware/RAMNV1/Core/Src/ramn_gsusb.c index 4e06758..5d71ba6 100644 --- a/firmware/RAMNV1/Core/Src/ramn_gsusb.c +++ b/firmware/RAMNV1/Core/Src/ramn_gsusb.c @@ -47,7 +47,7 @@ RAMN_Result_t RAMN_GSUSB_ProcessRX(FDCAN_RxHeaderTypeDef *canRxHeader, uint8_t * frameData->channel = 0; frameData->flags = 0; frameData->can_dlc = canRxHeader->DataLength; - frameData->timestamp_us = 0; // RAMN gs_usb does not support GS_CAN_FEATURE_HW_TIMESTAMP + frameData->timestamp_us = (xTaskGetTickCount() * (1000000 /*us per sec*/ / configTICK_RATE_HZ) ); if (!(frameData->can_id & CAN_RTR_FLAG)) RAMN_memcpy(frameData->data, canRxData, frameData->can_dlc); diff --git a/firmware/RAMNV1/Middlewares/ST/STM32_USB_Device_Library/USBClass/Composite/gs_usb/usbd_gs_usb.c b/firmware/RAMNV1/Middlewares/ST/STM32_USB_Device_Library/USBClass/Composite/gs_usb/usbd_gs_usb.c index c18befa..904deed 100644 --- a/firmware/RAMNV1/Middlewares/ST/STM32_USB_Device_Library/USBClass/Composite/gs_usb/usbd_gs_usb.c +++ b/firmware/RAMNV1/Middlewares/ST/STM32_USB_Device_Library/USBClass/Composite/gs_usb/usbd_gs_usb.c @@ -59,6 +59,7 @@ static const struct gs_device_config gscan_dconf = { const struct gs_device_bt_const gscan_btconst = { GS_CAN_FEATURE_LISTEN_ONLY // supported features | GS_CAN_FEATURE_LOOP_BACK + | GS_CAN_FEATURE_HW_TIMESTAMP | GS_CAN_FEATURE_IDENTIFY | GS_CAN_FEATURE_USER_ID | GS_CAN_FEATURE_PAD_PKTS_TO_MAX_PKT_SIZE,