]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - board/kup/common/load_sernum_ethaddr.c
Merge branch 'u-boot/master' into u-boot-arm/master
[karo-tx-uboot.git] / board / kup / common / load_sernum_ethaddr.c
1 /*
2  * (C) Copyright 2000-2004
3  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4  *
5  * SPDX-License-Identifier:     GPL-2.0+
6  */
7
8 #include <common.h>
9 #include <mpc8xx.h>
10
11 /*-----------------------------------------------------------------------
12  * Process Hardware Information Block:
13  *
14  * If we boot on a system fresh from factory, check if the Hardware
15  * Information Block exists and save the information it contains.
16  *
17  * The KUP Hardware Information Block is defined as
18  * follows:
19  * - located in first flash bank
20  * - starts at offset CONFIG_SYS_HWINFO_OFFSET
21  * - size CONFIG_SYS_HWINFO_SIZE
22  *
23  * Internal structure:
24  * - sequence of ASCII character lines
25  * - fields separated by <CR><LF>
26  * - last field terminated by NUL character (0x00)
27  *
28  * Fields in Hardware Information Block:
29  * 1) Module Type
30  * 2) MAC Address
31  * 3) ....
32  */
33
34
35 #define ETHADDR_TOKEN "ethaddr="
36 #define LCD_TOKEN "lcd="
37
38 void load_sernum_ethaddr (void)
39 {
40         unsigned char *hwi;
41         char *var;
42         unsigned char hwi_stack[CONFIG_SYS_HWINFO_SIZE];
43         char *p;
44
45         hwi = (unsigned char *) (CONFIG_SYS_FLASH_BASE + CONFIG_SYS_HWINFO_OFFSET);
46         if (*((unsigned long *) hwi) != (unsigned long) CONFIG_SYS_HWINFO_MAGIC) {
47                 printf ("HardwareInfo not found!\n");
48                 return;
49         }
50         memcpy (hwi_stack, hwi, CONFIG_SYS_HWINFO_SIZE);
51
52         /*
53          ** ethaddr
54          */
55         var = strstr ((char *)hwi_stack, ETHADDR_TOKEN);
56         if (var) {
57                 var += sizeof (ETHADDR_TOKEN) - 1;
58                 p = strchr (var, '\r');
59                 if ((unsigned char *)p < hwi + CONFIG_SYS_HWINFO_SIZE) {
60                         *p = '\0';
61                         setenv ("ethaddr", var);
62                         *p = '\r';
63                 }
64         }
65         /*
66          ** lcd
67          */
68         var = strstr ((char *)hwi_stack, LCD_TOKEN);
69         if (var) {
70                 var += sizeof (LCD_TOKEN) - 1;
71                 p = strchr (var, '\r');
72                 if ((unsigned char *)p < hwi + CONFIG_SYS_HWINFO_SIZE) {
73                         *p = '\0';
74                         setenv ("lcd", var);
75                         *p = '\r';
76                 }
77         }
78 }