lib: use struct for metadata

Streamline this with the host library.
This commit is contained in:
Steve Markgraf 2024-12-26 00:34:56 +01:00
parent d9e7813ccf
commit ae01224d0d

View file

@ -159,19 +159,23 @@ void hsdaoh_update_head(int head)
static bool hstx_dma_pong = false; static bool hstx_dma_pong = false;
static uint v_scanline = 2; static uint v_scanline = 2;
static bool vactive_cmdlist_posted = false; static bool vactive_cmdlist_posted = false;
static uint16_t framecnt = 0;
uint8_t metadata[] = { enum crc_config {
/* 0xda7acab1 magic word for hsdaoh */ CRC_NONE, /* No CRC, just 16 bit idle counter */
0x1, 0xb, 0xa, 0xc, 0xa, 0x7, 0xa, 0xd, CRC16_1_LINE, /* Line contains CRC of the last line */
/* u16: placeholder for framecounter */ CRC16_2_LINE /* Line contains CRC of the line before the last line */
0, 0, 0, 0,
/* u8: pack_state */
0, 0,
/* u8: crc_config: CRC16 of last line */
1, 0,
}; };
typedef struct
{
uint32_t magic;
uint16_t framecounter;
uint8_t pack_state;
uint8_t crc_config;
} __attribute__((packed, aligned(1))) metadata_t;
metadata_t metadata = (metadata_t) { .magic = 0xda7acab1, .crc_config = CRC16_1_LINE };
/* HSTX DMA IRQ handler, reconfigures the channel that just completed while /* HSTX DMA IRQ handler, reconfigures the channel that just completed while
* ther other channel is currently busy */ * ther other channel is currently busy */
void __scratch_x("") hstx_dma_irq_handler() void __scratch_x("") hstx_dma_irq_handler()
@ -191,12 +195,8 @@ void __scratch_x("") hstx_dma_irq_handler()
ch->read_addr = (uintptr_t)info_p; ch->read_addr = (uintptr_t)info_p;
ch->transfer_count = info_len; ch->transfer_count = info_len;
/* update frame counter in metadata */ /* increment framecounter*/
metadata[8] = framecnt & 0xf; metadata.framecounter++;
metadata[9] = (framecnt >> 4) & 0xf;
metadata[10] = (framecnt >> 8) & 0xf;
metadata[11] = (framecnt >> 12) & 0xf;
framecnt++;
} else { } else {
ch->read_addr = (uintptr_t)vblank_line_vsync_on; ch->read_addr = (uintptr_t)vblank_line_vsync_on;
ch->transfer_count = count_of(vblank_line_vsync_on); ch->transfer_count = count_of(vblank_line_vsync_on);
@ -227,8 +227,13 @@ void __scratch_x("") hstx_dma_irq_handler()
uint16_t cur_active_line = v_scanline - (MODE_V_TOTAL_LINES - MODE_V_ACTIVE_LINES); uint16_t cur_active_line = v_scanline - (MODE_V_TOTAL_LINES - MODE_V_ACTIVE_LINES);
/* fill in metadata word (last word of line) */ /* fill in metadata word (last word of line) */
if (cur_active_line < sizeof(metadata)) if (cur_active_line < (sizeof(metadata_t) * 2)) {
next_line[RBUF_SLICE_LEN - 1] |= (metadata[cur_active_line] << 12); uint8_t *met_p = (uint8_t *)&metadata;
if (cur_active_line % 2)
next_line[RBUF_SLICE_LEN - 1] |= ((met_p[cur_active_line/2] & 0xf0) << 8);
else
next_line[RBUF_SLICE_LEN - 1] |= ((met_p[cur_active_line/2] & 0x0f) << 12);
}
/* on the second last word of the line, insert the CRC16 of the entire previous line */ /* on the second last word of the line, insert the CRC16 of the entire previous line */
next_line[RBUF_SLICE_LEN - 2] = dma_sniffer_get_data_accumulator() & 0xffff; next_line[RBUF_SLICE_LEN - 2] = dma_sniffer_get_data_accumulator() & 0xffff;