int main(int argc, char **argv) { int fd, n, size, size2; int update_fw = 1; void *map_base, *virt_addr; unsigned long stack, pc, loadaddr; unsigned long read_result, writeval; off_t target; char *p; char *filepath; filepath = (char *)malloc(150); if (argc < 2) { printf("\n\tUsage: %s <project_name> [0xLOADADDR]\n\n", argv[0]); return 1; } sprintf(filepath, "%s", argv[1]); if (argc == 3) { loadaddr = strtoul(argv[2], &p, 16); } else { // printf("Warn ! Missing LOADADDR. Not loading new fw in to DDR ram.\n"); // update_fw = 0; loadaddr = 0x0; } fd = open("/dev/mem", O_RDWR | O_SYNC); if (update_fw == 1) { srcscr_set_bit(fd, (M4c_RST)); // rdc_reset(fd); // aips123_reset(fd); set_gate_m4_clk(fd); load_m4_fw(fd, filepath, loadaddr); } free(filepath); // srcscr_set_bit(fd, M4_ENABLE); // srcscr_set_bit(fd, (M4_ENABLE | M4c_CL_RST | M4p_CL_RST)); // srcscr_set_bit(fd, (M4_ENABLE | M4p_CL_RST)); // srcscr_set_bit(fd, (M4_ENABLE | M4c_RST)); srcscr_unset_bit(fd, ~(M4c_RST)); sleep(0.1); srcscr_set_bit(fd, M4c_CL_RST); close(fd); return 0; }
int main(int argc, char** argv) { int fd, n; unsigned long loadaddr; char* p; char m4IsStopped = 0; char m4IsRunning = 0; int m4TraceFlags = 0; int m4Retry; char* filepath = argv[1]; int currentSoC = -1; if (argc < 2) { LogError(HEADER); LogError("-- %s -- \nUsage:\n" "%s [filename.bin] [0xLOADADDR] [--verbose] # loads new firmware\n" "or: %s stop # holds the auxiliary core in reset\n" "or: %s start # releases the auxiliary core from reset\n" "or: %s kick [n] # triggers interrupt on RPMsg virtqueue n\n", NAME_OF_UTILITY, argv[0], argv[0], argv[0], argv[0], argv[0]); return RETURN_CODE_ARGUMENTS_ERROR; } currentSoC = get_board_id(); if (currentSoC == -1) { LogError(HEADER); LogError("Board is not supported.\n"); return RETURN_CODE_ARGUMENTS_ERROR; } fd = open("/dev/mem", O_RDWR | O_SYNC); if (fd < 0) { LogError(HEADER); LogError("Could not open /dev/mem, are you root?\n"); return RETURN_CODE_ARGUMENTS_ERROR; } /* PARTIAL COMMANDS */ if (!strcmp(argv[1], "stop")) { stop_cpu(fd, currentSoC); return RETURN_CODE_OK; } else if (!strcmp(argv[1], "start")) { start_cpu(fd, currentSoC); return RETURN_CODE_OK; } else if (!strcmp(argv[1], "kick")) { if (argc < 3) { LogError(HEADER); LogError("%s - Usage: %s kick {vq_id to kick}\n", NAME_OF_UTILITY, argv[0]); return RETURN_CODE_ARGUMENTS_ERROR; } rpmsg_mu_kick(fd, currentSoC, strtoul(argv[2], &p, 16)); return RETURN_CODE_OK; } /* FW LOADING */ if (argc < 3) { LogError(HEADER); LogError("%s - Usage: %s [yourfwname.bin] [0xLOADADDR] [--verbose]\n", NAME_OF_UTILITY, argv[0]); return RETURN_CODE_ARGUMENTS_ERROR; } if (access(filepath, F_OK) == -1) { LogError("File %s not found.\n", argv[1]); return RETURN_CODE_ARGUMENTS_ERROR; } loadaddr = strtoul(argv[2], &p, 16); if (argc == 4) { if (!strcmp(argv[3], "--verbose")) { verbose = 1; } else { LogError(HEADER); LogError("%s - Usage: %s [yourfwname.bin] [0xLOADADDR] [--verbose]\n", NAME_OF_UTILITY, argv[0]); return RETURN_CODE_ARGUMENTS_ERROR; } } LogVerbose("LoadAddr is: %X\n", loadaddr); LogVerbose("Will stop CPU now...\n"); stop_cpu(fd, currentSoC); LogVerbose("Will ungate M4 clock source...\n"); ungate_m4_clk(fd, currentSoC); LogVerbose("Will load M4 firmware...\n"); load_m4_fw(fd, currentSoC, filepath, loadaddr); LogVerbose("Will start CPU now...\n"); start_cpu(fd, currentSoC); LogVerbose("Done!\n"); close(fd); return RETURN_CODE_OK; }