+static void serialize_header(struct am7xxx_header *h, uint8_t *buffer)
+{
+ uint8_t **buffer_iterator = &buffer;
+
+ put_le32(h->packet_type, buffer_iterator);
+ put_8(h->unknown0, buffer_iterator);
+ put_8(h->header_data_len, buffer_iterator);
+ put_8(h->unknown2, buffer_iterator);
+ put_8(h->unknown3, buffer_iterator);
+ put_le32(h->header_data.data.field0, buffer_iterator);
+ put_le32(h->header_data.data.field1, buffer_iterator);
+ put_le32(h->header_data.data.field2, buffer_iterator);
+ put_le32(h->header_data.data.field3, buffer_iterator);
+}
+
+static void unserialize_header(uint8_t *buffer, struct am7xxx_header *h)
+{
+ uint8_t **buffer_iterator = &buffer;
+
+ h->packet_type = get_le32(buffer_iterator);
+ h->unknown0 = get_8(buffer_iterator);
+ h->header_data_len = get_8(buffer_iterator);
+ h->unknown2 = get_8(buffer_iterator);
+ h->unknown3 = get_8(buffer_iterator);
+ h->header_data.data.field0 = get_le32(buffer_iterator);
+ h->header_data.data.field1 = get_le32(buffer_iterator);
+ h->header_data.data.field2 = get_le32(buffer_iterator);
+ h->header_data.data.field3 = get_le32(buffer_iterator);
+}
+
+static int read_header(am7xxx_device dev, struct am7xxx_header *h)
+{
+ uint8_t *buffer;
+ int ret;
+
+ buffer = calloc(AM7XXX_HEADER_WIRE_SIZE, 1);
+ if (buffer == NULL) {
+ perror("calloc buffer");
+ return -ENOMEM;
+ }
+
+ ret = read_data(dev, buffer, AM7XXX_HEADER_WIRE_SIZE);
+ if (ret < 0)
+ goto out;
+
+ unserialize_header(buffer, h);
+
+#if DEBUG
+ printf("\n");
+ dump_header(h);
+ printf("\n");
+#endif
+
+ ret = 0;
+
+out:
+ free(buffer);
+ return ret;
+}
+