blob: 006eeffe6acf38c93bb40914dcf2ae28e1078814 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
/* Copyright 2018 The ChromiumOS Authors
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "ec_commands.h"
/* Size of the buffer inside the rx queue */
#define CEC_RX_BUFFER_SIZE 20
#if CEC_RX_BUFFER_SIZE < MAX_CEC_MSG_LEN + 1
#error "Buffer must fit at least a CEC message and a length byte"
#endif
#if CEC_RX_BUFFER_SIZE > 255
#error "Buffer size must not exceed 255 since offsets are uint8_t"
#endif
/* CEC message during transfer */
struct cec_msg_transfer {
/* Bit offset */
uint8_t bit;
/* Byte offset */
uint8_t byte;
/* The CEC message */
uint8_t buf[MAX_CEC_MSG_LEN];
};
/*
* Queue of completed incoming CEC messages
* ready to be read out by AP
*/
struct cec_rx_queue {
/*
* Write offset. Updated from interrupt context when we
* have received a complete message.
*/
uint8_t write_offset;
/* Read offset. Updated when AP sends CEC read command */
uint8_t read_offset;
/* Data buffer */
uint8_t buf[CEC_RX_BUFFER_SIZE];
};
/**
* Get the current bit of a CEC message transfer
*
* @param queue Queue to flush
*/
int cec_transfer_get_bit(const struct cec_msg_transfer *transfer);
/**
* Set the current bit of a CEC message transfer
*
* @param transfer Message transfer to set current bit of
* @param val New bit value
*/
void cec_transfer_set_bit(struct cec_msg_transfer *transfer, int val);
/**
* Make the current bit the next bit in the transfer buffer
*
* @param transfer Message transfer to change current bit of
*/
void cec_transfer_inc_bit(struct cec_msg_transfer *transfer);
/**
* Check if current bit is an end-of-message bit and if it is set
*
* @param transfer Message transfer to check for end-of-message
*/
int cec_transfer_is_eom(const struct cec_msg_transfer *transfer, int len);
/**
* Flush all messages from a CEC receive queue
*
* @param queue Queue to flush
*/
void cec_rx_queue_flush(struct cec_rx_queue *queue);
/**
* Push a CEC message to a CEC receive queue
*
* @param queue Queue to add message to
*/
int cec_rx_queue_push(struct cec_rx_queue *queue, const uint8_t *msg,
uint8_t msg_len);
/**
* Pop a CEC message from a CEC receive queue
*
* @param queue Queue to retrieve message from
* @param msg Buffer to store retrieved message in
* @param msg_len Number of data bytes in msg
*/
int cec_rx_queue_pop(struct cec_rx_queue *queue, uint8_t *msg,
uint8_t *msg_len);
|