xref: /haiku/headers/private/i2c/i2c.h (revision 01990a00e8ffa3bda55324a0931ae386860d12c9)
1 /*
2  * Copyright 2020, Haiku, Inc. All Rights Reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef _I2C_H_
6 #define _I2C_H_
7 
8 
9 #include <ACPI.h>
10 #include <device_manager.h>
11 #include <KernelExport.h>
12 
13 
14 typedef uint16 i2c_addr;
15 typedef enum {
16 	I2C_OP_READ = 0,
17 	I2C_OP_READ_STOP = 1,
18 	I2C_OP_WRITE = 2,
19 	I2C_OP_WRITE_STOP = 3,
20 	I2C_OP_READ_BLOCK = 5,
21 	I2C_OP_WRITE_BLOCK = 7,
22 } i2c_op;
23 
24 
25 #define IS_READ_OP(op)	(((op) & I2C_OP_WRITE) == 0)
26 #define IS_WRITE_OP(op)	(((op) & I2C_OP_WRITE) != 0)
27 #define IS_STOP_OP(op)	(((op) & 1) != 0)
28 #define IS_BLOCK_OP(op)	(((op) & 4) != 0)
29 
30 
31 // bus/device handle
32 typedef void* i2c_bus;
33 typedef void* i2c_device;
34 
35 
36 // Device node
37 
38 // slave address (uint16)
39 #define I2C_DEVICE_SLAVE_ADDR_ITEM "i2c/slave_addr"
40 
41 // node type
42 #define I2C_DEVICE_TYPE_NAME "i2c/device/v1"
43 
44 // bus cookie, issued by i2c bus manager
45 typedef void* i2c_bus;
46 // device cookie, issued by i2c bus manager
47 typedef void* i2c_device;
48 
49 // bus manager device interface for peripheral driver
50 typedef struct {
51 	driver_module_info info;
52 
53 	status_t (*exec_command)(i2c_device cookie, i2c_op op,
54 		const void *cmdBuffer, size_t cmdLength, void* dataBuffer,
55 		size_t dataLength);
56 	status_t (*acquire_bus)(i2c_device cookie);
57 	void (*release_bus)(i2c_device cookie);
58 } i2c_device_interface;
59 
60 
61 #define I2C_DEVICE_MODULE_NAME "bus_managers/i2c/device/driver_v1"
62 
63 
64 // Bus node
65 
66 #define I2C_BUS_PATH_ID_ITEM "i2c/path_id"
67 
68 // node type
69 #define I2C_BUS_TYPE_NAME "i2c/bus"
70 
71 // I2C bus node driver.
72 // This interface can be used by peripheral drivers to access the
73 // bus directly.
74 typedef struct {
75 	driver_module_info info;
76 
77 	status_t (*exec_command)(i2c_bus cookie, i2c_op op, i2c_addr slaveAddress,
78 		const void *cmdBuffer, size_t cmdLength, void* dataBuffer,
79 		size_t dataLength);
80 	status_t (*acquire_bus)(i2c_bus cookie);
81 	void (*release_bus)(i2c_bus cookie);
82 } i2c_bus_interface;
83 
84 
85 // name of I2C bus node driver
86 #define I2C_BUS_MODULE_NAME "bus_managers/i2c/bus/driver_v1"
87 
88 
89 
90 // Interface for Controllers
91 
92 typedef struct {
93 	driver_module_info info;
94 
95 	status_t (*register_device)(i2c_bus bus, i2c_addr slaveAddress,
96 		char* hid, char** cid, acpi_handle acpiHandle);
97 } i2c_for_controller_interface;
98 
99 #define I2C_FOR_CONTROLLER_MODULE_NAME "bus_managers/i2c/controller/driver_v1"
100 
101 
102 // Controller Node
103 
104 // node type
105 #define I2C_CONTROLLER_TYPE_NAME "bus/i2c/v1"
106 // controller name (required, string)
107 #define I2C_DESCRIPTION_CONTROLLER_NAME "controller_name"
108 
109 typedef void *i2c_bus_cookie;
110 typedef void *i2c_intr_cookie;
111 
112 
113 // Bus manager interface used by I2C controller drivers.
114 typedef struct {
115 	driver_module_info info;
116 
117 	void (*set_i2c_bus)(i2c_bus_cookie cookie, i2c_bus bus);
118 
119 	status_t (*exec_command)(i2c_bus_cookie cookie, i2c_op op,
120 		i2c_addr slaveAddress, const void *cmdBuffer, size_t cmdLength,
121 		void* dataBuffer, size_t dataLength);
122 
123 	status_t (*scan_bus)(i2c_bus_cookie cookie);
124 
125 	status_t (*acquire_bus)(i2c_bus_cookie cookie);
126 	void (*release_bus)(i2c_bus_cookie cookie);
127 
128 	status_t (*install_interrupt_handler)(i2c_bus_cookie cookie,
129 		i2c_intr_cookie intrCookie, interrupt_handler handler, void* data);
130 
131 	status_t (*uninstall_interrupt_handler)(i2c_bus_cookie cookie,
132 		i2c_intr_cookie intrCookie);
133 } i2c_sim_interface;
134 
135 
136 // Devfs entry for raw bus access.
137 // used by i2c diag tool
138 
139 enum {
140 	I2CEXEC = B_DEVICE_OP_CODES_END + 1,
141 };
142 
143 
144 typedef struct i2c_ioctl_exec
145 {
146 	i2c_op		op;
147 	i2c_addr	addr;
148 	const void*	cmdBuffer;
149 	size_t		cmdLength;
150 	void*		buffer;
151 	size_t		bufferLength;
152 } i2c_ioctl_exec;
153 
154 #define I2C_EXEC_MAX_BUFFER_LENGTH  32
155 
156 #endif	/* _I2C_H_ */
157