Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions cdba-power.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,14 +71,14 @@ int main(int argc, char **argv)
}

if (on) {
device_power(selected_device, true);
device_power_on(selected_device, MSG_POWER_ON_NORMAL);
watch_main_loop(ready);

selected_device->usb_always_on = true;
selected_device->power_always_on = true;
} else {
device_usb(selected_device, false);
device_power(selected_device, false);
device_power_off(selected_device);
}

device_close(selected_device);
Expand Down
119 changes: 117 additions & 2 deletions cdba-server.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>
#include <syslog.h>

Expand All @@ -26,6 +27,26 @@ static const char *username;

struct device *selected_device;

struct edl_file {
struct list_head node;

int fd;

char *filename;
char *target;
};

static struct list_head edl_files = LIST_INIT(edl_files);

static void edl_present(bool present)
{
uint8_t value = present ? 1 : 0;

warnx("edl is %spresent", present? "" : "not ");

cdba_send_buf(MSG_EDL_PRESENT, 1, &value);
}

static void fastboot_opened(struct fastboot *fb, void *data)
{
const uint8_t one = 1;
Expand Down Expand Up @@ -60,6 +81,7 @@ static void msg_select_board(const void *param)
fprintf(stderr, "failed to open %s\n", (const char *)param);
watch_quit();
} else {
device_edl_open(selected_device, edl_present);
device_fastboot_open(selected_device, &fastboot_ops);
}

Expand Down Expand Up @@ -93,6 +115,79 @@ static void msg_fastboot_download(const void *data, size_t len)
}
}

static struct edl_file *current_edl_file;

static void msg_edl_download(const void *data, size_t len)
{
char template[] = "/tmp/cdba.XXXXXX";
struct edl_file *edl;

edl = current_edl_file;

if (!edl) {
edl = calloc(1, sizeof(*edl));

edl->filename = strdup(template);
edl->fd = mkstemp(edl->filename);
if (edl->fd < 0)
err(1, "failed to create temporary file");

list_append(&edl_files, &edl->node);

current_edl_file = edl;
}

write(edl->fd, data, len);

if (len == 0)
close(edl->fd);
}

static void msg_edl_flash(const void *data, size_t len)
{
const char *target = data;

fprintf(stderr, "edl flash into '%s'\n", target);

current_edl_file->target = strdup(target);
current_edl_file = NULL;
}

static void msg_edl_reset(void)
{
struct edl_file *edl;
const char **argv;
size_t args;
size_t arg = 0;

fprintf(stderr, "edl reset\n");

args = 4 + list_len(&edl_files) * 3 + 1;
argv = calloc(args, sizeof(char *));

argv[arg++] = "qdl";
argv[arg++] = "firehose-hamoa.elf";
argv[arg++] = "--storage";
argv[arg++] = "nvme";

list_for_each_entry(edl, &edl_files, node) {
argv[arg++] = "write";
argv[arg++] = edl->target;
argv[arg++] = edl->filename;
}
argv[arg] = NULL;

if (fork() == 0) {
dup2(STDERR_FILENO, STDOUT_FILENO);
execvp("qdl", (char **)argv);
err(127, "failed to spawn qdl failed");
}
wait(NULL);

list_for_each_entry(edl, &edl_files, node)
unlink(edl->filename);
}

static void msg_fastboot_continue(void)
{
device_fastboot_continue(selected_device);
Expand Down Expand Up @@ -138,6 +233,7 @@ static int handle_stdin(int fd, void *buf)
static struct circ_buf recv_buf = { };
struct msg *msg;
struct msg hdr;
uint8_t mode;
size_t n;
int ret;

Expand Down Expand Up @@ -171,12 +267,22 @@ static int handle_stdin(int fd, void *buf)
// fprintf(stderr, "hard reset\n");
break;
case MSG_POWER_ON:
device_power(selected_device, true);
if (msg->len == 1)
mode = *(uint8_t *)msg->data;
else
mode = MSG_POWER_ON_NORMAL;

if (mode >= MSG_POWER_ON_COUNT) {
fprintf(stderr, "invalid power on mode requested\n");
exit(1);
}

device_power_on(selected_device, mode);

cdba_send(MSG_POWER_ON);
break;
case MSG_POWER_OFF:
device_power(selected_device, false);
device_power_off(selected_device);

cdba_send(MSG_POWER_OFF);
break;
Expand Down Expand Up @@ -210,6 +316,15 @@ static int handle_stdin(int fd, void *buf)
case MSG_KEY_PRESS:
msg_key_press(msg->data, msg->len);
break;
case MSG_EDL_DOWNLOAD:
msg_edl_download(msg->data, msg->len);
break;
case MSG_EDL_FLASH:
msg_edl_flash(msg->data, msg->len);
break;
case MSG_EDL_RESET:
msg_edl_reset();
break;
default:
fprintf(stderr, "unk %d len %d\n", msg->type, msg->len);
exit(1);
Expand Down
Loading
Loading