+ 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)
+{
+ int ret;
+
+ ret = read_data(dev, dev->buffer, AM7XXX_HEADER_WIRE_SIZE);
+ if (ret < 0)
+ goto out;
+
+ unserialize_header(dev->buffer, h);
+
+#if DEBUG
+ printf("\n");
+ dump_header(h);
+ printf("\n");
+#endif
+
+ ret = 0;
+
+out:
+ return ret;
+}
+
+static int send_header(am7xxx_device *dev, struct am7xxx_header *h)
+{
+ int ret;
+
+#if DEBUG
+ printf("\n");
+ dump_header(h);
+ printf("\n");
+#endif