[DM/CAN] Update CAN for DM

1. Kconfig import wtih DM
2. Add DM API for Drivers

Signed-off-by: GuEe-GUI <2991707448@qq.com>
This commit is contained in:
GuEe-GUI
2025-12-04 15:55:33 +08:00
committed by R b b666
parent 4337d7fb30
commit 1e82368778
4 changed files with 120 additions and 2 deletions
+6 -2
View File
@@ -1,4 +1,4 @@
config RT_USING_CAN
menuconfig RT_USING_CAN
bool "Using CAN device drivers"
default n
help
@@ -73,4 +73,8 @@ if RT_USING_CAN
consumes static RAM but guarantees the memory is always available
and avoids heap fragmentation.
endif
endif
if RT_USING_DM && RT_USING_CAN
osource "$(SOC_DM_CAN_DIR)/Kconfig"
endif
+4
View File
@@ -3,6 +3,10 @@ from building import *
cwd = GetCurrentDir()
src = Glob('*.c')
CPPPATH = [cwd + '/../include']
if not GetDepend('RT_USING_DM'):
SrcRemove(src, ['can_dm.c'])
group = DefineGroup('DeviceDrivers', src, depend = ['RT_USING_CAN'], CPPPATH = CPPPATH)
Return('group')
+45
View File
@@ -0,0 +1,45 @@
/*
* Copyright (c) 2006-2022, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2022-11-26 GuEe-GUI first version
*/
#include "can_dm.h"
static const rt_uint8_t dlc2len[] =
{
0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 16, 20, 24, 32, 48, 64
};
rt_uint8_t can_dlc2len(rt_uint8_t can_dlc)
{
return dlc2len[can_dlc & 0x0F];
}
static const rt_uint8_t len2dlc[] =
{
0, 1, 2, 3, 4, 5, 6, 7, 8, /* 0 - 8 */
9, 9, 9, 9, /* 9 - 12 */
10, 10, 10, 10, /* 13 - 16 */
11, 11, 11, 11, /* 17 - 20 */
12, 12, 12, 12, /* 21 - 24 */
13, 13, 13, 13, 13, 13, 13, 13, /* 25 - 32 */
14, 14, 14, 14, 14, 14, 14, 14, /* 33 - 40 */
14, 14, 14, 14, 14, 14, 14, 14, /* 41 - 48 */
15, 15, 15, 15, 15, 15, 15, 15, /* 49 - 56 */
15, 15, 15, 15, 15, 15, 15, 15, /* 57 - 64 */
};
rt_uint8_t can_len2dlc(rt_uint8_t len)
{
if (len <= 64)
{
return len2dlc[len];
}
return 0xf;
}
+65
View File
@@ -0,0 +1,65 @@
/*
* Copyright (c) 2006-2022, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2022-11-26 GuEe-GUI first version
*/
#ifndef __CAN_DM_H__
#define __CAN_DM_H__
#include <drivers/misc.h>
/* Special address description flags for the CAN_ID */
#define CAN_EFF_FLAG 0x80000000U /* EFF/SFF is set in the MSB */
#define CAN_RTR_FLAG 0x40000000U /* Remote transmission request */
#define CAN_ERR_FLAG 0x20000000U /* Error message frame */
/* Valid bits in CAN ID for frame formats */
#define CAN_SFF_MASK 0x000007ffU /* Standard frame format (SFF) */
#define CAN_EFF_MASK 0x1fffffffU /* Extended frame format (EFF) */
#define CAN_ERR_MASK 0x1fffffffU /* Omit EFF, RTR, ERR flags */
#define CANXL_PRIO_MASK CAN_SFF_MASK /* 11 bit priority mask */
/* CAN payload length and DLC definitions according to ISO 11898-1 */
#define CAN_MAX_DLC 8
#define CAN_MAX_RAW_DLC 15
#define CAN_MAX_DLEN 8
/* CAN FD payload length and DLC definitions according to ISO 11898-7 */
#define CANFD_MAX_DLC 15
#define CANFD_MAX_DLEN 64
/*
* To be used in the CAN netdriver receive path to ensure conformance with
* ISO 11898-1 Chapter 8.4.2.3 (DLC field)
*/
#define can_get_dlc(v) (rt_min_t(rt_uint8_t, (v), CAN_MAX_DLC))
#define canfd_get_dlc(v) (rt_min_t(rt_uint8_t, (v), CANFD_MAX_DLC))
/**
* @brief Convert CAN DLC value to actual data length
*
* Converts a CAN Data Length Code (DLC) to the actual number of data bytes
* according to ISO 11898-1 and ISO 11898-7 (CAN FD) specifications.
*
* @param can_dlc The DLC value (0-15)
* @return The actual data length in bytes
*/
rt_uint8_t can_dlc2len(rt_uint8_t can_dlc);
/**
* @brief Convert data length to CAN DLC value
*
* Converts a data length in bytes to the appropriate CAN Data Length Code (DLC)
* according to ISO 11898-1 and ISO 11898-7 (CAN FD) specifications.
*
* @param len The data length in bytes (0-64)
* @return The corresponding DLC value (0-15)
*/
rt_uint8_t can_len2dlc(rt_uint8_t len);
#endif /* __CAN_DM_H__ */