xref: /minix/minix/usr.bin/eepromread/board_info.c (revision 7f5f010b)
1 #include <minix/i2c.h>
2 
3 #include <sys/types.h>
4 #include <sys/stat.h>
5 
6 #include <errno.h>
7 #include <fcntl.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include <unistd.h>
12 
13 #include "eepromread.h"
14 
15 /*
16  * Attempt to read the board info from an eeprom on this board.
17  */
18 
19 static int board_info_beaglebone(int fd, i2c_addr_t address, int flags,
20     enum device_types device_type);
21 static int board_info_cape_a0(int fd, i2c_addr_t address, int flags,
22     enum device_types device_type);
23 static int board_info_cape_a1(int fd, i2c_addr_t address, int flags,
24     enum device_types device_type);
25 
26 /* Memory Layout of the BeagleBone and BeagleBone Black EEPROM */
27 typedef struct beaglebone_info
28 {
29 	uint8_t magic_number[4];	/* Should be 0xaa 0x55 0x33 0xee */
30 	char board_name[8];	/* Warning: strings not NULL terminated */
31 	char version[4];
32 	char serial_number[12];
33 	char config[32];	/* All 0x00 on BeagleBone White */
34 	char mac_addrs[3][6];	/* Not set on BeagleBone White */
35 } beaglebone_info_t;
36 
37 /* Memory Layout of the Cape EEPROM (A0 Format) - Defined in BBW SRM Rev A5.3 */
38 typedef struct cape_info_a0
39 {
40 	uint8_t magic_number[4];	/* Should be 0xaa 0x55 0x33 0xee */
41 	char revision[2];	/* Should be 'A' '0' */
42 	char board_name[32];	/* Warning: strings not NULL terminated */
43 	char version[4];
44 	char manufacturer[16];
45 	char partno[16];
46 	char num_pins[2];
47 	char serial[12];
48 	char pin_usage[140];
49 	char vdd_3v3exp_i[2];
50 	char vdd_5v_i[2];
51 	char sys_5v_i[2];
52 	char dc_supp[2];
53 } cape_info_a0_t;
54 
55 /* Memory Layout of the Cape EEPROM (A1 Format) - Defined in BBB SRM Rev A5.3 */
56 typedef struct cape_info_a1
57 {
58 	uint8_t magic_number[4];	/* Should be 0xaa 0x55 0x33 0xee */
59 	char revision[2];	/* Should be 'A' '1' */
60 	char board_name[32];	/* Warning: strings not NULL terminated */
61 	char version[4];
62 	char manufacturer[16];
63 	char partno[16];
64 	char num_pins[2];
65 	char serial[12];
66 	char pin_usage[148];
67 	char vdd_3v3exp_i[2];
68 	char vdd_5v_i[2];
69 	char sys_5v_i[2];
70 	char dc_supp[2];
71 } cape_info_a1_t;
72 
73 static int
74 board_info_beaglebone(int fd, i2c_addr_t address, int flags,
75     enum device_types device_type)
76 {
77 	int r;
78 	int i, j;
79 	char s[33];
80 	beaglebone_info_t boneinfo;
81 
82 	r = eeprom_read(fd, address, 0x0000, &boneinfo,
83 	    sizeof(beaglebone_info_t), flags, device_type);
84 	if (r == -1) {
85 		fprintf(stderr, "Failed to read BeagleBone info r=%d\n", r);
86 		return -1;
87 	}
88 
89 	fprintf(stdout, "%-16s: 0x%x%x%x%x\n", "MAGIC_NUMBER",
90 	    boneinfo.magic_number[0], boneinfo.magic_number[1],
91 	    boneinfo.magic_number[2], boneinfo.magic_number[3]);
92 
93 	memset(s, '\0', 33);
94 	memcpy(s, boneinfo.board_name, 8);
95 	fprintf(stdout, "%-16s: %s\n", "BOARD_NAME", s);
96 
97 	memset(s, '\0', 33);
98 	memcpy(s, boneinfo.version, 4);
99 	fprintf(stdout, "%-16s: %s\n", "VERSION", s);
100 
101 	memset(s, '\0', 33);
102 	memcpy(s, boneinfo.serial_number, 12);
103 	fprintf(stdout, "%-16s: %s\n", "SERIAL_NUMBER", s);
104 
105 	return 0;
106 }
107 
108 static int
109 board_info_cape_a0(int fd, i2c_addr_t address, int flags,
110     enum device_types device_type)
111 {
112 	int r;
113 	int i, j;
114 	char s[33];
115 	cape_info_a0_t capeinfo;
116 
117 	r = eeprom_read(fd, address, 0x0000, &capeinfo,
118 	    sizeof(cape_info_a0_t), flags, device_type);
119 	if (r == -1) {
120 		fprintf(stderr, "failed to read cape A0 info r=%d\n", r);
121 		return -1;
122 	}
123 
124 	fprintf(stdout, "%-16s: 0x%x%x%x%x\n", "MAGIC_NUMBER",
125 	    capeinfo.magic_number[0], capeinfo.magic_number[1],
126 	    capeinfo.magic_number[2], capeinfo.magic_number[3]);
127 
128 	memset(s, '\0', 33);
129 	memcpy(s, capeinfo.revision, 2);
130 	fprintf(stdout, "%-16s: %s\n", "REVISION", s);
131 
132 	memset(s, '\0', 33);
133 	memcpy(s, capeinfo.board_name, 32);
134 	fprintf(stdout, "%-16s: %s\n", "BOARD_NAME", s);
135 
136 	memset(s, '\0', 33);
137 	memcpy(s, capeinfo.version, 4);
138 	fprintf(stdout, "%-16s: %s\n", "VERSION", s);
139 
140 	memset(s, '\0', 33);
141 	memcpy(s, capeinfo.manufacturer, 16);
142 	fprintf(stdout, "%-16s: %s\n", "MANUFACTURER", s);
143 
144 	memset(s, '\0', 33);
145 	memcpy(s, capeinfo.partno, 16);
146 	fprintf(stdout, "%-16s: %s\n", "PART_NUMBER", s);
147 
148 	memset(s, '\0', 33);
149 	memcpy(s, capeinfo.serial, 12);
150 	fprintf(stdout, "%-16s: %s\n", "SERIAL", s);
151 
152 	return 0;
153 }
154 
155 static int
156 board_info_cape_a1(int fd, i2c_addr_t address, int flags,
157     enum device_types device_type)
158 {
159 	int r;
160 	int i, j;
161 	char s[33];
162 	cape_info_a1_t capeinfo;
163 
164 	r = eeprom_read(fd, address, 0x0000, &capeinfo,
165 	    sizeof(cape_info_a1_t), flags, device_type);
166 	if (r == -1) {
167 		fprintf(stderr, "failed to read cape A0 info r=%d\n", r);
168 		return -1;
169 	}
170 
171 	fprintf(stdout, "%-16s: 0x%x%x%x%x\n", "MAGIC_NUMBER",
172 	    capeinfo.magic_number[0], capeinfo.magic_number[1],
173 	    capeinfo.magic_number[2], capeinfo.magic_number[3]);
174 
175 	memset(s, '\0', 33);
176 	memcpy(s, capeinfo.revision, 2);
177 	fprintf(stdout, "%-16s: %s\n", "REVISION", s);
178 
179 	memset(s, '\0', 33);
180 	memcpy(s, capeinfo.board_name, 32);
181 	fprintf(stdout, "%-16s: %s\n", "BOARD_NAME", s);
182 
183 	memset(s, '\0', 33);
184 	memcpy(s, capeinfo.version, 4);
185 	fprintf(stdout, "%-16s: %s\n", "VERSION", s);
186 
187 	memset(s, '\0', 33);
188 	memcpy(s, capeinfo.manufacturer, 16);
189 	fprintf(stdout, "%-16s: %s\n", "MANUFACTURER", s);
190 
191 	memset(s, '\0', 33);
192 	memcpy(s, capeinfo.partno, 16);
193 	fprintf(stdout, "%-16s: %s\n", "PART_NUMBER", s);
194 
195 	memset(s, '\0', 33);
196 	memcpy(s, capeinfo.serial, 12);
197 	fprintf(stdout, "%-16s: %s\n", "SERIAL", s);
198 
199 	return 0;
200 }
201 
202 int
203 board_info(int fd, i2c_addr_t address, int flags,
204     enum device_types device_type)
205 {
206 	int r;
207 	uint8_t magic_number[6];
208 
209 	r = eeprom_read(fd, address, 0x0000, &magic_number, 6, flags,
210 	    device_type);
211 	if (r == -1) {
212 		printf("%-16s: %s\n", "BOARD_NAME", "UNKNOWN");
213 		return 0;
214 	}
215 
216 	/* Check for BeagleBone/BeagleBone Black/Cape Magic Number */
217 	if (magic_number[0] == 0xaa && magic_number[1] == 0x55 &&
218 	    magic_number[2] == 0x33 && magic_number[3] == 0xee) {
219 
220 		/* Check if Cape Rev A0, Cape Rev A1, or on-board EEPROM */
221 		if (magic_number[4] == 'A' && magic_number[5] == '0') {
222 			board_info_cape_a0(fd, address, flags, device_type);
223 		} else if (magic_number[4] == 'A' && magic_number[5] == '1') {
224 			board_info_cape_a1(fd, address, flags, device_type);
225 		} else {
226 			board_info_beaglebone(fd, address, flags, device_type);
227 		}
228 	} else {
229 		printf("%-16s: %s\n", "BOARD_NAME", "UNKNOWN");
230 	}
231 
232 	return 0;
233 }
234