OpenCores
URL https://opencores.org/ocsvn/mips_enhanced/mips_enhanced/trunk

Subversion Repositories mips_enhanced

[/] [mips_enhanced/] [trunk/] [grlib-gpl-1.0.19-b3188/] [software/] [leon3/] [can_oc.c] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dimamali
/* -------------------------------------------------------------------------- */
2
/* Gaisler Research AB, 2007                                                  */
3
/* -------------------------------------------------------------------------- */
4
/* Simple self reception test for OpenCore CAN_OC Controller, with DMA        */
5
/* -------------------------------------------------------------------------- */
6
 
7
//struct can_oc_basic {
8
//   volatile unsigned char control_register;            /* 0000 */
9
//   volatile unsigned char command_register;            /* 0001 */
10
//   volatile unsigned char status_register;             /* 0002 */
11
//   volatile unsigned char interrupt_register;          /* 0003 */
12
//   volatile unsigned char acceptance_code_register;    /* 0004 */
13
//   volatile unsigned char acceptance_mask_register;    /* 0005 */
14
//   volatile unsigned char bus_timing_0_register;       /* 0006 */
15
//   volatile unsigned char bus_timing_1_register;       /* 0007 */
16
//   volatile unsigned char output_control_register;     /* 0008 */
17
//   volatile unsigned char test_register;               /* 0009 */
18
//   volatile unsigned char tb_identifier_byte_0;        /* 000A */
19
//   volatile unsigned char tb_identifier_byte_1;        /* 000B */
20
//   volatile unsigned char tb_data_byte_1;              /* 000C */
21
//   volatile unsigned char tb_data_byte_2;              /* 000D */
22
//   volatile unsigned char tb_data_byte_3;              /* 000E */
23
//   volatile unsigned char tb_data_byte_4;              /* 000F */
24
//   volatile unsigned char tb_data_byte_5;              /* 0010 */
25
//   volatile unsigned char tb_data_byte_6;              /* 0011 */
26
//   volatile unsigned char tb_data_byte_7;              /* 0012 */
27
//   volatile unsigned char tb_data_byte_8;              /* 0013 */
28
//   volatile unsigned char rb_identifier_byte_0;        /* 0014 */
29
//   volatile unsigned char rb_identifier_byte_1;        /* 0015 */
30
//   volatile unsigned char rb_data_byte_1;              /* 0016 */
31
//   volatile unsigned char rb_data_byte_2;              /* 0017 */
32
//   volatile unsigned char rb_data_byte_3;              /* 0018 */
33
//   volatile unsigned char rb_data_byte_4;              /* 0019 */
34
//   volatile unsigned char rb_data_byte_5;              /* 001A */
35
//   volatile unsigned char rb_data_byte_6;              /* 001B */
36
//   volatile unsigned char rb_data_byte_7;              /* 001C */
37
//   volatile unsigned char rb_data_byte_8;              /* 001D */
38
//   volatile unsigned char extra_register;              /* 001E */
39
//   volatile unsigned char clock_divider_register;      /* 001F */
40
//};
41
 
42
struct can_oc_extended {
43
   volatile unsigned char control_register;            /* 0000 */
44
   volatile unsigned char command_register;            /* 0001 */
45
   volatile unsigned char status_register;             /* 0002 */
46
   volatile unsigned char interrupt_register;          /* 0003 */
47
   volatile unsigned char interrupt_enable_register;   /* 0004 */
48
   volatile unsigned char reserved_register;           /* 0005 */
49
   volatile unsigned char bus_timing_0_register;       /* 0006 */
50
   volatile unsigned char bus_timing_1_register;       /* 0007 */
51
   volatile unsigned char output_control_register;     /* 0008 */
52
   volatile unsigned char test_register;               /* 0009 */
53
   volatile unsigned char reserved_1_register;         /* 000A */
54
   volatile unsigned char arbitration_lost_capture;    /* 000B */
55
   volatile unsigned char error_code_capture;          /* 000C */
56
   volatile unsigned char error_warning_limit;         /* 000D */
57
   volatile unsigned char rx_error_counter;            /* 000E */
58
   volatile unsigned char tx_error_counter;            /* 000F */
59
   volatile unsigned char acceptance_code_0;           /* 0010 */
60
   volatile unsigned char acceptance_code_1;           /* 0011 */
61
   volatile unsigned char acceptance_code_2;           /* 0012 */
62
   volatile unsigned char acceptance_code_3;           /* 0013 */
63
   volatile unsigned char acceptance_mask_0;           /* 0014 */
64
   volatile unsigned char acceptance_mask_1;           /* 0015 */
65
   volatile unsigned char acceptance_mask_2;           /* 0016 */
66
   volatile unsigned char acceptance_mask_3;           /* 0017 */
67
   volatile unsigned char dummy0;                      /* 0018 */
68
   volatile unsigned char dummy1;                      /* 0019 */
69
   volatile unsigned char dummy2;                      /* 001A */
70
   volatile unsigned char dummy3;                      /* 001B */
71
   volatile unsigned char dummy4;                      /* 001C */
72
   volatile unsigned char rx_message_counter;          /* 001D */
73
   volatile unsigned char rx_buffer_start_address;     /* 001E */
74
   volatile unsigned char clock_divider_register;      /* 001F */
75
};
76
 
77
//struct can_oc_extended_rx_sff {
78
//   volatile unsigned char rx_frame_information_sff;    /* 0010 */
79
//   volatile unsigned char rx_identifier_1_sff;         /* 0011 */
80
//   volatile unsigned char rx_identifier_2_sff;         /* 0012 */
81
//   volatile unsigned char rx_data_1_sff;               /* 0013 */
82
//   volatile unsigned char rx_data_2_sff;               /* 0014 */
83
//   volatile unsigned char rx_data_3_sff;               /* 0015 */
84
//   volatile unsigned char rx_data_4_sff;               /* 0016 */
85
//   volatile unsigned char rx_data_5_sff;               /* 0017 */
86
//   volatile unsigned char rx_data_6_sff;               /* 0018 */
87
//   volatile unsigned char rx_data_7_sff;               /* 0019 */
88
//   volatile unsigned char rx_data_8_sff;               /* 001A */
89
//};
90
//
91
//struct can_oc_extended_rx_eff {
92
//   volatile unsigned char rx_frame_information_eff;    /* 0010 */
93
//   volatile unsigned char rx_identifier_1_eff;         /* 0011 */
94
//   volatile unsigned char rx_identifier_2_eff;         /* 0012 */
95
//   volatile unsigned char rx_identifier_3_eff;         /* 0013 */
96
//   volatile unsigned char rx_identifier_4_eff;         /* 0014 */
97
//   volatile unsigned char rx_data_1_eff;               /* 0015 */
98
//   volatile unsigned char rx_data_2_eff;               /* 0016 */
99
//   volatile unsigned char rx_data_3_eff;               /* 0017 */
100
//   volatile unsigned char rx_data_4_eff;               /* 0018 */
101
//   volatile unsigned char rx_data_5_eff;               /* 0019 */
102
//   volatile unsigned char rx_data_6_eff;               /* 001A */
103
//   volatile unsigned char rx_data_7_eff;               /* 001B */
104
//   volatile unsigned char rx_data_8_eff;               /* 001C */
105
//};
106
 
107
//struct can_oc_extended_tx_sff {
108
//   volatile unsigned char tx_frame_information_sff;    /* 0010 */
109
//   volatile unsigned char tx_identifier_1_sff;         /* 0011 */
110
//   volatile unsigned char tx_identifier_2_sff;         /* 0012 */
111
//   volatile unsigned char tx_data_1_sff;               /* 0013 */
112
//   volatile unsigned char tx_data_2_sff;               /* 0014 */
113
//   volatile unsigned char tx_data_3_sff;               /* 0015 */
114
//   volatile unsigned char tx_data_4_sff;               /* 0016 */
115
//   volatile unsigned char tx_data_5_sff;               /* 0017 */
116
//   volatile unsigned char tx_data_6_sff;               /* 0018 */
117
//   volatile unsigned char tx_data_7_sff;               /* 0019 */
118
//   volatile unsigned char tx_data_8_sff;               /* 001A */
119
//};
120
//
121
//struct can_oc_extended_tx_eff {
122
//   volatile unsigned char tx_frame_information_eff;    /* 0010 */
123
//   volatile unsigned char tx_identifier_1_eff;         /* 0011 */
124
//   volatile unsigned char tx_identifier_2_eff;         /* 0012 */
125
//   volatile unsigned char tx_identifier_3_eff;         /* 0013 */
126
//   volatile unsigned char tx_identifier_4_eff;         /* 0014 */
127
//   volatile unsigned char tx_data_1_eff;               /* 0015 */
128
//   volatile unsigned char tx_data_2_eff;               /* 0016 */
129
//   volatile unsigned char tx_data_3_eff;               /* 0017 */
130
//   volatile unsigned char tx_data_4_eff;               /* 0018 */
131
//   volatile unsigned char tx_data_5_eff;               /* 0019 */
132
//   volatile unsigned char tx_data_6_eff;               /* 001A */
133
//   volatile unsigned char tx_data_7_eff;               /* 001B */
134
//   volatile unsigned char tx_data_8_eff;               /* 001C */
135
//};
136
 
137
#define reset_mode_on 0x01
138
#define reset_mode_off 0xFE
139
//#define enable_all_int 0x1E
140
//#define tx_request 0x01
141
//#define basic_mode 0x7F
142
#define extended_mode 0x80
143
#define release_buffer 0x04
144
 
145
#define self_test_mode 0x04
146
#define self_reception 0x10
147
//#define enable_all_int_eff 0xFF
148
 
149
int can_oc_test(int addr)
150
{
151
   struct can_oc_extended *ce = (struct can_oc_extended *) addr;
152
 
153
   volatile unsigned char *buf = (volatile unsigned char *) (addr + 0x0010);
154
 
155
   int tmp, i;
156
 
157
   report_device(0x01019000);
158
 
159
   // switch on reset mode
160
   ce->control_register = reset_mode_on;
161
 
162
   // switch to extended mode
163
   ce->clock_divider_register = extended_mode;
164
   ce->interrupt_enable_register = 0;
165
 
166
   // set bus timing
167
   ce->bus_timing_0_register = 0x80;
168
   ce->bus_timing_1_register = 0x00;
169
 
170
   // set acceptance and mask register
171
   buf[0] = 0x05;
172
   buf[1] = 0x06;
173
   buf[2] = 0x07;
174
   buf[3] = 0x08;
175
   buf[4] = 0x70;
176
   buf[5] = 0xe0;
177
   buf[6] = 0xf0;
178
   buf[7] = 0xc0;
179
 
180
   // Setting the self test mode
181
   ce->control_register = reset_mode_on | self_test_mode;
182
 
183
   // Switch-off reset mode
184
   ce->control_register = self_test_mode;
185
 
186
   // ---------- transmit and check frame data ----------
187
 
188
   // send first frame
189
//   report_subtest(0);
190
   buf[0] = 0x88;
191
   for (tmp=1; tmp < 13; tmp++)
192
      buf[tmp] = (unsigned char) ((tmp+4 + 16*tmp*0) & 0xFF);
193
   ce->command_register = self_reception;
194
 
195
   while (!ce->rx_message_counter);
196
 
197
   for (i=1; i < 5; i++) {
198
      // send frame
199
//      report_subtest(i);
200
      buf[0] = 0x88;
201
      for (tmp=1; tmp < 13; tmp++)
202
         buf[tmp] = (unsigned char) ((tmp+4 + 16*tmp*i) & 0xFF);
203
      ce->command_register = self_reception;
204
 
205
      // check frame
206
//      report_subtest(10+i-1);
207
      if (buf[0] != 0x88) fail(0);
208
      for (tmp=1; tmp < 13; tmp++)
209
         if (buf[tmp] != (unsigned char) ((tmp+4 + 16*tmp*(i-1)) & 0xFF))  fail (tmp);
210
      ce->command_register = release_buffer;
211
 
212
      while (!ce->rx_message_counter);
213
   }
214
 
215
   // check last frame
216
//   report_subtest(10+4);
217
   if (buf[0] != 0x88) fail(0);
218
   for (tmp=1; tmp < 13; tmp++)
219
      if (buf[tmp] != (unsigned char) ((tmp+4 + 16*tmp*(4)) & 0xFF))  fail (tmp);
220
   ce->command_register = release_buffer;
221
 
222
   ce->control_register = reset_mode_on;
223
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.