Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | /* SPDX-License-Identifier: GPL-2.0+ * * (C) Copyright 2018 * Microchip Technology, Inc. * Eugen Hristev <eugen.hristev@microchip.com> */ #include <common.h> #include <command.h> #include <w1.h> #include <w1-eeprom.h> #include <dm/device-internal.h> static int w1_bus(void) { struct udevice *bus, *dev; int ret; ret = w1_get_bus(0, &bus); if (ret) { printf("one wire interface not found\n"); return CMD_RET_FAILURE; } printf("Bus %d:\t%s", bus->seq, bus->name); if (device_active(bus)) printf(" (active)"); printf("\n"); for (device_find_first_child(bus, &dev); dev; device_find_next_child(&dev)) { ret = device_probe(dev); printf("\t%s (%d) uclass %s : ", dev->name, dev->seq, dev->uclass->uc_drv->name); if (ret) printf("device error\n"); else printf("family 0x%x\n", w1_get_device_family(dev)); } return CMD_RET_SUCCESS; } static int w1_read(int argc, char *const argv[]) { int bus_n = 0, dev_n = 0, offset = 0, len = 512; int i; struct udevice *bus, *dev; int ret; u8 buf[512]; if (argc > 2) bus_n = simple_strtoul(argv[2], NULL, 10); if (argc > 3) dev_n = simple_strtoul(argv[3], NULL, 10); if (argc > 4) offset = simple_strtoul(argv[4], NULL, 10); if (argc > 5) len = simple_strtoul(argv[5], NULL, 10); if (len > 512) { printf("len needs to be <= 512\n"); return CMD_RET_FAILURE; } ret = w1_get_bus(bus_n, &bus); if (ret) { printf("one wire interface not found\n"); return CMD_RET_FAILURE; } for (device_find_first_child(bus, &dev), i = 0; dev && i <= dev_n; device_find_next_child(&dev), i++) { ret = device_probe(dev); if (!ret && i == dev_n) break; } if (i != dev_n || ret || !dev) { printf("invalid dev\n"); return CMD_RET_FAILURE; } if (strcmp(dev->uclass->uc_drv->name, "w1_eeprom")) { printf("the device present on the interface is of unknown device class\n"); return CMD_RET_FAILURE; } ret = w1_eeprom_read_buf(dev, offset, (u8 *)buf, len); if (ret) { printf("error reading device %s\n", dev->name); return CMD_RET_FAILURE; } for (i = 0; i < len; i++) printf("%x", buf[i]); printf("\n"); return CMD_RET_SUCCESS; } int do_w1(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) { if (argc < 2) return CMD_RET_USAGE; if (!strcmp(argv[1], "bus")) return w1_bus(); if (!strcmp(argv[1], "read")) return w1_read(argc, argv); return CMD_RET_SUCCESS; } U_BOOT_CMD(w1, 6, 0, do_w1, "onewire interface utility commands", "bus - show onewire bus info (all)\n" "w1 read [<bus> [<dev> [offset [length]]]]" " - read from onewire device 'dev' on onewire bus 'bus'" " starting from offset 'offset' and length 'length'\n" " defaults: bus 0, dev 0, offset 0, length 512 bytes."); |