added prescaler for 16 bit pwm in LPC1347 target

Fork of mbed-dev by mbed official

Committer:
JojoS
Date:
Sat Sep 10 15:32:04 2016 +0000
Revision:
147:ba84b7dc41a7
Parent:
144:ef7eb2e8f9f7
added prescaler for 16 bit timers (solution as in LPC11xx), default prescaler 31 for max 28 ms period time

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /* mbed Microcontroller Library
<> 144:ef7eb2e8f9f7 2 * Copyright (c) 2006-2013 ARM Limited
<> 144:ef7eb2e8f9f7 3 *
<> 144:ef7eb2e8f9f7 4 * Licensed under the Apache License, Version 2.0 (the "License");
<> 144:ef7eb2e8f9f7 5 * you may not use this file except in compliance with the License.
<> 144:ef7eb2e8f9f7 6 * You may obtain a copy of the License at
<> 144:ef7eb2e8f9f7 7 *
<> 144:ef7eb2e8f9f7 8 * http://www.apache.org/licenses/LICENSE-2.0
<> 144:ef7eb2e8f9f7 9 *
<> 144:ef7eb2e8f9f7 10 * Unless required by applicable law or agreed to in writing, software
<> 144:ef7eb2e8f9f7 11 * distributed under the License is distributed on an "AS IS" BASIS,
<> 144:ef7eb2e8f9f7 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
<> 144:ef7eb2e8f9f7 13 * See the License for the specific language governing permissions and
<> 144:ef7eb2e8f9f7 14 * limitations under the License.
<> 144:ef7eb2e8f9f7 15 */
<> 144:ef7eb2e8f9f7 16 #include <string.h>
<> 144:ef7eb2e8f9f7 17 #include "mbed_assert.h"
<> 144:ef7eb2e8f9f7 18 #include "can_api.h"
<> 144:ef7eb2e8f9f7 19 #include "RZ_A1_Init.h"
<> 144:ef7eb2e8f9f7 20 #include "cmsis.h"
<> 144:ef7eb2e8f9f7 21 #include "pinmap.h"
<> 144:ef7eb2e8f9f7 22 #include "rscan0_iodefine.h"
<> 144:ef7eb2e8f9f7 23 #include "r_typedefs.h"
<> 144:ef7eb2e8f9f7 24 #include "MBRZA1H.h"
<> 144:ef7eb2e8f9f7 25
<> 144:ef7eb2e8f9f7 26 #define CAN_NUM 5
<> 144:ef7eb2e8f9f7 27 #define CAN_SND_RCV 2
<> 144:ef7eb2e8f9f7 28 #define IRQ_NUM 8
<> 144:ef7eb2e8f9f7 29
<> 144:ef7eb2e8f9f7 30 static void can_rec_irq(uint32_t ch);
<> 144:ef7eb2e8f9f7 31 static void can_trx_irq(uint32_t ch);
<> 144:ef7eb2e8f9f7 32 static void can_err_irq(uint32_t ch, CanIrqType type);
<> 144:ef7eb2e8f9f7 33 static void can0_rec_irq(void);
<> 144:ef7eb2e8f9f7 34 static void can1_rec_irq(void);
<> 144:ef7eb2e8f9f7 35 static void can2_rec_irq(void);
<> 144:ef7eb2e8f9f7 36 static void can3_rec_irq(void);
<> 144:ef7eb2e8f9f7 37 static void can4_rec_irq(void);
<> 144:ef7eb2e8f9f7 38 static void can0_trx_irq(void);
<> 144:ef7eb2e8f9f7 39 static void can1_trx_irq(void);
<> 144:ef7eb2e8f9f7 40 static void can2_trx_irq(void);
<> 144:ef7eb2e8f9f7 41 static void can3_trx_irq(void);
<> 144:ef7eb2e8f9f7 42 static void can4_trx_irq(void);
<> 144:ef7eb2e8f9f7 43 static void can0_err_warning_irq(void);
<> 144:ef7eb2e8f9f7 44 static void can1_err_warning_irq(void);
<> 144:ef7eb2e8f9f7 45 static void can2_err_warning_irq(void);
<> 144:ef7eb2e8f9f7 46 static void can3_err_warning_irq(void);
<> 144:ef7eb2e8f9f7 47 static void can4_err_warning_irq(void);
<> 144:ef7eb2e8f9f7 48 static void can0_overrun_irq(void);
<> 144:ef7eb2e8f9f7 49 static void can1_overrun_irq(void);
<> 144:ef7eb2e8f9f7 50 static void can2_overrun_irq(void);
<> 144:ef7eb2e8f9f7 51 static void can3_overrun_irq(void);
<> 144:ef7eb2e8f9f7 52 static void can4_overrun_irq(void);
<> 144:ef7eb2e8f9f7 53 static void can0_passive_irq(void);
<> 144:ef7eb2e8f9f7 54 static void can1_passive_irq(void);
<> 144:ef7eb2e8f9f7 55 static void can2_passive_irq(void);
<> 144:ef7eb2e8f9f7 56 static void can3_passive_irq(void);
<> 144:ef7eb2e8f9f7 57 static void can4_passive_irq(void);
<> 144:ef7eb2e8f9f7 58 static void can0_arb_lost_irq(void);
<> 144:ef7eb2e8f9f7 59 static void can1_arb_lost_irq(void);
<> 144:ef7eb2e8f9f7 60 static void can2_arb_lost_irq(void);
<> 144:ef7eb2e8f9f7 61 static void can3_arb_lost_irq(void);
<> 144:ef7eb2e8f9f7 62 static void can4_arb_lost_irq(void);
<> 144:ef7eb2e8f9f7 63 static void can0_bus_err_irq(void);
<> 144:ef7eb2e8f9f7 64 static void can1_bus_err_irq(void);
<> 144:ef7eb2e8f9f7 65 static void can2_bus_err_irq(void);
<> 144:ef7eb2e8f9f7 66 static void can3_bus_err_irq(void);
<> 144:ef7eb2e8f9f7 67 static void can4_bus_err_irq(void);
<> 144:ef7eb2e8f9f7 68 static void can_reset_reg(can_t *obj);
<> 144:ef7eb2e8f9f7 69 static void can_reset_recv_rule(can_t *obj);
<> 144:ef7eb2e8f9f7 70 static void can_reset_buffer(can_t *obj);
<> 144:ef7eb2e8f9f7 71 static void can_reconfigure_channel(void);
<> 144:ef7eb2e8f9f7 72 static void can_set_frequency(can_t *obj, int f);
<> 144:ef7eb2e8f9f7 73 static void can_set_global_mode(int mode);
<> 144:ef7eb2e8f9f7 74 static void can_set_channel_mode(uint32_t ch, int mode);
<> 144:ef7eb2e8f9f7 75
<> 144:ef7eb2e8f9f7 76 typedef enum {
<> 144:ef7eb2e8f9f7 77 CAN_SEND = 0,
<> 144:ef7eb2e8f9f7 78 CAN_RECV
<> 144:ef7eb2e8f9f7 79 } CANfunc;
<> 144:ef7eb2e8f9f7 80
<> 144:ef7eb2e8f9f7 81 typedef enum {
<> 144:ef7eb2e8f9f7 82 GL_OPE = 0,
<> 144:ef7eb2e8f9f7 83 GL_RESET,
<> 144:ef7eb2e8f9f7 84 GL_TEST
<> 144:ef7eb2e8f9f7 85 } Globalmode;
<> 144:ef7eb2e8f9f7 86
<> 144:ef7eb2e8f9f7 87 typedef enum {
<> 144:ef7eb2e8f9f7 88 CH_COMM = 0,
<> 144:ef7eb2e8f9f7 89 CH_RESET,
<> 144:ef7eb2e8f9f7 90 CH_HOLD
<> 144:ef7eb2e8f9f7 91 } Channelmode;
<> 144:ef7eb2e8f9f7 92
<> 144:ef7eb2e8f9f7 93 typedef struct {
<> 144:ef7eb2e8f9f7 94 IRQn_Type int_num; /* Interrupt number */
<> 144:ef7eb2e8f9f7 95 IRQHandler handler; /* Interrupt handler */
<> 144:ef7eb2e8f9f7 96 } can_info_int_t;
<> 144:ef7eb2e8f9f7 97
<> 144:ef7eb2e8f9f7 98 static can_irq_handler irq_handler;
<> 144:ef7eb2e8f9f7 99 static uint32_t can_irq_id[CAN_NUM];
<> 144:ef7eb2e8f9f7 100 static int can_initialized[CAN_NUM] = {0};
<> 144:ef7eb2e8f9f7 101
<> 144:ef7eb2e8f9f7 102 static const PinMap PinMap_CAN_RD[] = {
<> 144:ef7eb2e8f9f7 103 {P7_8 , CAN_0, 4},
<> 144:ef7eb2e8f9f7 104 {P9_1 , CAN_0, 3},
<> 144:ef7eb2e8f9f7 105 {P1_4 , CAN_1, 3},
<> 144:ef7eb2e8f9f7 106 {P5_9 , CAN_1, 5},
<> 144:ef7eb2e8f9f7 107 {P7_11 , CAN_1, 4},
<> 144:ef7eb2e8f9f7 108 {P11_12, CAN_1, 1},
<> 144:ef7eb2e8f9f7 109 {P4_9 , CAN_2, 6},
<> 144:ef7eb2e8f9f7 110 {P6_4 , CAN_2, 3},
<> 144:ef7eb2e8f9f7 111 {P7_2 , CAN_2, 5},
<> 144:ef7eb2e8f9f7 112 {P2_12 , CAN_3, 5},
<> 144:ef7eb2e8f9f7 113 {P4_2 , CAN_3, 4},
<> 144:ef7eb2e8f9f7 114 {P1_5 , CAN_4, 3},
<> 144:ef7eb2e8f9f7 115 {P2_14 , CAN_4, 5},
<> 144:ef7eb2e8f9f7 116 {NC , NC , 0}
<> 144:ef7eb2e8f9f7 117 };
<> 144:ef7eb2e8f9f7 118
<> 144:ef7eb2e8f9f7 119 static const PinMap PinMap_CAN_TD[] = {
<> 144:ef7eb2e8f9f7 120 {P7_9 , CAN_0, 4},
<> 144:ef7eb2e8f9f7 121 {P9_0 , CAN_0, 3},
<> 144:ef7eb2e8f9f7 122 {P5_10 , CAN_1, 5},
<> 144:ef7eb2e8f9f7 123 {P7_10 , CAN_1, 4},
<> 144:ef7eb2e8f9f7 124 {P11_13, CAN_1, 1},
<> 144:ef7eb2e8f9f7 125 {P4_8 , CAN_2, 6},
<> 144:ef7eb2e8f9f7 126 {P6_5 , CAN_2, 3},
<> 144:ef7eb2e8f9f7 127 {P7_3 , CAN_2, 5},
<> 144:ef7eb2e8f9f7 128 {P2_13 , CAN_3, 5},
<> 144:ef7eb2e8f9f7 129 {P4_3 , CAN_3, 4},
<> 144:ef7eb2e8f9f7 130 {P4_11 , CAN_4, 6},
<> 144:ef7eb2e8f9f7 131 {P8_10 , CAN_4, 5},
<> 144:ef7eb2e8f9f7 132 {NC , NC , 0}
<> 144:ef7eb2e8f9f7 133 };
<> 144:ef7eb2e8f9f7 134
<> 144:ef7eb2e8f9f7 135 static __IO uint32_t *CTR_MATCH[] = {
<> 144:ef7eb2e8f9f7 136 &RSCAN0C0CTR,
<> 144:ef7eb2e8f9f7 137 &RSCAN0C1CTR,
<> 144:ef7eb2e8f9f7 138 &RSCAN0C2CTR,
<> 144:ef7eb2e8f9f7 139 &RSCAN0C3CTR,
<> 144:ef7eb2e8f9f7 140 &RSCAN0C4CTR,
<> 144:ef7eb2e8f9f7 141 };
<> 144:ef7eb2e8f9f7 142
<> 144:ef7eb2e8f9f7 143 static __IO uint32_t *CFG_MATCH[] = {
<> 144:ef7eb2e8f9f7 144 &RSCAN0C0CFG,
<> 144:ef7eb2e8f9f7 145 &RSCAN0C1CFG,
<> 144:ef7eb2e8f9f7 146 &RSCAN0C2CFG,
<> 144:ef7eb2e8f9f7 147 &RSCAN0C3CFG,
<> 144:ef7eb2e8f9f7 148 &RSCAN0C4CFG,
<> 144:ef7eb2e8f9f7 149 };
<> 144:ef7eb2e8f9f7 150
<> 144:ef7eb2e8f9f7 151 static __IO uint32_t *RFCC_MATCH[] = {
<> 144:ef7eb2e8f9f7 152 &RSCAN0RFCC0,
<> 144:ef7eb2e8f9f7 153 &RSCAN0RFCC1,
<> 144:ef7eb2e8f9f7 154 &RSCAN0RFCC2,
<> 144:ef7eb2e8f9f7 155 &RSCAN0RFCC3,
<> 144:ef7eb2e8f9f7 156 &RSCAN0RFCC4,
<> 144:ef7eb2e8f9f7 157 &RSCAN0RFCC5,
<> 144:ef7eb2e8f9f7 158 &RSCAN0RFCC6,
<> 144:ef7eb2e8f9f7 159 &RSCAN0RFCC7
<> 144:ef7eb2e8f9f7 160 };
<> 144:ef7eb2e8f9f7 161
<> 144:ef7eb2e8f9f7 162 static __IO uint32_t *TXQCC_MATCH[] = {
<> 144:ef7eb2e8f9f7 163 &RSCAN0TXQCC0,
<> 144:ef7eb2e8f9f7 164 &RSCAN0TXQCC1,
<> 144:ef7eb2e8f9f7 165 &RSCAN0TXQCC2,
<> 144:ef7eb2e8f9f7 166 &RSCAN0TXQCC3,
<> 144:ef7eb2e8f9f7 167 &RSCAN0TXQCC4,
<> 144:ef7eb2e8f9f7 168 };
<> 144:ef7eb2e8f9f7 169
<> 144:ef7eb2e8f9f7 170 static __IO uint32_t *THLCC_MATCH[] = {
<> 144:ef7eb2e8f9f7 171 &RSCAN0THLCC0,
<> 144:ef7eb2e8f9f7 172 &RSCAN0THLCC1,
<> 144:ef7eb2e8f9f7 173 &RSCAN0THLCC2,
<> 144:ef7eb2e8f9f7 174 &RSCAN0THLCC3,
<> 144:ef7eb2e8f9f7 175 &RSCAN0THLCC4,
<> 144:ef7eb2e8f9f7 176 };
<> 144:ef7eb2e8f9f7 177
<> 144:ef7eb2e8f9f7 178 static __IO uint32_t *STS_MATCH[] = {
<> 144:ef7eb2e8f9f7 179 &RSCAN0C0STS,
<> 144:ef7eb2e8f9f7 180 &RSCAN0C1STS,
<> 144:ef7eb2e8f9f7 181 &RSCAN0C2STS,
<> 144:ef7eb2e8f9f7 182 &RSCAN0C3STS,
<> 144:ef7eb2e8f9f7 183 &RSCAN0C4STS,
<> 144:ef7eb2e8f9f7 184 };
<> 144:ef7eb2e8f9f7 185
<> 144:ef7eb2e8f9f7 186 static __IO uint32_t *ERFL_MATCH[] = {
<> 144:ef7eb2e8f9f7 187 &RSCAN0C0ERFL,
<> 144:ef7eb2e8f9f7 188 &RSCAN0C1ERFL,
<> 144:ef7eb2e8f9f7 189 &RSCAN0C2ERFL,
<> 144:ef7eb2e8f9f7 190 &RSCAN0C3ERFL,
<> 144:ef7eb2e8f9f7 191 &RSCAN0C4ERFL,
<> 144:ef7eb2e8f9f7 192 };
<> 144:ef7eb2e8f9f7 193
<> 144:ef7eb2e8f9f7 194 static __IO uint32_t *CFCC_TBL[CAN_NUM][CAN_SND_RCV] = {
<> 144:ef7eb2e8f9f7 195 { &RSCAN0CFCC0 , &RSCAN0CFCC1 },
<> 144:ef7eb2e8f9f7 196 { &RSCAN0CFCC3 , &RSCAN0CFCC4 },
<> 144:ef7eb2e8f9f7 197 { &RSCAN0CFCC6 , &RSCAN0CFCC7 },
<> 144:ef7eb2e8f9f7 198 { &RSCAN0CFCC9 , &RSCAN0CFCC10 },
<> 144:ef7eb2e8f9f7 199 { &RSCAN0CFCC12, &RSCAN0CFCC13 }
<> 144:ef7eb2e8f9f7 200 };
<> 144:ef7eb2e8f9f7 201
<> 144:ef7eb2e8f9f7 202 static __IO uint32_t *CFSTS_TBL[CAN_NUM][CAN_SND_RCV] = {
<> 144:ef7eb2e8f9f7 203 { &RSCAN0CFSTS0 , &RSCAN0CFSTS1 },
<> 144:ef7eb2e8f9f7 204 { &RSCAN0CFSTS3 , &RSCAN0CFSTS4 },
<> 144:ef7eb2e8f9f7 205 { &RSCAN0CFSTS6 , &RSCAN0CFSTS7 },
<> 144:ef7eb2e8f9f7 206 { &RSCAN0CFSTS9 , &RSCAN0CFSTS10 },
<> 144:ef7eb2e8f9f7 207 { &RSCAN0CFSTS12, &RSCAN0CFSTS13 }
<> 144:ef7eb2e8f9f7 208 };
<> 144:ef7eb2e8f9f7 209
<> 144:ef7eb2e8f9f7 210 static __IO uint32_t *CFPCTR_TBL[CAN_NUM][CAN_SND_RCV] = {
<> 144:ef7eb2e8f9f7 211 { &RSCAN0CFPCTR0 , &RSCAN0CFPCTR1 },
<> 144:ef7eb2e8f9f7 212 { &RSCAN0CFPCTR3 , &RSCAN0CFPCTR4 },
<> 144:ef7eb2e8f9f7 213 { &RSCAN0CFPCTR6 , &RSCAN0CFPCTR7 },
<> 144:ef7eb2e8f9f7 214 { &RSCAN0CFPCTR9 , &RSCAN0CFPCTR10 },
<> 144:ef7eb2e8f9f7 215 { &RSCAN0CFPCTR12, &RSCAN0CFPCTR13 }
<> 144:ef7eb2e8f9f7 216 };
<> 144:ef7eb2e8f9f7 217
<> 144:ef7eb2e8f9f7 218 static __IO uint32_t *CFID_TBL[CAN_NUM][CAN_SND_RCV] = {
<> 144:ef7eb2e8f9f7 219 { &RSCAN0CFID0 , &RSCAN0CFID1 },
<> 144:ef7eb2e8f9f7 220 { &RSCAN0CFID3 , &RSCAN0CFID4 },
<> 144:ef7eb2e8f9f7 221 { &RSCAN0CFID6 , &RSCAN0CFID7 },
<> 144:ef7eb2e8f9f7 222 { &RSCAN0CFID9 , &RSCAN0CFID10 },
<> 144:ef7eb2e8f9f7 223 { &RSCAN0CFID12, &RSCAN0CFID13 }
<> 144:ef7eb2e8f9f7 224 };
<> 144:ef7eb2e8f9f7 225
<> 144:ef7eb2e8f9f7 226 static __IO uint32_t *CFPTR_TBL[CAN_NUM][CAN_SND_RCV] = {
<> 144:ef7eb2e8f9f7 227 { &RSCAN0CFPTR0 , &RSCAN0CFPTR1 },
<> 144:ef7eb2e8f9f7 228 { &RSCAN0CFPTR3 , &RSCAN0CFPTR4 },
<> 144:ef7eb2e8f9f7 229 { &RSCAN0CFPTR6 , &RSCAN0CFPTR7 },
<> 144:ef7eb2e8f9f7 230 { &RSCAN0CFPTR9 , &RSCAN0CFPTR10 },
<> 144:ef7eb2e8f9f7 231 { &RSCAN0CFPTR12, &RSCAN0CFPTR13 }
<> 144:ef7eb2e8f9f7 232 };
<> 144:ef7eb2e8f9f7 233
<> 144:ef7eb2e8f9f7 234 static __IO uint32_t *CFDF0_TBL[CAN_NUM][CAN_SND_RCV] = {
<> 144:ef7eb2e8f9f7 235 { &RSCAN0CFDF00 , &RSCAN0CFDF01 },
<> 144:ef7eb2e8f9f7 236 { &RSCAN0CFDF03 , &RSCAN0CFDF04 },
<> 144:ef7eb2e8f9f7 237 { &RSCAN0CFDF06 , &RSCAN0CFDF07 },
<> 144:ef7eb2e8f9f7 238 { &RSCAN0CFDF09 , &RSCAN0CFDF010 },
<> 144:ef7eb2e8f9f7 239 { &RSCAN0CFDF012, &RSCAN0CFDF013 }
<> 144:ef7eb2e8f9f7 240 };
<> 144:ef7eb2e8f9f7 241
<> 144:ef7eb2e8f9f7 242 static __IO uint32_t *CFDF1_TBL[CAN_NUM][CAN_SND_RCV] = {
<> 144:ef7eb2e8f9f7 243 { &RSCAN0CFDF10 , &RSCAN0CFDF11 },
<> 144:ef7eb2e8f9f7 244 { &RSCAN0CFDF13 , &RSCAN0CFDF14 },
<> 144:ef7eb2e8f9f7 245 { &RSCAN0CFDF16 , &RSCAN0CFDF17 },
<> 144:ef7eb2e8f9f7 246 { &RSCAN0CFDF19 , &RSCAN0CFDF110 },
<> 144:ef7eb2e8f9f7 247 { &RSCAN0CFDF112, &RSCAN0CFDF113 }
<> 144:ef7eb2e8f9f7 248 };
<> 144:ef7eb2e8f9f7 249
<> 144:ef7eb2e8f9f7 250 static const can_info_int_t can_int_info[CAN_NUM][IRQ_NUM] =
<> 144:ef7eb2e8f9f7 251 {
<> 144:ef7eb2e8f9f7 252 { /* ch0 */
<> 144:ef7eb2e8f9f7 253 { INTRCAN0REC_IRQn, can0_rec_irq }, /* RxIrq */
<> 144:ef7eb2e8f9f7 254 { INTRCAN0TRX_IRQn, can0_trx_irq }, /* TxIrq */
<> 144:ef7eb2e8f9f7 255 { INTRCAN0ERR_IRQn, can0_err_warning_irq }, /* EwIrq */
<> 144:ef7eb2e8f9f7 256 { INTRCAN0ERR_IRQn, can0_overrun_irq }, /* DoIrq */
<> 144:ef7eb2e8f9f7 257 { INTRCAN0ERR_IRQn, NULL }, /* WuIrq(not supported) */
<> 144:ef7eb2e8f9f7 258 { INTRCAN0ERR_IRQn, can0_passive_irq }, /* EpIrq */
<> 144:ef7eb2e8f9f7 259 { INTRCAN0ERR_IRQn, can0_arb_lost_irq }, /* AlIrq */
<> 144:ef7eb2e8f9f7 260 { INTRCAN0ERR_IRQn, can0_bus_err_irq } /* BeIrq */
<> 144:ef7eb2e8f9f7 261 },
<> 144:ef7eb2e8f9f7 262 { /* ch1 */
<> 144:ef7eb2e8f9f7 263 { INTRCAN1REC_IRQn, can1_rec_irq }, /* RxIrq */
<> 144:ef7eb2e8f9f7 264 { INTRCAN1TRX_IRQn, can1_trx_irq }, /* TxIrq */
<> 144:ef7eb2e8f9f7 265 { INTRCAN1ERR_IRQn, can1_err_warning_irq }, /* EwIrq */
<> 144:ef7eb2e8f9f7 266 { INTRCAN1ERR_IRQn, can1_overrun_irq }, /* DoIrq */
<> 144:ef7eb2e8f9f7 267 { INTRCAN1ERR_IRQn, NULL }, /* WuIrq(not supported) */
<> 144:ef7eb2e8f9f7 268 { INTRCAN1ERR_IRQn, can1_passive_irq }, /* EpIrq */
<> 144:ef7eb2e8f9f7 269 { INTRCAN1ERR_IRQn, can1_arb_lost_irq }, /* AlIrq */
<> 144:ef7eb2e8f9f7 270 { INTRCAN1ERR_IRQn, can1_bus_err_irq } /* BeIrq */
<> 144:ef7eb2e8f9f7 271 },
<> 144:ef7eb2e8f9f7 272 { /* ch2 */
<> 144:ef7eb2e8f9f7 273 { INTRCAN2REC_IRQn, can2_rec_irq }, /* RxIrq */
<> 144:ef7eb2e8f9f7 274 { INTRCAN2TRX_IRQn, can2_trx_irq }, /* TxIrq */
<> 144:ef7eb2e8f9f7 275 { INTRCAN2ERR_IRQn, can2_err_warning_irq }, /* EwIrq */
<> 144:ef7eb2e8f9f7 276 { INTRCAN2ERR_IRQn, can2_overrun_irq }, /* DoIrq */
<> 144:ef7eb2e8f9f7 277 { INTRCAN2ERR_IRQn, NULL }, /* WuIrq(not supported) */
<> 144:ef7eb2e8f9f7 278 { INTRCAN2ERR_IRQn, can2_passive_irq }, /* EpIrq */
<> 144:ef7eb2e8f9f7 279 { INTRCAN2ERR_IRQn, can2_arb_lost_irq }, /* AlIrq */
<> 144:ef7eb2e8f9f7 280 { INTRCAN2ERR_IRQn, can2_bus_err_irq } /* BeIrq */
<> 144:ef7eb2e8f9f7 281 },
<> 144:ef7eb2e8f9f7 282 { /* ch3 */
<> 144:ef7eb2e8f9f7 283 { INTRCAN3REC_IRQn, can3_rec_irq }, /* RxIrq */
<> 144:ef7eb2e8f9f7 284 { INTRCAN3TRX_IRQn, can3_trx_irq }, /* TxIrq */
<> 144:ef7eb2e8f9f7 285 { INTRCAN3ERR_IRQn, can3_err_warning_irq }, /* EwIrq */
<> 144:ef7eb2e8f9f7 286 { INTRCAN3ERR_IRQn, can3_overrun_irq }, /* DoIrq */
<> 144:ef7eb2e8f9f7 287 { INTRCAN3ERR_IRQn, NULL }, /* WuIrq(not supported) */
<> 144:ef7eb2e8f9f7 288 { INTRCAN3ERR_IRQn, can3_passive_irq }, /* EpIrq */
<> 144:ef7eb2e8f9f7 289 { INTRCAN3ERR_IRQn, can3_arb_lost_irq }, /* AlIrq */
<> 144:ef7eb2e8f9f7 290 { INTRCAN3ERR_IRQn, can3_bus_err_irq } /* BeIrq */
<> 144:ef7eb2e8f9f7 291 },
<> 144:ef7eb2e8f9f7 292 { /* ch4 */
<> 144:ef7eb2e8f9f7 293 { INTRCAN4REC_IRQn, can4_rec_irq }, /* RxIrq */
<> 144:ef7eb2e8f9f7 294 { INTRCAN4TRX_IRQn, can4_trx_irq }, /* TxIrq */
<> 144:ef7eb2e8f9f7 295 { INTRCAN4ERR_IRQn, can4_err_warning_irq }, /* EwIrq */
<> 144:ef7eb2e8f9f7 296 { INTRCAN4ERR_IRQn, can4_overrun_irq }, /* DoIrq */
<> 144:ef7eb2e8f9f7 297 { INTRCAN4ERR_IRQn, NULL }, /* WuIrq(not supported) */
<> 144:ef7eb2e8f9f7 298 { INTRCAN4ERR_IRQn, can4_passive_irq }, /* EpIrq */
<> 144:ef7eb2e8f9f7 299 { INTRCAN4ERR_IRQn, can4_arb_lost_irq }, /* AlIrq */
<> 144:ef7eb2e8f9f7 300 { INTRCAN4ERR_IRQn, can4_bus_err_irq } /* BeIrq */
<> 144:ef7eb2e8f9f7 301 }
<> 144:ef7eb2e8f9f7 302 };
<> 144:ef7eb2e8f9f7 303
<> 144:ef7eb2e8f9f7 304 static __IO uint32_t *dmy_gaflid = &RSCAN0GAFLID0;
<> 144:ef7eb2e8f9f7 305 static __IO uint32_t *dmy_gaflm = &RSCAN0GAFLM0;
<> 144:ef7eb2e8f9f7 306 static __IO uint32_t *dmy_gaflp0 = &RSCAN0GAFLP00;
<> 144:ef7eb2e8f9f7 307 static __IO uint32_t *dmy_gaflp1 = &RSCAN0GAFLP10;
<> 144:ef7eb2e8f9f7 308
<> 144:ef7eb2e8f9f7 309 void can_irq_init(can_t *obj, can_irq_handler handler, uint32_t id) {
<> 144:ef7eb2e8f9f7 310 irq_handler = handler;
<> 144:ef7eb2e8f9f7 311 can_irq_id[obj->ch] = id;
<> 144:ef7eb2e8f9f7 312 }
<> 144:ef7eb2e8f9f7 313
<> 144:ef7eb2e8f9f7 314 void can_irq_free(can_t *obj) {
<> 144:ef7eb2e8f9f7 315 can_irq_id[obj->ch] = 0;
<> 144:ef7eb2e8f9f7 316 }
<> 144:ef7eb2e8f9f7 317
<> 144:ef7eb2e8f9f7 318 void can_irq_set(can_t *obj, CanIrqType type, uint32_t enable) {
<> 144:ef7eb2e8f9f7 319 __IO uint32_t *dmy_ctr;
<> 144:ef7eb2e8f9f7 320
<> 144:ef7eb2e8f9f7 321 /* Wake-up Irq is not supported */
<> 144:ef7eb2e8f9f7 322 if (type != IRQ_WAKEUP) {
<> 144:ef7eb2e8f9f7 323 if (enable) {
<> 144:ef7eb2e8f9f7 324 dmy_ctr = CTR_MATCH[obj->ch];
<> 144:ef7eb2e8f9f7 325 if (type == IRQ_ERROR) {
<> 144:ef7eb2e8f9f7 326 /* EWIE interrupts is enable */
<> 144:ef7eb2e8f9f7 327 *dmy_ctr |= 0x00000200;
<> 144:ef7eb2e8f9f7 328 } else if (type == IRQ_OVERRUN) {
<> 144:ef7eb2e8f9f7 329 /* OLIE interrupts is enable */
<> 144:ef7eb2e8f9f7 330 *dmy_ctr |= 0x00002000;
<> 144:ef7eb2e8f9f7 331 } else if (type == IRQ_PASSIVE) {
<> 144:ef7eb2e8f9f7 332 /* EPIE interrupts is enable */
<> 144:ef7eb2e8f9f7 333 *dmy_ctr |= 0x00000400;
<> 144:ef7eb2e8f9f7 334 } else if (type == IRQ_ARB) {
<> 144:ef7eb2e8f9f7 335 /* ALIE interrupts is enable */
<> 144:ef7eb2e8f9f7 336 *dmy_ctr |= 0x00008000;
<> 144:ef7eb2e8f9f7 337 } else if (type == IRQ_BUS) {
<> 144:ef7eb2e8f9f7 338 /* BEIE interrupts is enable */
<> 144:ef7eb2e8f9f7 339 *dmy_ctr |= 0x00000100;
<> 144:ef7eb2e8f9f7 340 }
<> 144:ef7eb2e8f9f7 341 InterruptHandlerRegister(can_int_info[obj->ch][type].int_num, can_int_info[obj->ch][type].handler);
<> 144:ef7eb2e8f9f7 342 GIC_SetPriority(can_int_info[obj->ch][type].int_num, 5);
<> 144:ef7eb2e8f9f7 343 GIC_EnableIRQ(can_int_info[obj->ch][type].int_num);
<> 144:ef7eb2e8f9f7 344 } else {
<> 144:ef7eb2e8f9f7 345 GIC_DisableIRQ(can_int_info[obj->ch][type].int_num);
<> 144:ef7eb2e8f9f7 346 }
<> 144:ef7eb2e8f9f7 347 }
<> 144:ef7eb2e8f9f7 348 }
<> 144:ef7eb2e8f9f7 349
<> 144:ef7eb2e8f9f7 350 static void can_rec_irq(uint32_t ch) {
<> 144:ef7eb2e8f9f7 351 __IO uint32_t *dmy_cfsts;
<> 144:ef7eb2e8f9f7 352
<> 144:ef7eb2e8f9f7 353 dmy_cfsts = CFSTS_TBL[ch][CAN_RECV];
<> 144:ef7eb2e8f9f7 354 *dmy_cfsts &= 0xFFFFFFF7; // Clear CFRXIF
<> 144:ef7eb2e8f9f7 355
<> 144:ef7eb2e8f9f7 356 irq_handler(can_irq_id[ch], IRQ_RX);
<> 144:ef7eb2e8f9f7 357 }
<> 144:ef7eb2e8f9f7 358
<> 144:ef7eb2e8f9f7 359 static void can_trx_irq(uint32_t ch) {
<> 144:ef7eb2e8f9f7 360 __IO uint32_t *dmy_cfsts;
<> 144:ef7eb2e8f9f7 361
<> 144:ef7eb2e8f9f7 362 dmy_cfsts = CFSTS_TBL[ch][CAN_SEND];
<> 144:ef7eb2e8f9f7 363 *dmy_cfsts &= 0xFFFFFFEF; // Clear CFTXIF
<> 144:ef7eb2e8f9f7 364
<> 144:ef7eb2e8f9f7 365 irq_handler(can_irq_id[ch], IRQ_TX);
<> 144:ef7eb2e8f9f7 366 }
<> 144:ef7eb2e8f9f7 367
<> 144:ef7eb2e8f9f7 368 static void can_err_irq(uint32_t ch, CanIrqType type) {
<> 144:ef7eb2e8f9f7 369 __IO uint32_t *dmy_erfl;
<> 144:ef7eb2e8f9f7 370 int val = 1;
<> 144:ef7eb2e8f9f7 371
<> 144:ef7eb2e8f9f7 372 dmy_erfl = ERFL_MATCH[ch];
<> 144:ef7eb2e8f9f7 373 switch (type) {
<> 144:ef7eb2e8f9f7 374 case IRQ_ERROR:
<> 144:ef7eb2e8f9f7 375 *dmy_erfl &= 0xFFFFFFFD; // Clear EWF
<> 144:ef7eb2e8f9f7 376 break;
<> 144:ef7eb2e8f9f7 377 case IRQ_OVERRUN:
<> 144:ef7eb2e8f9f7 378 *dmy_erfl &= 0xFFFFFFDF; // Clear OVLF
<> 144:ef7eb2e8f9f7 379 break;
<> 144:ef7eb2e8f9f7 380 case IRQ_PASSIVE:
<> 144:ef7eb2e8f9f7 381 *dmy_erfl &= 0xFFFFFFFB; // Clear EPF
<> 144:ef7eb2e8f9f7 382 break;
<> 144:ef7eb2e8f9f7 383 case IRQ_ARB:
<> 144:ef7eb2e8f9f7 384 *dmy_erfl &= 0xFFFFFF7F; // Clear ALF
<> 144:ef7eb2e8f9f7 385 break;
<> 144:ef7eb2e8f9f7 386 case IRQ_BUS:
<> 144:ef7eb2e8f9f7 387 *dmy_erfl &= 0xFFFF00FF; // Clear ADERRAB0ERRAB1ERRACERRAAERRAFERRASERR
<> 144:ef7eb2e8f9f7 388 *dmy_erfl &= 0xFFFFFFFE; // Clear BEF
<> 144:ef7eb2e8f9f7 389 break;
<> 144:ef7eb2e8f9f7 390 case IRQ_WAKEUP:
<> 144:ef7eb2e8f9f7 391 /* not supported */
<> 144:ef7eb2e8f9f7 392 /* fall through */
<> 144:ef7eb2e8f9f7 393 default:
<> 144:ef7eb2e8f9f7 394 val = 0;
<> 144:ef7eb2e8f9f7 395 break;
<> 144:ef7eb2e8f9f7 396 }
<> 144:ef7eb2e8f9f7 397 if (val == 1) {
<> 144:ef7eb2e8f9f7 398 irq_handler(can_irq_id[ch], type);
<> 144:ef7eb2e8f9f7 399 }
<> 144:ef7eb2e8f9f7 400 }
<> 144:ef7eb2e8f9f7 401
<> 144:ef7eb2e8f9f7 402 static void can0_rec_irq(void) {
<> 144:ef7eb2e8f9f7 403 can_rec_irq(CAN_0);
<> 144:ef7eb2e8f9f7 404 }
<> 144:ef7eb2e8f9f7 405
<> 144:ef7eb2e8f9f7 406 static void can1_rec_irq(void) {
<> 144:ef7eb2e8f9f7 407 can_rec_irq(CAN_1);
<> 144:ef7eb2e8f9f7 408 }
<> 144:ef7eb2e8f9f7 409
<> 144:ef7eb2e8f9f7 410 static void can2_rec_irq(void) {
<> 144:ef7eb2e8f9f7 411 can_rec_irq(CAN_2);
<> 144:ef7eb2e8f9f7 412 }
<> 144:ef7eb2e8f9f7 413
<> 144:ef7eb2e8f9f7 414 static void can3_rec_irq(void) {
<> 144:ef7eb2e8f9f7 415 can_rec_irq(CAN_3);
<> 144:ef7eb2e8f9f7 416 }
<> 144:ef7eb2e8f9f7 417
<> 144:ef7eb2e8f9f7 418 static void can4_rec_irq(void) {
<> 144:ef7eb2e8f9f7 419 can_rec_irq(CAN_4);
<> 144:ef7eb2e8f9f7 420 }
<> 144:ef7eb2e8f9f7 421
<> 144:ef7eb2e8f9f7 422 static void can0_trx_irq(void) {
<> 144:ef7eb2e8f9f7 423 can_trx_irq(CAN_0);
<> 144:ef7eb2e8f9f7 424 }
<> 144:ef7eb2e8f9f7 425
<> 144:ef7eb2e8f9f7 426 static void can1_trx_irq(void) {
<> 144:ef7eb2e8f9f7 427 can_trx_irq(CAN_1);
<> 144:ef7eb2e8f9f7 428 }
<> 144:ef7eb2e8f9f7 429
<> 144:ef7eb2e8f9f7 430 static void can2_trx_irq(void) {
<> 144:ef7eb2e8f9f7 431 can_trx_irq(CAN_2);
<> 144:ef7eb2e8f9f7 432 }
<> 144:ef7eb2e8f9f7 433
<> 144:ef7eb2e8f9f7 434 static void can3_trx_irq(void) {
<> 144:ef7eb2e8f9f7 435 can_trx_irq(CAN_3);
<> 144:ef7eb2e8f9f7 436 }
<> 144:ef7eb2e8f9f7 437
<> 144:ef7eb2e8f9f7 438 static void can4_trx_irq(void) {
<> 144:ef7eb2e8f9f7 439 can_trx_irq(CAN_4);
<> 144:ef7eb2e8f9f7 440 }
<> 144:ef7eb2e8f9f7 441
<> 144:ef7eb2e8f9f7 442 static void can0_err_warning_irq(void) {
<> 144:ef7eb2e8f9f7 443 can_err_irq(CAN_0, IRQ_ERROR);
<> 144:ef7eb2e8f9f7 444 }
<> 144:ef7eb2e8f9f7 445
<> 144:ef7eb2e8f9f7 446 static void can1_err_warning_irq(void) {
<> 144:ef7eb2e8f9f7 447 can_err_irq(CAN_1, IRQ_ERROR);
<> 144:ef7eb2e8f9f7 448 }
<> 144:ef7eb2e8f9f7 449
<> 144:ef7eb2e8f9f7 450 static void can2_err_warning_irq(void) {
<> 144:ef7eb2e8f9f7 451 can_err_irq(CAN_2, IRQ_ERROR);
<> 144:ef7eb2e8f9f7 452 }
<> 144:ef7eb2e8f9f7 453
<> 144:ef7eb2e8f9f7 454 static void can3_err_warning_irq(void) {
<> 144:ef7eb2e8f9f7 455 can_err_irq(CAN_3, IRQ_ERROR);
<> 144:ef7eb2e8f9f7 456 }
<> 144:ef7eb2e8f9f7 457
<> 144:ef7eb2e8f9f7 458 static void can4_err_warning_irq(void) {
<> 144:ef7eb2e8f9f7 459 can_err_irq(CAN_4, IRQ_ERROR);
<> 144:ef7eb2e8f9f7 460 }
<> 144:ef7eb2e8f9f7 461
<> 144:ef7eb2e8f9f7 462 static void can0_overrun_irq(void) {
<> 144:ef7eb2e8f9f7 463 can_err_irq(CAN_0, IRQ_OVERRUN);
<> 144:ef7eb2e8f9f7 464 }
<> 144:ef7eb2e8f9f7 465
<> 144:ef7eb2e8f9f7 466 static void can1_overrun_irq(void) {
<> 144:ef7eb2e8f9f7 467 can_err_irq(CAN_1, IRQ_OVERRUN);
<> 144:ef7eb2e8f9f7 468 }
<> 144:ef7eb2e8f9f7 469
<> 144:ef7eb2e8f9f7 470 static void can2_overrun_irq(void) {
<> 144:ef7eb2e8f9f7 471 can_err_irq(CAN_2, IRQ_OVERRUN);
<> 144:ef7eb2e8f9f7 472 }
<> 144:ef7eb2e8f9f7 473
<> 144:ef7eb2e8f9f7 474 static void can3_overrun_irq(void) {
<> 144:ef7eb2e8f9f7 475 can_err_irq(CAN_3, IRQ_OVERRUN);
<> 144:ef7eb2e8f9f7 476 }
<> 144:ef7eb2e8f9f7 477
<> 144:ef7eb2e8f9f7 478 static void can4_overrun_irq(void) {
<> 144:ef7eb2e8f9f7 479 can_err_irq(CAN_4, IRQ_OVERRUN);
<> 144:ef7eb2e8f9f7 480 }
<> 144:ef7eb2e8f9f7 481
<> 144:ef7eb2e8f9f7 482 static void can0_passive_irq(void) {
<> 144:ef7eb2e8f9f7 483 can_err_irq(CAN_0, IRQ_PASSIVE);
<> 144:ef7eb2e8f9f7 484 }
<> 144:ef7eb2e8f9f7 485
<> 144:ef7eb2e8f9f7 486 static void can1_passive_irq(void) {
<> 144:ef7eb2e8f9f7 487 can_err_irq(CAN_1, IRQ_PASSIVE);
<> 144:ef7eb2e8f9f7 488 }
<> 144:ef7eb2e8f9f7 489
<> 144:ef7eb2e8f9f7 490 static void can2_passive_irq(void) {
<> 144:ef7eb2e8f9f7 491 can_err_irq(CAN_2, IRQ_PASSIVE);
<> 144:ef7eb2e8f9f7 492 }
<> 144:ef7eb2e8f9f7 493
<> 144:ef7eb2e8f9f7 494 static void can3_passive_irq(void) {
<> 144:ef7eb2e8f9f7 495 can_err_irq(CAN_3, IRQ_PASSIVE);
<> 144:ef7eb2e8f9f7 496 }
<> 144:ef7eb2e8f9f7 497
<> 144:ef7eb2e8f9f7 498 static void can4_passive_irq(void) {
<> 144:ef7eb2e8f9f7 499 can_err_irq(CAN_4, IRQ_PASSIVE);
<> 144:ef7eb2e8f9f7 500 }
<> 144:ef7eb2e8f9f7 501
<> 144:ef7eb2e8f9f7 502 static void can0_arb_lost_irq(void) {
<> 144:ef7eb2e8f9f7 503 can_err_irq(CAN_0, IRQ_ARB);
<> 144:ef7eb2e8f9f7 504 }
<> 144:ef7eb2e8f9f7 505
<> 144:ef7eb2e8f9f7 506 static void can1_arb_lost_irq(void) {
<> 144:ef7eb2e8f9f7 507 can_err_irq(CAN_1, IRQ_ARB);
<> 144:ef7eb2e8f9f7 508 }
<> 144:ef7eb2e8f9f7 509
<> 144:ef7eb2e8f9f7 510 static void can2_arb_lost_irq(void) {
<> 144:ef7eb2e8f9f7 511 can_err_irq(CAN_2, IRQ_ARB);
<> 144:ef7eb2e8f9f7 512 }
<> 144:ef7eb2e8f9f7 513
<> 144:ef7eb2e8f9f7 514 static void can3_arb_lost_irq(void) {
<> 144:ef7eb2e8f9f7 515 can_err_irq(CAN_3, IRQ_ARB);
<> 144:ef7eb2e8f9f7 516 }
<> 144:ef7eb2e8f9f7 517
<> 144:ef7eb2e8f9f7 518 static void can4_arb_lost_irq(void) {
<> 144:ef7eb2e8f9f7 519 can_err_irq(CAN_4, IRQ_ARB);
<> 144:ef7eb2e8f9f7 520 }
<> 144:ef7eb2e8f9f7 521
<> 144:ef7eb2e8f9f7 522 static void can0_bus_err_irq(void) {
<> 144:ef7eb2e8f9f7 523 can_err_irq(CAN_0, IRQ_BUS);
<> 144:ef7eb2e8f9f7 524 }
<> 144:ef7eb2e8f9f7 525
<> 144:ef7eb2e8f9f7 526 static void can1_bus_err_irq(void) {
<> 144:ef7eb2e8f9f7 527 can_err_irq(CAN_1, IRQ_BUS);
<> 144:ef7eb2e8f9f7 528 }
<> 144:ef7eb2e8f9f7 529
<> 144:ef7eb2e8f9f7 530 static void can2_bus_err_irq(void) {
<> 144:ef7eb2e8f9f7 531 can_err_irq(CAN_2, IRQ_BUS);
<> 144:ef7eb2e8f9f7 532 }
<> 144:ef7eb2e8f9f7 533
<> 144:ef7eb2e8f9f7 534 static void can3_bus_err_irq(void) {
<> 144:ef7eb2e8f9f7 535 can_err_irq(CAN_3, IRQ_BUS);
<> 144:ef7eb2e8f9f7 536 }
<> 144:ef7eb2e8f9f7 537
<> 144:ef7eb2e8f9f7 538 static void can4_bus_err_irq(void) {
<> 144:ef7eb2e8f9f7 539 can_err_irq(CAN_4, IRQ_BUS);
<> 144:ef7eb2e8f9f7 540 }
<> 144:ef7eb2e8f9f7 541
<> 144:ef7eb2e8f9f7 542 void can_init(can_t *obj, PinName rd, PinName td) {
<> 144:ef7eb2e8f9f7 543 __IO uint32_t *dmy_ctr;
<> 144:ef7eb2e8f9f7 544
<> 144:ef7eb2e8f9f7 545 /* determine the CAN to use */
<> 144:ef7eb2e8f9f7 546 uint32_t can_rx = pinmap_peripheral(rd, PinMap_CAN_RD);
<> 144:ef7eb2e8f9f7 547 uint32_t can_tx = pinmap_peripheral(td, PinMap_CAN_TD);
<> 144:ef7eb2e8f9f7 548 obj->ch = pinmap_merge(can_tx, can_rx);
<> 144:ef7eb2e8f9f7 549 MBED_ASSERT((int)obj->ch != NC);
<> 144:ef7eb2e8f9f7 550
<> 144:ef7eb2e8f9f7 551 /* enable CAN clock */
<> 144:ef7eb2e8f9f7 552 CPGSTBCR3 &= ~(CPG_STBCR3_BIT_MSTP32);
<> 144:ef7eb2e8f9f7 553 /* Has CAN RAM initialisation completed ? */
<> 144:ef7eb2e8f9f7 554 while ((RSCAN0GSTS & 0x08) == 0x08) {
<> 144:ef7eb2e8f9f7 555 __NOP();
<> 144:ef7eb2e8f9f7 556 }
<> 144:ef7eb2e8f9f7 557 /* clear Global Stop mode bit */
<> 144:ef7eb2e8f9f7 558 RSCAN0GCTR &= 0xFFFFFFFB;
<> 144:ef7eb2e8f9f7 559 /* clear Channel Stop mode bit */
<> 144:ef7eb2e8f9f7 560 dmy_ctr = CTR_MATCH[obj->ch];
<> 144:ef7eb2e8f9f7 561 *dmy_ctr &= 0xFFFFFFFB;
<> 144:ef7eb2e8f9f7 562 /* Enter global reset mode */
<> 144:ef7eb2e8f9f7 563 can_set_global_mode(GL_RESET);
<> 144:ef7eb2e8f9f7 564 /* Enter channel reset mode */
<> 144:ef7eb2e8f9f7 565 can_set_channel_mode(obj->ch, CH_RESET);
<> 144:ef7eb2e8f9f7 566 /* reset register */
<> 144:ef7eb2e8f9f7 567 can_reset_reg(obj);
<> 144:ef7eb2e8f9f7 568
<> 144:ef7eb2e8f9f7 569 can_initialized[obj->ch] = 1;
<> 144:ef7eb2e8f9f7 570 /* reconfigure channel which is already initialized */
<> 144:ef7eb2e8f9f7 571 can_reconfigure_channel();
<> 144:ef7eb2e8f9f7 572
<> 144:ef7eb2e8f9f7 573 /* pin out the can pins */
<> 144:ef7eb2e8f9f7 574 pinmap_pinout(rd, PinMap_CAN_RD);
<> 144:ef7eb2e8f9f7 575 pinmap_pinout(td, PinMap_CAN_TD);
<> 144:ef7eb2e8f9f7 576 }
<> 144:ef7eb2e8f9f7 577
<> 144:ef7eb2e8f9f7 578 void can_free(can_t *obj) {
<> 144:ef7eb2e8f9f7 579 /* disable CAN clock */
<> 144:ef7eb2e8f9f7 580 CPGSTBCR3 |= CPG_STBCR3_BIT_MSTP32;
<> 144:ef7eb2e8f9f7 581 }
<> 144:ef7eb2e8f9f7 582
<> 144:ef7eb2e8f9f7 583 int can_frequency(can_t *obj, int f) {
<> 144:ef7eb2e8f9f7 584 int retval = 0;
<> 144:ef7eb2e8f9f7 585
<> 144:ef7eb2e8f9f7 586 if (f <= 1000000) {
<> 144:ef7eb2e8f9f7 587 /* less than 1Mhz */
<> 144:ef7eb2e8f9f7 588 /* set Channel Reset mode */
<> 144:ef7eb2e8f9f7 589 can_set_channel_mode(obj->ch, CH_RESET);
<> 144:ef7eb2e8f9f7 590 can_set_frequency(obj, f);
<> 144:ef7eb2e8f9f7 591 /* set Channel Communication mode */
<> 144:ef7eb2e8f9f7 592 can_set_channel_mode(obj->ch, CH_COMM);
<> 144:ef7eb2e8f9f7 593 retval = 1;
<> 144:ef7eb2e8f9f7 594 }
<> 144:ef7eb2e8f9f7 595
<> 144:ef7eb2e8f9f7 596 return retval;
<> 144:ef7eb2e8f9f7 597 }
<> 144:ef7eb2e8f9f7 598
<> 144:ef7eb2e8f9f7 599 void can_reset(can_t *obj) {
<> 144:ef7eb2e8f9f7 600 /* Enter global reset mode */
<> 144:ef7eb2e8f9f7 601 can_set_global_mode(GL_RESET);
<> 144:ef7eb2e8f9f7 602 /* Enter channel reset mode */
<> 144:ef7eb2e8f9f7 603 can_set_channel_mode(obj->ch, CH_RESET);
<> 144:ef7eb2e8f9f7 604 /* reset register */
<> 144:ef7eb2e8f9f7 605 can_reset_reg(obj);
<> 144:ef7eb2e8f9f7 606 /* reconfigure channel which is already initialized */
<> 144:ef7eb2e8f9f7 607 can_reconfigure_channel();
<> 144:ef7eb2e8f9f7 608 }
<> 144:ef7eb2e8f9f7 609
<> 144:ef7eb2e8f9f7 610 int can_write(can_t *obj, CAN_Message msg, int cc) {
<> 144:ef7eb2e8f9f7 611 __IO uint32_t *dmy_sts;
<> 144:ef7eb2e8f9f7 612 __IO uint32_t *dmy_cfsts;
<> 144:ef7eb2e8f9f7 613 __IO uint32_t *dmy_cfid;
<> 144:ef7eb2e8f9f7 614 __IO uint32_t *dmy_cfptr;
<> 144:ef7eb2e8f9f7 615 __IO uint32_t *dmy_cfdf0;
<> 144:ef7eb2e8f9f7 616 __IO uint32_t *dmy_cfdf1;
<> 144:ef7eb2e8f9f7 617 __IO uint32_t *dmy_cfpctr;
<> 144:ef7eb2e8f9f7 618 int retval = 0;
<> 144:ef7eb2e8f9f7 619
<> 144:ef7eb2e8f9f7 620 /* Wait to become channel communication mode */
<> 144:ef7eb2e8f9f7 621 dmy_sts = STS_MATCH[obj->ch];
<> 144:ef7eb2e8f9f7 622 while ((*dmy_sts & 0x07) != 0) {
<> 144:ef7eb2e8f9f7 623 __NOP();
<> 144:ef7eb2e8f9f7 624 }
<> 144:ef7eb2e8f9f7 625
<> 144:ef7eb2e8f9f7 626 if (((msg.format == CANStandard) && (msg.id <= 0x07FF)) || ((msg.format == CANExtended) && (msg.id <= 0x03FFFF))) {
<> 144:ef7eb2e8f9f7 627 /* send/receive FIFO buffer isn't full */
<> 144:ef7eb2e8f9f7 628 dmy_cfsts = CFSTS_TBL[obj->ch][CAN_SEND];
<> 144:ef7eb2e8f9f7 629 if ((*dmy_cfsts & 0x02) != 0x02) {
<> 144:ef7eb2e8f9f7 630 /* set format, frame type and send/receive FIFO buffer ID(b10-0 or b28-11) */
<> 144:ef7eb2e8f9f7 631 dmy_cfid = CFID_TBL[obj->ch][CAN_SEND];
<> 144:ef7eb2e8f9f7 632 *dmy_cfid = ((msg.format << 31) | (msg.type << 30));
<> 144:ef7eb2e8f9f7 633 if (msg.format == CANStandard) {
<> 144:ef7eb2e8f9f7 634 *dmy_cfid |= (msg.id & 0x07FF);
<> 144:ef7eb2e8f9f7 635 } else {
<> 144:ef7eb2e8f9f7 636 *dmy_cfid |= ((msg.id & 0x03FFFF) << 11);
<> 144:ef7eb2e8f9f7 637 }
<> 144:ef7eb2e8f9f7 638 /* set length */
<> 144:ef7eb2e8f9f7 639 dmy_cfptr = CFPTR_TBL[obj->ch][CAN_SEND];
<> 144:ef7eb2e8f9f7 640 *dmy_cfptr = msg.len << 28;
<> 144:ef7eb2e8f9f7 641 /* set data */
<> 144:ef7eb2e8f9f7 642 dmy_cfdf0 = CFDF0_TBL[obj->ch][CAN_SEND];
<> 144:ef7eb2e8f9f7 643 memcpy((void *)dmy_cfdf0, &msg.data[0], 4);
<> 144:ef7eb2e8f9f7 644 dmy_cfdf1 = CFDF1_TBL[obj->ch][CAN_SEND];
<> 144:ef7eb2e8f9f7 645 memcpy((void *)dmy_cfdf1, &msg.data[4], 4);
<> 144:ef7eb2e8f9f7 646 /* send request */
<> 144:ef7eb2e8f9f7 647 dmy_cfpctr = CFPCTR_TBL[obj->ch][CAN_SEND];
<> 144:ef7eb2e8f9f7 648 *dmy_cfpctr = 0xFF;
<> 144:ef7eb2e8f9f7 649 retval = 1;
<> 144:ef7eb2e8f9f7 650 }
<> 144:ef7eb2e8f9f7 651 }
<> 144:ef7eb2e8f9f7 652
<> 144:ef7eb2e8f9f7 653 return retval;
<> 144:ef7eb2e8f9f7 654 }
<> 144:ef7eb2e8f9f7 655
<> 144:ef7eb2e8f9f7 656 int can_read(can_t *obj, CAN_Message *msg, int handle) {
<> 144:ef7eb2e8f9f7 657 __IO uint32_t *dmy_sts;
<> 144:ef7eb2e8f9f7 658 __IO uint32_t *dmy_cfsts;
<> 144:ef7eb2e8f9f7 659 __IO uint32_t *dmy_cfid;
<> 144:ef7eb2e8f9f7 660 __IO uint32_t *dmy_cfptr;
<> 144:ef7eb2e8f9f7 661 __IO uint32_t *dmy_cfdf0;
<> 144:ef7eb2e8f9f7 662 __IO uint32_t *dmy_cfdf1;
<> 144:ef7eb2e8f9f7 663 __IO uint32_t *dmy_cfpctr;
<> 144:ef7eb2e8f9f7 664 int retval = 0;
<> 144:ef7eb2e8f9f7 665
<> 144:ef7eb2e8f9f7 666 /* Wait to become channel communication mode */
<> 144:ef7eb2e8f9f7 667 dmy_sts = STS_MATCH[obj->ch];
<> 144:ef7eb2e8f9f7 668 while ((*dmy_sts & 0x07) != 0) {
<> 144:ef7eb2e8f9f7 669 __NOP();
<> 144:ef7eb2e8f9f7 670 }
<> 144:ef7eb2e8f9f7 671
<> 144:ef7eb2e8f9f7 672 /* send/receive FIFO buffer isn't empty */
<> 144:ef7eb2e8f9f7 673 dmy_cfsts = CFSTS_TBL[obj->ch][CAN_RECV];
<> 144:ef7eb2e8f9f7 674 while ((*dmy_cfsts & 0x01) != 0x01) {
<> 144:ef7eb2e8f9f7 675 /* get format, frame type and send/receive FIFO buffer ID(b10-0 or b28-11) */
<> 144:ef7eb2e8f9f7 676 dmy_cfid = CFID_TBL[obj->ch][CAN_RECV];
<> 144:ef7eb2e8f9f7 677 msg->format = (CANFormat)(*dmy_cfid >> 31);
<> 144:ef7eb2e8f9f7 678 msg->type = (CANType)(*dmy_cfid >> 30);
<> 144:ef7eb2e8f9f7 679 if (msg->format == CANStandard) {
<> 144:ef7eb2e8f9f7 680 msg->id = (*dmy_cfid & 0x07FF);
<> 144:ef7eb2e8f9f7 681 } else {
<> 144:ef7eb2e8f9f7 682 msg->id = ((*dmy_cfid >> 11) & 0x03FFFF);
<> 144:ef7eb2e8f9f7 683 }
<> 144:ef7eb2e8f9f7 684 /* get length */
<> 144:ef7eb2e8f9f7 685 dmy_cfptr = CFPTR_TBL[obj->ch][CAN_RECV];
<> 144:ef7eb2e8f9f7 686 msg->len = (unsigned char)(*dmy_cfptr >> 28);
<> 144:ef7eb2e8f9f7 687 /* get data */
<> 144:ef7eb2e8f9f7 688 dmy_cfdf0 = CFDF0_TBL[obj->ch][CAN_RECV];
<> 144:ef7eb2e8f9f7 689 memcpy(&msg->data[0], (void *)dmy_cfdf0, 4);
<> 144:ef7eb2e8f9f7 690 dmy_cfdf1 = CFDF1_TBL[obj->ch][CAN_RECV];
<> 144:ef7eb2e8f9f7 691 memcpy(&msg->data[4], (void *)dmy_cfdf1, 4);
<> 144:ef7eb2e8f9f7 692 /* receive(next data) request */
<> 144:ef7eb2e8f9f7 693 dmy_cfpctr = CFPCTR_TBL[obj->ch][CAN_RECV];
<> 144:ef7eb2e8f9f7 694 *dmy_cfpctr = 0xFF;
<> 144:ef7eb2e8f9f7 695 retval = 1;
<> 144:ef7eb2e8f9f7 696 }
<> 144:ef7eb2e8f9f7 697
<> 144:ef7eb2e8f9f7 698 return retval;
<> 144:ef7eb2e8f9f7 699 }
<> 144:ef7eb2e8f9f7 700
<> 144:ef7eb2e8f9f7 701 unsigned char can_rderror(can_t *obj) {
<> 144:ef7eb2e8f9f7 702 __IO uint32_t *dmy_sts;
<> 144:ef7eb2e8f9f7 703
<> 144:ef7eb2e8f9f7 704 dmy_sts = STS_MATCH[obj->ch];
<> 144:ef7eb2e8f9f7 705 return (unsigned char)((*dmy_sts >> 16) & 0xFF);
<> 144:ef7eb2e8f9f7 706 }
<> 144:ef7eb2e8f9f7 707
<> 144:ef7eb2e8f9f7 708 unsigned char can_tderror(can_t *obj) {
<> 144:ef7eb2e8f9f7 709 __IO uint32_t *dmy_sts;
<> 144:ef7eb2e8f9f7 710
<> 144:ef7eb2e8f9f7 711 dmy_sts = STS_MATCH[obj->ch];
<> 144:ef7eb2e8f9f7 712 return (unsigned char)((*dmy_sts >> 24) & 0xFF);
<> 144:ef7eb2e8f9f7 713 }
<> 144:ef7eb2e8f9f7 714
<> 144:ef7eb2e8f9f7 715 int can_mode(can_t *obj, CanMode mode) {
<> 144:ef7eb2e8f9f7 716 __IO uint32_t *dmy_ctr;
<> 144:ef7eb2e8f9f7 717 __IO uint32_t *dmy_sts;
<> 144:ef7eb2e8f9f7 718 __IO uint32_t *dmy_cfcc;
<> 144:ef7eb2e8f9f7 719 int ch_cnt;
<> 144:ef7eb2e8f9f7 720 can_t *tmp_obj;
<> 144:ef7eb2e8f9f7 721 tmp_obj = obj;
<> 144:ef7eb2e8f9f7 722 int retval = 1;
<> 144:ef7eb2e8f9f7 723
<> 144:ef7eb2e8f9f7 724 switch (mode) {
<> 144:ef7eb2e8f9f7 725 case MODE_RESET:
<> 144:ef7eb2e8f9f7 726 can_set_global_mode(GL_RESET);
<> 144:ef7eb2e8f9f7 727 can_set_channel_mode(obj->ch, CH_RESET);
<> 144:ef7eb2e8f9f7 728 for (ch_cnt = 0; ch_cnt < CAN_NUM; ch_cnt++) {
<> 144:ef7eb2e8f9f7 729 can_initialized[ch_cnt] = 0;
<> 144:ef7eb2e8f9f7 730 }
<> 144:ef7eb2e8f9f7 731 break;
<> 144:ef7eb2e8f9f7 732 case MODE_NORMAL:
<> 144:ef7eb2e8f9f7 733 can_set_global_mode(GL_OPE);
<> 144:ef7eb2e8f9f7 734 can_set_channel_mode(obj->ch, CH_COMM);
<> 144:ef7eb2e8f9f7 735 break;
<> 144:ef7eb2e8f9f7 736 case MODE_SILENT:
<> 144:ef7eb2e8f9f7 737 can_set_channel_mode(obj->ch, CH_HOLD);
<> 144:ef7eb2e8f9f7 738 /* set listen only mode, enable communication test mode */
<> 144:ef7eb2e8f9f7 739 dmy_ctr = CTR_MATCH[obj->ch];
<> 144:ef7eb2e8f9f7 740 *dmy_ctr = ((*dmy_ctr & 0x00FFFFFF) | 0x03000000);
<> 144:ef7eb2e8f9f7 741 can_set_channel_mode(obj->ch, CH_COMM);
<> 144:ef7eb2e8f9f7 742 break;
<> 144:ef7eb2e8f9f7 743 case MODE_TEST_LOCAL:
<> 144:ef7eb2e8f9f7 744 can_set_channel_mode(obj->ch, CH_HOLD);
<> 144:ef7eb2e8f9f7 745 /* set self test mode 0, enable communication test mode */
<> 144:ef7eb2e8f9f7 746 dmy_ctr = CTR_MATCH[obj->ch];
<> 144:ef7eb2e8f9f7 747 *dmy_ctr = ((*dmy_ctr & 0x00FFFFFF) | 0x05000000);
<> 144:ef7eb2e8f9f7 748 can_set_channel_mode(obj->ch, CH_COMM);
<> 144:ef7eb2e8f9f7 749 break;
<> 144:ef7eb2e8f9f7 750 case MODE_TEST_GLOBAL:
<> 144:ef7eb2e8f9f7 751 /* set the channel between the communication test on channel 1 and channel 2 */
<> 144:ef7eb2e8f9f7 752 /* set Channel Hold mode */
<> 144:ef7eb2e8f9f7 753 for (tmp_obj->ch = CAN_1; tmp_obj->ch <= CAN_2; tmp_obj->ch++) {
<> 144:ef7eb2e8f9f7 754 dmy_sts = STS_MATCH[tmp_obj->ch];
<> 144:ef7eb2e8f9f7 755 if ((*dmy_sts & 0x04) == 0x04) {
<> 144:ef7eb2e8f9f7 756 /* Channel Stop mode */
<> 144:ef7eb2e8f9f7 757 /* clear Channel Stop mode bit */
<> 144:ef7eb2e8f9f7 758 dmy_ctr = CTR_MATCH[tmp_obj->ch];
<> 144:ef7eb2e8f9f7 759 *dmy_ctr &= 0xFFFFFFFB;
<> 144:ef7eb2e8f9f7 760 can_set_channel_mode(tmp_obj->ch, CH_RESET);
<> 144:ef7eb2e8f9f7 761 }
<> 144:ef7eb2e8f9f7 762 can_set_channel_mode(tmp_obj->ch, CH_HOLD);
<> 144:ef7eb2e8f9f7 763 }
<> 144:ef7eb2e8f9f7 764 can_set_global_mode(GL_TEST);
<> 144:ef7eb2e8f9f7 765 /* enable communication test between channel1 and channel2 */
<> 144:ef7eb2e8f9f7 766 RSCAN0GTSTCFG = 0x06;
<> 144:ef7eb2e8f9f7 767 RSCAN0GTSTCTR = 0x01;
<> 144:ef7eb2e8f9f7 768 /* send and receive setting of channel1 and channel2 */
<> 144:ef7eb2e8f9f7 769 for (tmp_obj->ch = CAN_1; tmp_obj->ch <= CAN_2; tmp_obj->ch++) {
<> 144:ef7eb2e8f9f7 770 can_reset_buffer(tmp_obj);
<> 144:ef7eb2e8f9f7 771 /* set global interrrupt */
<> 144:ef7eb2e8f9f7 772 /* THLEIE, MEIE and DEIE interrupts are disable */
<> 144:ef7eb2e8f9f7 773 RSCAN0GCTR &= 0xFFFFF8FF;
<> 144:ef7eb2e8f9f7 774 /* BLIE, OLIE, BORIE and BOEIE interrupts are disable */
<> 144:ef7eb2e8f9f7 775 /* TAIE, ALIE, EPIE, EWIE and BEIE interrupts are enable */
<> 144:ef7eb2e8f9f7 776 dmy_ctr = CTR_MATCH[tmp_obj->ch];
<> 144:ef7eb2e8f9f7 777 *dmy_ctr &= 0x00018700;
<> 144:ef7eb2e8f9f7 778 can_set_global_mode(GL_OPE);
<> 144:ef7eb2e8f9f7 779 can_set_channel_mode(tmp_obj->ch, CH_COMM);
<> 144:ef7eb2e8f9f7 780 /* Use send/receive FIFO buffer */
<> 144:ef7eb2e8f9f7 781 dmy_cfcc = CFCC_TBL[tmp_obj->ch][CAN_SEND];
<> 144:ef7eb2e8f9f7 782 *dmy_cfcc |= 0x01;
<> 144:ef7eb2e8f9f7 783 dmy_cfcc = CFCC_TBL[tmp_obj->ch][CAN_RECV];
<> 144:ef7eb2e8f9f7 784 *dmy_cfcc |= 0x01;
<> 144:ef7eb2e8f9f7 785 }
<> 144:ef7eb2e8f9f7 786 break;
<> 144:ef7eb2e8f9f7 787 case MODE_TEST_SILENT:
<> 144:ef7eb2e8f9f7 788 /* not supported */
<> 144:ef7eb2e8f9f7 789 /* fall through */
<> 144:ef7eb2e8f9f7 790 default:
<> 144:ef7eb2e8f9f7 791 retval = 0;
<> 144:ef7eb2e8f9f7 792 break;
<> 144:ef7eb2e8f9f7 793 }
<> 144:ef7eb2e8f9f7 794
<> 144:ef7eb2e8f9f7 795 return retval;
<> 144:ef7eb2e8f9f7 796 }
<> 144:ef7eb2e8f9f7 797
<> 144:ef7eb2e8f9f7 798 int can_filter(can_t *obj, uint32_t id, uint32_t mask, CANFormat format, int32_t handle) {
<> 144:ef7eb2e8f9f7 799 int retval = 0;
<> 144:ef7eb2e8f9f7 800
<> 144:ef7eb2e8f9f7 801 if ((format == CANStandard) || (format == CANExtended)) {
<> 144:ef7eb2e8f9f7 802 if (((format == CANStandard) && (id <= 0x07FF)) || ((format == CANExtended) && (id <= 0x03FFFF))) {
<> 144:ef7eb2e8f9f7 803 /* set Global Reset mode and Channel Reset mode */
<> 144:ef7eb2e8f9f7 804 can_set_global_mode(GL_RESET);
<> 144:ef7eb2e8f9f7 805 can_set_channel_mode(obj->ch, CH_RESET);
<> 144:ef7eb2e8f9f7 806 /* enable receive rule table writing */
<> 144:ef7eb2e8f9f7 807 RSCAN0GAFLECTR = 0x00000100;
<> 144:ef7eb2e8f9f7 808 /* set the page number of receive rule table(page number = 0) */
<> 144:ef7eb2e8f9f7 809 RSCAN0GAFLECTR |= (obj->ch * 4);
<> 144:ef7eb2e8f9f7 810 /* set IDE format */
<> 144:ef7eb2e8f9f7 811 *dmy_gaflid = (format << 31);
<> 144:ef7eb2e8f9f7 812 if (format == CANExtended) {
<> 144:ef7eb2e8f9f7 813 /* set receive rule ID for bit28-11 */
<> 144:ef7eb2e8f9f7 814 *dmy_gaflid |= (id << 11);
<> 144:ef7eb2e8f9f7 815 } else {
<> 144:ef7eb2e8f9f7 816 /* set receive rule ID for bit10-0 */
<> 144:ef7eb2e8f9f7 817 *dmy_gaflid |= id;
<> 144:ef7eb2e8f9f7 818 }
<> 144:ef7eb2e8f9f7 819 /* set ID mask bit */
<> 144:ef7eb2e8f9f7 820 *dmy_gaflm = (0xC0000000 | mask);
<> 144:ef7eb2e8f9f7 821 /* disable receive rule table writing */
<> 144:ef7eb2e8f9f7 822 RSCAN0GAFLECTR &= 0xFFFFFEFF;
<> 144:ef7eb2e8f9f7 823 /* reconfigure channel which is already initialized */
<> 144:ef7eb2e8f9f7 824 can_reconfigure_channel();
<> 144:ef7eb2e8f9f7 825 retval = 1;
<> 144:ef7eb2e8f9f7 826 }
<> 144:ef7eb2e8f9f7 827 }
<> 144:ef7eb2e8f9f7 828
<> 144:ef7eb2e8f9f7 829 return retval;
<> 144:ef7eb2e8f9f7 830 }
<> 144:ef7eb2e8f9f7 831
<> 144:ef7eb2e8f9f7 832 void can_monitor(can_t *obj, int silent) {
<> 144:ef7eb2e8f9f7 833 __IO uint32_t *dmy_ctr;
<> 144:ef7eb2e8f9f7 834
<> 144:ef7eb2e8f9f7 835 /* set Channel Hold mode */
<> 144:ef7eb2e8f9f7 836 can_set_channel_mode(obj->ch, CH_HOLD);
<> 144:ef7eb2e8f9f7 837 if (silent) {
<> 144:ef7eb2e8f9f7 838 /* set listen only mode, enable communication test mode */
<> 144:ef7eb2e8f9f7 839 dmy_ctr = CTR_MATCH[obj->ch];
<> 144:ef7eb2e8f9f7 840 *dmy_ctr = ((*dmy_ctr & 0x00FFFFFF) | 0x03000000);
<> 144:ef7eb2e8f9f7 841 can_set_channel_mode(obj->ch, CH_COMM);
<> 144:ef7eb2e8f9f7 842 } else {
<> 144:ef7eb2e8f9f7 843 /* set normal test mode, disable communication test mode */
<> 144:ef7eb2e8f9f7 844 dmy_ctr = CTR_MATCH[obj->ch];
<> 144:ef7eb2e8f9f7 845 *dmy_ctr &= 0x00FFFFFF;
<> 144:ef7eb2e8f9f7 846 /* reset register */
<> 144:ef7eb2e8f9f7 847 can_reset_reg(obj);
<> 144:ef7eb2e8f9f7 848 /* reconfigure channel which is already initialized */
<> 144:ef7eb2e8f9f7 849 can_reconfigure_channel();
<> 144:ef7eb2e8f9f7 850 }
<> 144:ef7eb2e8f9f7 851 }
<> 144:ef7eb2e8f9f7 852
<> 144:ef7eb2e8f9f7 853 static void can_reset_reg(can_t *obj) {
<> 144:ef7eb2e8f9f7 854 __IO uint32_t *dmy_ctr;
<> 144:ef7eb2e8f9f7 855
<> 144:ef7eb2e8f9f7 856 /* time stamp source uses peripheral clock (pclk(P1_phi)/2), CAN clock uses clkc(P1_phi/2), */
<> 144:ef7eb2e8f9f7 857 /* mirror off, DLC not transfer, DLC check permit, transmit buffer priority, clock source not divided */
<> 144:ef7eb2e8f9f7 858 RSCAN0GCFG = 0x00000003;
<> 144:ef7eb2e8f9f7 859 /* set default frequency at 100k */
<> 144:ef7eb2e8f9f7 860 can_set_frequency(obj, 100000);
<> 144:ef7eb2e8f9f7 861 /* set receive rule */
<> 144:ef7eb2e8f9f7 862 can_reset_recv_rule(obj);
<> 144:ef7eb2e8f9f7 863 /* set buffer */
<> 144:ef7eb2e8f9f7 864 can_reset_buffer(obj);
<> 144:ef7eb2e8f9f7 865 /* set global interrrupt */
<> 144:ef7eb2e8f9f7 866 /* THLEIE, MEIE and DEIE interrupts are disable */
<> 144:ef7eb2e8f9f7 867 RSCAN0GCTR &= 0xFFFFF8FF;
<> 144:ef7eb2e8f9f7 868 /* ALIE, BLIE, OLIE, BORIE, BOEIE, EPIE, EWIE and BEIE interrupts are disable */
<> 144:ef7eb2e8f9f7 869 dmy_ctr = CTR_MATCH[obj->ch];
<> 144:ef7eb2e8f9f7 870 *dmy_ctr &= 0xFFFF00FF;
<> 144:ef7eb2e8f9f7 871 }
<> 144:ef7eb2e8f9f7 872
<> 144:ef7eb2e8f9f7 873 static void can_reset_recv_rule(can_t *obj) {
<> 144:ef7eb2e8f9f7 874 /* number of receive rules of each chanel = 64 */
<> 144:ef7eb2e8f9f7 875 RSCAN0GAFLCFG0 = 0x40404040;
<> 144:ef7eb2e8f9f7 876 RSCAN0GAFLCFG1 = 0x40000000;
<> 144:ef7eb2e8f9f7 877 /* enable receive rule table writing */
<> 144:ef7eb2e8f9f7 878 RSCAN0GAFLECTR = 0x00000100;
<> 144:ef7eb2e8f9f7 879 /* set the page number of receive rule table(ex: id ch = 1, page number = 4) */
<> 144:ef7eb2e8f9f7 880 RSCAN0GAFLECTR |= (obj->ch * 4);
<> 144:ef7eb2e8f9f7 881 /* set standard ID, data frame and receive rule ID */
<> 144:ef7eb2e8f9f7 882 *dmy_gaflid = 0x07FF;
<> 144:ef7eb2e8f9f7 883 /* IDE bit, RTR bit and ID bit(28-0) are not compared */
<> 144:ef7eb2e8f9f7 884 *dmy_gaflm = 0;
<> 144:ef7eb2e8f9f7 885 /* DLC check is 1 bytes, not use a receive buffer */
<> 144:ef7eb2e8f9f7 886 *dmy_gaflp0 = 0x10000000;
<> 144:ef7eb2e8f9f7 887 /* use a send/receive FIFO buffer(ex: if ch = 1, FIFO buffer number = 4 and bit = 12) */
<> 144:ef7eb2e8f9f7 888 *dmy_gaflp1 = (1 << ((obj->ch + 3) * 3));
<> 144:ef7eb2e8f9f7 889 /* disable receive rule table writing */
<> 144:ef7eb2e8f9f7 890 RSCAN0GAFLECTR &= 0xFFFFFEFF;
<> 144:ef7eb2e8f9f7 891 }
<> 144:ef7eb2e8f9f7 892
<> 144:ef7eb2e8f9f7 893 static void can_reset_buffer(can_t *obj) {
<> 144:ef7eb2e8f9f7 894 __IO uint32_t *dmy_rfcc;
<> 144:ef7eb2e8f9f7 895 __IO uint32_t *dmy_cfcc;
<> 144:ef7eb2e8f9f7 896 __IO uint32_t *dmy_txqcc;
<> 144:ef7eb2e8f9f7 897 __IO uint32_t *dmy_thlcc;
<> 144:ef7eb2e8f9f7 898 int cnt;
<> 144:ef7eb2e8f9f7 899
<> 144:ef7eb2e8f9f7 900 /* set linked send buffer number(ex: if ch = 1 and mode = send, buffer number = 16), interval timer is pclk/2 */
<> 144:ef7eb2e8f9f7 901 /* number of rows of send/receive FIFO buffer = 4 */
<> 144:ef7eb2e8f9f7 902 dmy_cfcc = CFCC_TBL[obj->ch][CAN_SEND];
<> 144:ef7eb2e8f9f7 903 *dmy_cfcc = 0x00011100; /* send/receive FIFO mode is send */
<> 144:ef7eb2e8f9f7 904 dmy_cfcc = CFCC_TBL[obj->ch][CAN_RECV];
<> 144:ef7eb2e8f9f7 905 *dmy_cfcc = 0x00001100; /* send/receive FIFO mode is receive */
<> 144:ef7eb2e8f9f7 906 /* receive buffer is not used */
<> 144:ef7eb2e8f9f7 907 RSCAN0RMNB = 0;
<> 144:ef7eb2e8f9f7 908 /* receive FIFO buffer is not used */
<> 144:ef7eb2e8f9f7 909 for (cnt = 0; cnt < 8; cnt++) {
<> 144:ef7eb2e8f9f7 910 dmy_rfcc = RFCC_MATCH[cnt];
<> 144:ef7eb2e8f9f7 911 *dmy_rfcc = 0;
<> 144:ef7eb2e8f9f7 912 }
<> 144:ef7eb2e8f9f7 913 /* send queue is not used */
<> 144:ef7eb2e8f9f7 914 dmy_txqcc = TXQCC_MATCH[obj->ch];
<> 144:ef7eb2e8f9f7 915 *dmy_txqcc = 0;
<> 144:ef7eb2e8f9f7 916 /* send history is not used */
<> 144:ef7eb2e8f9f7 917 dmy_thlcc = THLCC_MATCH[obj->ch];
<> 144:ef7eb2e8f9f7 918 *dmy_thlcc = 0;
<> 144:ef7eb2e8f9f7 919
<> 144:ef7eb2e8f9f7 920 /* CFTXIE and CFRXIE interrupts are enable */
<> 144:ef7eb2e8f9f7 921 dmy_cfcc = CFCC_TBL[obj->ch][CAN_SEND];
<> 144:ef7eb2e8f9f7 922 *dmy_cfcc |= 0x04;
<> 144:ef7eb2e8f9f7 923 dmy_cfcc = CFCC_TBL[obj->ch][CAN_RECV];
<> 144:ef7eb2e8f9f7 924 *dmy_cfcc |= 0x02;
<> 144:ef7eb2e8f9f7 925 /* TMIEp interrupt is disable */
<> 144:ef7eb2e8f9f7 926 RSCAN0TMIEC0 = 0x00000000;
<> 144:ef7eb2e8f9f7 927 RSCAN0TMIEC1 = 0x00000000;
<> 144:ef7eb2e8f9f7 928 RSCAN0TMIEC2 = 0x00000000;
<> 144:ef7eb2e8f9f7 929 }
<> 144:ef7eb2e8f9f7 930
<> 144:ef7eb2e8f9f7 931 static void can_reconfigure_channel(void) {
<> 144:ef7eb2e8f9f7 932 __IO uint32_t *dmy_cfcc;
<> 144:ef7eb2e8f9f7 933 int ch_cnt;
<> 144:ef7eb2e8f9f7 934
<> 144:ef7eb2e8f9f7 935 for (ch_cnt = 0; ch_cnt < CAN_NUM; ch_cnt++) {
<> 144:ef7eb2e8f9f7 936 if (can_initialized[ch_cnt] == 1) {
<> 144:ef7eb2e8f9f7 937 /* set Global Operation mode and Channel Communication mode */
<> 144:ef7eb2e8f9f7 938 can_set_global_mode(GL_OPE);
<> 144:ef7eb2e8f9f7 939 can_set_channel_mode(ch_cnt, CH_COMM);
<> 144:ef7eb2e8f9f7 940 /* Use send/receive FIFO buffer */
<> 144:ef7eb2e8f9f7 941 dmy_cfcc = CFCC_TBL[ch_cnt][CAN_SEND];
<> 144:ef7eb2e8f9f7 942 *dmy_cfcc |= 0x01;
<> 144:ef7eb2e8f9f7 943 dmy_cfcc = CFCC_TBL[ch_cnt][CAN_RECV];
<> 144:ef7eb2e8f9f7 944 *dmy_cfcc |= 0x01;
<> 144:ef7eb2e8f9f7 945 }
<> 144:ef7eb2e8f9f7 946 }
<> 144:ef7eb2e8f9f7 947 }
<> 144:ef7eb2e8f9f7 948
<> 144:ef7eb2e8f9f7 949 static void can_set_frequency(can_t *obj, int f) {
<> 144:ef7eb2e8f9f7 950 __IO uint32_t *dmy_cfg;
<> 144:ef7eb2e8f9f7 951 int oldfreq = 0;
<> 144:ef7eb2e8f9f7 952 int newfreq = 0;
<> 144:ef7eb2e8f9f7 953 uint32_t clkc_val;
<> 144:ef7eb2e8f9f7 954 uint8_t tmp_tq;
<> 144:ef7eb2e8f9f7 955 uint8_t tq = 0;
<> 144:ef7eb2e8f9f7 956 uint8_t tmp_brp;
<> 144:ef7eb2e8f9f7 957 uint8_t brp = 0;
<> 144:ef7eb2e8f9f7 958 uint8_t tseg1 = 0;
<> 144:ef7eb2e8f9f7 959 uint8_t tseg2 = 0;
<> 144:ef7eb2e8f9f7 960
<> 144:ef7eb2e8f9f7 961 /* set clkc */
<> 144:ef7eb2e8f9f7 962 if (RZ_A1_IsClockMode0() == false) {
<> 144:ef7eb2e8f9f7 963 clkc_val = CM1_RENESAS_RZ_A1_P1_CLK / 2;
<> 144:ef7eb2e8f9f7 964 } else {
<> 144:ef7eb2e8f9f7 965 clkc_val = CM0_RENESAS_RZ_A1_P1_CLK / 2;
<> 144:ef7eb2e8f9f7 966 }
<> 144:ef7eb2e8f9f7 967 /* calculate BRP bit and Choose max value of calculated frequency */
<> 144:ef7eb2e8f9f7 968 for (tmp_tq = 8; tmp_tq <= 25; tmp_tq++) {
<> 144:ef7eb2e8f9f7 969 /* f = fCAN / ((BRP+1) * Tq) */
<> 144:ef7eb2e8f9f7 970 /* BRP = (fCAN / (f * Tq)) - 1 */
<> 144:ef7eb2e8f9f7 971 tmp_brp = ((clkc_val / (f * tmp_tq)) - 1) + 1; // carry(decimal point is carry)
<> 144:ef7eb2e8f9f7 972 newfreq = clkc_val / ((tmp_brp + 1) * tmp_tq);
<> 144:ef7eb2e8f9f7 973 if (newfreq >= oldfreq) {
<> 144:ef7eb2e8f9f7 974 oldfreq = newfreq;
<> 144:ef7eb2e8f9f7 975 tq = tmp_tq;
<> 144:ef7eb2e8f9f7 976 brp = tmp_brp;
<> 144:ef7eb2e8f9f7 977 }
<> 144:ef7eb2e8f9f7 978 }
<> 144:ef7eb2e8f9f7 979 /* calculate TSEG1 bit and TSEG2 bit */
<> 144:ef7eb2e8f9f7 980 tseg1 = (tq - 1) * 0.666666667;
<> 144:ef7eb2e8f9f7 981 tseg2 = (tq - 1) - tseg1;
<> 144:ef7eb2e8f9f7 982 /* set RSCAN0CmCFG register */
<> 144:ef7eb2e8f9f7 983 dmy_cfg = CFG_MATCH[obj->ch];
<> 144:ef7eb2e8f9f7 984 *dmy_cfg = ((tseg2 - 1) << 20) | ((tseg1 - 1) << 16) | brp;
<> 144:ef7eb2e8f9f7 985 }
<> 144:ef7eb2e8f9f7 986
<> 144:ef7eb2e8f9f7 987 static void can_set_global_mode(int mode) {
<> 144:ef7eb2e8f9f7 988 /* set Global mode */
<> 144:ef7eb2e8f9f7 989 RSCAN0GCTR = ((RSCAN0GCTR & 0xFFFFFFFC) | mode);
<> 144:ef7eb2e8f9f7 990 /* Wait to cahnge into Global XXXX mode */
<> 144:ef7eb2e8f9f7 991 while ((RSCAN0GSTS & 0x07) != mode) {
<> 144:ef7eb2e8f9f7 992 __NOP();
<> 144:ef7eb2e8f9f7 993 }
<> 144:ef7eb2e8f9f7 994 }
<> 144:ef7eb2e8f9f7 995
<> 144:ef7eb2e8f9f7 996 static void can_set_channel_mode(uint32_t ch, int mode) {
<> 144:ef7eb2e8f9f7 997 __IO uint32_t *dmy_ctr;
<> 144:ef7eb2e8f9f7 998 __IO uint32_t *dmy_sts;
<> 144:ef7eb2e8f9f7 999
<> 144:ef7eb2e8f9f7 1000 /* set Channel mode */
<> 144:ef7eb2e8f9f7 1001 dmy_ctr = CTR_MATCH[ch];
<> 144:ef7eb2e8f9f7 1002 *dmy_ctr = ((*dmy_ctr & 0xFFFFFFFC) | mode);
<> 144:ef7eb2e8f9f7 1003 /* Wait to cahnge into Channel XXXX mode */
<> 144:ef7eb2e8f9f7 1004 dmy_sts = STS_MATCH[ch];
<> 144:ef7eb2e8f9f7 1005 while ((*dmy_sts & 0x07) != mode) {
<> 144:ef7eb2e8f9f7 1006 __NOP();
<> 144:ef7eb2e8f9f7 1007 }
<> 144:ef7eb2e8f9f7 1008 }
<> 144:ef7eb2e8f9f7 1009