mirror of
git://projects.qi-hardware.com/antorcha.git
synced 2024-11-25 19:51:52 +02:00
fw/: add image data upload (completely untested)
This commit is contained in:
parent
6223a58552
commit
87cc67d5f7
7
PROTOCOL
7
PROTOCOL
@ -38,3 +38,10 @@ may have a variable-size payload.
|
|||||||
Even numbered packet types correspond to packets sent from the remote
|
Even numbered packet types correspond to packets sent from the remote
|
||||||
controller to the device. Odd numbered packet types correspond to
|
controller to the device. Odd numbered packet types correspond to
|
||||||
responses. The device never initiates communication.
|
responses. The device never initiates communication.
|
||||||
|
|
||||||
|
|
||||||
|
Image format
|
||||||
|
============
|
||||||
|
|
||||||
|
Two bytes per line. LSB of first byte is LED A1, MSB of last byte is B8.
|
||||||
|
Unused lines must be set to zero.
|
||||||
|
@ -134,6 +134,7 @@ image-secret.inc:
|
|||||||
|
|
||||||
fw.o: unlock-secret.inc
|
fw.o: unlock-secret.inc
|
||||||
reset.o: unlock-secret.inc
|
reset.o: unlock-secret.inc
|
||||||
|
image.o: image-secret.inc
|
||||||
|
|
||||||
# ----- Dependencies ----------------------------------------------------------
|
# ----- Dependencies ----------------------------------------------------------
|
||||||
|
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
|
|
||||||
static const struct handler *protos[] = {
|
static const struct handler *protos[] = {
|
||||||
|
&image_handler,
|
||||||
&reset_handler,
|
&reset_handler,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
@ -26,8 +26,10 @@ struct handler {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
extern struct handler image_handler;
|
||||||
extern struct handler reset_handler;
|
extern struct handler reset_handler;
|
||||||
|
|
||||||
|
|
||||||
bool dispatch(const uint8_t *buf, uint8_t len, const struct handler **protos);
|
bool dispatch(const uint8_t *buf, uint8_t len, const struct handler **protos);
|
||||||
|
|
||||||
#endif /* !PROTO_H */
|
#endif /* !PROTO_H */
|
||||||
|
91
fw/image.c
91
fw/image.c
@ -11,7 +11,96 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "io.h"
|
||||||
|
#include "hash.h"
|
||||||
|
#include "proto.h"
|
||||||
|
#include "dispatch.h"
|
||||||
#include "image.h"
|
#include "image.h"
|
||||||
|
|
||||||
|
|
||||||
extern struct line image[MAX_LINES];
|
static struct line images[2][MAX_LINES];
|
||||||
|
static const struct line *next_image;
|
||||||
|
static struct line *p, *end;
|
||||||
|
static bool failed;
|
||||||
|
|
||||||
|
const struct line *image = images[0];
|
||||||
|
|
||||||
|
|
||||||
|
static const uint8_t image_secret[2*PAYLOAD] = {
|
||||||
|
#include "image-secret.inc"
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#define MAP(port, value, group) ( \
|
||||||
|
((value) & 1 ? MASK(port, LED_##group##1) : 0) | \
|
||||||
|
((value) & 2 ? MASK(port, LED_##group##2) : 0) | \
|
||||||
|
((value) & 4 ? MASK(port, LED_##group##3) : 0) | \
|
||||||
|
((value) & 8 ? MASK(port, LED_##group##4) : 0) | \
|
||||||
|
((value) & 16 ? MASK(port, LED_##group##5) : 0) | \
|
||||||
|
((value) & 32 ? MASK(port, LED_##group##6) : 0) | \
|
||||||
|
((value) & 64 ? MASK(port, LED_##group##7) : 0) | \
|
||||||
|
((value) & 128 ? MASK(port, LED_##group##8) : 0))
|
||||||
|
|
||||||
|
|
||||||
|
static void add_payload(const uint8_t *payload)
|
||||||
|
{
|
||||||
|
uint8_t i, b, c, d;
|
||||||
|
|
||||||
|
for (i = 0; i != PAYLOAD && p != end; i += 2) {
|
||||||
|
b = MAP(B, payload[i], A) | MAP(B, payload[i+1], B);
|
||||||
|
c = MAP(C, payload[i], A) | MAP(C, payload[i+1], B);
|
||||||
|
d = MAP(D, payload[i], A) | MAP(D, payload[i+1], B);
|
||||||
|
p->d = d;
|
||||||
|
p->cb = c | b;
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool image_first(const uint8_t *payload)
|
||||||
|
{
|
||||||
|
hash_init();
|
||||||
|
next_image = p = image == images[0] ? images[1] : images[0];
|
||||||
|
end = p+MAX_LINES;
|
||||||
|
memset(p, 0, (char *) end-(char *) p);
|
||||||
|
add_payload(payload);
|
||||||
|
hash_merge(payload, PAYLOAD);
|
||||||
|
failed = 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool image_more(uint8_t seq, uint8_t limit, const uint8_t *payload)
|
||||||
|
{
|
||||||
|
switch (limit-seq) {
|
||||||
|
default:
|
||||||
|
add_payload(payload);
|
||||||
|
/* fall through */
|
||||||
|
case 3:
|
||||||
|
case 2:
|
||||||
|
hash_merge(payload, PAYLOAD);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
failed = !hash_eq(payload, PAYLOAD, 0);
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
if (!hash_eq(payload, PAYLOAD, PAYLOAD))
|
||||||
|
failed = 1;
|
||||||
|
if (failed)
|
||||||
|
return 0;
|
||||||
|
image = next_image;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct handler image_handler = {
|
||||||
|
.type = IMAGE,
|
||||||
|
.first = image_first,
|
||||||
|
.more = image_more,
|
||||||
|
};
|
||||||
|
@ -27,6 +27,6 @@ struct line {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
extern struct line image[MAX_LINES];
|
extern const struct line *image;
|
||||||
|
|
||||||
#endif /* !IMAGE_H */
|
#endif /* !IMAGE_H */
|
||||||
|
2
fw/io.h
2
fw/io.h
@ -57,14 +57,12 @@
|
|||||||
#define __SEL_CC(v) (v)
|
#define __SEL_CC(v) (v)
|
||||||
#define __SEL_DD(v) (v)
|
#define __SEL_DD(v) (v)
|
||||||
|
|
||||||
#if 0
|
|
||||||
#define __SEL_BC(v) (0)
|
#define __SEL_BC(v) (0)
|
||||||
#define __SEL_BD(v) (0)
|
#define __SEL_BD(v) (0)
|
||||||
#define __SEL_CB(v) (0)
|
#define __SEL_CB(v) (0)
|
||||||
#define __SEL_CD(v) (0)
|
#define __SEL_CD(v) (0)
|
||||||
#define __SEL_DB(v) (0)
|
#define __SEL_DB(v) (0)
|
||||||
#define __SEL_DC(v) (0)
|
#define __SEL_DC(v) (0)
|
||||||
#endif
|
|
||||||
|
|
||||||
#define __MASK(sel, port, bit) __SEL_##sel##port(1 << (bit))
|
#define __MASK(sel, port, bit) __SEL_##sel##port(1 << (bit))
|
||||||
#define MASK(...) __MASK(__VA_ARGS__)
|
#define MASK(...) __MASK(__VA_ARGS__)
|
||||||
|
@ -21,8 +21,6 @@
|
|||||||
#include "sweep.h"
|
#include "sweep.h"
|
||||||
|
|
||||||
|
|
||||||
struct line image[MAX_LINES];
|
|
||||||
|
|
||||||
static uint32_t t_sw; /* cumulative number of timer ticks in sweep */
|
static uint32_t t_sw; /* cumulative number of timer ticks in sweep */
|
||||||
|
|
||||||
static uint16_t wait_periods; /* number of periods to wait before image */
|
static uint16_t wait_periods; /* number of periods to wait before image */
|
||||||
|
Loading…
Reference in New Issue
Block a user