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