@@ -57,27 +57,23 @@ int can_internal_init(can_t *obj)
57
57
return 1 ;
58
58
}
59
59
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
68
67
{
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 );
73
69
74
70
__HAL_RCC_FDCAN_CLK_ENABLE ();
75
71
76
- if (can == CAN_1 ) {
72
+ if (pinmap -> peripheral == CAN_1 ) {
77
73
obj -> index = 0 ;
78
74
}
79
75
#if defined(FDCAN2_BASE )
80
- else if (can == CAN_2 ) {
76
+ else if (pinmap -> peripheral == CAN_2 ) {
81
77
obj -> index = 1 ;
82
78
}
83
79
#endif
@@ -102,18 +98,18 @@ void can_init_freq(can_t *obj, PinName rd, PinName td, int hz)
102
98
LL_HSEM_ReleaseLock (HSEM , CFG_HW_RCC_SEMID , HSEM_CR_COREID_CURRENT );
103
99
#endif /* DUAL_CORE */
104
100
// 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 );
107
103
// 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 );
110
106
}
111
- if (td != NC ) {
112
- pin_mode (td , PullUp );
107
+ if (pinmap -> td_pin != NC ) {
108
+ pin_mode (pinmap -> td_pin , PullUp );
113
109
}
114
110
115
111
// Default values
116
- obj -> CanHandle .Instance = (FDCAN_GlobalTypeDef * )can ;
112
+ obj -> CanHandle .Instance = (FDCAN_GlobalTypeDef * )pinmap -> peripheral ;
117
113
118
114
/* Bit time parameter
119
115
ex with 100 kHz requested frequency hz
@@ -160,6 +156,49 @@ void can_init_freq(can_t *obj, PinName rd, PinName td, int hz)
160
156
can_internal_init (obj );
161
157
}
162
158
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
+
163
202
164
203
void can_irq_init (can_t * obj , can_irq_handler handler , uint32_t id )
165
204
{
@@ -545,32 +584,30 @@ static void can_registers_init(can_t *obj)
545
584
}
546
585
}
547
586
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
554
594
{
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 );
558
595
559
- MBED_ASSERT ((int )can != NC );
596
+ MBED_ASSERT ((int )pinmap -> peripheral != NC );
560
597
561
- if (can == CAN_1 ) {
598
+ if (pinmap -> peripheral == CAN_1 ) {
562
599
__HAL_RCC_CAN1_CLK_ENABLE ();
563
600
obj -> index = 0 ;
564
601
}
565
602
#if defined(CAN2_BASE ) && (CAN_NUM > 1 )
566
- else if (can == CAN_2 ) {
603
+ else if (pinmap -> peripheral == CAN_2 ) {
567
604
__HAL_RCC_CAN1_CLK_ENABLE (); // needed to set filters
568
605
__HAL_RCC_CAN2_CLK_ENABLE ();
569
606
obj -> index = 1 ;
570
607
}
571
608
#endif
572
609
#if defined(CAN3_BASE ) && (CAN_NUM > 2 )
573
- else if (can == CAN_3 ) {
610
+ else if (pinmap -> peripheral == CAN_3 ) {
574
611
__HAL_RCC_CAN3_CLK_ENABLE ();
575
612
obj -> index = 2 ;
576
613
}
@@ -579,18 +616,19 @@ void can_init_freq(can_t *obj, PinName rd, PinName td, int hz)
579
616
return ;
580
617
}
581
618
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 );
587
625
}
588
- if (td != NC ) {
589
- pin_mode (td , PullUp );
626
+ if (pinmap -> td_pin != NC ) {
627
+ pin_mode (pinmap -> td_pin , PullUp );
590
628
}
591
629
592
630
/* Use default values for rist init */
593
- obj -> CanHandle .Instance = (CAN_TypeDef * )can ;
631
+ obj -> CanHandle .Instance = (CAN_TypeDef * )pinmap -> peripheral ;
594
632
obj -> CanHandle .Init .TTCM = DISABLE ;
595
633
obj -> CanHandle .Init .ABOM = DISABLE ;
596
634
obj -> CanHandle .Init .AWUM = DISABLE ;
@@ -611,13 +649,53 @@ void can_init_freq(can_t *obj, PinName rd, PinName td, int hz)
611
649
/* Bits 27:14 are available for dual CAN configuration and are reserved for
612
650
single CAN configuration: */
613
651
#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 ;
615
653
#else
616
- uint32_t filter_number = (can == CAN_1 ) ? 0 : 14 ;
654
+ uint32_t filter_number = (pinmap -> peripheral == CAN_1 ) ? 0 : 14 ;
617
655
#endif
618
656
can_filter (obj , 0 , 0 , CANStandard , filter_number );
619
657
}
620
658
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
+ }
621
699
622
700
void can_irq_init (can_t * obj , can_irq_handler handler , uint32_t id )
623
701
{
0 commit comments