t

Fork of mbed-dev by mbed official

Committer:
<>
Date:
Fri Oct 28 11:17:30 2016 +0100
Revision:
149:156823d33999
Parent:
targets/hal/TARGET_RENESAS/TARGET_RZ_A1H/can_api.c@144:ef7eb2e8f9f7
Child:
153:fa9ff456f731
This updates the lib to the mbed lib v128

NOTE: This release includes a restructuring of the file and directory locations and thus some
include paths in your code may need updating accordingly.

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