static int do_components(int argc, const char **argv) { VC_MEM_ACCESS_HANDLE_T vc; VC_MEM_ADDR_T addr, statsaddr; size_t size; MMAL_VC_STATS_T stats; int rc; if (argc > 2 && (strcasecmp(argv[2], "update") == 0)) { MMAL_STATUS_T status; do_connect(); status = mmal_vc_get_stats(&stats, 0); if (status != MMAL_SUCCESS) { fprintf(stderr, "Failed to update MMAL stats. error %s", mmal_status_to_string(status)); return -1; } } else { if ((rc = OpenVideoCoreMemory(&vc)) < 0) { fprintf(stderr,"Unable to open videocore memory: %d\n", rc); return -1; } if (!LookupVideoCoreSymbol(vc, "mmal_vc_stats", &addr, &size)) { fprintf(stderr,"Could not get MMAL stats address\n"); goto fail; } if (!ReadVideoCoreUInt32(vc, &statsaddr, addr)) { fprintf(stderr,"Could not read MMAL stats pointer at address 0x%x\n", addr); goto fail; } if (!ReadVideoCoreMemory(vc, &stats, statsaddr, sizeof(stats))) { fprintf(stderr,"Could not read MMAL stats at address 0x%x\n", addr); goto fail; } CloseVideoCoreMemory(vc); } rc = print_component_stats(&stats); return rc; fail: CloseVideoCoreMemory(vc); return -1; }
static int do_stats(int argc, const char **argv) { MMAL_VC_STATS_T stats; int reset_stats = strcasecmp(argv[1], "reset") == 0; MMAL_STATUS_T st = mmal_vc_get_stats(&stats, reset_stats); int ret; (void)argc; (void)argv; if (st != MMAL_SUCCESS) { fprintf(stderr, "error getting status (%i,%s)\n", st, mmal_status_to_string(st)); ret = -1; } else { unsigned i; uint32_t *ptr = (uint32_t*)&stats; for (i=0; i<vcos_countof(stats_fields); i++) { printf("%-32s: %u\n", stats_fields[i].name, ptr[stats_fields[i].offset/sizeof(uint32_t)]); } ret = 0; } return ret; }