kp_id_rev.c 2.6 KB

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