static int gb_bootrom_firmware_size_request(struct gb_operation *op) { struct gb_bootrom *bootrom = gb_connection_get_data(op->connection); struct gb_bootrom_firmware_size_request *size_request = op->request->payload; struct gb_bootrom_firmware_size_response *size_response; struct device *dev = &op->connection->bundle->dev; int ret; /* Disable timeouts */ gb_bootrom_cancel_timeout(bootrom); if (op->request->payload_size != sizeof(*size_request)) { dev_err(dev, "%s: illegal size of firmware size request (%zu != %zu)\n", __func__, op->request->payload_size, sizeof(*size_request)); ret = -EINVAL; goto queue_work; } mutex_lock(&bootrom->mutex); ret = find_firmware(bootrom, size_request->stage); if (ret) goto unlock; if (!gb_operation_response_alloc(op, sizeof(*size_response), GFP_KERNEL)) { dev_err(dev, "%s: error allocating response\n", __func__); free_firmware(bootrom); ret = -ENOMEM; goto unlock; } size_response = op->response->payload; size_response->size = cpu_to_le32(bootrom->fw->size); dev_dbg(dev, "%s: firmware size %d bytes\n", __func__, size_response->size); unlock: mutex_unlock(&bootrom->mutex); queue_work: if (!ret) { /* Refresh timeout */ gb_bootrom_set_timeout(bootrom, NEXT_REQ_GET_FIRMWARE, NEXT_REQ_TIMEOUT_MS); } return ret; }
libusb_device_handle* start(int argc, char **argv) { libusb_device_handle *handler = NULL; char firmwareFilename[4096]; handler = b96_init_device(); if (handler == NULL) { return NULL; } printf ("Handler: %p\n",handler); if (find_firmware("adfudec.bin", firmwareFilename, sizeof(firmwareFilename))==NULL) { error_at_line(0,0,__FILE__,__LINE__, "Error: Cannot find adfudec.bin"); return handler; } writeBinaryFile(handler, '\x05', 0xe406f000u, firmwareFilename, 0, NULL); sleep(1); if (find_firmware("bootloader.bin", firmwareFilename, sizeof(firmwareFilename))==NULL) { error_at_line(0,0,__FILE__,__LINE__, "Error: Cannot find bootloader.bin"); return handler; } writeBootloaderBin(handler, firmwareFilename); sleep(1); unknownCMD07(handler); sleep(10); libusb_close(handler); handler = b96_init_device(); if (handler == NULL) { return NULL; } setuid(getuid()); if (find_firmware("bl31.bin", firmwareFilename, sizeof(firmwareFilename))==NULL) { error_at_line(0,0,__FILE__,__LINE__, "Error: Cannot find bl31.bin"); return handler; } /* load bl31.bin to 0x1f000000 */ writeBinaryFile(handler, '\xcd' ,0x13, firmwareFilename, 0x1f000000u, NULL); if (find_firmware("bl32.bin", firmwareFilename, sizeof(firmwareFilename))==NULL) { error_at_line(0,0,__FILE__,__LINE__, "Error: Cannot find bl32.bin"); return handler; } /* load bl32.bin to 0x1f202000 */ writeBinaryFile(handler, '\xcd', 0x13, firmwareFilename, 0x1f202000u, NULL); /* load u-boot-dtb.img to 0x10ffffc0. (Note: u-boot is at 0x11000000, -0x40 is the header */ writeBinaryFile(handler, '\xcd', 0x13, argv[1], 0x10ffffc0u, NULL); sleep(2); /* jump to 0x1f000000 (bl31.bin)*/ unknownCMD50(handler, 0x1f000000u); sleep(2); libusb_close(handler); handler = NULL; return handler; }