kp_id_rev.c 2.5 KB

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