ff557c272c
Allow external devices to drive pca9552 input pins by adding input GPIO's to the model. This allows a device to connect its output GPIO's to the pca9552 input GPIO's. In order for an external device to set the state of a pca9552 pin, the pin must first be configured for high impedance (LED is off). If the pca9552 pin is configured to drive the pin low (LED is on), then external input will be ignored. Here is a table describing the logical state of a pca9552 pin given the state being driven by the pca9552 and an external device: PCA9552 Configured State | Hi-Z | Low | ------+------+-----+ External Hi-Z | Hi | Low | Device ------+------+-----+ State Low | Low | Low | ------+------+-----+ Reviewed-by: Andrew Jeffery <andrew@codeconstruct.com.au> Signed-off-by: Glenn Miles <milesg@linux.vnet.ibm.com> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
39 lines
866 B
C
39 lines
866 B
C
/*
|
|
* PCA9552 I2C LED blinker
|
|
*
|
|
* Copyright (c) 2017-2018, IBM Corporation.
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or
|
|
* later. See the COPYING file in the top-level directory.
|
|
*/
|
|
#ifndef PCA9552_H
|
|
#define PCA9552_H
|
|
|
|
#include "hw/i2c/i2c.h"
|
|
#include "qom/object.h"
|
|
|
|
#define TYPE_PCA9552 "pca9552"
|
|
#define TYPE_PCA955X "pca955x"
|
|
typedef struct PCA955xState PCA955xState;
|
|
DECLARE_INSTANCE_CHECKER(PCA955xState, PCA955X,
|
|
TYPE_PCA955X)
|
|
|
|
#define PCA955X_NR_REGS 10
|
|
#define PCA955X_PIN_COUNT_MAX 16
|
|
|
|
struct PCA955xState {
|
|
/*< private >*/
|
|
I2CSlave i2c;
|
|
/*< public >*/
|
|
|
|
uint8_t len;
|
|
uint8_t pointer;
|
|
|
|
uint8_t regs[PCA955X_NR_REGS];
|
|
qemu_irq gpio_out[PCA955X_PIN_COUNT_MAX];
|
|
uint8_t ext_state[PCA955X_PIN_COUNT_MAX];
|
|
char *description; /* For debugging purpose only */
|
|
};
|
|
|
|
#endif
|