12 int vw_bap_txer_build_first_can_frame(struct BAP_Frame *bap_frame, struct can_frame *frame)
14 if (!vw_bap_frame_is_valid(bap_frame)) {
19 if (!bap_frame->is_multiframe) {
20 frame->data[0] = (bap_frame->opcode & 0x7) << 4;
21 frame->data[0] |= (bap_frame->node & 0x3f) >> 2;
22 frame->data[1] = (bap_frame->node & 0x3) << 6;
23 frame->data[1] |= bap_frame->function & 0x3f;
25 frame->can_dlc = 2 + bap_frame->len;
26 memcpy(&frame->data[2], bap_frame->data, bap_frame->len);
27 } else { /* bap->frame->is_multiframe */
28 /* TODO, maybe: Support simultaneous streams */
29 frame->data[0] = 0x80;
30 frame->data[0] |= (bap_frame->len & 0xfff) >> 8;
31 frame->data[1] = bap_frame->len & 0xff;
33 frame->data[2] = (bap_frame->opcode & 0x7) << 4;
34 frame->data[2] |= (bap_frame->node & 0x3f) >> 2;
35 frame->data[3] = (bap_frame->node & 0x3) << 6;
36 frame->data[3] |= bap_frame->function & 0x3f;
38 if (bap_frame->len > 4) {
40 /* TODO: Support continuation frames */
42 frame->can_dlc = 4 + bap_frame->len;
43 memcpy(&frame->data[4], bap_frame->data, bap_frame->len);
52 struct BAP_TXer* vw_bap_txer_alloc()
56 bap = calloc(1, sizeof(*bap));
67 void vw_bap_txer_free(struct BAP_TXer *bap)