1 /******************************************************************************\r
2 * Copyright (c) 2019 Texas Instruments Incorporated - http://www.ti.com\r
3 *\r
4 * Redistribution and use in source and binary forms, with or without\r
5 * modification, are permitted provided that the following conditions\r
6 * are met:\r
7 *\r
8 * Redistributions of source code must retain the above copyright\r
9 * notice, this list of conditions and the following disclaimer.\r
10 *\r
11 * Redistributions in binary form must reproduce the above copyright\r
12 * notice, this list of conditions and the following disclaimer in the\r
13 * documentation and/or other materials provided with the\r
14 * distribution.\r
15 *\r
16 * Neither the name of Texas Instruments Incorporated nor the names of\r
17 * its contributors may be used to endorse or promote products derived\r
18 * from this software without specific prior written permission.\r
19 *\r
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
31 *\r
32 *****************************************************************************/\r
33 \r
34 /**\r
35 * \file board_info.c\r
36 *\r
37 * \brief This file contains the functions to read/write board info data \r
38 *\r
39 */\r
40 \r
41 #include "board_utils.h"\r
42 #include "board_internal.h"\r
43 #include "board_cfg.h"\r
44 #include <stdio.h>\r
45 #include <string.h>\r
46 \r
47 extern Board_I2cInitCfg_t gBoardI2cInitCfg;\r
48 \r
49 /**\r
50 * @brief This function is not supported by this platform.\r
51 *\r
52 * Function implementation for build backward compatibilty.\r
53 * Always returns 'BOARD_UNSUPPORTED_FEATURE'\r
54 *\r
55 */\r
56 Board_STATUS Board_getIDInfo(Board_IDInfo *info)\r
57 {\r
58 return BOARD_UNSUPPORTED_FEATURE;\r
59 }\r
60 \r
61 /**\r
62 * @brief Get board information.\r
63 * \r
64 * This function requires the information of I2C instance and domain\r
65 * to which board ID EEPROM is connected. This need to be set using\r
66 * Board_setI2cInitConfig() before calling this function.\r
67 *\r
68 * @param[out] Board_STATUS\r
69 * Returns status on API call\r
70 * @param[out] info\r
71 * This structure will have board information on return\r
72 * @param[in] slaveAddress\r
73 * I2C slave address of EEPROM to be read\r
74 *\r
75 */\r
76 Board_STATUS Board_getIDInfo_v2(Board_IDInfo_v2 *info, uint8_t slaveAddress)\r
77 {\r
78 Board_STATUS ret = BOARD_SOK;\r
79 I2C_Transaction i2cTransaction;\r
80 I2C_Handle handle = NULL;\r
81 uint16_t offsetAddress = BOARD_EEPROM_HEADER_ADDR;\r
82 uint8_t rdBuff[3];\r
83 char txBuf[2] = {0x00, 0x00};\r
84 bool status;\r
85 \r
86 I2C_transactionInit(&i2cTransaction);\r
87 \r
88 handle = Board_getI2CHandle(gBoardI2cInitCfg.socDomain,\r
89 gBoardI2cInitCfg.i2cInst);\r
90 if(handle == NULL)\r
91 {\r
92 ret = BOARD_I2C_OPEN_FAIL;\r
93 }\r
94 \r
95 i2cTransaction.slaveAddress = slaveAddress;\r
96 i2cTransaction.writeBuf = (uint8_t *)&txBuf[0];\r
97 i2cTransaction.writeCount = 2;\r
98 \r
99 /* Get header info */\r
100 txBuf[0] = (char)(((uint32_t) 0xFF00 & offsetAddress)>>8);\r
101 txBuf[1] = (char)((uint32_t) 0xFF & offsetAddress);\r
102 i2cTransaction.readBuf = &info->headerInfo;\r
103 i2cTransaction.readCount = BOARD_EEPROM_HEADER_FIELD_SIZE;\r
104 \r
105 status = I2C_transfer(handle, &i2cTransaction);\r
106 if (status == false)\r
107 {\r
108 ret = BOARD_I2C_TRANSFER_FAIL;\r
109 Board_i2cDeInit();\r
110 return ret;\r
111 }\r
112 \r
113 /* Checking whether the board contents are flashed or not */\r
114 if (info->headerInfo.magicNumber == BOARD_EEPROM_MAGIC_NUMBER)\r
115 {\r
116 offsetAddress = offsetAddress + i2cTransaction.readCount;\r
117 txBuf[0] = (char)(((uint32_t) 0xFF00 & offsetAddress) >> 8);\r
118 txBuf[1] = (char)((uint32_t) 0xFF & offsetAddress);\r
119 i2cTransaction.readBuf = &info->boardInfo;\r
120 i2cTransaction.readCount = BOARD_EEPROM_TYPE_SIZE +\r
121 BOARD_EEPROM_STRUCT_LENGTH_SIZE;\r
122 status = I2C_transfer(handle, &i2cTransaction);\r
123 if (status == false)\r
124 {\r
125 ret = BOARD_I2C_TRANSFER_FAIL;\r
126 Board_i2cDeInit();\r
127 return ret;\r
128 }\r
129 \r
130 offsetAddress = offsetAddress + i2cTransaction.readCount;\r
131 txBuf[0] = (char)(((uint32_t) 0xFF00 & offsetAddress) >> 8);\r
132 txBuf[1] = (char)((uint32_t) 0xFF & offsetAddress);\r
133 i2cTransaction.readBuf = info->boardInfo.boardName;\r
134 i2cTransaction.readCount = info->boardInfo.boardInfoLength;\r
135 \r
136 status = I2C_transfer(handle, &i2cTransaction);\r
137 if (status == false)\r
138 {\r
139 ret = BOARD_I2C_TRANSFER_FAIL;\r
140 Board_i2cDeInit();\r
141 return ret;\r
142 }\r
143 \r
144 offsetAddress = offsetAddress + i2cTransaction.readCount;\r
145 txBuf[0] = (char)(((uint32_t) 0xFF00 & offsetAddress) >> 8);\r
146 txBuf[1] = (char)((uint32_t) 0xFF & offsetAddress);\r
147 i2cTransaction.readBuf = &rdBuff[0];\r
148 i2cTransaction.readCount = BOARD_EEPROM_TYPE_SIZE +\r
149 BOARD_EEPROM_STRUCT_LENGTH_SIZE;\r
150 \r
151 status = I2C_transfer(handle, &i2cTransaction);\r
152 if (status == false)\r
153 {\r
154 ret = BOARD_I2C_TRANSFER_FAIL;\r
155 Board_i2cDeInit();\r
156 return ret;\r
157 }\r
158 \r
159 /* Checking whether DDR field is present or not */\r
160 if (rdBuff[0] == BOARD_DDR_FIELD_TYPE)\r
161 {\r
162 memcpy(&info->ddrInfo, &rdBuff[0], sizeof(rdBuff));\r
163 \r
164 offsetAddress = offsetAddress + i2cTransaction.readCount;\r
165 txBuf[0] = (char)(((uint32_t) 0xFF00 & offsetAddress)>>8);\r
166 txBuf[1] = (char)((uint32_t) 0xFF & offsetAddress);\r
167 i2cTransaction.readBuf = &info->ddrInfo.ddrCtrl;\r
168 i2cTransaction.readCount = info->ddrInfo.ddrStructLen;\r
169 \r
170 status = I2C_transfer(handle, &i2cTransaction);\r
171 if (status == false)\r
172 {\r
173 ret = BOARD_I2C_TRANSFER_FAIL;\r
174 Board_i2cDeInit();\r
175 return ret;\r
176 }\r
177 \r
178 offsetAddress = offsetAddress + i2cTransaction.readCount;\r
179 txBuf[0] = (char)(((uint32_t) 0xFF00 & offsetAddress) >> 8);\r
180 txBuf[1] = (char)((uint32_t) 0xFF & offsetAddress);\r
181 i2cTransaction.readBuf = &rdBuff[0];\r
182 i2cTransaction.readCount = BOARD_EEPROM_TYPE_SIZE +\r
183 BOARD_EEPROM_STRUCT_LENGTH_SIZE;\r
184 status = I2C_transfer(handle, &i2cTransaction);\r
185 if (status == false)\r
186 {\r
187 ret = BOARD_I2C_TRANSFER_FAIL;\r
188 Board_i2cDeInit();\r
189 return ret;\r
190 }\r
191 }\r
192 \r
193 /* Checking whether MAC id field is present or not */\r
194 if(rdBuff[0] == BOARD_MACINFO_FIELD_TYPE)\r
195 {\r
196 memcpy(&info->macInfo, &rdBuff[0], sizeof(rdBuff));\r
197 \r
198 offsetAddress = offsetAddress + i2cTransaction.readCount;\r
199 txBuf[0] = (char)(((uint32_t) 0xFF00 & offsetAddress) >> 8);\r
200 txBuf[1] = (char)((uint32_t) 0xFF & offsetAddress);\r
201 i2cTransaction.readBuf = &info->macInfo.macControl;\r
202 i2cTransaction.readCount = info->macInfo.macLength;\r
203 \r
204 status = I2C_transfer(handle, &i2cTransaction);\r
205 if (status == false)\r
206 {\r
207 ret = BOARD_I2C_TRANSFER_FAIL;\r
208 Board_i2cDeInit();\r
209 return ret;\r
210 }\r
211 \r
212 offsetAddress = offsetAddress + i2cTransaction.readCount;\r
213 txBuf[0] = (char)(((uint32_t) 0xFF00 & offsetAddress)>>8);\r
214 txBuf[1] = (char)((uint32_t) 0xFF & offsetAddress);\r
215 i2cTransaction.readBuf = &rdBuff[0];\r
216 i2cTransaction.readCount = BOARD_EEPROM_TYPE_SIZE;\r
217 \r
218 status = I2C_transfer(handle, &i2cTransaction);\r
219 if (status == false)\r
220 {\r
221 ret = BOARD_I2C_TRANSFER_FAIL;\r
222 Board_i2cDeInit();\r
223 return ret;\r
224 }\r
225 }\r
226 \r
227 if(rdBuff[0] == BOARD_ENDLIST)\r
228 {\r
229 info->endList = rdBuff[0];\r
230 }\r
231 }\r
232 else\r
233 {\r
234 ret = BOARD_INVALID_PARAM;\r
235 Board_i2cDeInit();\r
236 return ret;\r
237 }\r
238 \r
239 Board_i2cDeInit();\r
240 \r
241 return ret;\r
242 }\r
243 \r
244 /**\r
245 * @brief This function is not supported by this platform.\r
246 *\r
247 * Function implementation for build backward compatibilty.\r
248 * Always returns 'BOARD_UNSUPPORTED_FEATURE'\r
249 *\r
250 */\r
251 Board_STATUS Board_writeIDInfo(Board_IDInfo *info)\r
252 {\r
253 return BOARD_UNSUPPORTED_FEATURE;\r
254 }\r
255 \r
256 /**\r
257 * @brief Write board id contents to specific EEPROM.\r
258 *\r
259 * This function requires the information of I2C instance and domain\r
260 * to which board ID EEPROM is connected. This need to be set using\r
261 * Board_setI2cInitConfig() before calling this function.\r
262 *\r
263 * @param[out] Board_STATUS\r
264 * Returns status on API call\r
265 * @param[out] info\r
266 * Structure contain board id contents to write\r
267 * @param[in] slaveAddress\r
268 * Address of eeprom\r
269 *\r
270 */\r
271 Board_STATUS Board_writeIDInfo_v2(Board_IDInfo_v2 *info, uint8_t slaveAddress)\r
272 {\r
273 Board_STATUS ret = BOARD_SOK;\r
274 I2C_Transaction i2cTransaction;\r
275 I2C_Handle handle = NULL;\r
276 uint16_t offsetAddress = BOARD_EEPROM_HEADER_ADDR;\r
277 char txBuf[BOARD_EEPROM_MAX_BUFF_LENGTH + 2 + 1];\r
278 bool status;\r
279 \r
280 /* Checking the structure is valid or not */\r
281 if (info->headerInfo.magicNumber != BOARD_EEPROM_MAGIC_NUMBER)\r
282 {\r
283 ret = BOARD_INVALID_PARAM;\r
284 return ret;\r
285 }\r
286 \r
287 I2C_transactionInit(&i2cTransaction);\r
288 \r
289 handle = Board_getI2CHandle(gBoardI2cInitCfg.socDomain,\r
290 gBoardI2cInitCfg.i2cInst);\r
291 if(handle == NULL)\r
292 {\r
293 ret = BOARD_I2C_OPEN_FAIL;\r
294 }\r
295 \r
296 /* Transferring Header and Board Info field */\r
297 i2cTransaction.slaveAddress = slaveAddress;\r
298 i2cTransaction.writeBuf = &txBuf[0];\r
299 i2cTransaction.writeCount = BOARD_EEPROM_HEADER_FIELD_SIZE +\r
300 BOARD_EEPROM_TYPE_SIZE +\r
301 BOARD_EEPROM_STRUCT_LENGTH_SIZE +\r
302 info->boardInfo.boardInfoLength;\r
303 txBuf[0] = (char)(((uint32_t) 0xFF00 & offsetAddress) >> 8);\r
304 txBuf[1] = (char)((uint32_t) 0xFF & offsetAddress);\r
305 memcpy(&txBuf[2], &info->headerInfo, i2cTransaction.writeCount);\r
306 \r
307 i2cTransaction.readBuf = NULL;\r
308 i2cTransaction.readCount = 0;\r
309 \r
310 status = I2C_transfer(handle, &i2cTransaction);\r
311 if (status == false)\r
312 {\r
313 ret = BOARD_I2C_TRANSFER_FAIL;\r
314 Board_i2cDeInit();\r
315 return ret;\r
316 }\r
317 \r
318 /* Checking whether DDR field is included or not */\r
319 if (info->ddrInfo.ddrStructType == BOARD_DDR_FIELD_TYPE)\r
320 {\r
321 offsetAddress = offsetAddress + i2cTransaction.writeCount;\r
322 i2cTransaction.writeCount = info->ddrInfo.ddrStructLen +\r
323 BOARD_EEPROM_TYPE_SIZE +\r
324 BOARD_EEPROM_STRUCT_LENGTH_SIZE;\r
325 txBuf[0] = (char)(((uint32_t) 0xFF00 & offsetAddress) >> 8);\r
326 txBuf[1] = (char)((uint32_t) 0xFF & offsetAddress);\r
327 memcpy(&txBuf[2], &info->ddrInfo, i2cTransaction.writeCount);\r
328 \r
329 status = I2C_transfer(handle, &i2cTransaction);\r
330 if (status == false)\r
331 {\r
332 ret = BOARD_I2C_TRANSFER_FAIL;\r
333 Board_i2cDeInit();\r
334 return ret;\r
335 }\r
336 }\r
337 \r
338 /* Checking whether MAC id field is included or not */\r
339 if (info->macInfo.macStructType == BOARD_MACINFO_FIELD_TYPE)\r
340 {\r
341 offsetAddress = offsetAddress + i2cTransaction.writeCount;\r
342 i2cTransaction.writeCount = info->macInfo.macLength +\r
343 BOARD_EEPROM_TYPE_SIZE +\r
344 BOARD_EEPROM_STRUCT_LENGTH_SIZE;\r
345 txBuf[0] = (char)(((uint32_t) 0xFF00 & offsetAddress) >> 8);\r
346 txBuf[1] = (char)((uint32_t) 0xFF & offsetAddress);\r
347 memcpy(&txBuf[2], &info->macInfo, i2cTransaction.writeCount);\r
348 \r
349 status = I2C_transfer(handle, &i2cTransaction);\r
350 if (status == false)\r
351 {\r
352 ret = BOARD_I2C_TRANSFER_FAIL;\r
353 Board_i2cDeInit();\r
354 return ret;\r
355 }\r
356 }\r
357 \r
358 offsetAddress = offsetAddress + i2cTransaction.writeCount;\r
359 i2cTransaction.writeCount = BOARD_EEPROM_TYPE_SIZE;\r
360 txBuf[0] = (char)(((uint32_t) 0xFF00 & offsetAddress)>>8);\r
361 txBuf[1] = (char)((uint32_t) 0xFF & offsetAddress);\r
362 memcpy(&txBuf[2], &info->endList, i2cTransaction.writeCount);\r
363 \r
364 status = I2C_transfer(handle, &i2cTransaction);\r
365 if (status == false)\r
366 {\r
367 ret = BOARD_I2C_TRANSFER_FAIL;\r
368 Board_i2cDeInit();\r
369 return ret;\r
370 }\r
371 \r
372 Board_i2cDeInit();\r
373 return ret;\r
374 }\r