1 /* 2 * Copyright (C) 2018 3 * Lukasz Majewski, DENX Software Engineering, lukma@denx.de 4 * 5 * Based on code developed by: 6 * 7 * Copyright (C) 2012 TQ-Systems GmbH 8 * Daniel Gericke <daniel.gericke@tqs.de> 9 * 10 * SPDX-License-Identifier: GPL-2.0+ 11 */ 12 13 #include <common.h> 14 #include <environment.h> 15 #include <i2c.h> 16 #include "kp_id_rev.h" 17 18 static int eeprom_has_been_read; 19 static struct id_eeprom eeprom; 20 21 void show_eeprom(void) 22 { 23 char safe_string[33]; 24 int i; 25 u8 *p; 26 27 puts("Module EEPROM:\n"); 28 /* ID */ 29 for (i = 0; i <= sizeof(eeprom.id) && 0xff != eeprom.id[i]; ++i) 30 safe_string[i] = eeprom.id[i]; 31 safe_string[i] = '\0'; 32 33 if (!strncmp(safe_string, "TQM", 3)) { 34 printf(" ID: %s\n", safe_string); 35 env_set("boardtype", safe_string); 36 } else { 37 puts(" unknown hardware variant\n"); 38 } 39 40 /* Serial number */ 41 for (i = 0; (sizeof(eeprom.serial) >= i) && 42 (eeprom.serial[i] >= 0x30) && 43 (eeprom.serial[i] <= 0x39); ++i) 44 safe_string[i] = eeprom.serial[i]; 45 safe_string[i] = '\0'; 46 47 if (strlen(safe_string) == 8) { 48 printf(" SN: %s\n", safe_string); 49 env_set("serial#", safe_string); 50 } else { 51 puts(" unknown serial number\n"); 52 } 53 54 /* MAC address */ 55 p = eeprom.mac; 56 if (!is_valid_ethaddr(p)) { 57 printf(" Not valid ETH EEPROM addr!\n"); 58 return; 59 } 60 61 printf(" MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", 62 p[0], p[1], p[2], p[3], p[4], p[5]); 63 64 eth_env_set_enetaddr("ethaddr", p); 65 } 66 67 int read_eeprom(void) 68 { 69 struct udevice *dev; 70 int ret; 71 72 if (eeprom_has_been_read) 73 return 0; 74 75 ret = i2c_get_chip_for_busnum(CONFIG_SYS_EEPROM_BUS_NUM, 76 CONFIG_SYS_I2C_EEPROM_ADDR, 77 CONFIG_SYS_I2C_EEPROM_ADDR_LEN, &dev); 78 if (ret) { 79 printf("Cannot find EEPROM !\n"); 80 return ret; 81 } 82 83 ret = dm_i2c_read(dev, 0x0, (uchar *)&eeprom, sizeof(eeprom)); 84 85 eeprom_has_been_read = (ret == 0) ? 1 : 0; 86 return ret; 87 } 88 89 int read_board_id(void) 90 { 91 unsigned char rev_id = 0x42; 92 char rev_str[32], buf[8]; 93 struct udevice *dev; 94 int ret; 95 96 ret = i2c_get_chip_for_busnum(2, 0x22, 1, &dev); 97 if (ret) { 98 printf("Cannot find pcf8574 IO expander !\n"); 99 return ret; 100 } 101 102 dm_i2c_read(dev, 0x0, &rev_id, sizeof(rev_id)); 103 104 sprintf(rev_str, "%02X", rev_id); 105 if (rev_id & 0x80) { 106 printf("BBoard:4x00 Rev:%s\n", rev_str); 107 env_set("boardtype", "ddc"); 108 env_set("fit_config", "imx53_kb_conf"); 109 } else { 110 printf("BBoard:40x0 Rev:%s\n", rev_str); 111 env_set("boardtype", "hsc"); 112 env_set("fit_config", "imx53_kb_40x0_conf"); 113 } 114 115 sprintf(buf, "kp-%s", env_get("boardtype")); 116 env_set("boardname", buf); 117 env_set("boardsoc", "imx53"); 118 env_set("kb53_rev", rev_str); 119 120 return 0; 121 } 122