Skip to content

Commit c8a80bb

Browse files
committed
STM CAN driver: Add explicit pinmap support
1 parent 097f3b4 commit c8a80bb

File tree

1 file changed

+122
-44
lines changed

1 file changed

+122
-44
lines changed

targets/TARGET_STM/can_api.c

Lines changed: 122 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -57,27 +57,23 @@ int can_internal_init(can_t *obj)
5757
return 1;
5858
}
5959

60-
void can_init(can_t *obj, PinName rd, PinName td)
61-
{
62-
/* default frequency is 100 kHz */
63-
can_init_freq(obj, rd, td, 100000);
64-
}
65-
66-
67-
void can_init_freq(can_t *obj, PinName rd, PinName td, int hz)
60+
#if EXPLICIT_PINMAP_READY
61+
#define CAN_INIT_FREQ_DIRECT can_init_freq_direct
62+
void can_init_freq_direct(can_t *obj, const can_pinmap_t *pinmap, int hz)
63+
#else
64+
#define CAN_INIT_FREQ_DIRECT _can_init_freq_direct
65+
static void _can_init_freq_direct(can_t *obj, const can_pinmap_t *pinmap, int hz)
66+
#endif
6867
{
69-
CANName can_rd = (CANName)pinmap_peripheral(rd, PinMap_CAN_RD);
70-
CANName can_td = (CANName)pinmap_peripheral(td, PinMap_CAN_TD);
71-
CANName can = (CANName)pinmap_merge(can_rd, can_td);
72-
MBED_ASSERT((int)can != NC);
68+
MBED_ASSERT((int)pinmap->peripheral != NC);
7369

7470
__HAL_RCC_FDCAN_CLK_ENABLE();
7571

76-
if (can == CAN_1) {
72+
if (pinmap->peripheral == CAN_1) {
7773
obj->index = 0;
7874
}
7975
#if defined(FDCAN2_BASE)
80-
else if (can == CAN_2) {
76+
else if (pinmap->peripheral == CAN_2) {
8177
obj->index = 1;
8278
}
8379
#endif
@@ -102,18 +98,18 @@ void can_init_freq(can_t *obj, PinName rd, PinName td, int hz)
10298
LL_HSEM_ReleaseLock(HSEM, CFG_HW_RCC_SEMID, HSEM_CR_COREID_CURRENT);
10399
#endif /* DUAL_CORE */
104100
// Configure CAN pins
105-
pinmap_pinout(rd, PinMap_CAN_RD);
106-
pinmap_pinout(td, PinMap_CAN_TD);
101+
pin_function(pinmap->rd_pin, pinmap->rd_function);
102+
pin_function(pinmap->td_pin, pinmap->td_function);
107103
// Add pull-ups
108-
if (rd != NC) {
109-
pin_mode(rd, PullUp);
104+
if (pinmap->rd_pin != NC) {
105+
pin_mode(pinmap->rd_pin, PullUp);
110106
}
111-
if (td != NC) {
112-
pin_mode(td, PullUp);
107+
if (pinmap->td_pin != NC) {
108+
pin_mode(pinmap->td_pin, PullUp);
113109
}
114110

115111
// Default values
116-
obj->CanHandle.Instance = (FDCAN_GlobalTypeDef *)can;
112+
obj->CanHandle.Instance = (FDCAN_GlobalTypeDef *)pinmap->peripheral;
117113

118114
/* Bit time parameter
119115
ex with 100 kHz requested frequency hz
@@ -160,6 +156,49 @@ void can_init_freq(can_t *obj, PinName rd, PinName td, int hz)
160156
can_internal_init(obj);
161157
}
162158

159+
#if EXPLICIT_PINMAP_READY
160+
#define CAN_INIT_DIRECT can_init_direct
161+
void can_init_direct(can_t *obj, const can_pinmap_t *pinmap)
162+
#else
163+
#define CAN_INIT_DIRECT _can_init_direct
164+
static void _can_init_direct(can_t *obj, const can_pinmap_t *pinmap)
165+
#endif
166+
{
167+
/* default frequency is 100 kHz */
168+
CAN_INIT_FREQ_DIRECT(obj, pinmap, 100000);
169+
}
170+
171+
void can_init(can_t *obj, PinName rd, PinName td)
172+
{
173+
CANName can_rd = (CANName)pinmap_peripheral(rd, PinMap_CAN_RD);
174+
CANName can_td = (CANName)pinmap_peripheral(td, PinMap_CAN_TD);
175+
int peripheral = (int) pinmap_merge(can_rd, can_td);
176+
177+
int function_rd = (int)pinmap_find_function(rd, PinMap_CAN_RD);
178+
int function_td = (int)pinmap_find_function(td, PinMap_CAN_TD);
179+
180+
const can_pinmap_t explicit_pinmap = {peripheral, rd, function_rd, td, function_td};
181+
182+
/* default frequency is 100 kHz */
183+
CAN_INIT_DIRECT(obj, &explicit_pinmap);
184+
}
185+
186+
187+
188+
void can_init_freq(can_t *obj, PinName rd, PinName td, int hz)
189+
{
190+
CANName can_rd = (CANName)pinmap_peripheral(rd, PinMap_CAN_RD);
191+
CANName can_td = (CANName)pinmap_peripheral(td, PinMap_CAN_TD);
192+
int peripheral = (int) pinmap_merge(can_rd, can_td);
193+
194+
int function_rd = (int)pinmap_find_function(rd, PinMap_CAN_RD);
195+
int function_td = (int)pinmap_find_function(td, PinMap_CAN_TD);
196+
197+
const can_pinmap_t explicit_pinmap = {peripheral, rd, function_rd, td, function_td};
198+
199+
CAN_INIT_FREQ_DIRECT(obj, &explicit_pinmap, 100000);
200+
}
201+
163202

164203
void can_irq_init(can_t *obj, can_irq_handler handler, uint32_t id)
165204
{
@@ -545,32 +584,30 @@ static void can_registers_init(can_t *obj)
545584
}
546585
}
547586

548-
void can_init(can_t *obj, PinName rd, PinName td)
549-
{
550-
can_init_freq(obj, rd, td, 100000);
551-
}
552-
553-
void can_init_freq(can_t *obj, PinName rd, PinName td, int hz)
587+
#if EXPLICIT_PINMAP_READY
588+
#define CAN_INIT_FREQ_DIRECT can_init_freq_direct
589+
void can_init_freq_direct(can_t *obj, const can_pinmap_t *pinmap, int hz)
590+
#else
591+
#define CAN_INIT_FREQ_DIRECT _can_init_freq_direct
592+
static void _can_init_freq_direct(can_t *obj, const can_pinmap_t *pinmap, int hz)
593+
#endif
554594
{
555-
CANName can_rd = (CANName)pinmap_peripheral(rd, PinMap_CAN_RD);
556-
CANName can_td = (CANName)pinmap_peripheral(td, PinMap_CAN_TD);
557-
CANName can = (CANName)pinmap_merge(can_rd, can_td);
558595

559-
MBED_ASSERT((int)can != NC);
596+
MBED_ASSERT((int)pinmap->peripheral != NC);
560597

561-
if (can == CAN_1) {
598+
if (pinmap->peripheral == CAN_1) {
562599
__HAL_RCC_CAN1_CLK_ENABLE();
563600
obj->index = 0;
564601
}
565602
#if defined(CAN2_BASE) && (CAN_NUM > 1)
566-
else if (can == CAN_2) {
603+
else if (pinmap->peripheral == CAN_2) {
567604
__HAL_RCC_CAN1_CLK_ENABLE(); // needed to set filters
568605
__HAL_RCC_CAN2_CLK_ENABLE();
569606
obj->index = 1;
570607
}
571608
#endif
572609
#if defined(CAN3_BASE) && (CAN_NUM > 2)
573-
else if (can == CAN_3) {
610+
else if (pinmap->peripheral == CAN_3) {
574611
__HAL_RCC_CAN3_CLK_ENABLE();
575612
obj->index = 2;
576613
}
@@ -579,18 +616,19 @@ void can_init_freq(can_t *obj, PinName rd, PinName td, int hz)
579616
return;
580617
}
581618

582-
// Configure the CAN pins
583-
pinmap_pinout(rd, PinMap_CAN_RD);
584-
pinmap_pinout(td, PinMap_CAN_TD);
585-
if (rd != NC) {
586-
pin_mode(rd, PullUp);
619+
// Configure CAN pins
620+
pin_function(pinmap->rd_pin, pinmap->rd_function);
621+
pin_function(pinmap->td_pin, pinmap->td_function);
622+
// Add pull-ups
623+
if (pinmap->rd_pin != NC) {
624+
pin_mode(pinmap->rd_pin, PullUp);
587625
}
588-
if (td != NC) {
589-
pin_mode(td, PullUp);
626+
if (pinmap->td_pin != NC) {
627+
pin_mode(pinmap->td_pin, PullUp);
590628
}
591629

592630
/* Use default values for rist init */
593-
obj->CanHandle.Instance = (CAN_TypeDef *)can;
631+
obj->CanHandle.Instance = (CAN_TypeDef *)pinmap->peripheral;
594632
obj->CanHandle.Init.TTCM = DISABLE;
595633
obj->CanHandle.Init.ABOM = DISABLE;
596634
obj->CanHandle.Init.AWUM = DISABLE;
@@ -611,13 +649,53 @@ void can_init_freq(can_t *obj, PinName rd, PinName td, int hz)
611649
/* Bits 27:14 are available for dual CAN configuration and are reserved for
612650
single CAN configuration: */
613651
#if defined(CAN3_BASE) && (CAN_NUM > 2)
614-
uint32_t filter_number = (can == CAN_1 || can == CAN_3) ? 0 : 14;
652+
uint32_t filter_number = (pinmap->peripheral == CAN_1 || pinmap->peripheral == CAN_3) ? 0 : 14;
615653
#else
616-
uint32_t filter_number = (can == CAN_1) ? 0 : 14;
654+
uint32_t filter_number = (pinmap->peripheral == CAN_1) ? 0 : 14;
617655
#endif
618656
can_filter(obj, 0, 0, CANStandard, filter_number);
619657
}
620658

659+
#if EXPLICIT_PINMAP_READY
660+
#define CAN_INIT_DIRECT can_init_direct
661+
void can_init_direct(can_t *obj, const can_pinmap_t *pinmap)
662+
#else
663+
#define CAN_INIT_DIRECT _can_init_direct
664+
static void _can_init_direct(can_t *obj, const can_pinmap_t *pinmap)
665+
#endif
666+
{
667+
/* default frequency is 100 kHz */
668+
CAN_INIT_FREQ_DIRECT(obj, pinmap, 100000);
669+
}
670+
671+
void can_init(can_t *obj, PinName rd, PinName td)
672+
{
673+
CANName can_rd = (CANName)pinmap_peripheral(rd, PinMap_CAN_RD);
674+
CANName can_td = (CANName)pinmap_peripheral(td, PinMap_CAN_TD);
675+
int peripheral = (int) pinmap_merge(can_rd, can_td);
676+
677+
int function_rd = (int)pinmap_find_function(rd, PinMap_CAN_RD);
678+
int function_td = (int)pinmap_find_function(td, PinMap_CAN_TD);
679+
680+
const can_pinmap_t explicit_pinmap = {peripheral, rd, function_rd, td, function_td};
681+
682+
/* default frequency is 100 kHz */
683+
CAN_INIT_DIRECT(obj, &explicit_pinmap);
684+
}
685+
686+
void can_init_freq(can_t *obj, PinName rd, PinName td, int hz)
687+
{
688+
CANName can_rd = (CANName)pinmap_peripheral(rd, PinMap_CAN_RD);
689+
CANName can_td = (CANName)pinmap_peripheral(td, PinMap_CAN_TD);
690+
int peripheral = (int) pinmap_merge(can_rd, can_td);
691+
692+
int function_rd = (int)pinmap_find_function(rd, PinMap_CAN_RD);
693+
int function_td = (int)pinmap_find_function(td, PinMap_CAN_TD);
694+
695+
const can_pinmap_t explicit_pinmap = {peripheral, rd, function_rd, td, function_td};
696+
697+
CAN_INIT_FREQ_DIRECT(obj, &explicit_pinmap, 100000);
698+
}
621699

622700
void can_irq_init(can_t *obj, can_irq_handler handler, uint32_t id)
623701
{

0 commit comments

Comments
 (0)