2 #define SNO_WRITE_SCRATCHPAD 0x0f
3 #define SNO_READ_SCRATCHPAD 0xaa
4 #define SNO_COPY_SCRATCHPAD 0x55
5 #define SNO_READ_MEMORY 0xf0
6 #define SNO_WRITE_APPLICATION_REG 0x99
7 #define SNO_READ_STATUS_REG 0x66
8 #define SNO_READ_APPLICATION_REG 0xc3
9 #define SNO_COPY_LOCK 0x5a
10 #define SNO_READ_ROM 0x33
11 #define SNO_MATCH_ROM 0x55
12 #define SNO_SKIP_ROM 0xcc
13 #define SNO_SEARCH_ROM 0xf0
20 "ldr r4, =0x00000020;" // mask for GPIO 5
22 "ldr r5, =0x40e0000c;" // pin dir register
25 "str r6, [r5];" // set GPIO to output
27 "ldr r5, =0x40e00024;" // output clear register
28 "str r4, [r5];" // reset pin
30 "ldr r5, =0x40a00010;" // timer 500 usec
40 "ldr r5, =0x40e00018;" // output set register
41 "str r4, [r5];" // reset pin
43 "ldr r5, =0x40e0000c;" // pin dir register
46 "str r6, [r5];" // set GPIO to input
48 "ldr r5, =0x40a00010;" // timer 80 usec
58 "ldr r5, =0x40e00000;" // pin level register
61 "mov %0, r6, lsr#5;" // shift right by 5
63 "ldr r5, =0x40a00010;" // timer 500 usec
75 : "r4","r5","r6","r7");
85 "ldr r4, =0x00000020;" // mask for GPIO 5
87 "ldr r5, =0x40e0000c;" // pin dir register
90 "str r6, [r5];" // set GPIO to output
92 "ldr r5, =0x40e00024;" // output clear register
93 "str r4, [r5];" // reset pin
95 "ldr r5, =0x40a00010;" // timer 5 usec
104 "ldr r5, =0x40e00018;" // output set register
105 "str r4, [r5];" // reset pin
107 "ldr r5, =0x40e0000c;" // pin dir register
110 "str r6, [r5];" // set GPIO to input
112 "ldr r5, =0x40a00010;" // timer 5 usec
121 "ldr r5, =0x40e00000;" // pin level register
124 "mov %0, r6, lsr#5;" // shift right by 5
128 : "r4","r5","r6","r7");
133 void sno_write_1(void)
136 "ldr r4, =0x00000020;" // mask for GPIO 5
138 "ldr r5, =0x40e0000c;" // pin dir register
141 "str r6, [r5];" // set GPIO to output
143 "ldr r5, =0x40e00024;" // output clear register
144 "str r4, [r5];" // reset pin
146 "ldr r5, =0x40a00010;" // timer 5 usec
155 "ldr r5, =0x40e00018;" // output set register
156 "str r4, [r5];" // reset pin
158 "ldr r5, =0x40e0000c;" // pin dir register
161 "str r6, [r5];" // set GPIO to input
163 "ldr r5, =0x40a00010;" // timer 60 usec
174 : "r4","r5","r6","r7");
177 void sno_write_0(void)
180 "ldr r4, =0x00000020;" // mask for GPIO 5
182 "ldr r5, =0x40e0000c;" // pin dir register
185 "str r6, [r5];" // set GPIO to output
187 "ldr r5, =0x40e00024;" // output clear register
188 "str r4, [r5];" // reset pin
190 "ldr r5, =0x40a00010;" // timer 67 usec
199 "ldr r5, =0x40e00018;" // output set register
200 "str r4, [r5];" // reset pin
202 "ldr r5, =0x40e0000c;" // pin dir register
205 "str r6, [r5];" // set GPIO to input
209 : "r4","r5","r6","r7");
212 void sno_write_byte (unsigned char sbyte)
218 for (i = 0; i < 8; i++) {
229 unsigned char sno_read_byte (void)
231 unsigned char mask = 0x01;
232 unsigned char abyte = 0x00;
233 unsigned char return_value;
236 for (i = 0; i < 8; i++) {
237 return_value = sno_read();
247 unsigned char sno_crc8(unsigned char * data, unsigned long count)
249 unsigned char look_up_table[256] = {
250 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
251 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
252 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
253 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
254 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
255 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
256 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
257 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
258 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
259 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
260 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
261 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
262 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
263 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
264 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
265 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};
267 unsigned char crc = 0;
269 for (i = 0; i < count; i++) {
270 crc = look_up_table[crc ^ data[i]];
281 //diag_printf("presence pulse detected\n");
284 diag_printf("NO presence pulse detected\n");
289 cyg_bool get_esa_1w(cyg_uint8 *buffer)
292 unsigned char mac_data[8] = {0x00,0x00,0x0c,0xc6,0x00,0x00,0x00,0x00};
293 unsigned char crc, status;
296 "ldr r4, =0x00000020;" // mask for GPIO 5
297 "ldr r7, =0x00000040;" // mask for GPIO 6
299 "ldr r5, =0x40e0000c;" // pin dir register
304 "str r6, [r5];" // set GPIO to output
306 "ldr r5, =0x40e00024;" // output clear register
307 "str r4, [r5];" // reset pin
309 "ldr r5, =0x40e00018;" // output set register
310 "str r7, [r5];" // set pin
312 "ldr r5, =0x40e0000c;" // pin dir register
315 "str r6, [r5];" // set GPIO to input
317 "ldr r4, =0x00003c00;"
318 "ldr r5, =0x40e00054;" // alternate function register
321 "str r6, [r5];" // set GPIO to IO function
324 : "r4","r5","r6","r7"
327 HAL_DELAY_US(2000); // 2 msec recovery time
329 // check status of application register
332 diag_printf("no eeprom device for MAC address found \n");
336 sno_write_byte(SNO_SKIP_ROM);
337 sno_write_byte(SNO_READ_STATUS_REG);
338 sno_write_byte(0x00); // validation key
339 status = sno_read_byte();
340 //diag_printf("Status des Application Registers ist: %02X\n", status);
343 diag_printf("no eeprom device for MAC address found \n");
348 diag_printf("No information in Application Register !!!!\n");
349 diag_printf("using defauft MAC 0x00 : 0x0C : 0xC6 : 0x00 : 0x00 : 0x00\n");
350 for (i = 0; i < 6; i++) {
351 buffer[i] = mac_data[i+1];
356 sno_write_byte(SNO_SKIP_ROM);
357 sno_write_byte(SNO_READ_APPLICATION_REG);
358 sno_write_byte(0x00); // register address
359 for (i = 0; i < 8;i++) {
360 mac_data[i] = sno_read_byte();
364 diag_printf("no eeprom device for MAC address found \n");
368 // diag_printf("\nMAC address read from ROM: ");
369 // for (i=0; i<8; i++) {
370 // diag_printf("0x%02X ", mac_data[i]);
374 crc = sno_crc8(mac_data,7);
376 //diag_printf("calculated CRC is: %02X\n", crc );
378 if (crc != mac_data[7]) {
379 diag_printf("ROM data CRC Checksum Error !!!\n\n");
383 for (i = 0; i < 6; i++)
384 buffer[i] = mac_data[i + 1];