Lines Matching +full:pulse +full:- +full:code
2 * Bit-Bang i2c emulation extracted from
7 * This code is licensed under the GNU GPL v2.
9 * Contributions after 2012-01-13 are licensed under the terms of the
51 trace_bitbang_i2c_state(sname[i2c->state], sname[state]); in bitbang_i2c_set_state()
52 i2c->state = state; in bitbang_i2c_set_state()
57 if (i2c->current_addr >= 0) in bitbang_i2c_enter_stop()
58 i2c_end_transfer(i2c->bus); in bitbang_i2c_enter_stop()
59 i2c->current_addr = -1; in bitbang_i2c_enter_stop()
66 trace_bitbang_i2c_data(i2c->last_clock, i2c->last_data, in bitbang_i2c_ret()
67 i2c->device_out, level); in bitbang_i2c_ret()
68 i2c->device_out = level; in bitbang_i2c_ret()
70 return level & i2c->last_data; in bitbang_i2c_ret()
76 return bitbang_i2c_ret(i2c, i2c->device_out); in bitbang_i2c_nop()
89 if (level == i2c->last_data) { in bitbang_i2c_set()
92 i2c->last_data = level; in bitbang_i2c_set()
93 if (i2c->last_clock == 0) { in bitbang_i2c_set()
99 i2c->current_addr = -1; in bitbang_i2c_set()
107 data = i2c->last_data; in bitbang_i2c_set()
108 if (i2c->last_clock == level) { in bitbang_i2c_set()
111 i2c->last_clock = level; in bitbang_i2c_set()
113 /* State is set/read at the start of the clock pulse. in bitbang_i2c_set()
117 switch (i2c->state) { in bitbang_i2c_set()
123 i2c->buffer = (i2c->buffer << 1) | data; in bitbang_i2c_set()
125 bitbang_i2c_set_state(i2c, i2c->state + 1); in bitbang_i2c_set()
132 if (i2c->current_addr < 0) { in bitbang_i2c_set()
133 i2c->current_addr = i2c->buffer; in bitbang_i2c_set()
134 trace_bitbang_i2c_addr(i2c->current_addr); in bitbang_i2c_set()
135 ret = i2c_start_transfer(i2c->bus, i2c->current_addr >> 1, in bitbang_i2c_set()
136 i2c->current_addr & 1); in bitbang_i2c_set()
138 trace_bitbang_i2c_send(i2c->buffer); in bitbang_i2c_set()
139 ret = i2c_send(i2c->bus, i2c->buffer); in bitbang_i2c_set()
149 if (i2c->current_addr & 1) { in bitbang_i2c_set()
157 i2c->buffer = i2c_recv(i2c->bus); in bitbang_i2c_set()
158 trace_bitbang_i2c_recv(i2c->buffer); in bitbang_i2c_set()
161 data = i2c->buffer >> 7; in bitbang_i2c_set()
163 bitbang_i2c_set_state(i2c, i2c->state + 1); in bitbang_i2c_set()
164 i2c->buffer <<= 1; in bitbang_i2c_set()
170 i2c_nack(i2c->bus); in bitbang_i2c_set()
181 s->bus = bus; in bitbang_i2c_init()
182 s->last_data = 1; in bitbang_i2c_init()
183 s->last_clock = 1; in bitbang_i2c_init()
184 s->device_out = 1; in bitbang_i2c_init()
205 level = bitbang_i2c_set(&s->bitbang, irq, level); in bitbang_i2c_gpio_set()
206 if (level != s->last_level) { in bitbang_i2c_gpio_set()
207 s->last_level = level; in bitbang_i2c_gpio_set()
208 qemu_set_irq(s->out, level); in bitbang_i2c_gpio_set()
219 bitbang_i2c_init(&s->bitbang, bus); in gpio_i2c_init()
222 qdev_init_gpio_out(dev, &s->out, 1); in gpio_i2c_init()
229 set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories); in gpio_i2c_class_init()
230 dc->desc = "Virtual GPIO to I2C bridge"; in gpio_i2c_class_init()