summaryrefslogtreecommitdiffstats
path: root/firmware/twi_master.h
blob: 5437514517c01acda0680aa01f02d869285c06fe (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
#ifndef TWI_MASTER_MAC_H_
#define TWI_MASTER_MAC_H_

#include <stdint.h>
#include <string.h>

#include "util.h"


struct twi_transfer;

enum twi_status {
	TWI_STAT_IDLE = 0,
	TWI_STAT_INPROGRESS,
	TWI_STAT_FINISHED,
	TWI_STAT_BUSERROR,
	TWI_STAT_TIMEOUT,
	TWI_STAT_CANCELLED,
};

#if defined(TWI_SIZE_16BIT) && (TWI_SIZE_16BIT != 0)
typedef uint16_t twi_size_t;
#else
typedef uint8_t twi_size_t;
#endif

typedef void (*twi_callback_t)(struct twi_transfer *, enum twi_status);

struct twi_transfer {
	void *buffer;
	twi_size_t write_size;
	twi_size_t read_size;

	uint8_t address;

	twi_callback_t callback;

	/* Internal fields follow. */
	uint8_t status;			/* enum twi_transfer_status_flags */
	twi_size_t offset;		/* The current byte offset. */
	struct twi_transfer *next;	/* Linked list of transfer objects. */
};

void twi_init(void);

static inline void twi_transfer_init(struct twi_transfer *xfer)
{
	memset(xfer, 0, sizeof(*xfer));
}

void twi_transfer(struct twi_transfer *xfer);
enum twi_status twi_transfer_get_status(const struct twi_transfer *xfer);
enum twi_status twi_transfer_wait(struct twi_transfer *xfer,
				  uint16_t timeout_ms);
void twi_transfer_cancel(struct twi_transfer *xfer);

#endif /* TWI_MASTER_MAC_H_ */
bues.ch cgit interface