mirror of https://github.com/periph/devices
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
3.3 KiB
Go
90 lines
3.3 KiB
Go
// Copyright 2022 The Periph Authors. All rights reserved.
|
|
// Use of this source code is governed under the Apache License, Version 2.0
|
|
// that can be found in the LICENSE file.
|
|
|
|
package tca95xx
|
|
|
|
import (
|
|
"periph.io/x/conn/v3/i2c"
|
|
)
|
|
|
|
// Variant is the type denoting a specific variant of the family.
|
|
type Variant string
|
|
|
|
const (
|
|
PCA9536 Variant = "PCA9536" // PCA9536 8-bit I²C extender. Datasheet: https://www.ti.com/lit/gpn/pca9536
|
|
TCA6408A Variant = "TCA6408A" // TCA6408A 8-bit I²C extender. Datasheet: https://www.ti.com/lit/gpn/tca6408a
|
|
TCA6416 Variant = "TCA6416" // TCA6416 8-bit I²C extender. Datasheet: https://www.ti.com/lit/gpn/tca6416
|
|
TCA6416A Variant = "TCA6416A" // TCA6416A 8-bit I²C extender. Datasheet: https://www.ti.com/lit/gpn/tca6416a
|
|
TCA9534 Variant = "TCA9534" // TCA9534 8-bit I²C extender. Datasheet: https://www.ti.com/lit/gpn/tca9534
|
|
TCA9534A Variant = "TCA9534A" // TCA9534A 8-bit I²C extender. Datasheet: https://www.ti.com/lit/gpn/tca9534a
|
|
TCA9535 Variant = "TCA9535" // TCA9535 8-bit I²C extender. Datasheet: https://www.ti.com/lit/gpn/tca9535
|
|
TCA9537 Variant = "TCA9537" // TCA9537 8-bit I²C extender. Datasheet: https://www.ti.com/lit/gpn/tca9537
|
|
TCA9538 Variant = "TCA9538" // TCA9538 8-bit I²C extender. Datasheet: https://www.ti.com/lit/gpn/tca9538
|
|
TCA9539 Variant = "TCA9539" // TCA9539 8-bit I²C extender. Datasheet: https://www.ti.com/lit/gpn/tca9539
|
|
TCA9554 Variant = "TCA9554" // TCA9554 8-bit I²C extender. Datasheet: https://www.ti.com/lit/gpn/tca9554
|
|
TCA9555 Variant = "TCA9555" // TCA9555 8-bit I²C extender. Datasheet: https://www.ti.com/lit/gpn/tca9555
|
|
)
|
|
|
|
type variant struct {
|
|
addStart uint16
|
|
addEnd uint16
|
|
pins int
|
|
}
|
|
|
|
var variants = map[Variant]variant{
|
|
PCA9536: {addStart: 0x41, addEnd: 0x41, pins: 4},
|
|
TCA6408A: {addStart: 0x20, addEnd: 0x21, pins: 8},
|
|
TCA6416: {addStart: 0x20, addEnd: 0x21, pins: 16},
|
|
TCA6416A: {addStart: 0x20, addEnd: 0x21, pins: 16},
|
|
TCA9534: {addStart: 0x20, addEnd: 0x27, pins: 8},
|
|
TCA9534A: {addStart: 0x38, addEnd: 0x3f, pins: 8},
|
|
TCA9535: {addStart: 0x20, addEnd: 0x27, pins: 16},
|
|
TCA9537: {addStart: 0x49, addEnd: 0x49, pins: 4},
|
|
TCA9538: {addStart: 0x70, addEnd: 0x73, pins: 8},
|
|
TCA9539: {addStart: 0x74, addEnd: 0x77, pins: 16},
|
|
TCA9554: {addStart: 0x20, addEnd: 0x27, pins: 8},
|
|
TCA9555: {addStart: 0x20, addEnd: 0x27, pins: 16},
|
|
}
|
|
|
|
// isAddrInvalid checks to see if the address is used by the chip.
|
|
func (v variant) isAddrInvalid(addr uint16) bool {
|
|
if addr < v.addStart || v.addEnd < addr {
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
// getVariantRegMap returns the register map based on the number of pins the
|
|
// chip expands to.
|
|
func (v variant) getPorts(i2c *i2c.Dev, devicename string) []*port {
|
|
if v.pins == 16 {
|
|
return []*port{
|
|
{
|
|
name: devicename + "_P0",
|
|
input: newRegister(i2c, 0x00),
|
|
output: newRegister(i2c, 0x02),
|
|
ipol: newRegister(i2c, 0x04),
|
|
iodir: newRegister(i2c, 0x06),
|
|
},
|
|
{
|
|
name: devicename + "_P1",
|
|
input: newRegister(i2c, 0x01),
|
|
output: newRegister(i2c, 0x03),
|
|
ipol: newRegister(i2c, 0x05),
|
|
iodir: newRegister(i2c, 0x07),
|
|
},
|
|
}
|
|
}
|
|
|
|
return []*port{
|
|
{
|
|
name: devicename + "_P0",
|
|
input: newRegister(i2c, 0x00),
|
|
output: newRegister(i2c, 0x01),
|
|
ipol: newRegister(i2c, 0x02),
|
|
iodir: newRegister(i2c, 0x03),
|
|
},
|
|
}
|
|
}
|