2 * QEMU SMBus host (master) emulation.
4 * This code emulates SMBus transactions from the master point of view,
5 * it runs the individual I2C transaction to do the SMBus protocol
8 * Copyright (c) 2007 CodeSourcery.
9 * Written by Paul Brook
11 * This code is licensed under the LGPL.
14 #include "qemu/osdep.h"
16 #include "hw/i2c/i2c.h"
17 #include "hw/i2c/smbus_master.h"
19 /* Master device commands. */
20 int smbus_quick_command(I2CBus
*bus
, uint8_t addr
, int read
)
22 if (i2c_start_transfer(bus
, addr
, read
)) {
25 i2c_end_transfer(bus
);
29 int smbus_receive_byte(I2CBus
*bus
, uint8_t addr
)
33 if (i2c_start_transfer(bus
, addr
, 1)) {
38 i2c_end_transfer(bus
);
42 int smbus_send_byte(I2CBus
*bus
, uint8_t addr
, uint8_t data
)
44 if (i2c_start_transfer(bus
, addr
, 0)) {
48 i2c_end_transfer(bus
);
52 int smbus_read_byte(I2CBus
*bus
, uint8_t addr
, uint8_t command
)
55 if (i2c_start_transfer(bus
, addr
, 0)) {
58 i2c_send(bus
, command
);
59 if (i2c_start_transfer(bus
, addr
, 1)) {
60 i2c_end_transfer(bus
);
65 i2c_end_transfer(bus
);
69 int smbus_write_byte(I2CBus
*bus
, uint8_t addr
, uint8_t command
, uint8_t data
)
71 if (i2c_start_transfer(bus
, addr
, 0)) {
74 i2c_send(bus
, command
);
76 i2c_end_transfer(bus
);
80 int smbus_read_word(I2CBus
*bus
, uint8_t addr
, uint8_t command
)
83 if (i2c_start_transfer(bus
, addr
, 0)) {
86 i2c_send(bus
, command
);
87 if (i2c_start_transfer(bus
, addr
, 1)) {
88 i2c_end_transfer(bus
);
92 data
|= i2c_recv(bus
) << 8;
94 i2c_end_transfer(bus
);
98 int smbus_write_word(I2CBus
*bus
, uint8_t addr
, uint8_t command
, uint16_t data
)
100 if (i2c_start_transfer(bus
, addr
, 0)) {
103 i2c_send(bus
, command
);
104 i2c_send(bus
, data
& 0xff);
105 i2c_send(bus
, data
>> 8);
106 i2c_end_transfer(bus
);
110 int smbus_read_block(I2CBus
*bus
, uint8_t addr
, uint8_t command
, uint8_t *data
,
111 int len
, bool recv_len
, bool send_cmd
)
117 if (i2c_start_transfer(bus
, addr
, 0)) {
120 i2c_send(bus
, command
);
122 if (i2c_start_transfer(bus
, addr
, 1)) {
124 i2c_end_transfer(bus
);
129 rlen
= i2c_recv(bus
);
136 for (i
= 0; i
< rlen
; i
++) {
137 data
[i
] = i2c_recv(bus
);
140 i2c_end_transfer(bus
);
144 int smbus_write_block(I2CBus
*bus
, uint8_t addr
, uint8_t command
, uint8_t *data
,
145 int len
, bool send_len
)
153 if (i2c_start_transfer(bus
, addr
, 0)) {
156 i2c_send(bus
, command
);
160 for (i
= 0; i
< len
; i
++) {
161 i2c_send(bus
, data
[i
]);
163 i2c_end_transfer(bus
);