#include </hal/include/device/hal-backend-common.h>
-#define SERIAL_FILE_PATH "/sys/firmware/devicetree/base/serial-number"
-#define LINE_LEN 64
+#define DATA_BUFF_MAX 256
+#define CPUINFO_PATH "/proc/cpuinfo"
+#define SERIAL_TAG "Serial"
+#define LINE_LEN 64
+
+struct board_info {
+ char serial[DATA_BUFF_MAX];
+ int serial_len;
+ int revision;
+};
-static int get_device_serial(char **out)
+static struct board_info info;
+
+static int get_serialno_from_cpuinfo(void)
{
FILE *fp;
- char *line, *p;
+ char line[LINE_LEN], *p, *q;
+ int len;
+
+ fp = fopen(CPUINFO_PATH, "r");
+ if (!fp) {
+ _E("Failed to open %s.", CPUINFO_PATH);
+ return -ENOENT;
+ }
- fp = fopen(SERIAL_FILE_PATH, "r");
- if (!fp)
- return -1;
+ while ((p = fgets(line, sizeof(line), fp)) != NULL) {
+ p = strchr(p, '\t');
+ if (!p)
+ continue;
+
+ *p = '\0';
+ if (strncmp(line, SERIAL_TAG, sizeof(line)) != 0)
+ continue;
+
+ ++p;
+ p = strchr(p, ':');
+ if (!p)
+ continue;
+ p += 2;
+ q = strchrnul(p, '\n');
+ *q = '\0';
+
+ len = strlen(p) > DATA_BUFF_MAX-1 ? DATA_BUFF_MAX-1 : strlen(p);
+ memcpy(info.serial, p, len);
+ info.serial[len] = '\0';
+ info.serial_len = strlen(p);
+
+ fclose(fp);
+ return 0;
+ }
- line = malloc(LINE_LEN);
- p = fgets(line, LINE_LEN, fp);
+ _E("Failed to find serial number from cpuinfo.");
fclose(fp);
- if (p == NULL) {
- free(line);
- return -1;
+ return -EIO;
+}
+
+static int get_device_serial(char **out)
+{
+ int ret;
+ if (info.serial_len > 0 && strlen(info.serial) == info.serial_len) {
+ *out = strdup(info.serial);
+ if (!out) {
+ _E("Out of memory, strdup failed.");
+ return -ENOMEM;
+ }
+ return 0;
}
- *out = p;
- return 0;
+ ret = get_serialno_from_cpuinfo();
+ if (ret < 0) {
+ _E("Failed to find serial number.");
+ return ret;
+ }
+
+ *out = strdup(info.serial);
+ if (!out)
+ _E("Out of memory, strdup failed.");
+
+ return ret;
}
static int board_init(void **data)
hal_backend EXPORT hal_backend_device_board_data = {
.name = "board",
- .vendor = "RPI",
+ .vendor = "VIM3",
.abi_version = HAL_ABI_VERSION_TIZEN_6_5,
.init = board_init,
.exit = board_exit,