Skip to content

Commit 0edacf1

Browse files
committed
Fix M5Stack Core S3
1 parent 243105b commit 0edacf1

File tree

1 file changed

+169
-0
lines changed

1 file changed

+169
-0
lines changed
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
#-------------------------------------------------------------
2+
- Generic driver for AXP2102 - solidified
3+
-------------------------------------------------------------#
4+
5+
# Specs
6+
# DCDC1 : 1.5-3.4V, 2000mA
7+
# DCDC2 : 0.5-1.2V,1.22-1.54V, 2000mA
8+
# DCDC3 : 0.5-1.2V,1.22-1.54V, 1.6-3.4V, 2000mA
9+
# DCDC4 : 0.5-1.2V, 1.22-1.84V, 1500mA
10+
# DCDC5 : 1.2V , 1.4-3.7V, 1000mA
11+
#
12+
# RTCLDO1/2 : 1.8V/2.5V/3V/3.3V, 30mA
13+
# ALDO1~4 : 0.5-3.5V, 100mV/step 300mA
14+
15+
# LDO index:
16+
# 0=ALDO1 ~ 3=ALDO4 / 4=BLDO1 / 5=BLDO2
17+
18+
#@ solidify:AXP2102
19+
class AXP2102 : I2C_Driver
20+
def init(addr)
21+
if (addr == nil) addr = 0x34 end # default address is 0x34
22+
super(self).init("AXP2102", addr)
23+
end
24+
25+
# Return True = Battery Exist
26+
def battery_present()
27+
return bool(self.wire.read(self.addr, 0x00, 1) & 0x08)
28+
end
29+
30+
# # Battery Charging Status
31+
def get_battery_charging_status()
32+
var val = (self.read8(0x01) >> 5) & 0x03
33+
# 1:charge / 2:dischage / 0:stanby
34+
return (val == 1) ? 1 : ((val == 2) ? -1 : 0)
35+
end
36+
37+
def is_charging()
38+
return (self.read8(0x01) & 0x60) == 0x20
39+
end
40+
41+
def get_battery_level()
42+
return self.read8(0xA4)
43+
end
44+
45+
# AXP chip temperature in °C
46+
def get_temp()
47+
return 22 + ((7274 - self.read16(0x3C)) / 20);
48+
end
49+
50+
def get_bat_power()
51+
return 0
52+
end
53+
54+
def get_bat_voltage()
55+
return self.read14(0x34) / 1000.0
56+
end
57+
def get_bat_current()
58+
return 0
59+
end
60+
def get_bat_charge_current()
61+
return 0
62+
end
63+
def get_aps_voltage()
64+
return 0
65+
end
66+
def get_vbus_good()
67+
return bool(self.wire.read(self.addr, 0x00, 1) & 0x20)
68+
end
69+
def get_vbus_voltage()
70+
if (!self.get_vbus_good()) return 0 end
71+
var vbus = self.read14(0x38)
72+
if (vbus > 16375) return 0 end
73+
return vbus / 1000.0
74+
end
75+
def get_vbus_current()
76+
return 0
77+
end
78+
79+
# set LDO voltage
80+
# 0=ALDO1 ~ 3=ALDO4 / 4=BLDO1 / 5=BLDO2
81+
# voltage: (mV) 0.5-3.5V in 100mV steps
82+
def set_ldo_voltage(num, voltage)
83+
if (num < 0 || num > 5) return end
84+
var reg_volt = num + 0x92
85+
voltage -= 500
86+
# convert voltage to value
87+
var val = (voltage < 0) ? 0 : voltage / 100
88+
if (val > 0x1E) val = 0x1E end
89+
self.write8(reg_volt, val)
90+
91+
var reg90bit = 1 << num
92+
if (voltage < 0)
93+
self.write8(0x90, self.read8(0x90) & ~reg90bit) # bit off
94+
else
95+
self.write8(0x90, self.read8(0x90) | reg90bit) # bit on
96+
end
97+
end
98+
99+
# det DLDO voltage
100+
def set_dldo_voltage(num, voltage)
101+
if (num < 0 || num > 1) return end
102+
var reg_volt = num + 0x99
103+
voltage -= 500
104+
# convert voltage to value
105+
var val = (voltage < 0) ? 0 : voltage / (num ? 50 : 100)
106+
if (val > (num ? 0x13 : 0x1C)) val = num ? 0x13 : 0x1C end
107+
self.write8(reg_volt, val)
108+
109+
var reg = 0x90 + num
110+
var bit = num ? 0x01 : 0x80
111+
if (voltage < 0)
112+
self.write8(0x90, self.read8(reg) & ~bit) # bit off
113+
else
114+
self.write8(0x90, self.read8(reg) | bit) # bit on
115+
end
116+
end
117+
118+
# get LDO enable
119+
def get_ldo_enable(num)
120+
var res = false
121+
if (num <= 5)
122+
var reg90bit = 1 << num
123+
res = bool(self.read8(0x90) & reg90bit)
124+
end
125+
return res
126+
end
127+
128+
def set_battery_charge(enable)
129+
self.write8(0x18, (self.read8(0x18) & 0xFD) | ((enable ? 1 : 0) << 1))
130+
end
131+
132+
static var _pre_charge = [0, 25, 50, 75, 100, 125, 150, 175, 200, 255]
133+
def set_pre_charge_current(max_mA)
134+
if (max_mA < 0) max_mA = 0 end
135+
if (max_mA > 200) max_mA = 200 end
136+
var i = 0
137+
while (self._pre_charge[i] <= max_mA)
138+
i += 1
139+
end
140+
self.write8(0x61, i)
141+
end
142+
143+
static var _charge = [ 25, 30, 35, 40, 60, 80, 100, 120, 140, 160, 180, 200, 255]
144+
def set_charge_current(max_mA)
145+
if (max_mA < 0) max_mA = 0 end
146+
if (max_mA > 200) max_mA = 200 end
147+
var i = 0
148+
while (self._charge[i] <= max_mA)
149+
i += 1
150+
end
151+
i += 4
152+
self.write8(0x62, i)
153+
end
154+
155+
static var _charge_voltage = [410, 420, 435, 440, 460, 655]
156+
def set_charge_voltage(max_mV)
157+
if (max_mV < 0) max_mV = 0 end
158+
if (max_mV > 460) max_mV = 460 end
159+
var i = 0
160+
while (self._charge_voltage[i] <= max_mV)
161+
i += 1
162+
end
163+
i += 1
164+
if (i >= 6) i = 0 end
165+
self.write8(0x64, i)
166+
end
167+
168+
end
169+
return AXP2102

0 commit comments

Comments
 (0)