can_rx.c
00001 #include <includes.h>
00002
00003 CAN_FRAME_DESC ** can_rx_descriptors;
00004 CAN_FRAME_DESC ** can_rx_rtr_descriptors;
00005 CAN_RX_CHAN_CFG can_rx_chan_cfgs[5];
00006
00007 extern unsigned long can_elapsed_ms;
00008
00009
00010 volatile unsigned short can_rx_frame_count_1 = 0;
00011 volatile unsigned short can_rx_frame_count_2 = 0;
00012 volatile unsigned short can_rx_frame_count_3 = 0;
00013 volatile unsigned short can_rx_frame_count_4 = 0;
00014
00015 unsigned short can_rx_get_frame_count_1(CAN_FRAME * frame)
00016 {
00017 frame->payload.w.w1 = can_rx_frame_count_1;
00018 can_rx_frame_count_1 = 0;
00019 frame->payload.w.w2 = can_elapsed_ms;
00020 return 0;
00021 }
00022
00023 unsigned short can_rx_get_frame_count_2(CAN_FRAME * frame)
00024 {
00025 frame->payload.w.w1 = can_rx_frame_count_2;
00026 can_rx_frame_count_2 = 0;
00027 frame->payload.w.w2 = can_elapsed_ms;
00028 return 0;
00029 }
00030
00031 unsigned short can_rx_get_frame_count_3(CAN_FRAME * frame)
00032 {
00033 frame->payload.w.w1 = can_rx_frame_count_3;
00034 can_rx_frame_count_3 = 0;
00035 frame->payload.w.w2 = can_elapsed_ms;
00036 return 0;
00037 }
00038
00039 unsigned short can_rx_get_frame_count_4(CAN_FRAME * frame)
00040 {
00041 frame->payload.w.w1 = can_rx_frame_count_4;
00042 can_rx_frame_count_4 = 0;
00043 frame->payload.w.w2 = can_elapsed_ms;
00044 return 0;
00045 }
00046
00047 void can_rx_set_descriptors(CAN_FRAME_DESC ** rx_descriptors,CAN_FRAME_DESC ** rtr_descriptors){
00048 can_rx_descriptors = rx_descriptors;
00049 can_rx_rtr_descriptors = rtr_descriptors;
00050
00051 }
00052
00053 void can_rx_set_chan_cfg(CAN_CHANNEL chan,volatile unsigned long * base_addr, CAN_RING * rx_ring, CAN_DISPATCH_MODE mode){
00054 CAN_RX_CHAN_CFG * cfg = &can_rx_chan_cfgs[chan];
00055
00056 cfg->base_addr = base_addr;
00057 cfg->dispatch_mode = mode;
00058 cfg->ring = rx_ring;
00059 }
00060
00062
00063
00064
00065
00066
00067
00068 void can_rx_acceptance_filter_init(void)
00069 {
00070 unsigned short i, j, high_id;
00071 unsigned long addr, chan, test_value;
00072 CAN_FRAME_DESC * frame_desc = 0;
00073 volatile unsigned long * afram_ptr = &AFRAM;
00074
00075
00076 AFMR =
00077 (0 << 0)
00078 | (1 << 1)
00079 | (0 << 2);
00080
00081
00082
00083
00084 i = 0;
00085 j = 0;
00086 high_id = 0;
00087 while(1)
00088 {
00089 frame_desc = can_rx_descriptors[i];
00090
00091 if (frame_desc != NULL)
00092 {
00093 if (!high_id)
00094 {
00095 addr = frame_desc->addr;
00096 chan = frame_desc->chan;
00097
00098 afram_ptr[j] = (addr << 16) | (chan - 1) << 29;
00099 high_id = 1;
00100 }
00101 else
00102 {
00103 addr = frame_desc->addr;
00104 chan = frame_desc->chan;
00105
00106 afram_ptr[j] |= (addr | ((chan - 1) << 13));
00107 ++j;
00108 if (j >= 0x200)
00109 {
00110
00111 break;
00112 }
00113 high_id = 0;
00114 }
00115 ++i;
00116 }
00117 else if ((frame_desc == 0) && (i == 0))
00118 {
00119 break;
00120 }
00121 else
00122 {
00123 if (high_id)
00124 {
00125 afram_ptr[j] |= 0x67FF;
00126 j++;
00127 }
00128 break;
00129 }
00130 }
00131
00132
00133
00134
00135 i = 0;
00136 while (1)
00137 {
00138 test_value = 0xFFFF & (afram_ptr[i >> 1] >> ((~i & 1) << 4));
00139 if (((i+1) >> 1) >= j)
00140 {
00141 break;
00142 }
00143 else if (test_value > (0xFFFF & (afram_ptr[(i+1) >> 1] >> ((~(i+1) & 1) << 4))))
00144 {
00145
00146 if (i & 1)
00147 {
00148 afram_ptr[i >> 1] &= 0xFFFF0000;
00149 afram_ptr[i >> 1] |= afram_ptr[(i+1) >> 1] >> 16;
00150
00151 afram_ptr[(i+1) >> 1] &= 0xFFFF;
00152 afram_ptr[(i+1) >> 1] |= (test_value << 16);
00153
00154
00155 }
00156 else
00157 {
00158 afram_ptr[i >> 1] <<= 16;
00159 afram_ptr[i >> 1] |= test_value;
00160 }
00161 i = 0;
00162 }
00163 else if (test_value == (0xFFFF & (afram_ptr[(i+1) >> 1] >> (((i+1) & 1) << 4))))
00164 {
00165
00166 ++i;
00167 }
00168 else
00169 {
00170 ++i;
00171 }
00172 }
00173
00174
00175 SFF_sa = 0;
00176
00177 SFF_GRP_sa = j << 2;
00178
00179 EFF_sa = SFF_GRP_sa;
00180
00181 EFF_GRP_sa = SFF_GRP_sa;
00182
00183 ENDofTable = SFF_GRP_sa;
00184
00185
00186 AFMR =
00187 (0 << 0)
00188 | (0 << 1)
00189 | (0 << 2);
00190
00191 }
00193
00195 void can_rx_now(CAN_CHANNEL chan){
00196 CAN_RX_CHAN_CFG * cfg;
00197 volatile unsigned long * base;
00198 CAN_FRAME frame;
00199
00200 cfg = &can_rx_chan_cfgs[chan];
00201 base = cfg->base_addr;
00202
00203 if(base == NULL) {
00204 C1CMR = 1<<2;
00205 C2CMR = 1<<2;
00206 C3CMR = 1<<2;
00207 C4CMR = 1<<2;
00208 } else {
00209 frame.chan = chan;
00210 frame.addr = CAN_REG(base,CAN_RID);
00211 frame.dlc = (CAN_REG(base,CAN_RFS)>>16)&0xF;
00212 frame.rtr = (CAN_REG(base,CAN_RFS)>>30)&0x1;
00213 frame.payload.w.w1 = CAN_REG(base,CAN_RDA);
00214 frame.payload.w.w2 = CAN_REG(base,CAN_RDB);
00215 CAN_REG(base,CAN_CMR) = 1<<2;
00216
00217 if (cfg->dispatch_mode == CAN_DISPATCH_MANUAL) {
00218 can_ring_push(cfg->ring,&frame);
00219 } else {
00220 can_rx_dispatch_frame(&frame);
00221 }
00222 }
00223 }
00224
00225 void can_rx_dispatch_frame(CAN_FRAME * frame){
00226 CAN_FRAME_DESC * frame_desc = 0;
00227 CAN_LAYOUT layout;
00228 int expected_dlc;
00229 int i;
00230 CAN_FRAME_DESC ** search_list;
00231
00232 search_list = (frame->rtr) ? can_rx_rtr_descriptors : can_rx_descriptors;
00233
00234 if(search_list == NULL) {
00235 return;
00236 }
00237
00238 i = 0;
00239 while(1){
00240 frame_desc = search_list[i];
00241 if((frame_desc == 0) ||
00242 ((frame_desc->addr&0x7FF) == (frame->addr&0x7FF))) {
00243 break;
00244 }
00245 i++;
00246 }
00247
00248 if(frame_desc == 0) {
00249
00250 return;
00251 }
00252
00253
00254
00255 layout = frame_desc->frame_layout;
00256
00257 if(frame->rtr) {
00258 expected_dlc = 0;
00259 } else {
00260 switch(layout){
00261 case CAN_LAYOUT_D:
00262 case CAN_LAYOUT_FF:
00263 case CAN_LAYOUT_II:
00264 case CAN_LAYOUT_FI:
00265 case CAN_LAYOUT_ISS:
00266 expected_dlc = 8;
00267 break;
00268 default:
00269
00270 expected_dlc = -1;
00271 break;
00272 };
00273 }
00274 if(expected_dlc == -1){
00275
00276 return;
00277 }
00278 if((expected_dlc == 8) &&(frame->dlc < 8) ||
00279 (expected_dlc != frame->dlc)) {
00280
00281 return;
00282 }
00283
00284
00285 if(frame->rtr == 0){
00286 switch(layout){
00287 case CAN_LAYOUT_D:
00288 ((CAN_RX_SETTER_DOUBLE)frame_desc->ptr1)(frame->payload.d.d1);
00289 break;
00290 case CAN_LAYOUT_FF:
00291 ((CAN_RX_SETTER_FLOAT)frame_desc->ptr1)(frame->payload.f.f1);
00292 ((CAN_RX_SETTER_FLOAT)frame_desc->ptr2)(frame->payload.f.f2);
00293 break;
00294 case CAN_LAYOUT_II:
00295 ((CAN_RX_SETTER_INT)frame_desc->ptr1)(frame->payload.i.i1);
00296 ((CAN_RX_SETTER_INT)frame_desc->ptr2)(frame->payload.i.i2);
00297 break;
00298 case CAN_LAYOUT_FI:
00299 ((CAN_RX_SETTER_FLOAT)frame_desc->ptr1)(frame->payload.f.f1);
00300 ((CAN_RX_SETTER_INT) frame_desc->ptr2)(frame->payload.i.i2);
00301 break;
00302 case CAN_LAYOUT_ISS:
00303 ((CAN_RX_SETTER_INT )frame_desc->ptr1)(frame->payload.i.i1);
00304 ((CAN_RX_SETTER_SHORT)frame_desc->ptr2)(frame->payload.s.s3);
00305 ((CAN_RX_SETTER_SHORT)frame_desc->ptr3)(frame->payload.s.s4);
00306 break;
00307 default:
00308
00309 break;
00310 };
00311 } else {
00312 can_transmit(frame_desc);
00313 }
00314
00315
00316 }
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340