1
0
mirror of git://projects.qi-hardware.com/antorcha.git synced 2024-11-26 07:10:39 +02:00

tools/antorcha.c: add image upload (doesn't work yet)

This commit is contained in:
Werner Almesberger 2012-06-20 16:50:23 -03:00
parent ab00d8e231
commit 1d1c83f926

View File

@ -202,6 +202,77 @@ static void firmware(struct atrf_dsc *dsc, const char *name)
} }
/* ----- Image upload ------------------------------------------------------ */
static const uint8_t image_secret[PAYLOAD*2] = {
#include "image-secret.inc"
};
static void send_image(struct atrf_dsc *dsc, void *buf, int len)
{
uint8_t payload[PAYLOAD];
uint8_t last, seq;
hash_init();
hash_merge(image_secret, sizeof(image_secret));
if (verbose)
write(2, "image ", 6);
last = (len+63)/64+3;
seq = 0;
while (len >= PAYLOAD) {
packet(dsc, IMAGE, seq++, last, buf, PAYLOAD);
hash_merge(buf, PAYLOAD);
buf += PAYLOAD;
len -= PAYLOAD;
}
if (len) {
memcpy(payload, buf, len);
memset(payload+len, 0, PAYLOAD-len);
packet(dsc, FIRMWARE, seq++, last, payload, PAYLOAD);
hash_merge(payload, PAYLOAD);
}
/* @@@ salt */
packet(dsc, IMAGE, seq++, last, payload, PAYLOAD);
packet(dsc, IMAGE, seq++, last, payload, PAYLOAD);
hash_end();
/* hash */
hash_cp(payload, PAYLOAD, 0);
packet(dsc, IMAGE, seq++, last, payload, PAYLOAD);
hash_cp(payload, PAYLOAD, PAYLOAD);
packet(dsc, IMAGE, seq++, last, payload, PAYLOAD);
if (verbose)
write(2, "\n", 1);
}
static void image(struct atrf_dsc *dsc, const char *name)
{
FILE *file;
uint8_t img[200] = { 0 };
ssize_t len;
file = fopen(name, "r");
if (!file) {
perror(name);
exit(1);
}
len = fread(img, 1, sizeof(img), file);
if (len < 0) {
perror(name);
exit(1);
}
fclose(file);
send_image(dsc, img, len);
}
/* ----- Command-line processing ------------------------------------------- */ /* ----- Command-line processing ------------------------------------------- */
@ -235,10 +306,13 @@ int main(int argc, char **argv)
if (do_ping && fw) if (do_ping && fw)
usage(*argv); usage(*argv);
if (argc != optind) if (do_ping || fw) {
usage(*argv); if (argc != optind)
if (!do_ping && !fw) usage(*argv);
usage(*argv); } else {
if (argc != optind+1)
usage(*argv);
}
dsc = atrf_open(NULL); dsc = atrf_open(NULL);
if (!dsc) if (!dsc)
@ -247,8 +321,10 @@ int main(int argc, char **argv)
rf_init(dsc, 8, 15); rf_init(dsc, 8, 15);
if (do_ping) if (do_ping)
ping(dsc); ping(dsc);
if (fw) else if (fw)
firmware(dsc, fw); firmware(dsc, fw);
else
image(dsc, argv[optind]);
return 0; return 0;
} }