diff --git a/drivers/can/can.c b/drivers/can/can.c index 1683e54867..c2076ea4c0 100644 --- a/drivers/can/can.c +++ b/drivers/can/can.c @@ -96,12 +96,6 @@ * Private Function Prototypes ****************************************************************************/ -/* CAN helpers */ - -static uint8_t can_dlc2bytes(uint8_t dlc); -#if 0 /* Not used */ -static uint8_t can_bytes2dlc(uint8_t nbytes); -#endif #ifdef CONFIG_CAN_TXREADY static void can_txready_work(FAR void *arg); #endif @@ -144,124 +138,6 @@ static const struct file_operations g_canops = * Private Functions ****************************************************************************/ -/**************************************************************************** - * Name: can_dlc2bytes - * - * Description: - * In the CAN FD format, the coding of the DLC differs from the standard - * CAN format. The DLC codes 0 to 8 have the same coding as in standard - * CAN. But the codes 9 to 15 all imply a data field of 8 bytes with - * standard CAN. In CAN FD mode, the values 9 to 15 are encoded to values - * in the range 12 to 64. - * - * Input Parameters: - * dlc - the DLC value to convert to a byte count - * - * Returned Value: - * The number of bytes corresponding to the DLC value. - * - ****************************************************************************/ - -static uint8_t can_dlc2bytes(uint8_t dlc) -{ - if (dlc > 8) - { -#ifdef CONFIG_CAN_FD - switch (dlc) - { - case 9: - return 12; - - case 10: - return 16; - - case 11: - return 20; - - case 12: - return 24; - - case 13: - return 32; - - case 14: - return 48; - - default: - case 15: - return 64; - } -#else - return 8; -#endif - } - - return dlc; -} - -/**************************************************************************** - * Name: can_bytes2dlc - * - * Description: - * In the CAN FD format, the coding of the DLC differs from the standard - * CAN format. The DLC codes 0 to 8 have the same coding as in standard - * CAN. But the codes 9 to 15 all imply a data field of 8 bytes with - * standard CAN. In CAN FD mode, the values 9 to 15 are encoded to values - * in the range 12 to 64. - * - * Input Parameters: - * nbytes - the byte count to convert to a DLC value - * - * Returned Value: - * The encoded DLC value corresponding to at least that number of bytes. - * - ****************************************************************************/ - -#if 0 /* Not used */ -static uint8_t can_bytes2dlc(FAR struct sam_can_s *priv, uint8_t nbytes) -{ - if (nbytes <= 8) - { - return nbytes; - } -#ifdef CONFIG_CAN_FD - else if (nbytes <= 12) - { - return 9; - } - else if (nbytes <= 16) - { - return 10; - } - else if (nbytes <= 20) - { - return 11; - } - else if (nbytes <= 24) - { - return 12; - } - else if (nbytes <= 32) - { - return 13; - } - else if (nbytes <= 48) - { - return 14; - } - else /* if (nbytes <= 64) */ - { - return 15; - } -#else - else - { - return 8; - } -#endif -} -#endif - /**************************************************************************** * Name: can_txready_work * @@ -1694,4 +1570,121 @@ int can_txready(FAR struct can_dev_s *dev) return ret; } #endif /* CONFIG_CAN_TXREADY */ + +/**************************************************************************** + * Name: can_bytes2dlc + * + * Description: + * In the CAN FD format, the coding of the DLC differs from the standard + * CAN format. The DLC codes 0 to 8 have the same coding as in standard + * CAN. But the codes 9 to 15 all imply a data field of 8 bytes with + * standard CAN. In CAN FD mode, the values 9 to 15 are encoded to values + * in the range 12 to 64. + * + * Input Parameters: + * nbytes - the byte count to convert to a DLC value + * + * Returned Value: + * The encoded DLC value corresponding to at least that number of bytes. + * + ****************************************************************************/ + +uint8_t can_bytes2dlc(uint8_t nbytes) +{ + if (nbytes <= 8) + { + return nbytes; + } +#ifdef CONFIG_CAN_FD + else if (nbytes <= 12) + { + return 9; + } + else if (nbytes <= 16) + { + return 10; + } + else if (nbytes <= 20) + { + return 11; + } + else if (nbytes <= 24) + { + return 12; + } + else if (nbytes <= 32) + { + return 13; + } + else if (nbytes <= 48) + { + return 14; + } + else /* if (nbytes <= 64) */ + { + return 15; + } +#else + else + { + return 8; + } +#endif +} + +/**************************************************************************** + * Name: can_dlc2bytes + * + * Description: + * In the CAN FD format, the coding of the DLC differs from the standard + * CAN format. The DLC codes 0 to 8 have the same coding as in standard + * CAN. But the codes 9 to 15 all imply a data field of 8 bytes with + * standard CAN. In CAN FD mode, the values 9 to 15 are encoded to values + * in the range 12 to 64. + * + * Input Parameters: + * dlc - the DLC value to convert to a byte count + * + * Returned Value: + * The number of bytes corresponding to the DLC value. + * + ****************************************************************************/ + +uint8_t can_dlc2bytes(uint8_t dlc) +{ + if (dlc > 8) + { +#ifdef CONFIG_CAN_FD + switch (dlc) + { + case 9: + return 12; + + case 10: + return 16; + + case 11: + return 20; + + case 12: + return 24; + + case 13: + return 32; + + case 14: + return 48; + + default: + case 15: + return 64; + } +#else + return 8; +#endif + } + + return dlc; +} + #endif /* CONFIG_CAN */ diff --git a/include/nuttx/can/can.h b/include/nuttx/can/can.h index d26c503e46..59646b54a1 100644 --- a/include/nuttx/can/can.h +++ b/include/nuttx/can/can.h @@ -936,6 +936,46 @@ int can_txdone(FAR struct can_dev_s *dev); int can_txready(FAR struct can_dev_s *dev); #endif +/**************************************************************************** + * Name: can_bytes2dlc + * + * Description: + * In the CAN FD format, the coding of the DLC differs from the standard + * CAN format. The DLC codes 0 to 8 have the same coding as in standard + * CAN. But the codes 9 to 15 all imply a data field of 8 bytes with + * standard CAN. In CAN FD mode, the values 9 to 15 are encoded to values + * in the range 12 to 64. + * + * Input Parameters: + * nbytes - the byte count to convert to a DLC value + * + * Returned Value: + * The encoded DLC value corresponding to at least that number of bytes. + * + ****************************************************************************/ + +uint8_t can_bytes2dlc(uint8_t nbytes); + +/**************************************************************************** + * Name: can_dlc2bytes + * + * Description: + * In the CAN FD format, the coding of the DLC differs from the standard + * CAN format. The DLC codes 0 to 8 have the same coding as in standard + * CAN. But the codes 9 to 15 all imply a data field of 8 bytes with + * standard CAN. In CAN FD mode, the values 9 to 15 are encoded to values + * in the range 12 to 64. + * + * Input Parameters: + * dlc - the DLC value to convert to a byte count + * + * Returned Value: + * The number of bytes corresponding to the DLC value. + * + ****************************************************************************/ + +uint8_t can_dlc2bytes(uint8_t dlc); + #undef EXTERN #if defined(__cplusplus) }