diff options
Diffstat (limited to 'modules/devices/devicetree.c')
-rw-r--r-- | modules/devices/devicetree.c | 304 |
1 files changed, 0 insertions, 304 deletions
diff --git a/modules/devices/devicetree.c b/modules/devices/devicetree.c deleted file mode 100644 index 4f3c85a2..00000000 --- a/modules/devices/devicetree.c +++ /dev/null @@ -1,304 +0,0 @@ -/* - * HardInfo - Displays System Information - * Copyright (C) 2003-2007 Leandro A. F. Pereira <leandro@hardinfo.org> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, version 2. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ -/* - * Device Tree support by Burt P. <pburt0@gmail.com> - * Sources: - * http://elinux.org/Device_Tree_Usage - * http://elinux.org/Device_Tree_Mysteries - */ -#include <unistd.h> -#include <sys/types.h> -#include <stdint.h> -#include "hardinfo.h" -#include "devices.h" -#include "cpu_util.h" -#include "dt_util.h" - -/* These should really go into CMakeLists.txt */ -#if defined(__arm__) -#include "devicetree/rpi_data.c" -#elif defined(__powerpc__) -#include "devicetree/pmac_data.c" -#endif - -gchar *dtree_info = NULL; - -static gchar *get_node(dtr *dt, char *np) { - gchar *nodes = NULL, *props = NULL, *ret = NULL; - gchar *tmp = NULL, *pstr = NULL, *lstr = NULL; - gchar *dir_path; - gchar *node_path; - const gchar *fn; - GDir *dir; - dtr_obj *node, *child; - - props = g_strdup_printf("[%s]\n", _("Properties") ); - nodes = g_strdup_printf("[%s]\n", _("Children") ); - node = dtr_obj_read(dt, np); - dir_path = dtr_obj_full_path(node); - - dir = g_dir_open(dir_path, 0 , NULL); - if (dir) { - while((fn = g_dir_read_name(dir)) != NULL) { - child = dtr_get_prop_obj(dt, node, fn); - pstr = hardinfo_clean_value(dtr_str(child), 1); - lstr = hardinfo_clean_label(fn, 0); - if (dtr_obj_type(child) == DT_NODE) { - tmp = g_strdup_printf("%s%s=%s\n", - nodes, lstr, pstr); - g_free(nodes); - nodes = tmp; - } else { - tmp = g_strdup_printf("%s%s=%s\n", - props, lstr, pstr); - g_free(props); - props = tmp; - } - dtr_obj_free(child); - g_free(pstr); - g_free(lstr); - } - } - g_dir_close(dir); - g_free(dir_path); - - lstr = dtr_obj_alias(node); - pstr = dtr_obj_symbol(node); - ret = g_strdup_printf("[%s]\n" - "%s=%s\n" - "%s=%s\n" - "%s=%s\n" - "%s%s", - _("Node"), - _("Node Path"), dtr_obj_path(node), - _("Alias"), (lstr != NULL) ? lstr : _("(None)"), - _("Symbol"), (pstr != NULL) ? pstr : _("(None)"), - props, nodes); - - dtr_obj_free(node); - g_free(props); - g_free(nodes); - - return ret; -} - -/* different from dtr_get_string() in that it re-uses the existing dt */ -static char *get_dt_string(dtr *dt, char *path, gboolean decode) { - char *ret; - - if (decode) { - dtr_obj *obj = dtr_get_prop_obj(dt, NULL, path); - - ret = dtr_str(obj); - - dtr_obj_free(obj); - } else { - ret = dtr_get_prop_str(dt, NULL, path); - } - - return ret; -} - -static gchar *get_summary(dtr *dt) { - char *model = NULL, *compat = NULL; - char *ret = NULL; - - model = get_dt_string(dt, "/model", 0); - compat = get_dt_string(dt, "/compatible", 1); - UNKIFNULL(model); - EMPIFNULL(compat); - -#if defined(__arm__) - /* Expand on the DT information from known machines, like RPi. - * RPi stores a revision value in /proc/cpuinfo that can be used - * to look up details. This is just a nice place to pull it all - * together for DT machines, with a nice fallback. - * PPC Macs could be handled this way too. They store - * machine identifiers in /proc/cpuinfo. */ - if (strstr(model, "Raspberry Pi") - || strstr(compat, "raspberrypi")) { - gchar *gpu_compat = get_dt_string(dt, "/soc/gpu/compatible", 1); - gchar *rpi_details = rpi_board_details(); - gchar *basic_info; - - basic_info = g_strdup_printf( - "[%s]\n" - "%s=%s\n" - "%s=%s\n", - _("Platform"), - _("Compatible"), compat, - _("GPU-compatible"), gpu_compat); - - if (rpi_details) { - ret = g_strconcat(rpi_details, basic_info, NULL); - - g_free(rpi_details); - } else { - gchar *serial_number = get_dt_string(dt, "/serial-number", 1); - - ret = g_strdup_printf( - "[%s]\n" - "%s=%s\n" - "%s=%s\n" - "%s=%s\n" - "%s", - _("Raspberry Pi or Compatible"), - _("Model"), model, - _("Serial Number"), serial_number, - _("RCode"), _("No revision code available; unable to lookup model details."), - basic_info); - - g_free(serial_number); - } - - g_free(gpu_compat); - g_free(basic_info); - } -#endif - -#if defined(__powerpc__) - /* Power Macintosh */ - if (strstr(compat, "PowerBook") != NULL - || strstr(compat, "MacRISC") != NULL - || strstr(compat, "Power Macintosh") != NULL) { - gchar *mac_details = ppc_mac_details(); - - if (mac_details) { - gchar *serial_number = get_dt_string(dt, "/serial-number", 1); - - ret = g_strdup_printf( - "%s[%s]\n" - "%s=%s\n", - mac_details, - _("More"), - _("Serial Number"), serial_number); - - free(mac_details); - free(serial_number); - } - } -#endif - - /* fallback */ - if (!ret) { - gchar *serial_number = get_dt_string(dt, "/serial-number", 1); - EMPIFNULL(serial_number); - ret = g_strdup_printf( - "[%s]\n" - "%s=%s\n" - "%s=%s\n" - "%s=%s\n", - _("Board"), - _("Model"), model, - _("Serial Number"), serial_number, - _("Compatible"), compat); - free(serial_number); - } - - free(model); - free(compat); - - return ret; -} - -static void mi_add(const char *key, const char *value) { - gchar *ckey, *rkey; - - ckey = hardinfo_clean_label(key, 0); - rkey = g_strdup_printf("%s:%s", "DTREE", ckey); - - dtree_info = h_strdup_cprintf("$%s$%s=\n", dtree_info, rkey, ckey); - moreinfo_add_with_prefix("DEV", rkey, g_strdup(value)); - - g_free(ckey); - g_free(rkey); -} - -static void add_keys(dtr *dt, char *np) { - gchar *dir_path, *dt_path; - gchar *ftmp, *ntmp; - gchar *n_info; - const gchar *fn; - GDir *dir; - dtr_obj *obj; - - /* add self */ - obj = dtr_obj_read(dt, np); - dt_path = dtr_obj_path(obj); - n_info = get_node(dt, dt_path); - mi_add(dt_path, n_info); - - dir_path = g_strdup_printf("%s/%s", dtr_base_path(dt), np); - dir = g_dir_open(dir_path, 0 , NULL); - if (dir) { - while((fn = g_dir_read_name(dir)) != NULL) { - ftmp = g_strdup_printf("%s/%s", dir_path, fn); - if ( g_file_test(ftmp, G_FILE_TEST_IS_DIR) ) { - if (strcmp(np, "/") == 0) - ntmp = g_strdup_printf("/%s", fn); - else - ntmp = g_strdup_printf("%s/%s", np, fn); - add_keys(dt, ntmp); - g_free(ntmp); - } - g_free(ftmp); - } - } - g_dir_close(dir); -} - -static char *msg_section(dtr *dt, int dump) { - gchar *aslbl = NULL; - gchar *messages = dtr_messages(dt); - gchar *ret = g_strdup_printf("[%s]\n", _("Messages")); - gchar **lines = g_strsplit(messages, "\n", 0); - int i = 0; - while(lines[i] != NULL) { - aslbl = hardinfo_clean_label(lines[i], 0); - ret = appf(ret, "%s=\n", aslbl); - g_free(aslbl); - i++; - } - g_strfreev(lines); - if (dump) - printf("%s", messages); - g_free(messages); - return ret; -} - -void __scan_dtree() -{ - dtr *dt = dtr_new(NULL); - gchar *summary = get_summary(dt); - gchar *maps = dtr_maps_info(dt); - gchar *messages = NULL; - - dtree_info = g_strdup("[Device Tree]\n"); - mi_add("Summary", summary); - mi_add("Maps", maps); - - if(dtr_was_found(dt)) - add_keys(dt, "/"); - messages = msg_section(dt, 0); - mi_add("Messages", messages); - - g_free(summary); - g_free(maps); - g_free(messages); - dtr_free(dt); -} |