Skip to content

Commit 1fd8c85

Browse files
committed
First Release
1 parent 5df9bfe commit 1fd8c85

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+9968
-0
lines changed

kvm_system/.DS_Store

6 KB
Binary file not shown.

kvm_system/README.md

Whitespace-only changes.

kvm_system/main/CMakeLists.txt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
2+
list(APPEND ADD_INCLUDE
3+
"include"
4+
"lib/libqr"
5+
"lib/system_ctrl"
6+
"lib/system_state"
7+
"lib/system_init"
8+
"lib/oled_ctrl"
9+
"lib/oled_ui"
10+
"lib/hdmi"
11+
)
12+
13+
list(APPEND ADD_PRIVATE_INCLUDE "")
14+
15+
append_srcs_dir(ADD_SRCS
16+
"src"
17+
"lib/libqr"
18+
"lib/system_ctrl"
19+
"lib/system_state"
20+
"lib/system_init"
21+
"lib/oled_ctrl"
22+
"lib/oled_ui"
23+
"lib/hdmi"
24+
) # append source file in src dir to var ADD_SRCS
25+
26+
list(APPEND ADD_REQUIREMENTS basic peripheral)
27+
28+
register_component()

kvm_system/main/Kconfig

Whitespace-only changes.

kvm_system/main/include/config.h

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
#ifndef CONFIG_H_
2+
#define CONFIG_H_
3+
4+
#include "maix_basic.hpp"
5+
#include "maix_time.hpp"
6+
#include "maix_gpio.hpp"
7+
#include "maix_pinmap.hpp"
8+
#include "maix_i2c.hpp"
9+
#include "maix_uart.hpp"
10+
#include <fcntl.h>
11+
#include <unistd.h>
12+
#include <string.h>
13+
#include <stdio.h>
14+
#include <sys/stat.h>
15+
#include <stdlib.h>
16+
#include <pthread.h>
17+
#include <sys/poll.h>
18+
#include <fstream>
19+
#include <linux/input.h>
20+
21+
#include "qr.h"
22+
#include "system_ctrl.h"
23+
#include "system_state.h"
24+
#include "system_init.h"
25+
#include "oled_ctrl.h"
26+
#include "oled_ui.h"
27+
#include "hdmi.h"
28+
29+
#define IP_Change_time 5000
30+
#define QR_Change_time 5000
31+
#define STATE_DELAY 1000
32+
#define OLED_DELAY 1000
33+
#define KEY_DELAY 100
34+
#define KEY_LONG_PRESS 1500
35+
#define KEY_LONGLONG_PRESS 9000
36+
#define WIFI_CONNECTION_DELAY 5000
37+
#define OLED_SLEEP_DELAY_MIN 10
38+
#define OLED_SLEEP_DELAY_DEFAULT 30
39+
40+
typedef struct {
41+
int8_t page = 0;
42+
int8_t sub_page = 0;
43+
uint8_t eth_route[16] = {0}; // route ip
44+
uint8_t wifi_route[16] = {0}; // route ip
45+
uint8_t eth_addr[16] = {0}; // ETH ip
46+
uint8_t wifi_addr[16] = {0}; // WiFi ip
47+
uint8_t tail_addr[16] = {0}; // Tailscale ip
48+
uint8_t rndis_addr[16] = {0}; // RNDIS ip
49+
int8_t eth_state = -1; // cat /sys/class/net/eth0/carrier
50+
int8_t wifi_state = -1; // cat /sys/class/net/wlan0/carrier
51+
int8_t tail_state = -1; // ifconfig tailscale0 | grep 'inet addr' | awk '{print $2}'
52+
int8_t hdmi_state = -1; // cat /proc/cvitek/vi_dbg | grep VIFPS | awk '{print $3}' (1s)
53+
int8_t usb_state = -1; // cat /sys/class/udc/4340000.usb/state
54+
int8_t hid_state = -1; // (exist?) /sys/kernel/config/usb_gadget/g0/configs/c.1/hid.GSn(n=012)
55+
int8_t rndis_state = -1; // (exist?) /sys/kernel/config/usb_gadget/g0/configs/c.1/rndis.usb0
56+
int8_t udisk_state = -1; // (exist?) /sys/kernel/config/usb_gadget/g0/configs/c.1/mass_storage.disk0
57+
int8_t host_pwr_state = -1; // cat /sys/class/gpio/gpio504/value
58+
int16_t hdmi_width = 0; // cat /kvmapp/kvm/width
59+
int16_t hdmi_height = 0; // cat /kvmapp/kvm/height
60+
int8_t type = 0; // cat /kvmapp/kvm/type
61+
int8_t now_fps = 0; // cat /kvmapp/kvm/now_fps
62+
int16_t qlty = 0; // cat /kvmapp/kvm/qlty
63+
int8_t oled_thread_running = 0;
64+
int8_t key_thread_running = 0;
65+
int8_t sys_thread_running = 0;
66+
int8_t wifi_config_process = -1; // 1:QR;2:Test;3:IP;
67+
char wifi_ap_pass[9] = {0};
68+
uint8_t oled_sleep_state = 0; // 0:wakeup; 1:sleep;
69+
int8_t reconvery_update = 0; // 0:Undetected; 1:Needs Update; 2:Update finish; -1:not need to update
70+
} kvm_sys_state_t;
71+
72+
typedef struct {
73+
int8_t page = -1;
74+
int8_t sub_page = -1;
75+
uint8_t eth_route[16] = {0}; // route ip
76+
uint8_t wifi_route[16] = {0}; // route ip
77+
uint8_t eth_addr[16] = {0}; // ETH ip
78+
uint8_t wifi_addr[16] = {0}; // WiFi ip
79+
uint8_t tail_addr[16] = {0}; // Tailscale ip
80+
uint8_t rndis_addr[16] = {0}; // RNDIS ip
81+
int8_t eth_state = -1; // cat /sys/class/net/eth0/carrier
82+
int8_t wifi_state = -1; // cat /sys/class/net/wlan0/carrier
83+
int8_t tail_state = -1; // ifconfig tailscale0 | grep inet\ addr | awk '{print $2}'
84+
int8_t hdmi_state = -1; // cat /proc/cvitek/vi_dbg | grep VIFPS | awk '{print $3}' (1s)
85+
int8_t usb_state = -1; // cat /sys/class/udc/4340000.usb/state
86+
int8_t hid_state = -1; // (exist?) /sys/kernel/config/usb_gadget/g0/configs/c.1/hid.GSn(n=012)
87+
int8_t rndis_state = -1; // (exist?) /sys/kernel/config/usb_gadget/g0/configs/c.1/rndis.usb0
88+
int8_t udisk_state = -1; // (exist?) /sys/kernel/config/usb_gadget/g0/configs/c.1/mass_storage.disk0
89+
int8_t host_pwr_state = -1; // cat /sys/class/gpio/gpio504/value
90+
int16_t hdmi_width = -1; // cat /kvmapp/kvm/width
91+
int16_t hdmi_height = -1; // cat /kvmapp/kvm/height
92+
int8_t type = -1; // cat /kvmapp/kvm/type
93+
int8_t now_fps = -1; // cat /kvmapp/kvm/now_fps
94+
int16_t qlty = -1; // cat /kvmapp/kvm/qlty
95+
uint8_t oled_sleep_param = 0;
96+
uint8_t oled_sleep_state = 0; // 0:wakeup; 1:sleep;
97+
uint64_t oled_sleep_start = 0;
98+
} kvm_oled_state_t;
99+
100+
#endif // CONFIG_H_

kvm_system/main/lib/hdmi/hdmi.cpp

Lines changed: 238 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
#include "hdmi.h"
2+
3+
using namespace maix;
4+
using namespace maix::sys;
5+
using namespace maix::peripheral;
6+
i2c::I2C LT6911_i2c(4, i2c::Mode::MASTER);
7+
8+
void lt6911_enable()
9+
{
10+
uint8_t buf[2];
11+
buf[0] = 0xff;
12+
buf[1] = 0x80;
13+
LT6911_i2c.writeto(LT6911_ADDR, buf, 2);
14+
15+
buf[0] = 0xee;
16+
buf[1] = 0x01;
17+
LT6911_i2c.writeto(LT6911_ADDR, buf, 2);
18+
}
19+
20+
void lt6911_disable()
21+
{
22+
uint8_t buf[2];
23+
buf[0] = 0xff;
24+
buf[1] = 0x80;
25+
LT6911_i2c.writeto(LT6911_ADDR, buf, 2);
26+
27+
buf[0] = 0xee;
28+
buf[1] = 0x00;
29+
LT6911_i2c.writeto(LT6911_ADDR, buf, 2);
30+
}
31+
32+
void lt6911_start()
33+
{
34+
uint8_t buf[2];
35+
36+
buf[0] = 0xff;
37+
buf[1] = 0x80;
38+
LT6911_i2c.writeto(LT6911_ADDR, buf, 2);
39+
40+
buf[0] = 0x5A;
41+
buf[1] = 0x80;
42+
LT6911_i2c.writeto(LT6911_ADDR, buf, 2);
43+
}
44+
45+
void lt6911_stop()
46+
{
47+
uint8_t buf[2];
48+
49+
buf[0] = 0xff;
50+
buf[1] = 0x80;
51+
LT6911_i2c.writeto(LT6911_ADDR, buf, 2);
52+
53+
buf[0] = 0x5A;
54+
buf[1] = 0x88;
55+
LT6911_i2c.writeto(LT6911_ADDR, buf, 2);
56+
}
57+
58+
void lt6911_reset()
59+
{
60+
lt6911_stop();
61+
time::sleep_ms(1);
62+
lt6911_start();
63+
}
64+
65+
void lt6911_get_hdmi_errer()
66+
{
67+
uint8_t buf[6];
68+
69+
buf[0] = 0xff;
70+
buf[1] = 0xC0;
71+
LT6911_i2c.writeto(LT6911_ADDR, buf, 2);
72+
73+
buf[0] = 0x20;
74+
buf[1] = 0x01;
75+
LT6911_i2c.writeto(LT6911_ADDR, buf, 2);
76+
77+
time::sleep_ms(100);
78+
79+
buf[0] = 0x24;
80+
LT6911_i2c.writeto(LT6911_ADDR, buf, 1);
81+
82+
maix::Bytes *dat = LT6911_i2c.readfrom(LT6911_ADDR, 6);
83+
84+
buf[0] = 0x20;
85+
buf[1] = 0x07;
86+
LT6911_i2c.writeto(LT6911_ADDR, buf, 2);
87+
88+
for(int i = 0; i < 6; i++){
89+
buf[i] = (uint8_t)dat->data[i];
90+
}
91+
delete dat;
92+
93+
printf("hdmi_errer_code = %x, %x, %x, %x, %x, %x\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
94+
}
95+
96+
uint8_t lt6911_get_hdmi_res()
97+
{
98+
uint8_t buf[2];
99+
uint8_t revbuf[4];
100+
uint16_t Vactive;
101+
uint16_t Hactive;
102+
103+
buf[0] = 0xff;
104+
buf[1] = 0xd2;
105+
LT6911_i2c.writeto(LT6911_ADDR, buf, 2);
106+
107+
buf[0] = 0x83;
108+
buf[1] = 0x11;
109+
LT6911_i2c.writeto(LT6911_ADDR, buf, 2);
110+
111+
time::sleep_ms(100);
112+
113+
// Vactive
114+
buf[0] = 0x96;
115+
LT6911_i2c.writeto(LT6911_ADDR, buf, 1);
116+
maix::Bytes *dat0 = LT6911_i2c.readfrom(LT6911_ADDR, 2);
117+
118+
// Hactive
119+
buf[0] = 0x8b;
120+
LT6911_i2c.writeto(LT6911_ADDR, buf, 1);
121+
maix::Bytes *dat1 = LT6911_i2c.readfrom(LT6911_ADDR, 2);
122+
123+
revbuf[0] = (uint8_t)dat0->data[0];
124+
revbuf[1] = (uint8_t)dat0->data[1];
125+
revbuf[2] = (uint8_t)dat1->data[0];
126+
revbuf[3] = (uint8_t)dat1->data[1];
127+
128+
Vactive = (revbuf[0] << 8)|revbuf[1];
129+
Hactive = (revbuf[2] << 8)|revbuf[3];
130+
Hactive *= 2;
131+
132+
printf("HDMI res modification event\n");
133+
printf("new res: %d * %d\n", Hactive, Vactive);
134+
135+
delete dat0;
136+
delete dat1;
137+
138+
if (Vactive != 0 && Hactive != 0){
139+
return 1;
140+
} else {
141+
return 0;
142+
}
143+
}
144+
145+
void lt6911_get_hdmi_clk()
146+
{
147+
uint8_t buf[2];
148+
uint8_t revbuf[3];
149+
uint32_t clk;
150+
151+
buf[0] = 0xff;
152+
buf[1] = 0xa0;
153+
LT6911_i2c.writeto(LT6911_ADDR, buf, 2);
154+
155+
buf[0] = 0x34;
156+
buf[1] = 0x0b;
157+
LT6911_i2c.writeto(LT6911_ADDR, buf, 2);
158+
159+
time::sleep_ms(50);
160+
161+
// clk
162+
buf[0] = 0xff;
163+
buf[1] = 0xb8;
164+
LT6911_i2c.writeto(LT6911_ADDR, buf, 2);
165+
166+
buf[0] = 0xb1;
167+
LT6911_i2c.writeto(LT6911_ADDR, buf, 1);
168+
maix::Bytes *dat0 = LT6911_i2c.readfrom(LT6911_ADDR, 3);
169+
170+
revbuf[0] = (uint8_t)dat0->data[0];
171+
revbuf[1] = (uint8_t)dat0->data[1];
172+
revbuf[2] = (uint8_t)dat0->data[2];
173+
revbuf[0] &= 0x07;
174+
175+
clk = revbuf[0];
176+
clk <<= 8;
177+
clk |= revbuf[1];
178+
clk <<= 8;
179+
clk |= revbuf[2];
180+
181+
printf("HDMI CLK = %d\n", clk);
182+
183+
delete dat0;
184+
}
185+
186+
uint8_t lt6911_get_csi_res()
187+
{
188+
uint8_t ret = 0;
189+
uint8_t buf[2];
190+
uint8_t revbuf[4];
191+
static uint16_t old_Vactive;
192+
static uint16_t old_Hactive;
193+
uint16_t Vactive;
194+
uint16_t Hactive;
195+
char Cmd[100]={0};
196+
197+
buf[0] = 0xff;
198+
buf[1] = 0xc2;
199+
LT6911_i2c.writeto(LT6911_ADDR, buf, 2);
200+
201+
// Vactive
202+
buf[0] = 0x06;
203+
LT6911_i2c.writeto(LT6911_ADDR, buf, 1);
204+
maix::Bytes *dat0 = LT6911_i2c.readfrom(LT6911_ADDR, 2);
205+
206+
// Hactive
207+
buf[0] = 0x38;
208+
LT6911_i2c.writeto(LT6911_ADDR, buf, 1);
209+
maix::Bytes *dat1 = LT6911_i2c.readfrom(LT6911_ADDR, 2);
210+
211+
revbuf[0] = (uint8_t)dat0->data[0];
212+
revbuf[1] = (uint8_t)dat0->data[1];
213+
revbuf[2] = (uint8_t)dat1->data[0];
214+
revbuf[3] = (uint8_t)dat1->data[1];
215+
216+
Vactive = (revbuf[0] << 8)|revbuf[1];
217+
Hactive = (revbuf[2] << 8)|revbuf[3];
218+
219+
if(old_Hactive != Hactive || old_Vactive != Vactive){
220+
old_Hactive = Hactive;
221+
old_Vactive = Vactive;
222+
ret = 1;
223+
}
224+
225+
printf("CSI res: %d * %d\n", Hactive, Vactive);
226+
// setenv("KVM_CSI_HEIGHT", to_string(Hactive).c_str(), 1);
227+
// setenv("KVM_CSI_WIDTH", to_string(Vactive).c_str(), 1);
228+
229+
sprintf(Cmd, "echo %d > /kvmapp/kvm/width", Hactive);
230+
system(Cmd);
231+
sprintf(Cmd, "echo %d > /kvmapp/kvm/height", Vactive);
232+
system(Cmd);
233+
234+
delete dat0;
235+
delete dat1;
236+
237+
return ret;
238+
}

0 commit comments

Comments
 (0)