Lines Matching +full:led +full:- +full:1

2  * PCA9552 I2C LED blinker
4 * https://www.nxp.com/docs/en/application-note/AN264.pdf
6 * Copyright (c) 2017-2018, IBM Corporation.
7 * Copyright (c) 2020 Philippe Mathieu-Daudé
10 * later. See the COPYING file in the top-level directory.
17 #include "hw/qdev-properties.h"
55 uint8_t shift = (pin % 4) << 1; in pca955x_pin_get_config()
57 return extract32(s->regs[reg], shift, 2); in pca955x_pin_get_config()
63 return (s->regs[PCA9552_INPUT1] << 8) | s->regs[PCA9552_INPUT0]; in pca955x_pins_get_status()
79 char buf[PCA955X_PIN_COUNT_MAX + 1]; in pca955x_display_pins_status()
81 for (i = 0; i < k->pin_count; i++) { in pca955x_display_pins_status()
82 if (extract32(pins_status, i, 1)) { in pca955x_display_pins_status()
89 trace_pca955x_gpio_status(s->description, buf); in pca955x_display_pins_status()
92 for (i = 0; i < k->pin_count; i++) { in pca955x_display_pins_status()
93 if (extract32(pins_changed, i, 1)) { in pca955x_display_pins_status()
94 unsigned new_state = extract32(pins_status, i, 1); in pca955x_display_pins_status()
97 * We display the state using the PCA logic ("active-high"). in pca955x_display_pins_status()
98 * This is not the state of the LED, which signal might be in pca955x_display_pins_status()
99 * wired "active-low" on the board. in pca955x_display_pins_status()
101 trace_pca955x_gpio_change(s->description, i, in pca955x_display_pins_status()
113 for (i = 0; i < k->pin_count; i++) { in pca955x_update_pin_input()
115 uint8_t bit_mask = 1 << (i % 8); in pca955x_update_pin_input()
117 uint8_t old_value = s->regs[input_reg] & bit_mask; in pca955x_update_pin_input()
122 /* Pin is set to 0V to turn on LED */ in pca955x_update_pin_input()
123 s->regs[input_reg] &= ~bit_mask; in pca955x_update_pin_input()
127 * Pin is set to Hi-Z to turn off LED and in pca955x_update_pin_input()
128 * pullup sets it to a logical 1 unless in pca955x_update_pin_input()
131 if (s->ext_state[i] == PCA9552_PIN_LOW) { in pca955x_update_pin_input()
132 s->regs[input_reg] &= ~bit_mask; in pca955x_update_pin_input()
134 s->regs[input_reg] |= bit_mask; in pca955x_update_pin_input()
145 new_value = s->regs[input_reg] & bit_mask; in pca955x_update_pin_input()
147 qemu_set_irq(s->gpio_out[i], !!new_value); in pca955x_update_pin_input()
165 return s->regs[reg]; in pca955x_read()
182 s->regs[reg] = data; in pca955x_write()
190 s->regs[reg] = data; in pca955x_write()
204 * When Auto-Increment is on, the register address is incremented
212 if (s->pointer != 0xFF && s->pointer & PCA9552_AUTOINC) { in pca955x_autoinc()
213 uint8_t reg = s->pointer & 0xf; in pca955x_autoinc()
215 reg = (reg + 1) % (k->max_reg + 1); in pca955x_autoinc()
216 s->pointer = reg | PCA9552_AUTOINC; in pca955x_autoinc()
225 ret = pca955x_read(s, s->pointer & 0xf); in pca955x_recv()
231 * AI bit is set to Logic Level 1, the Read Sequence MUST in pca955x_recv()
237 if (s->pointer == PCA9552_AUTOINC) { in pca955x_recv()
253 if (s->len == 0) { in pca955x_send()
254 s->pointer = data; in pca955x_send()
255 s->len++; in pca955x_send()
257 pca955x_write(s, s->pointer & 0xf, data); in pca955x_send()
269 s->len = 0; in pca955x_event()
278 int led, rc, reg; in pca955x_get_led() local
281 rc = sscanf(name, "led%2d", &led); in pca955x_get_led()
282 if (rc != 1) { in pca955x_get_led()
286 if (led < 0 || led > k->pin_count) { in pca955x_get_led()
287 error_setg(errp, "%s invalid led %s", __func__, name); in pca955x_get_led()
295 reg = PCA9552_LS0 + led / 4; in pca955x_get_led()
296 state = (pca955x_read(s, reg) >> ((led % 4) * 2)) & 0x3; in pca955x_get_led()
301 * Return an LED selector register value based on an existing one, with
302 * the appropriate 2-bit state value set for the given LED number (0-3).
306 return (oldval & (~(0x3 << (led_num << 1)))) | in pca955x_ledsel()
307 ((state & 0x3) << (led_num << 1)); in pca955x_ledsel()
315 int led, rc, reg, val; in pca955x_set_led() local
322 rc = sscanf(name, "led%2d", &led); in pca955x_set_led()
323 if (rc != 1) { in pca955x_set_led()
327 if (led < 0 || led > k->pin_count) { in pca955x_set_led()
328 error_setg(errp, "%s invalid led %s", __func__, name); in pca955x_set_led()
338 error_setg(errp, "%s invalid led state %s", __func__, state_str); in pca955x_set_led()
342 reg = PCA9552_LS0 + led / 4; in pca955x_set_led()
344 val = pca955x_ledsel(val, led % 4, state); in pca955x_set_led()
366 s->regs[PCA9552_PSC0] = 0xFF; in pca9552_reset()
367 s->regs[PCA9552_PWM0] = 0x80; in pca9552_reset()
368 s->regs[PCA9552_PSC1] = 0xFF; in pca9552_reset()
369 s->regs[PCA9552_PWM1] = 0x80; in pca9552_reset()
370 s->regs[PCA9552_LS0] = 0x55; /* all OFF */ in pca9552_reset()
371 s->regs[PCA9552_LS1] = 0x55; in pca9552_reset()
372 s->regs[PCA9552_LS2] = 0x55; in pca9552_reset()
373 s->regs[PCA9552_LS3] = 0x55; in pca9552_reset()
375 memset(s->ext_state, PCA9552_PIN_HIZ, PCA955X_PIN_COUNT_MAX); in pca9552_reset()
378 s->pointer = 0xFF; in pca9552_reset()
379 s->len = 0; in pca9552_reset()
385 int led; in pca955x_initfn() local
387 assert(k->pin_count <= PCA955X_PIN_COUNT_MAX); in pca955x_initfn()
388 for (led = 0; led < k->pin_count; led++) { in pca955x_initfn()
391 name = g_strdup_printf("led%d", led); in pca955x_initfn()
400 if (s->ext_state[pin] != level) { in pca955x_set_ext_state()
402 s->ext_state[pin] = level; in pca955x_set_ext_state()
414 assert((pin >= 0) && (pin < k->pin_count)); in pca955x_gpio_in_handler()
423 if (!s->description) { in pca955x_realize()
424 s->description = g_strdup("pca-unspecified"); in pca955x_realize()
427 qdev_init_gpio_out(dev, s->gpio_out, k->pin_count); in pca955x_realize()
428 qdev_init_gpio_in(dev, pca955x_gpio_in_handler, k->pin_count); in pca955x_realize()
440 k->event = pca955x_event; in pca955x_class_init()
441 k->recv = pca955x_recv; in pca955x_class_init()
442 k->send = pca955x_send; in pca955x_class_init()
443 dc->realize = pca955x_realize; in pca955x_class_init()
463 dc->vmsd = &pca9552_vmstate; in pca9552_class_init()
464 pc->max_reg = PCA9552_LS3; in pca9552_class_init()
465 pc->pin_count = 16; in pca9552_class_init()