14 static void vag_bap_txer_build_only_can_frame(struct BAP_Frame *bap_frame, struct can_frame *frame)
16 assert(!bap_frame->is_multiframe);
18 frame->data[0] = (bap_frame->opcode & 0x7) << 4;
19 frame->data[0] |= (bap_frame->node & 0x3f) >> 2;
20 frame->data[1] = (bap_frame->node & 0x3) << 6;
21 frame->data[1] |= bap_frame->port & 0x3f;
23 frame->can_dlc = 2 + bap_frame->len;
24 memcpy(&frame->data[2], bap_frame->data, bap_frame->len);
28 static void vag_bap_txer_build_first_can_frame(struct BAP_TXer* bap, unsigned slotnum, struct can_frame *frame)
30 struct BAP_Frame *bap_frame = bap->slot[slotnum];
35 /* TODO, maybe: Support simultaneous streams */
36 frame->data[0] = 0x80 + slotnum;
37 frame->data[0] |= (bap_frame->len & 0xfff) >> 8;
38 frame->data[1] = bap_frame->len & 0xff;
40 frame->data[2] = (bap_frame->opcode & 0x7) << 4;
41 frame->data[2] |= (bap_frame->node & 0x3f) >> 2;
42 frame->data[3] = (bap_frame->node & 0x3) << 6;
43 frame->data[3] |= bap_frame->port & 0x3f;
45 if (bap_frame->len <= 4) {
46 frame->can_dlc = 4 + bap_frame->len;
47 memcpy(&frame->data[4], bap_frame->data, bap_frame->len);
49 bap->slot[slotnum] = NULL;
51 /* Send first 4 data bytes */
52 frame->can_dlc = 4 + 4;
53 memcpy(&frame->data[4], bap_frame->data, 4);
56 bap->slot_done[slotnum] = 4;
62 int vag_bap_txer_queue(struct BAP_TXer* bap, struct BAP_Frame *bap_frame, struct can_frame *frame)
64 if (!vag_bap_frame_is_valid(bap_frame)) {
68 if (!bap_frame->is_multiframe) {
69 vag_bap_txer_build_only_can_frame(bap_frame, frame);
71 } else { /* bap->frame->is_multiframe */
74 /* Find available slot */
75 for (i = 0; i < 4; i++) {
84 /* Found empty slot */
85 bap->slot[i] = vag_bap_frame_clone(bap_frame);
90 vag_bap_txer_build_first_can_frame(bap, i, frame);
102 struct BAP_TXer* vag_bap_txer_alloc()
104 struct BAP_TXer *bap;
106 bap = calloc(1, sizeof(*bap));
117 void vag_bap_txer_free(struct BAP_TXer *bap)