tinygo.org/x/drivers@v0.27.1-0.20240509133757-7dbca2a54349/axp192/axp192.go (about) 1 // Package axp192 provides a driver for the axp192 I2C Enhanced single Cell 2 // Li-Battery and Power System Management IC. 3 // 4 // http://www.x-powers.com/en.php/Info/product_detail/article_id/29 5 // Datasheet: https://github.com/m5stack/M5-Schematic/blob/master/Core/AXP192%20Datasheet_v1.1_en_draft_2211.pdf 6 package axp192 // import "tinygo.org/x/drivers/axp192" 7 8 import ( 9 "tinygo.org/x/drivers" 10 "tinygo.org/x/drivers/internal/legacy" 11 ) 12 13 type Error uint8 14 15 const ( 16 ErrInvalidID Error = 0x1 17 ) 18 19 func (e Error) Error() string { 20 switch e { 21 case ErrInvalidID: 22 return "Invalid chip ID" 23 default: 24 return "Unknown error" 25 } 26 } 27 28 type Device struct { 29 bus drivers.I2C 30 buf []byte 31 Address uint8 32 } 33 34 // New returns AXP192 device for the provided I2C bus using default address. 35 func New(i2c drivers.I2C) *Device { 36 return &Device{ 37 bus: i2c, 38 buf: make([]byte, 2), 39 Address: Address, 40 } 41 } 42 43 type Config struct { 44 } 45 46 // Configure the AXP192 device. 47 func (d *Device) Configure(config Config) error { 48 return nil 49 } 50 51 // ReadPowerSupplyStatus reads power supply status. 52 func (d *Device) ReadPowerSupplyStatus() uint8 { 53 return d.read8bit(RegPowerSupplyStatus) 54 } 55 56 // SetVbusIPSOutAccessManagement sets VBUS-IPSOUT access management. 57 func (d *Device) SetVbusIPSOutAccessManagement(a uint8) { 58 d.write1Byte(RegVbusIPSOutAccessManagement, a) 59 } 60 61 // GetVbusIPSOutAccessManagement gets VBUS-IPSOUT access management. 62 func (d *Device) GetVbusIPSOutAccessManagement() uint8 { 63 return d.read8bit(RegVbusIPSOutAccessManagement) 64 } 65 66 // SetGPIO1Control sets GPIO1 function. 67 func (d *Device) SetGPIO1Control(a uint8) { 68 d.write1Byte(RegGPIO1Control, a) 69 } 70 71 // GetGPIO1Control gets GPIO1 function. 72 func (d *Device) GetGPIO1Control() uint8 { 73 return d.read8bit(RegGPIO1Control) 74 } 75 76 // SetGPIO2Control sets GPIO2 function. 77 func (d *Device) SetGPIO2Control(a uint8) { 78 d.write1Byte(RegGPIO2Control, a) 79 } 80 81 // GetGPIO2Control gets GPIO2 function. 82 func (d *Device) GetGPIO2Control() uint8 { 83 return d.read8bit(RegGPIO2Control) 84 } 85 86 // SetGPIO20SignalStatus sets GPIO[2:0] signal status. 87 func (d *Device) SetGPIO20SignalStatus(a uint8) { 88 d.write1Byte(RegGPIO20SignalStatus, a) 89 } 90 91 // GetGPIO20SignalStatus gets GPIO[2:0] signal status. 92 func (d *Device) GetGPIO20SignalStatus() uint8 { 93 return d.read8bit(RegGPIO20SignalStatus) 94 } 95 96 // SetBackupBatteryChargingControl sets backup battery charge control. 97 func (d *Device) SetBackupBatteryChargingControl(a uint8) { 98 d.write1Byte(RegBackupBatteryChargingControl, a) 99 } 100 101 // GetBackupBatteryChargingControl gets backup battery charge control. 102 func (d *Device) GetBackupBatteryChargingControl() uint8 { 103 return d.read8bit(RegBackupBatteryChargingControl) 104 } 105 106 // SetDCDC1VoltageSet sets DC-DC1 output voltage. 107 func (d *Device) SetDCDC1VoltageSet(a uint8) { 108 d.write1Byte(RegDCDC1VoltageSet, a) 109 } 110 111 // GetDCDC1VoltageSet gets DC-DC1 output voltage. 112 func (d *Device) GetDCDC1VoltageSet() uint8 { 113 return d.read8bit(RegDCDC1VoltageSet) 114 } 115 116 // SetDCDC2VoltageSet sets DC-DC2 dynamic voltage parameter. 117 func (d *Device) SetDCDC2VoltageSet(a uint8) { 118 d.write1Byte(RegDCDC2VoltageSet, a) 119 } 120 121 // GetDCDC2VoltageSet gets DC-DC2 dynamic voltage parameter. 122 func (d *Device) GetDCDC2VoltageSet() uint8 { 123 return d.read8bit(RegDCDC2VoltageSet) 124 } 125 126 // SetDCDC3VoltageSet sets DC-DC3 output voltage. 127 func (d *Device) SetDCDC3VoltageSet(a uint8) { 128 d.write1Byte(RegDCDC3VoltageSet, a) 129 } 130 131 // GetDCDC3VoltageSet gets DC-DC3 output voltage. 132 func (d *Device) GetDCDC3VoltageSet() uint8 { 133 return d.read8bit(RegDCDC3VoltageSet) 134 } 135 136 // SetLDO23VoltageSet sets LDO2/3 output voltage. 137 func (d *Device) SetLDO23VoltageSet(a uint8) { 138 d.write1Byte(RegLDO23VoltageSet, a) 139 } 140 141 // GetLDO23VoltageSet gets LDO2/3 output voltage. 142 func (d *Device) GetLDO23VoltageSet() uint8 { 143 return d.read8bit(RegLDO23VoltageSet) 144 } 145 146 // SetDCDC13LDO23Switch sets DC-DC1/3 & LOD2/3 output control. 147 func (d *Device) SetDCDC13LDO23Switch(a uint8) { 148 d.write1Byte(RegDCDC13LDO23Switch, a) 149 } 150 151 // GetDCDC13LDO23Switch gets DC-DC1/3 & LOD2/3 output control. 152 func (d *Device) GetDCDC13LDO23Switch() uint8 { 153 return d.read8bit(RegDCDC13LDO23Switch) 154 } 155 156 // SetGPIO43FunctionControl sets GPIO[4:3] pin function. 157 func (d *Device) SetGPIO43FunctionControl(a uint8) { 158 d.write1Byte(RegGPIO43FunctionControl, a) 159 } 160 161 // GetGPIO43FunctionControl gets GPIO[4:3] pin function. 162 func (d *Device) GetGPIO43FunctionControl() uint8 { 163 return d.read8bit(RegGPIO43FunctionControl) 164 } 165 166 // SetPEKParameterSet sets PEK press key parameter. 167 func (d *Device) SetPEKParameterSet(a uint8) { 168 d.write1Byte(RegPEKParameterSet, a) 169 } 170 171 // GetPEKParameterSet gets PEK press key parameter. 172 func (d *Device) GetPEKParameterSet() uint8 { 173 return d.read8bit(RegPEKParameterSet) 174 } 175 176 // SetADCEnableSet sets ADC enable 1. 177 func (d *Device) SetADCEnableSet(a uint8) { 178 d.write1Byte(RegADCEnableSet, a) 179 } 180 181 // GetADCEnableSet gets ADC enable 1. 182 func (d *Device) GetADCEnableSet() uint8 { 183 return d.read8bit(RegADCEnableSet) 184 } 185 186 // SetGPIO43SignalStatus sets GPIO[4:3] signal status. 187 func (d *Device) SetGPIO43SignalStatus(a uint8) { 188 d.write1Byte(RegGPIO43SignalStatus, a) 189 } 190 191 // GetGPIO43SignalStatus gets GPIO[4:3] signal status. 192 func (d *Device) GetGPIO43SignalStatus() uint8 { 193 return d.read8bit(RegGPIO43SignalStatus) 194 } 195 196 // SetDCVoltage sets DC voltage. 197 func (d *Device) SetDCVoltage(number uint8, voltage uint16) { 198 if voltage < 700 { 199 voltage = 0 200 } else { 201 voltage = (voltage - 700) / 25 202 } 203 204 switch number { 205 case 0: 206 v := d.GetDCDC1VoltageSet() 207 d.SetDCDC1VoltageSet((v & 0x80) | (uint8(voltage) & 0x7F)) 208 case 1: 209 v := d.GetDCDC2VoltageSet() 210 d.SetDCDC2VoltageSet((v & 0x80) | (uint8(voltage) & 0x7F)) 211 case 2: 212 v := d.GetDCDC3VoltageSet() 213 d.SetDCDC3VoltageSet((v & 0x80) | (uint8(voltage) & 0x7F)) 214 } 215 } 216 217 // SetLDOVoltage sets LDO voltage. 218 func (d *Device) SetLDOVoltage(number uint8, voltage uint16) { 219 if voltage > 3300 { 220 voltage = 15 221 } else { 222 voltage = (voltage / 100) - 18 223 } 224 225 switch number { 226 case 2: 227 v := d.GetLDO23VoltageSet() 228 d.SetLDO23VoltageSet((v & 0x0F) | (uint8(voltage) << 4)) 229 break 230 case 3: 231 v := d.GetLDO23VoltageSet() 232 d.SetLDO23VoltageSet((v & 0xF0) | uint8(voltage)) 233 break 234 } 235 } 236 237 // SetLDOEnable enable LDO. 238 func (d *Device) SetLDOEnable(number uint8, state bool) { 239 mark := uint8(0x01) 240 mark <<= number 241 switch number { 242 case 2: 243 v := d.GetDCDC13LDO23Switch() 244 d.SetDCDC13LDO23Switch(v | mark) 245 case 3: 246 v := d.GetDCDC13LDO23Switch() 247 d.SetDCDC13LDO23Switch(v & (^mark)) 248 } 249 } 250 251 func (d *Device) write1Byte(reg, data uint8) { 252 legacy.WriteRegister(d.bus, d.Address, reg, []byte{data}) 253 } 254 255 func (d *Device) read8bit(reg uint8) uint8 { 256 legacy.ReadRegister(d.bus, d.Address, reg, d.buf[:1]) 257 return d.buf[0] 258 }