Skip to content

Commit 4afffb8

Browse files
authored
Merge pull request #1247 from 13584452567/main
add support for hugsun-zm and delete tqc-a01
2 parents d037e8b + f2f659a commit 4afffb8

File tree

5 files changed

+279
-3
lines changed

5 files changed

+279
-3
lines changed

build-armbian/armbian-files/common-files/etc/model_database.conf

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ r301 :EAIDK-610 :rk3399 :rk3399-eaidk-610.dtb
186186
r302 :King3399 :rk3399 :rk3399-king3399.dtb :trust.bin :u-boot.img :idbloader.bin :stable :rockchip :rk3399 :armbianEnv.txt :king3399 :yes
187187
r303 :TN3399 :rk3399 :rk3399-tn3399.dtb :trust.bin :u-boot.img :idbloader.bin :stable :rockchip :rk3399 :armbianEnv.txt :tn3399 :yes
188188
r304 :Kylin3399 :rk3399 :rk3399-kylin3399.dtb :trust.bin :u-boot.img :idbloader.bin :stable :rockchip :rk3399 :armbianEnv.txt :kylin3399 :yes
189-
189+
r305 :ZCube1 Max :rk3399 :rk3399-hugsun-zm.dtb :trust.bin :u-boot.img :idbloader.bin :stable :rockchip :rk3399 :armbianEnv.txt :hugsun-zm :yes
190190

191191
# Rockchip RK3328 Family
192192
#-------+----------------------------+---------+---------------------------------------+-----------------------------+------------------------------------+--------------------------------+--------------+-----------+-------------+----------------+--------------------+-------
@@ -201,6 +201,5 @@ r402 :L1-Pro :rk3328 :rk3328-l1pro-1296mhz.dtb
201201
# 1.ID 2.MODEL 3.SOC 4.FDTFILE 5.UNUSED 6.MAINLINE_UBOOT 7.BOOTLOADER_IMG 8.KERNEL_TAGS 9.PLATFORM 10.FAMILY 11.BOOT_CONF 12.BOARD 13.BUILD
202202
#-------+----------------------------+---------+---------------------------------------+-----------------------------+------------------------------------+--------------------------------+--------------+-----------+-------------+----------------+--------------------+-------
203203
w101 :Vplus-Cloud :h6 :sun50i-h6-vplus-cloud.dtb :NA :NA :u-boot-sunxi-with-spl.bin :stable :allwinner :sun50i-h6 :armbianEnv.txt :vplus :yes
204-
w102 :TQC-A01 :h6 :sun50i-h6-tqc-a01.dtb :NA :NA :u-boot-sunxi-with-spl.bin :h6 :allwinner :sun50i-h6 :extlinux.conf :tqc-a01 :yes
205-
w103 :Tanix-TX6 :h6 :sun50i-h6-tanix-tx6.dtb :NA :NA :u-boot-sunxi-with-spl.bin :stable :allwinner :sun50i-h6 :extlinux.conf :tanix-tx6 :yes
204+
w102 :Tanix-TX6 :h6 :sun50i-h6-tanix-tx6.dtb :NA :NA :u-boot-sunxi-with-spl.bin :stable :allwinner :sun50i-h6 :extlinux.conf :tanix-tx6 :yes
206205

Lines changed: 277 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,277 @@
1+
#include <stdio.h>
2+
#include <stdint.h>
3+
#include <stdlib.h>
4+
#include <err.h>
5+
#include <errno.h>
6+
7+
#include <linux/types.h>
8+
#include <linux/i2c.h>
9+
#include <linux/i2c-dev.h>
10+
11+
#include <sys/ioctl.h>
12+
#include <sys/types.h>
13+
#include <sys/stat.h>
14+
#include <fcntl.h>
15+
16+
#define I2C_DEV "/dev/i2c-2"
17+
#define AW2028_I2C_ADDR 0x65
18+
19+
int fd = -1;
20+
21+
static uint8_t aw2028_init(void)
22+
{
23+
fd = open(I2C_DEV, O_RDWR);
24+
25+
if (fd < 0) {
26+
perror("Can't open " I2C_DEV " \n");
27+
exit(1);
28+
}
29+
30+
printf("open " I2C_DEV " success !\n");
31+
32+
if (ioctl(fd, I2C_SLAVE, AW2028_I2C_ADDR) < 0) {
33+
perror("fail to set i2c device slave address!\n");
34+
close(fd);
35+
return -1;
36+
}
37+
38+
return 0;
39+
}
40+
41+
static uint8_t i2c_write(uint8_t reg, uint8_t val)
42+
{
43+
int retries;
44+
uint8_t data[2];
45+
46+
data[0] = reg;
47+
data[1] = val;
48+
49+
for (retries = 5; retries; retries--) {
50+
if (write(fd, data, 2) == 2) {
51+
return 0;
52+
}
53+
usleep(1000 * 10);
54+
}
55+
56+
return -1;
57+
}
58+
59+
static uint8_t i2c_read(uint8_t reg, uint8_t *val)
60+
{
61+
int retries;
62+
63+
for (retries = 5; retries; retries--) {
64+
if (write(fd, &reg, 1) == 1) {
65+
if (read(fd, val, 1) == 1) {
66+
return 0;
67+
}
68+
}
69+
}
70+
71+
return -1;
72+
}
73+
74+
unsigned char ms2timer(unsigned int time)
75+
{
76+
unsigned char i = 0;
77+
unsigned int ref[16] = {4, 128, 256, 384, 512, 762, 1024, 1524,
78+
2048, 2560, 3072, 4096, 5120, 6144, 7168, 8192};
79+
80+
for (i = 0; i < 15; i++) {
81+
if (time <= ref[0]) {
82+
return 0;
83+
} else if (time > ref[15]) {
84+
return 15;
85+
} else if ((time > ref[i]) && (time <= ref[i + 1])) {
86+
if ((time - ref[i]) <= (ref[i + 1] - time)) {
87+
return i;
88+
} else {
89+
return (i + 1);
90+
}
91+
}
92+
}
93+
return 0;
94+
}
95+
96+
unsigned char AW2028_LED_ON(unsigned char r, unsigned char g, unsigned char b)
97+
{
98+
i2c_write(0x00, 0x55); // software reset
99+
100+
i2c_write(0x01, 0x01); // GCR
101+
i2c_write(0x03, 0x01); // IMAX
102+
i2c_write(0x04, 0x00); // LCFG1
103+
i2c_write(0x05, 0x00); // LCFG2
104+
i2c_write(0x06, 0x00); // LCFG3
105+
i2c_write(0x07, 0x07); // LEDEN
106+
107+
i2c_write(0x10, r); // ILED1
108+
i2c_write(0x11, g); // ILED2
109+
i2c_write(0x12, b); // ILED3
110+
i2c_write(0x1C, 0xFF); // PWM1
111+
i2c_write(0x1D, 0xFF); // PWM2
112+
i2c_write(0x1E, 0xFF); // PWM3
113+
114+
return 0;
115+
}
116+
117+
unsigned char AW2028_LED_OFF(void)
118+
{
119+
i2c_write(0x00, 0x55); // software reset
120+
return 0;
121+
}
122+
123+
unsigned char AW2028_LED_Blink(unsigned char r, unsigned char g,
124+
unsigned char b, unsigned int trise_ms,
125+
unsigned int ton_ms, unsigned int tfall_ms,
126+
unsigned int toff_ms)
127+
{
128+
unsigned char trise, ton, tfall, toff;
129+
130+
trise = ms2timer(trise_ms);
131+
ton = ms2timer(ton_ms);
132+
tfall = ms2timer(tfall_ms);
133+
toff = ms2timer(toff_ms);
134+
135+
i2c_write(0x00, 0x55); // software reset
136+
137+
i2c_write(0x01, 0x01); // GCR
138+
i2c_write(0x03, 0x01); // IMAX
139+
i2c_write(0x04, 0x01); // LCFG1
140+
i2c_write(0x05, 0x01); // LCFG2
141+
i2c_write(0x06, 0x01); // LCFG3
142+
i2c_write(0x07, 0x07); // LEDEN
143+
i2c_write(0x08, 0x08); // LEDCTR
144+
145+
i2c_write(0x10, r); // ILED1
146+
i2c_write(0x11, g); // ILED2
147+
i2c_write(0x12, b); // ILED3
148+
i2c_write(0x1C, 0xFF); // PWM1
149+
i2c_write(0x1D, 0xFF); // PWM2
150+
i2c_write(0x1E, 0xFF); // PWM3
151+
152+
i2c_write(0x30, (trise << 4) | ton); // PAT_T1 Trise & Ton
153+
i2c_write(0x31, (tfall << 4) | toff); // PAT_T2 Tfall & Toff
154+
i2c_write(0x32, 0x00); // PAT_T3 Tdelay
155+
i2c_write(0x33, 0x00); // PAT_T4 PAT_CTR & Color
156+
i2c_write(0x34, 0x00); // PAT_T5 Timer
157+
158+
i2c_write(0x09, 0x07); // PAT_RIN
159+
}
160+
161+
unsigned char AW2028_Audio_Corss_Zero(void)
162+
{
163+
i2c_write(0x00, 0x55); // software reset
164+
165+
i2c_write(0x01, 0x01); // GCR
166+
i2c_write(0x03, 0x01); // IMAX
167+
i2c_write(0x07, 0x07); // LEDEN
168+
i2c_write(0x10, 0xFF); // ILED1
169+
i2c_write(0x11, 0xFF); // ILED2
170+
i2c_write(0x12, 0xFF); // ILED3
171+
i2c_write(0x1C, 0xFF); // PWM1
172+
i2c_write(0x1D, 0xFF); // PWM2
173+
i2c_write(0x1E, 0xFF); // PWM3
174+
175+
i2c_write(0x40, 0x11); // AUDIO_CTR
176+
i2c_write(0x41, 0x07); // AUDIO_LEDEN
177+
i2c_write(0x42, 0x00); // AUDIO_FLT
178+
i2c_write(0x43, 0x1A); // AGC_GAIN
179+
i2c_write(0x44, 0x1F); // GAIN_MAX
180+
i2c_write(0x45, 0x3D); // AGC_CFG
181+
i2c_write(0x46, 0x14); // ATTH
182+
i2c_write(0x47, 0x0A); // RLTH
183+
i2c_write(0x48, 0x00); // NOISE
184+
i2c_write(0x49, 0x02); // TIMER
185+
i2c_write(0x40, 0x13); // AUDIO_CTR
186+
187+
return 0;
188+
}
189+
190+
unsigned char AW2028_Audio_Timer(void)
191+
{
192+
i2c_write(0x00, 0x55); // software reset
193+
194+
i2c_write(0x01, 0x01); // GCR
195+
i2c_write(0x03, 0x01); // IMAX
196+
i2c_write(0x07, 0x07); // LEDEN
197+
i2c_write(0x10, 0xFF); // ILED1
198+
i2c_write(0x11, 0xFF); // ILED2
199+
i2c_write(0x12, 0xFF); // ILED3
200+
i2c_write(0x1C, 0xFF); // PWM1
201+
i2c_write(0x1D, 0xFF); // PWM2
202+
i2c_write(0x1E, 0xFF); // PWM3
203+
204+
i2c_write(0x40, 0x11); // AUDIO_CTR
205+
i2c_write(0x41, 0x07); // AUDIO_LEDEN
206+
i2c_write(0x42, 0x00); // AUDIO_FLT
207+
i2c_write(0x43, 0x1A); // AGC_GAIN
208+
i2c_write(0x44, 0x1F); // GAIN_MAX
209+
i2c_write(0x45, 0x3D); // AGC_CFG
210+
i2c_write(0x46, 0x14); // ATTH
211+
i2c_write(0x47, 0x0A); // RLTH
212+
i2c_write(0x48, 0x00); // NOISE
213+
i2c_write(0x49, 0x00); // TIMER
214+
i2c_write(0x40, 0x0B); // AUDIO_CTR
215+
216+
return 0;
217+
}
218+
219+
unsigned char AW2028_Audio(unsigned char mode)
220+
{
221+
if (mode > 5) {
222+
mode = 0;
223+
}
224+
i2c_write(0x00, 0x55); // software reset
225+
226+
i2c_write(0x01, 0x01); // GCR
227+
i2c_write(0x03, 0x01); // IMAX
228+
i2c_write(0x07, 0x07); // LEDEN
229+
i2c_write(0x10, 0xFF); // ILED1
230+
i2c_write(0x11, 0xFF); // ILED2
231+
i2c_write(0x12, 0xFF); // ILED3
232+
i2c_write(0x1C, 0xFF); // PWM1
233+
i2c_write(0x1D, 0xFF); // PWM2
234+
i2c_write(0x1E, 0xFF); // PWM3
235+
236+
i2c_write(0x40, (mode << 3) | 0x01); // AUDIO_CTR
237+
i2c_write(0x41, 0x07); // AUDIO_LEDEN
238+
i2c_write(0x42, 0x00); // AUDIO_FLT
239+
i2c_write(0x43, 0x1A); // AGC_GAIN
240+
i2c_write(0x44, 0x1F); // GAIN_MAX
241+
i2c_write(0x45, 0x3D); // AGC_CFG
242+
i2c_write(0x46, 0x14); // ATTH
243+
i2c_write(0x47, 0x0A); // RLTH
244+
i2c_write(0x48, 0x00); // NOISE
245+
i2c_write(0x49, 0x00); // TIMER
246+
i2c_write(0x40, (mode << 3) | 0x03); // AUDIO_CTR
247+
248+
return 0;
249+
}
250+
251+
int main(int argc, char **argv)
252+
{
253+
if (aw2028_init() != 0) {
254+
exit(-1);
255+
}
256+
AW2028_LED_OFF();
257+
// AW2028_LED_ON(255, 255, 255);
258+
// AW2028_Audio(1);
259+
// AW2028_Audio_Corss_Zero();
260+
// AW2028_Audio_Timer();
261+
AW2028_Audio(3);
262+
// AW2028_LED_ON(255, 255, 255);
263+
// AW2028_LED_Blink(255,255,255, 10, 7, 10, 2);
264+
while (1) {
265+
AW2028_LED_Blink(255, 255, 255, 1000, 0, 1000, 1000);
266+
sleep(2);
267+
AW2028_LED_Blink(0, 255, 255, 1000, 0, 1000, 1000);
268+
sleep(2);
269+
AW2028_LED_Blink(255, 0, 255, 1000, 0, 1000, 1000);
270+
sleep(2);
271+
AW2028_LED_Blink(255, 255, 0, 1000, 0, 1000, 1000);
272+
sleep(2);
273+
AW2028_LED_Blink(0, 0, 0, 1000, 0, 1000, 1000);
274+
sleep(2);
275+
}
276+
return 0;
277+
}

0 commit comments

Comments
 (0)