Merge branch ‘dev’of https://gitlink.org.cn/Ybeichen/xiuos.git into 'prepare_for_master' #2

Merged
Ybeichen merged 66 commits from dev into prepare_for_master 2023-02-17 18:01:35 +08:00
186 changed files with 28050 additions and 342 deletions

3
.gitmodules vendored
View File

@ -22,3 +22,6 @@
[submodule "Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong-riscv64/kendryte-sdk/kendryte-sdk-source"]
path = Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong-riscv64/kendryte-sdk/kendryte-sdk-source
url = https://code.gitlink.org.cn/chunyexixiaoyu/kendryte-sdk-source.git
[submodule "Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/k210_edu/kendryte-sdk/kendryte-sdk-source"]
path = Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/k210_edu/kendryte-sdk/kendryte-sdk-source
url = https://code.gitlink.org.cn/chunyexixiaoyu/kendryte-sdk-source.git

View File

@ -0,0 +1,11 @@
import os
from building import *
Import('RTT_ROOT')
Import('rtconfig')
cwd = GetCurrentDir()
DEPENDS = ["LIB_LV"]
SOURCES = []
SOURCES = ['lv_init.c'] + ['lv_demo.c']+['lv_demo_calendar.c']
path = [cwd]
objs = DefineGroup('sensor_app', src = SOURCES, depend = DEPENDS,CPPPATH = path)
Return("objs")

View File

@ -39,7 +39,7 @@ static void event_handler(lv_event_t * e)
void lv_demo_calendar(void)
{
lv_obj_t * calendar = lv_calendar_create(lv_scr_act());
lv_obj_set_size(calendar, 320, 320);//lv_obj_set_size(calendar, 800, 480);
lv_obj_set_size(calendar, MY_DISP_HOR_RES, MY_DISP_VER_RES);//lv_obj_set_size(calendar, 800, 480);
lv_obj_align(calendar, LV_ALIGN_CENTER, 0, 0);
lv_obj_add_event_cb(calendar, event_handler, LV_EVENT_ALL, NULL);

View File

@ -7,8 +7,14 @@ DEPENDS = ["SUPPORT_SENSOR_FRAMEWORK"]
SOURCES = []
if GetDepend(['APPLICATION_SENSOR_CO2_ZG09']):
SOURCES = ['co2_zg09.c'] + SOURCES
if GetDepend(['APPLICATION_SENSOR_CO2_G8S']):
SOURCES = ['co2_g8s.c'] + SOURCES
if GetDepend(['APPLICATION_SENSOR_PM1_0_PS5308']):
SOURCES = ['pm1_0_ps5308.c.c'] + SOURCES
SOURCES = ['pm1_0_ps5308.c'] + SOURCES
if GetDepend(['APPLICATION_SENSOR_PM2_5_PS5308']):
SOURCES = ['pm2_5_ps5308.c'] + SOURCES
if GetDepend(['APPLICATION_SENSOR_PM10_PS5308']):
SOURCES = ['pm10_0_ps5308.c'] + SOURCES
if GetDepend(['APPLICATION_SENSOR_VOICE_D124']):
SOURCES = ['voice_d124.c'] + SOURCES
if GetDepend(['APPLICATION_SENSOR_HUMIDITY_HS300X']):
@ -19,6 +25,16 @@ if GetDepend(['APPLICATION_SENSOR_CH4_AS830']):
SOURCES = ['ch4_as830.c'] + SOURCES
if GetDepend(['APPLICATION_SENSOR_HCHO']):
SOURCES = ['hcho_tb600b_wq_hcho1os.c'] + SOURCES
if GetDepend(['APPLICATION_SENSOR_ALTITUDE_BMP180']):
SOURCES = ['altitude_bmp180.c'] + SOURCES
if GetDepend(['APPLICATION_SENSOR_TVOC_TB600B_TVOC10']):
SOURCES = ['tvoc_tb600b_tvoc10.c'] + SOURCES
if GetDepend(['APPLICATION_SENSOR_IAQ_TB600B_IAQ10']):
SOURCES = ['iaq_tb600b_iaq10.c'] + SOURCES
if GetDepend(['APPLICATION_SENSOR_WINDDIRECTION_QS_FX']):
SOURCES = ['winddirection_qs_fx.c'] + SOURCES
if GetDepend(['APPLICATION_SENSOR_WINDSPEED_QS_FS']):
SOURCES = ['windspeed_qs_fs.c'] + SOURCES
path = [cwd]
objs = DefineGroup('sensor_app', src = SOURCES, depend = DEPENDS,CPPPATH = path)
Return("objs")

View File

@ -28,6 +28,9 @@ void Co2Zg09(void)
{
struct SensorQuantity *co2 = SensorQuantityFind(SENSOR_QUANTITY_ZG09_CO2, SENSOR_QUANTITY_CO2);
SensorQuantityOpen(co2);
printf("CO2 : %d ppm\n", SensorQuantityReadValue(co2));
for (int i = 0; i < 5; i ++) {
PrivTaskDelay(2000);
printf("CO2 : %d ppm\n", SensorQuantityReadValue(co2));
}
SensorQuantityClose(co2);
}

View File

@ -29,9 +29,10 @@ void HchoTb600bHcho1os(void)
struct SensorQuantity *hcho = SensorQuantityFind(SENSOR_QUANTITY_TB600B_HCHO, SENSOR_QUANTITY_HCHO);
SensorQuantityOpen(hcho);
int32_t result = 0;
result = SensorQuantityReadValue(hcho);
printf("tvoc concentration is : %dppb\n", result);
for (int i = 0; i < 5; i ++) {
PrivTaskDelay(1000);
result = SensorQuantityReadValue(hcho);
printf("tvoc concentration is : %dppb\n", result);
}
SensorQuantityClose(hcho);
}

View File

@ -30,7 +30,7 @@ void HumiHs300x(void)
int32_t humidity;
struct SensorQuantity *humi = SensorQuantityFind(SENSOR_QUANTITY_HS300X_HUMIDITY, SENSOR_QUANTITY_HUMI);
SensorQuantityOpen(humi);
for (i = 0; i < 10; i ++) {
for (i = 0; i < 5; i ++) {
humidity = SensorQuantityReadValue(humi);
printf("Humidity : %d.%d %%RH\n", humidity/10, humidity%10);
PrivTaskDelay(500);

View File

@ -29,9 +29,10 @@ void IaqTb600bIaq10(void)
struct SensorQuantity *iaq = SensorQuantityFind(SENSOR_QUANTITY_TB600B_IAQ, SENSOR_QUANTITY_IAQ);
SensorQuantityOpen(iaq);
int32_t result = 0;
result = SensorQuantityReadValue(iaq);
printf("Gas concentration is : %dppb\n", result);
for (int i = 0; i < 5; i ++) {
PrivTaskDelay(1000);
result = SensorQuantityReadValue(iaq);
printf("Gas concentration is : %dppb\n", result);
}
SensorQuantityClose(iaq);
}

View File

@ -29,6 +29,9 @@ void Pm100Ps5308(void)
struct SensorQuantity *pm10_0 = SensorQuantityFind(SENSOR_QUANTITY_PS5308_PM10, SENSOR_QUANTITY_PM);
SensorQuantityOpen(pm10_0);
PrivTaskDelay(2000);
printf("PM10 : %d ug/m³\n", SensorQuantityReadValue(pm10_0));
for (int i = 0; i < 10; i ++) {
PrivTaskDelay(1000);
printf("PM10 : %d ug/m³\n", SensorQuantityReadValue(pm10_0));
}
SensorQuantityClose(pm10_0);
}

View File

@ -29,6 +29,9 @@ void Pm10Ps5308(void)
struct SensorQuantity *pm1_0 = SensorQuantityFind(SENSOR_QUANTITY_PS5308_PM1_0, SENSOR_QUANTITY_PM);
SensorQuantityOpen(pm1_0);
PrivTaskDelay(2000);
printf("PM1.0 : %d ug/m³\n", SensorQuantityReadValue(pm1_0));
for (int i = 0; i < 10; i ++) {
PrivTaskDelay(1000);
printf("PM1.0 : %d ug/m³\n", SensorQuantityReadValue(pm1_0));
}
SensorQuantityClose(pm1_0);
}

View File

@ -29,6 +29,9 @@ void Pm25Ps5308(void)
struct SensorQuantity *pm2_5 = SensorQuantityFind(SENSOR_QUANTITY_PS5308_PM2_5, SENSOR_QUANTITY_PM);
SensorQuantityOpen(pm2_5);
PrivTaskDelay(2000);
printf("PM2.5 : %d ug/m³\n", SensorQuantityReadValue(pm2_5));
for (int i = 0; i < 10; i ++) {
PrivTaskDelay(1000);
printf("PM2.5 : %d ug/m³\n", SensorQuantityReadValue(pm2_5));
}
SensorQuantityClose(pm2_5);
}

View File

@ -30,12 +30,12 @@ void TempHs300x(void)
int32_t temperature;
struct SensorQuantity *temp = SensorQuantityFind(SENSOR_QUANTITY_HS300X_TEMPERATURE, SENSOR_QUANTITY_TEMP);
SensorQuantityOpen(temp);
for (i = 0; i < 10; i ++) {
for (i = 0; i < 5; i ++) {
temperature = SensorQuantityReadValue(temp);
if (temperature > 0)
printf("Temperature : %d.%d ℃\n", temperature/10, temperature%10);
printf("Temperature : %d.%d ℃ \n", temperature/10, temperature%10);
else
printf("Temperature : %d.%d ℃\n", temperature/10, -temperature%10);
printf("Temperature : %d.%d ℃ \n", temperature/10, -temperature%10);
PrivTaskDelay(500);
}

View File

@ -29,9 +29,11 @@ void TvocTb600bTvoc10(void)
struct SensorQuantity *tvoc = SensorQuantityFind(SENSOR_QUANTITY_TB600B_TVOC, SENSOR_QUANTITY_TVOC);
SensorQuantityOpen(tvoc);
int32_t result = 0;
result = SensorQuantityReadValue(tvoc);
printf("tvoc concentration is : %dppb\n", result);
PrivTaskDelay(1000);
for (int i = 0; i < 3; i ++) {
PrivTaskDelay(1000);
result = SensorQuantityReadValue(tvoc);
printf("tvoc concentration is : %dppb\n", result);
}
SensorQuantityClose(tvoc);
}

View File

@ -29,7 +29,10 @@ void VoiceD124(void)
struct SensorQuantity *voice = SensorQuantityFind(SENSOR_QUANTITY_D124_VOICE, SENSOR_QUANTITY_VOICE);
SensorQuantityOpen(voice);
PrivTaskDelay(2000);
uint16_t result = SensorQuantityReadValue(voice);
printf("voice : %d.%d dB\n", result/(10*voice->value.decimal_places), result%(10*voice->value.decimal_places));
for (int i = 0; i < 10; i ++) {
uint16_t result = SensorQuantityReadValue(voice);
printf("voice : %d.%d dB\n", result/(10*voice->value.decimal_places), result%(10*voice->value.decimal_places));
PrivTaskDelay(1000);
}
SensorQuantityClose(voice);
}

View File

@ -29,14 +29,10 @@ void WindDirectionQsFx(void)
struct SensorQuantity *wind_direction = SensorQuantityFind(SENSOR_QUANTITY_QS_FX_WINDDIRECTION, SENSOR_QUANTITY_WINDDIRECTION);
SensorQuantityOpen(wind_direction);
PrivTaskDelay(2000);
int result = 0;
for(int i=0;i<2000;i++)
{
result = 0;
PrivTaskDelay(1000);
result = SensorQuantityReadValue(wind_direction);
if(result > 0)
printf("wind direction : %d degree\n", result);
for (int i = 0; i < 10; i ++) {
uint16_t result = SensorQuantityReadValue(wind_direction);
printf("wind direction : %d degree\n", result);
PrivTaskDelay(2000);
}
SensorQuantityClose(wind_direction);
}

View File

@ -29,14 +29,10 @@ void WindSpeedQsFs(void)
struct SensorQuantity *wind_speed = SensorQuantityFind(SENSOR_QUANTITY_QS_FS_WINDSPEED, SENSOR_QUANTITY_WINDSPEED);
SensorQuantityOpen(wind_speed);
PrivTaskDelay(2000);
int result = 0;
for(int i=0;i<2000;i++)
{
result = 0;
PrivTaskDelay(1000);
result = SensorQuantityReadValue(wind_speed);
if(result > 0)
printf("wind speed : %d.%d m/s\n", result/10, result%10);
for (int i = 0; i < 10; i ++) {
uint16_t result = SensorQuantityReadValue(wind_speed);
printf("wind speed : %d.%d m/s\n", result/10, result%10);
PrivTaskDelay(2000);
}
SensorQuantityClose(wind_speed);
}

View File

@ -69,17 +69,17 @@ if ADD_RTTHREAD_FETURES
config ADAPTER_HC08_DRIVER_EXTUART
bool "Using extra uart to support bluetooth"
default n
default y
config ADAPTER_HC08_DRIVER
string "HC08 device uart driver path"
default "/dev/dev2"
default "/dev/extuart_dev2"
depends on !ADAPTER_HC08_DRIVER_EXTUART
if ADAPTER_HC08_DRIVER_EXTUART
config ADAPTER_HC08_DRIVER
string "HC08 device extra uart driver path"
default "/dev/dev2"
default "/dev/extuart_dev2"
config ADAPTER_HC08_DRIVER_EXT_PORT
int "if HC08 device using extuart, choose port"

View File

@ -424,3 +424,130 @@ int AdapterWifiTestWithParam(int argc, char *argv[])
#endif
#ifdef ADD_RTTHREAD_FETURES
enum
{
APT_WIFI_PARAM_IP,
APT_WIFI_PARAM_PORT,
APT_WIFI_PARAM_SSID,
APT_WIFI_PARAM_PWD,
APT_WIFI_PARAM_GW,
APT_WIFI_PARAM_SERVER,
APT_WIFI_PARAM_MASK,
APT_WIFI_PARAM_PING,
APT_WIFI_PARAM_NUM
};
#define APT_WIFI_PARAM_LEN 128
char wifi_param[APT_WIFI_PARAM_NUM][APT_WIFI_PARAM_LEN] = {0};
#define CHECK_RET(__func) \
ret = __func; \
if(ret != 0){ \
printf("%s %d failed\n", __func__, __LINE__); \
AdapterDeviceClose(adapter); \
free(adapter->adapter_param); \
return ret; \
};
void AdapterWifiGetParam(int argc, char *argv[])
{
int i, j;
char *param_str[] = {"ip", "port", "ssid", "pwd", "gw", "server", "mask", "ping"};
char *default_str[] =
{
"192.168.141.34",
"12345",
"test",
"tttttttt",
"192.168.141.119",
"192.168.141.119",
"255.255.255.0",
"220.181.38.251"
};
for(i = 0; i < APT_WIFI_PARAM_NUM; i ++)
{
memset(wifi_param[i], 0, APT_WIFI_PARAM_LEN);
strcpy(wifi_param[i], default_str[i]);
}
for(i = 0; i < argc; i ++)
{
for(j = 0; j < APT_WIFI_PARAM_NUM; j ++)
{
if(strncmp(argv[i], param_str[j], strlen(param_str[j])) == 0)
{
printf("wifi %d: %s\n", j, argv[i] + strlen(param_str[j]) + 1);
strcpy(wifi_param[j], argv[i] + strlen(param_str[j]) + 1);
}
}
}
printf("--- wifi parameter ---\n");
for(i = 0; i < APT_WIFI_PARAM_NUM; i ++)
{
printf("%7.7s = %s\n", param_str[i], wifi_param[i]);
}
printf("----------------------\n");
}
int AdapterWifiTestWithParam(int argc, char *argv[])
{
int i, ret;
struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_WIFI_NAME);
AdapterWifiGetParam(argc, argv);
enum NetRoleType net_role = CLIENT;
enum IpType ip_type = IPV4;
adapter->adapter_param = malloc(sizeof(struct WifiParam));
memset(adapter->adapter_param, 0, sizeof(struct WifiParam));
struct WifiParam *apt_param = (struct WifiParam *)adapter->adapter_param;
strcpy(apt_param->wifi_ssid, wifi_param[APT_WIFI_PARAM_SSID]);
strcpy(apt_param->wifi_pwd, wifi_param[APT_WIFI_PARAM_PWD]);
printf("apt %p ssid %p %s\n", apt_param, apt_param->wifi_ssid);
CHECK_RET(AdapterDeviceOpen(adapter));
CHECK_RET(AdapterDeviceSetUp(adapter));
CHECK_RET(AdapterDeviceSetAddr(adapter, wifi_param[APT_WIFI_PARAM_IP], wifi_param[APT_WIFI_PARAM_GW],
wifi_param[APT_WIFI_PARAM_MASK]));
CHECK_RET(AdapterDeviceNetstat(adapter));
adapter->socket.protocal = SOCKET_PROTOCOL_TCP;
CHECK_RET(AdapterDeviceConnect(adapter, net_role, wifi_param[APT_WIFI_PARAM_SERVER],
wifi_param[APT_WIFI_PARAM_PORT], ip_type));
const char *wifi_msg = "Wifi Test";
for(i = 0; i < 10; i++)
{
AdapterDeviceSend(adapter, wifi_msg, strlen(wifi_msg));
PrivTaskDelay(4000);
}
char wifi_recv_msg[APT_WIFI_PARAM_LEN];
memset(wifi_recv_msg, 0, APT_WIFI_PARAM_LEN);
for(i = 0; i < APT_WIFI_PARAM_NUM; i ++)
{
AdapterDeviceRecv(adapter, wifi_recv_msg, 128);
PrivTaskDelay(1000);
}
// printf("ping %s\n", wifi_param[APT_WIFI_PARAM_PING]);
//
// CHECK_RET(AdapterDevicePing(adapter, wifi_param[APT_WIFI_PARAM_PING]));
// AdapterDeviceDisconnect(adapter, NULL);
ret = AdapterDeviceClose(adapter);
free(adapter->adapter_param);
return ret;
}
PRIV_SHELL_CMD_FUNCTION(AdapterWifiTestWithParam, a WiFi test sample, PRIV_SHELL_CMD_MAIN_ATTR);
#endif

View File

@ -8,6 +8,11 @@ if ADD_NUTTX_FETURES
default "/dev/ttyS1"
endif
if ADD_RTTHREAD_FETURES
config ADAPTER_ESP8285_DRIVER
string "ESP8285 device uart driver path"
default "/dev/uart1"
endif
if ADD_XIZI_FETURES
config ADAPTER_ESP8285_DRIVER
string "ESP8285 device uart driver path"

View File

@ -0,0 +1,12 @@
from building import *
import os
cwd = GetCurrentDir()
src = []
if GetDepend(['ADAPTER_ESP8285_WIFI']):
src += ['esp8285_wifi.c']
group = DefineGroup('connection wifi esp8285', src, depend = [], CPPPATH = [cwd])
Return('group')

View File

@ -0,0 +1,19 @@
import os
Import('RTT_ROOT')
from building import *
SOURCES = []
if GetDepend(['CONNECTION_ADAPTER_ZIGBEE']):
SOURCES = ['adapter_zigbee.c'] + SOURCES
objs = []
cwd = GetCurrentDir()
path = [cwd]
group = DefineGroup('zigbee', SOURCES, depend = [], CPPPATH = [cwd])
objs = objs + group
list = os.listdir(cwd)
for d in list:
path = os.path.join(cwd, d)
if os.path.isfile(os.path.join(path, 'SConscript')):
objs = objs + SConscript(os.path.join(path, 'SConscript'))
Return('objs')

View File

@ -124,10 +124,8 @@ int SendZigbee(int argc, char *argv[])
{
const char *send_msg = argv[1];
int ret = 0;
struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_ZIGBEE_NAME);
printf("send argv1 %s\n",argv[1]);
ret = AdapterDeviceSend(adapter, send_msg, strlen(send_msg));
if(ret < 0) {
printf(" adapter send failed\n");
@ -141,13 +139,14 @@ PRIV_SHELL_CMD_FUNCTION(SendZigbee, a ZigBee send sample, PRIV_SHELL_CMD_MAIN_AT
int RecvZigbee(void)
{
char recv_msg[128];
char recv_msg[128]={0};
struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_ZIGBEE_NAME);
memset(recv_msg,0,128);
AdapterDeviceRecv(adapter, recv_msg, 128);
PrivTaskDelay(2000);
printf("zigbee recv msg %s\n", recv_msg);
while(1) {
AdapterDeviceRecv(adapter, recv_msg, 128);
printf("zigbee recv msg : %s\n", recv_msg);
PrivTaskDelay(2000);
memset(recv_msg,0,128);
}
return 0;
}
PRIV_SHELL_CMD_FUNCTION(RecvZigbee, a ZigBee receive sample, PRIV_SHELL_CMD_MAIN_ATTR);

View File

@ -85,5 +85,30 @@ endif
endif
if ADD_RTTHREAD_FETURES
config ADAPTER_E18_MODEPIN
int "E18 MODE pin number"
default "46"
config ADAPTER_E18_PIN_DRIVER
string "E18 device pin driver path"
default "/dev/pin"
config ADAPTER_E18_DRIVER_EXTUART
bool "Using extra uart to support zigbee"
default y
config ADAPTER_E18_DRIVER
string "E18 device uart driver path"
default "/dev/extuart_dev1"
depends on !ADAPTER_E18_DRIVER_EXTUART
if ADAPTER_E18_DRIVER_EXTUART
config ADAPTER_E18_DRIVER
string "E18 device extra uart driver path"
default "/dev/extuart_dev1"
config ADAPTER_E18_DRIVER_EXT_PORT
int "if E18 device using extuart, choose port"
default "1"
endif
endif

View File

@ -0,0 +1,10 @@
from building import *
import os
cwd = GetCurrentDir()
src = []
if GetDepend(['ADAPTER_E18']):
src += ['e18.c']
group = DefineGroup('connection zigbee e18', src, depend = [], CPPPATH = [cwd])
Return('group')

View File

@ -69,6 +69,8 @@ static int E18HardwareModeGet()
#else
return E18_AS_HEX_MODE;
#endif
#elif defined(ADD_RTTHREAD_FETURES)
return E18_AS_HEX_MODE;
#else
int ret = 0;
int pin_fd;
@ -229,6 +231,8 @@ static int E18NetworkModeConfig(struct Adapter *adapter)
out:
#ifdef ADD_NUTTX_FETURES
if(E18_AS_HEX_MODE == mode)
#elif defined(ADD_RTTHREAD_FETURES)
if(E18_AS_HEX_MODE == mode)
#else
if(E18_AS_AT_MODE == mode)
#endif
@ -304,6 +308,8 @@ static int E18NetRoleConfig(struct Adapter *adapter)
out:
#ifdef ADD_NUTTX_FETURES
if(E18_AS_HEX_MODE == mode)
#elif defined(ADD_RTTHREAD_FETURES)
if(E18_AS_HEX_MODE == mode)
#else
if(E18_AS_AT_MODE == mode)
#endif
@ -451,6 +457,8 @@ static int E18Join(struct Adapter *adapter, unsigned char *priv_net_group)
if(!ret){
#ifdef ADD_NUTTX_FETURES
if(E18_AS_HEX_MODE == mode)
#elif defined(ADD_RTTHREAD_FETURES)
if(E18_AS_HEX_MODE == mode)
#else
if(E18_AS_AT_MODE == mode)
#endif

View File

@ -40,6 +40,7 @@ extern int Tb600bTvoc10TvocInit(void);
extern int Tb600bWqHcho1osInit(void);
extern int QsFxWindDirectionInit(void);
extern int QsFsWindSpeedInit(void);
extern int Bmp180AltitudeInit(void);
extern int lv_port_init(void);
@ -140,6 +141,9 @@ static struct InitDesc sensor_desc[] =
{ "tvoc_tb600b_wq_hcho1os", Tb600bWqHcho1osInit },
#endif
#ifdef SENSOR_DEVICE_BMP180
{ "bmp180_altitude_1", Bmp180AltitudeInit },
#endif
{ "NULL", NULL },
};

View File

@ -27,6 +27,12 @@ config SENSOR_BMP180
endif
if ADD_RTTHREAD_FETURES
config SENSOR_DEVICE_BMP180_DEV
string "BMP180 device name"
default "/dev/i2c1_dev0"
config SENSOR_DEVICE_BMP180_I2C_ADDR
hex "BMP180 device i2c address"
default 0x77
endif
endif

View File

@ -24,10 +24,10 @@
static struct SensorDevice bmp180;
typedef struct {
int8_t ac_data[3];
uint8_t unsigned_ac_data[3];
int8_t b_data[2];
int8_t m_data[3];
int16 ac_data[3];
uint16 unsigned_ac_data[3];
int16 b_data[2];
int16 m_data[3];
}Bmp180RegData;
static Bmp180RegData bmp180_reg_data;
@ -35,6 +35,10 @@ static Bmp180RegData bmp180_reg_data;
const static unsigned char OSS = 0; // Oversampling Setting
static long CalTemp_data = 0;
// I2c configuration
uint16_t i2c_dev_addr = SENSOR_DEVICE_BMP180_I2C_ADDR;
struct PrivIoctlCfg ioctl_cfg;
static struct SensorProductInfo info =
{
(SENSOR_ABILITY_ALTITUDE),
@ -50,7 +54,6 @@ static struct SensorProductInfo info =
static int SensorDeviceOpen(struct SensorDevice *sdev)
{
int result;
uint16_t i2c_dev_addr = SENSOR_DEVICE_BMP180_I2C_ADDR;
sdev->fd = PrivOpen(SENSOR_DEVICE_BMP180_DEV, O_RDWR);
if (sdev->fd < 0) {
@ -58,7 +61,6 @@ static int SensorDeviceOpen(struct SensorDevice *sdev)
return -1;
}
struct PrivIoctlCfg ioctl_cfg;
ioctl_cfg.ioctl_driver_type = I2C_TYPE;
ioctl_cfg.args = &i2c_dev_addr;
result = PrivIoctl(sdev->fd, OPE_INT, &ioctl_cfg);
@ -74,6 +76,11 @@ static int SensorDeviceOpen(struct SensorDevice *sdev)
*/
static int SensorDeviceWrite(struct SensorDevice *sdev, const void *buf, size_t len)
{
#ifdef ADD_RTTHREAD_FETURES
ioctl_cfg.ioctl_driver_type = I2C_TYPE;
ioctl_cfg.args = &i2c_dev_addr;
PrivIoctl(sdev->fd, OPE_INT, &ioctl_cfg);
#endif
if (PrivWrite(sdev->fd, buf, len) < 0)
return -1;
@ -88,6 +95,11 @@ static int SensorDeviceWrite(struct SensorDevice *sdev, const void *buf, size_t
*/
static int SensorDeviceRead(struct SensorDevice *sdev, size_t len)
{
#ifdef ADD_RTTHREAD_FETURES
ioctl_cfg.ioctl_driver_type = I2C_TYPE;
ioctl_cfg.args = &i2c_dev_addr;
PrivIoctl(sdev->fd, OPE_INT, &ioctl_cfg);
#endif
//Read i2c device data from i2c device address
if (PrivRead(sdev->fd, sdev->buffer, len) < 0)
return -1;
@ -158,7 +170,7 @@ static uint16_t SensorDeviceBmp180ReadUT(struct SensorDevice *sdev)
printf("SensorDeviceBmp180ReadUT write reg 0xF4 error. return 0x0\n");
return 0;
}
PrivTaskDelay(5);
return SensorDeviceBmp180ReadRegs(sdev, 0xF6);
}
@ -176,7 +188,7 @@ static uint16_t SensorDeviceBmp180ReadUP(struct SensorDevice *sdev)
printf("SensorDeviceBmp180ReadUP write reg 0xF4 error. return 0x0\n");
return 0;
}
PrivTaskDelay(5);
return SensorDeviceBmp180ReadRegs(sdev, 0xF6);
}
@ -281,6 +293,9 @@ static int32_t ReadAltitude(struct SensorQuantity *quant)
bmp180_temperature = SensorDeviceBmp180CalTemp(quant->sdev, ut, &bmp180_reg_data);
bmp180_pressure = SensorDeviceBmp180CalPressure(quant->sdev, up, &bmp180_reg_data);
bmp180_aititude = SensorDeviceBmp180CalAltitude(bmp180_pressure);
printf("Bmp180 temperature is : %.2f ℃ \n",bmp180_temperature);
printf("Bmp180 pressure = %.2f Pa\n",bmp180_pressure);
printf("Bmp180 aititude = %.2f m\n",bmp180_aititude);
return (int32_t)bmp180_pressure;
}
@ -317,6 +332,3 @@ int Bmp180AltitudeInit(void)
return 0;
}

View File

@ -108,6 +108,24 @@ config SENSOR_G8S
endif
if ADD_RTTHREAD_FETURES
config SENSOR_G8S_DRIVER_EXTUART
bool "Using extra uart to support g8-s"
default n
config SENSOR_DEVICE_G8S_DEV
string "g8-s device uart path"
default "/dev/uart2_dev2"
depends on !SENSOR_G8S_DRIVER_EXTUART
if SENSOR_G8S_DRIVER_EXTUART
config SENSOR_DEVICE_G8S_DEV
string "g8-s device extra uart path"
default "/dev/extuart_dev5"
config SENSOR_DEVICE_G8S_DEV_EXT_PORT
int "if g8-s device using extuart, choose port"
default "5"
endif
endif
endif

View File

@ -142,7 +142,7 @@ static uint8_t getCheckSum(uint8_t *packet)
{
uint8_t i;
uint8_t checksum = 0;
for( i = 1; i < 12; i++)
for( i = 1; i < 8; i++)
{
checksum += packet[i];
}

View File

@ -43,6 +43,23 @@ config SENSOR_TB600B_IAQ10
endif
if ADD_RTTHREAD_FETURES
config SENSOR_TB600B_IAQ10_DRIVER_EXTUART
bool "Using extra uart to support tb600b iaq10"
default y
config SENSOR_DEVICE_TB600B_IAQ10_DEV
string "tb600b iaq10 device uart path"
default "/dev/uart2_dev2"
depends on !SENSOR_TB600B_IAQ10_DRIVER_EXTUART
if SENSOR_TB600B_IAQ10_DRIVER_EXTUART
config SENSOR_DEVICE_TB600B_IAQ10_DEV
string "tb600b iaq10 device extra uart path"
default "/dev/extuart_dev6"
config SENSOR_DEVICE_TB600B_IAQ10_DEV_EXT_PORT
int "if TB600B_IAQ10 device using extuart, choose port"
default "6"
endif
endif
endif

View File

@ -0,0 +1,14 @@
import os
Import('RTT_ROOT')
from building import *
cwd = GetCurrentDir()
objs = []
list = os.listdir(cwd)
for d in list:
path = os.path.join(cwd, d)
if os.path.isfile(os.path.join(path, 'SConscript')):
objs = objs + SConscript(os.path.join(path, 'SConscript'))
Return('objs')

View File

@ -0,0 +1,10 @@
from building import *
import os
cwd = GetCurrentDir()
src = []
if GetDepend(['SENSOR_TB600B_IAQ10']):
src += ['tb600b_iaq10.c']
group = DefineGroup('sensor IAQ10 TB600B', src, depend = [], CPPPATH = [cwd])
Return('group')

View File

@ -192,7 +192,7 @@ static int32_t QuantityRead(struct SensorQuantity *quant)
result.TL = ((int)((quant->sdev->buffer[8] << 8)|quant->sdev->buffer[9]))%100;
result.RhH = ((unsigned int)((quant->sdev->buffer[10] << 8)|quant->sdev->buffer[11]))/100;
result.RhL = ((unsigned int)((quant->sdev->buffer[10] << 8)|quant->sdev->buffer[11]))%100;
printf("Gas concentration is : %dppb\nThe temperature is : %d.%d℃\nThe humidity is : %d.%drh%%\n", result.gas, result.TH, result.TL, result.RhH, result.RhL);
printf("Gas concentration is : %dppb\nThe temperature is : %d.%d℃ \nThe humidity is : %d.%drh%%\n", result.gas, result.TH, result.TL, result.RhH, result.RhL);
return result.gas;
}
else

View File

@ -69,6 +69,23 @@ config SENSOR_PS5308
endif
if ADD_RTTHREAD_FETURES
config SENSOR_PS5308_DRIVER_EXTUART
bool "Using extra uart to support PS5308"
default y
config SENSOR_DEVICE_PS5308_DEV
string "PS5308 device name"
default "/dev/uart2_dev2"
depends on !SENSOR_PS5308_DRIVER_EXTUART
if SENSOR_PS5308_DRIVER_EXTUART
config SENSOR_DEVICE_PS5308_DEV
string "PS5308 device extra uart path"
default "/dev/extuart_dev6"
config SENSOR_DEVICE_PS5308_DEV_EXT_PORT
int "if PS5308 device using extuart, choose port"
default "6"
endif
endif
endif

View File

@ -0,0 +1,14 @@
import os
Import('RTT_ROOT')
from building import *
cwd = GetCurrentDir()
objs = []
list = os.listdir(cwd)
for d in list:
path = os.path.join(cwd, d)
if os.path.isfile(os.path.join(path, 'SConscript')):
objs = objs + SConscript(os.path.join(path, 'SConscript'))
Return('objs')

View File

@ -0,0 +1,10 @@
from building import *
import os
cwd = GetCurrentDir()
src = []
if GetDepend(['SENSOR_DEVICE_PS5308']):
src += ['ps5308.c']
group = DefineGroup('sensor PS5308 DEVICE', src, depend = [], CPPPATH = [cwd])
Return('group')

View File

@ -78,12 +78,18 @@ static int SensorDeviceOpen(struct SensorDevice *sdev)
cfg.port_configure = PORT_CFG_INIT;
#endif
result = PrivIoctl(sdev->fd, OPE_INT, &cfg);
struct PrivIoctlCfg ioctl_cfg;
ioctl_cfg.ioctl_driver_type = SERIAL_TYPE;
ioctl_cfg.args = &cfg;
result = PrivIoctl(sdev->fd, OPE_INT, &ioctl_cfg);
#ifdef ADD_RTTHREAD_FETURES
return result;
#else
PrivTaskCreate(&active_task_id, NULL, &ReadTask, sdev);
PrivTaskStartup(&active_task_id);
return result;
#endif
}
/**
@ -93,8 +99,12 @@ static int SensorDeviceOpen(struct SensorDevice *sdev)
*/
static int SensorDeviceClose(struct SensorDevice *sdev)
{
#ifdef ADD_RTTHREAD_FETURES
PrivMutexDelete(&buff_lock);
#else
PrivTaskDelete(active_task_id, 0);
PrivMutexDelete(&buff_lock);
#endif
return 0;
}
@ -172,6 +182,16 @@ static int32_t ReadPm1_0(struct SensorQuantity *quant)
uint32_t result;
if (quant->sdev->done->read != NULL) {
#ifdef ADD_RTTHREAD_FETURES
uint32_t len = 0;
PrivMutexObtain(&buff_lock);
len = quant->sdev->done->read(quant->sdev, 32);
if (len == 0) {
printf("error read data length = 0.\n");
return -1;
}
PrivMutexAbandon(&buff_lock);
#endif
uint16_t checksum = 0;
PrivMutexObtain(&buff_lock);
@ -239,10 +259,20 @@ static int32_t ReadPm2_5(struct SensorQuantity *quant)
uint32_t result;
if (quant->sdev->done->read != NULL) {
#ifdef ADD_RTTHREAD_FETURES
uint32_t len = 0;
PrivMutexObtain(&buff_lock);
len = quant->sdev->done->read(quant->sdev, 32);
if (len == 0) {
printf("error read data length = 0.\n");
return -1;
}
PrivMutexAbandon(&buff_lock);
#endif
uint16_t checksum = 0;
PrivMutexObtain(&buff_lock);
for (uint i = 0; i < 30; i++)
for (uint8_t i = 0; i < 30; i++)
checksum += quant->sdev->buffer[i];
if (checksum == (((uint16_t)quant->sdev->buffer[30] << 8) + ((uint16_t)quant->sdev->buffer[31]))) {
@ -306,10 +336,20 @@ static int32_t ReadPm10(struct SensorQuantity *quant)
uint32_t result;
if (quant->sdev->done->read != NULL) {
#ifdef ADD_RTTHREAD_FETURES
uint32_t len = 0;
PrivMutexObtain(&buff_lock);
len = quant->sdev->done->read(quant->sdev, 32);
if (len == 0) {
printf("error read data length = 0.\n");
return -1;
}
PrivMutexAbandon(&buff_lock);
#endif
uint16_t checksum = 0;
PrivMutexObtain(&buff_lock);
for (uint i = 0; i < 30; i++)
for (uint8_t i = 0; i < 30; i++)
checksum += quant->sdev->buffer[i];
if (checksum == (((uint16_t)quant->sdev->buffer[30] << 8) + ((uint16_t)quant->sdev->buffer[31]))) {

View File

@ -43,6 +43,23 @@ config SENSOR_TB600B_TVOC10
endif
if ADD_RTTHREAD_FETURES
config SENSOR_TB600B_TVOC10_DRIVER_EXTUART
bool "Using extra uart to support tb600b tvoc10"
default y
config SENSOR_DEVICE_TB600B_TVOC10_DEV
string "tb600b tvoc10 device uart path"
default "/dev/uart2_dev2"
depends on !SENSOR_TB600B_TVOC10_DRIVER_EXTUART
if SENSOR_TB600B_TVOC10_DRIVER_EXTUART
config SENSOR_DEVICE_TB600B_TVOC10_DEV
string "tb600b tvoc10 device extra uart path"
default "/dev/extuart_dev6"
config SENSOR_DEVICE_TB600B_TVOC10_DEV_EXT_PORT
int "if TB600B_TVOC10 device using extuart, choose port"
default "6"
endif
endif
endif

View File

@ -0,0 +1,14 @@
import os
Import('RTT_ROOT')
from building import *
cwd = GetCurrentDir()
objs = []
list = os.listdir(cwd)
for d in list:
path = os.path.join(cwd, d)
if os.path.isfile(os.path.join(path, 'SConscript')):
objs = objs + SConscript(os.path.join(path, 'SConscript'))
Return('objs')

View File

@ -0,0 +1,10 @@
from building import *
import os
cwd = GetCurrentDir()
src = []
if GetDepend(['SENSOR_TB600B_TVOC10']):
src += ['tb600b_tvoc10.c']
group = DefineGroup('sensor TVOC10 TB600B', src, depend = [], CPPPATH = [cwd])
Return('group')

View File

@ -184,7 +184,7 @@ static int32_t QuantityRead(struct SensorQuantity *quant)
RhH = ((unsigned int)((quant->sdev->buffer[10] << 8)|quant->sdev->buffer[11]))/100;
RhL = ((unsigned int)((quant->sdev->buffer[10] << 8)|quant->sdev->buffer[11]))%100;
printf("tvoc concentration is : %dug/m³(%dppb)\nThe temperature is : %d.%d℃\nThe humidity is : %d.%drh%%\n", ugm3, ppb, TH, TL, RhH, RhL);
printf("tvoc concentration is : %dug/m³(%dppb)\nThe temperature is : %d.%d℃ \nThe humidity is : %d.%drh%% \n", ugm3, ppb, TH, TL, RhH, RhL);
return ppb;
}
else

View File

@ -51,6 +51,23 @@ config SENSOR_QS_FX
endif
if ADD_RTTHREAD_FETURES
config SENSOR_QS_FX_DRIVER_EXTUART
bool "Using extra uart to support qs-fx"
default y
config SENSOR_DEVICE_QS_FX_DEV
string "qs-fx device name"
default "/dev/uart2_dev2"
depends on !SENSOR_QS_FX_DRIVER_EXTUART
if SENSOR_QS_FX_DRIVER_EXTUART
config SENSOR_DEVICE_QS_FX_DEV
string "qs-fx device extra uart path"
default "/dev/extuart_dev2"
config SENSOR_DEVICE_QS_FX_DEV_EXT_PORT
int "if qs-fx device using extuart, choose port"
default "2"
endif
endif
endif

View File

@ -166,7 +166,7 @@ static int32_t ReadWindDirection(struct SensorQuantity *quant)
if (quant->sdev->done->read != NULL) {
if (quant->sdev->status == SENSOR_DEVICE_PASSIVE) {
quant->sdev->done->read(quant->sdev, 7);
if(Crc16(quant->sdev->buffer,7)!=0x00){
if(Crc16(quant->sdev->buffer,7)!=0x00) {
return -1;
}
result = (quant->sdev->buffer[3] << 8) | quant->sdev->buffer[4];

View File

@ -51,6 +51,23 @@ config SENSOR_QS_FS
endif
if ADD_RTTHREAD_FETURES
config SENSOR_QS_FS_DRIVER_EXTUART
bool "Using extra uart to support qs-fx"
default y
config SENSOR_DEVICE_QS_FS_DEV
string "qs-fx device name"
default "/dev/uart2_dev2"
depends on !SENSOR_QS_FS_DRIVER_EXTUART
if SENSOR_QS_FS_DRIVER_EXTUART
config SENSOR_DEVICE_QS_FS_DEV
string "qs-fx device extra uart path"
default "/dev/extuart_dev7"
config SENSOR_DEVICE_QS_FS_DEV_EXT_PORT
int "if qs-fx device using extuart, choose port"
default "7"
endif
endif
endif

View File

@ -21,7 +21,7 @@
#include <sensor.h>
static struct SensorDevice qs_fs;
static const unsigned char instructions[] = {0x02,0x03,0x00,0x00,0x00,0x01,0x84,0x39};
static const unsigned char instructions[] = {0x02, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x39};
static struct SensorProductInfo info =
{

View File

@ -187,6 +187,16 @@ static int PrivPinIoctl(int fd, int cmd, void *args)
return ioctl(fd, cmd, pin_cfg);
}
static int PrivI2cIoctl(int fd, int cmd, void *args)
{
struct dfs_fd *rt_fd;
int ret = 0;
rt_fd = fd_get(fd);
rt_fd->pos = *(off_t *)args;
// ret = rt_fd->fops->ioctl(rt_fd, RT_I2C_DEV_CTRL_ADDR, args);
return ret;
}
int PrivIoctl(int fd, int cmd, void *args)
{
int ret;
@ -200,6 +210,9 @@ int PrivIoctl(int fd, int cmd, void *args)
case PIN_TYPE:
ret = PrivPinIoctl(fd, cmd, ioctl_cfg->args);
break;
case I2C_TYPE:
ret = PrivI2cIoctl(fd, cmd, ioctl_cfg->args);
break;
default:
break;
}

View File

@ -65,7 +65,7 @@
extern "C" {
#endif
#ifndef _STDBOOL_H
typedef signed char bool;
//typedef signed char bool;
#endif
typedef signed char int8;
typedef signed short int16;
@ -73,6 +73,8 @@ typedef signed int int32;
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned int uint32;
#define EOK 0
#define x_err_t int
#ifdef ARCH_CPU_64BIT
typedef signed long int64;
@ -144,6 +146,7 @@ struct SerialDataCfg
uint8_t serial_bit_order;
uint8_t serial_invert_mode;
uint16_t serial_buffer_size;
int32 serial_timeout;
uint8_t is_ext_uart;
uint8_t ext_uart_no;
@ -165,6 +168,61 @@ struct PrivIoctlCfg
void *args;
};
typedef struct
{
uint16 x_pos;
uint16 y_pos;
uint16 width;
uint16 height;
uint8 font_size;
uint8 *addr;
uint16 font_color;
uint16 back_color;
}LcdStringParam;
typedef struct
{
uint16 x_startpos;
uint16 x_endpos;
uint16 y_startpos;
uint16 y_endpos;
void* pixel_color;
}LcdPixelParam;
typedef struct
{
char type; // 0:write string;1:write dot
LcdPixelParam pixel_info;
LcdStringParam string_info;
}LcdWriteParam;
typedef struct
{
uint16_t x;
uint16_t y;
uint16_t press;
}TouchDataParam;
struct TouchDataStandard
{
uint16_t x;
uint16_t y;
};
#define PRIV_SYSTICK_GET (rt_tick_get())
#define PRIV_LCD_DEV "/dev/lcd"
#define MY_DISP_HOR_RES LCD_WIDTH
#define MY_DISP_VER_RES LCD_HEIGHT
#define PRIV_TOUCH_DEV "/dev/touch"
#define MY_INDEV_X LCD_WIDTH
#define MY_INDEV_Y LCD_HEIGHT
/*********************shell***********************/
//for int func(int argc, char *agrv[])
#define PRIV_SHELL_CMD_MAIN_ATTR

View File

@ -8,7 +8,9 @@ cwd = GetCurrentDir()
src = []
inc = []
src += ['../porting/lv_port_disp_template.c']
src += ['../porting/lv_port_fs_template.c']
src += ['../porting/lv_port_indev_template.c']
lvgl_cwd = cwd + '/../'
lvgl_src_cwd = lvgl_cwd + 'src/'
@ -19,6 +21,7 @@ for root, dirs, files in os.walk(lvgl_src_cwd):
src = src + Glob(os.path.join(root,dir,'*.c'))
inc = inc + [os.path.join(root,dir)]
inc = inc + [lvgl_cwd]
LOCAL_CCFLAGS = ''
if rtconfig.PLATFORM == 'gcc': # GCC
LOCAL_CCFLAGS += ' -std=c99'
@ -27,39 +30,15 @@ elif rtconfig.PLATFORM == 'armcc': # Keil AC5
elif rtconfig.PLATFORM == 'armclang': # Keil AC6
LOCAL_CCFLAGS += ' -std=c99 -g -w'
group = DefineGroup('LVGL', src, depend = ['PKG_USING_LVGL'], CPPPATH = inc, LOCAL_CCFLAGS = LOCAL_CCFLAGS)
group = DefineGroup('LVGL', src, depend = ['LIB_LV'], CPPPATH = inc, LOCAL_CCFLAGS = LOCAL_CCFLAGS)
port_src = Glob('*.c')
port_inc = [cwd]
group = group + DefineGroup('LVGL-port', port_src, depend = ['PKG_USING_LVGL'], CPPPATH = port_inc)
port_inc = [cwd]+['../porting/']
group = group + DefineGroup('LVGL-port', port_src, depend = ['LIB_LV'], CPPPATH = port_inc)
list = os.listdir(cwd)
for d in list:
path = os.path.join(cwd, d)
if os.path.isfile(os.path.join(path, 'SConscript')):
group = group + SConscript(os.path.join(d, 'SConscript'))
#
# try:
# shutil.rmtree(os.path.join(lvgl_cwd, '.github'))
# shutil.rmtree(os.path.join(lvgl_cwd, 'docs'))
# shutil.rmtree(os.path.join(lvgl_cwd, 'scripts'))
# shutil.rmtree(os.path.join(lvgl_cwd, 'tests'))
# shutil.rmtree(os.path.join(lvgl_cwd, 'zephyr'))
# os.remove(os.path.join(lvgl_cwd, '.codecov.yml'))
# os.remove(os.path.join(lvgl_cwd, '.editorconfig'))
# os.remove(os.path.join(lvgl_cwd, '.gitignore'))
# os.remove(os.path.join(lvgl_cwd, '.gitmodules'))
# os.remove(os.path.join(lvgl_cwd, 'CMakeLists.txt'))
# os.remove(os.path.join(lvgl_cwd, 'component.mk'))
# os.remove(os.path.join(lvgl_cwd, 'idf_component.yml'))
# os.remove(os.path.join(lvgl_cwd, 'Kconfig'))
# os.remove(os.path.join(lvgl_cwd, 'library.json'))
# os.remove(os.path.join(lvgl_cwd, 'library.properties'))
# os.remove(os.path.join(lvgl_cwd, 'lv_conf_template.h'))
# os.remove(os.path.join(lvgl_cwd, 'lvgl.mk'))
# except:
# pass
#
Return('group')

View File

@ -16,69 +16,12 @@
#define LV_RTTHREAD_INCLUDE <rtthread.h>
#include LV_RTTHREAD_INCLUDE
/*=========================
MEMORY SETTINGS
*=========================*/
#ifdef RT_USING_HEAP
# define LV_MEM_CUSTOM 1
# define LV_MEM_CUSTOM_INCLUDE LV_RTTHREAD_INCLUDE
# define LV_MEM_CUSTOM_ALLOC rt_malloc
# define LV_MEM_CUSTOM_FREE rt_free
# define LV_MEM_CUSTOM_REALLOC rt_realloc
#endif
/*====================
HAL SETTINGS
*====================*/
#define LV_TICK_CUSTOM 1
#define LV_TICK_CUSTOM_INCLUDE LV_RTTHREAD_INCLUDE
#define LV_TICK_CUSTOM_SYS_TIME_EXPR (rt_tick_get_millisecond()) /*Expression evaluating to current system time in ms*/
/*=======================
* FEATURE CONFIGURATION
*=======================*/
/*-------------
* Logging
*-----------*/
#ifdef PKG_LVGL_ENABLE_LOG
# define LV_USE_LOG 1
# define LV_LOG_PRINTF 0
#else
# define LV_USE_LOG 0
#endif
/*-------------
* Asserts
*-----------*/
#define LV_ASSERT_HANDLER_INCLUDE LV_RTTHREAD_INCLUDE
#define LV_ASSERT_HANDLER RT_ASSERT(0);
/*-------------
* Others
*-----------*/
#define LV_SPRINTF_CUSTOM 1
#define LV_SPRINTF_INCLUDE LV_RTTHREAD_INCLUDE
#ifdef __ARMCC_VERSION
#define lv_snprintf rt_snprintf
#define lv_vsnprintf rt_vsnprintf
#define LV_SPRINTF_USE_FLOAT 0
/*=====================
* COMPILER SETTINGS
*====================*/
#ifdef RT_USING_BIG_ENDIAN
# define LV_BIG_ENDIAN_SYSTEM 1
#else
# define LV_BIG_ENDIAN_SYSTEM 0
#endif
#define LV_ATTRIBUTE_MEM_ALIGN ALIGN(4)
/*--END OF LV_RT_THREAD_CONF_H--*/

View File

@ -1,52 +0,0 @@
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: MIT
*
* Change Logs:
* Date Author Notes
* 2021-10-18 Meco Man The first version
*/
#ifdef __RTTHREAD__
#include <rtthread.h>
#include <lvgl.h>
#define DBG_TAG "LVGL"
#define DBG_LVL DBG_INFO
#include <rtdbg.h>
#ifndef PKG_USING_LVGL_DISP_DEVICE
# include <lv_port_disp.h>
#endif
#ifndef PKG_USING_LVGL_INDEV_DEVICE
# include <lv_port_indev.h>
#endif
#if LV_USE_LOG && LV_LOG_PRINTF
static void lv_rt_log(const char *buf)
{
LOG_I(buf);
}
#endif
static int lv_port_init(void)
{
#if LV_USE_LOG && LV_LOG_PRINTF
lv_log_register_print_cb(lv_rt_log);
#endif
lv_init();
#ifndef PKG_USING_LVGL_DISP_DEVICE
lv_port_disp_init();
#endif
#ifndef PKG_USING_LVGL_INDEV_DEVICE
lv_port_indev_init();
#endif
return 0;
}
INIT_COMPONENT_EXPORT(lv_port_init);
#endif /*__RTTHREAD__*/

View File

@ -547,6 +547,7 @@ static size_t _etoa(out_fct_type out, char * buffer, size_t idx, size_t maxlen,
#endif // PRINTF_SUPPORT_FLOAT
// internal vsnprintf
#ifndef __ARMCC_VERSION
static int _vsnprintf(out_fct_type out, char * buffer, const size_t maxlen, const char * format, va_list va)
{
unsigned int flags, width, precision, n;
@ -859,9 +860,9 @@ static int _vsnprintf(out_fct_type out, char * buffer, const size_t maxlen, cons
// return written chars without terminating \0
return (int)idx;
}
#endif
///////////////////////////////////////////////////////////////////////////////
#ifndef __ARMCC_VERSION
int lv_snprintf(char * buffer, size_t count, const char * format, ...)
{
va_list va;
@ -875,5 +876,5 @@ int lv_vsnprintf(char * buffer, size_t count, const char * format, va_list va)
{
return _vsnprintf(_out_buffer, buffer, count, format, va);
}
#endif
#endif /*LV_SPRINTF_CUSTOM*/

View File

@ -78,8 +78,9 @@ typedef struct {
* null character. A value equal or larger than count indicates truncation. Only when the returned value
* is non-negative and less than count, the string has been completely written.
*/
int lv_snprintf(char * buffer, size_t count, const char * format, ...) LV_FORMAT_ATTRIBUTE(3, 4);
int lv_vsnprintf(char * buffer, size_t count, const char * format, va_list va) LV_FORMAT_ATTRIBUTE(3, 0);
//int lv_snprintf(char * buffer, size_t count, const char * format, ...) LV_FORMAT_ATTRIBUTE(3, 4);
//int lv_vsnprintf(char * buffer, size_t count, const char * format, va_list va) LV_FORMAT_ATTRIBUTE(3, 0);
#else
#include LV_SPRINTF_INCLUDE

View File

@ -10,7 +10,7 @@ CONFIG_RTT_DIR="../../rt-thread"
#
# RT-Thread Kernel
#
CONFIG_RT_NAME_MAX=8
CONFIG_RT_NAME_MAX=12
# CONFIG_RT_USING_BIG_ENDIAN is not set
# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
# CONFIG_RT_USING_SMP is not set
@ -167,7 +167,7 @@ CONFIG_RT_USING_SERIAL=y
CONFIG_RT_USING_SERIAL_V1=y
# CONFIG_RT_USING_SERIAL_V2 is not set
# CONFIG_RT_SERIAL_USING_DMA is not set
CONFIG_RT_SERIAL_RB_BUFSZ=64
CONFIG_RT_SERIAL_RB_BUFSZ=256
CONFIG_RT_USING_CAN=y
# CONFIG_RT_CAN_USING_HDR is not set
# CONFIG_RT_USING_HWTIMER is not set
@ -239,7 +239,15 @@ CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8
#
# Network interface device
#
# CONFIG_RT_USING_NETDEV is not set
CONFIG_RT_USING_NETDEV=y
CONFIG_NETDEV_USING_IFCONFIG=y
CONFIG_NETDEV_USING_PING=y
CONFIG_NETDEV_USING_NETSTAT=y
CONFIG_NETDEV_USING_AUTO_DEFAULT=y
# CONFIG_NETDEV_USING_IPV6 is not set
CONFIG_NETDEV_IPV4=1
CONFIG_NETDEV_IPV6=0
# CONFIG_NETDEV_IPV6_SCOPES is not set
#
# light weight TCP/IP stack
@ -283,7 +291,7 @@ CONFIG_BSP_USING_UART1=y
CONFIG_BSP_USING_UART2=y
CONFIG_BSP_USING_UART3=y
# CONFIG_BSP_USING_UART4 is not set
# CONFIG_BSP_USING_I2C1 is not set
CONFIG_BSP_USING_I2C1=y
# CONFIG_BSP_USING_SPI is not set
# CONFIG_BSP_USING_CH438 is not set
CONFIG_BSP_USING_USB=y
@ -304,6 +312,9 @@ CONFIG_USB_DEVICE_NAME="usb_dev"
#
# CONFIG_PKG_USING_RW007 is not set
# CONFIG_DRV_USING_OV2640 is not set
# CONFIG_DRV_USING_HS300X is not set
# CONFIG_DRV_USING_SX1278 is not set
# CONFIG_PKG_USING_WIZNET is not set
#
# APP_Framework
@ -316,23 +327,20 @@ CONFIG_TRANSFORM_LAYER_ATTRIUBUTE=y
# CONFIG_ADD_XIZI_FETURES is not set
# CONFIG_ADD_NUTTX_FETURES is not set
CONFIG_ADD_RTTHREAD_FETURES=y
# CONFIG_SUPPORT_SENSOR_FRAMEWORK is not set
CONFIG_SUPPORT_CONNECTION_FRAMEWORK=y
CONFIG_CONNECTION_FRAMEWORK_DEBUG=y
# CONFIG_CONNECTION_INDUSTRIAL_ETHERNET is not set
# CONFIG_CONNECTION_INDUSTRIAL_FIELDBUS is not set
# CONFIG_CONNECTION_INDUSTRIAL_WLAN is not set
# CONFIG_CONNECTION_ADAPTER_LORA is not set
# CONFIG_CONNECTION_ADAPTER_4G is not set
# CONFIG_CONNECTION_ADAPTER_NB is not set
# CONFIG_CONNECTION_ADAPTER_WIFI is not set
CONFIG_ADAPTER_HFA21_DRIVER="/dev/uart3"
CONFIG_CONNECTION_ADAPTER_ETHERNET=y
CONFIG_ADAPTER_HFA21_ETHERNET=y
CONFIG_ADAPTER_ETHERNET_HFA21="hfa21_ethernet"
# CONFIG_CONNECTION_ADAPTER_BLUETOOTH is not set
# CONFIG_CONNECTION_ADAPTER_ZIGBEE is not set
# CONFIG_CONNECTION_ADAPTER_5G is not set
CONFIG_SUPPORT_SENSOR_FRAMEWORK=y
# CONFIG_SENSOR_HCHO is not set
# CONFIG_SENSOR_TVOC is not set
# CONFIG_SENSOR_IAQ is not set
# CONFIG_SENSOR_CH4 is not set
# CONFIG_SENSOR_CO2 is not set
# CONFIG_SENSOR_PM is not set
# CONFIG_SENSOR_VOICE is not set
# CONFIG_SENSOR_TEMPERATURE is not set
# CONFIG_SENSOR_HUMIDITY is not set
# CONFIG_SENSOR_WINDSPEED is not set
# CONFIG_SENSOR_WINDDIRECTION is not set
# CONFIG_SENSOR_ALTITUDE is not set
# CONFIG_SUPPORT_CONNECTION_FRAMEWORK is not set
# CONFIG_SUPPORT_KNOWING_FRAMEWORK is not set
# CONFIG_SUPPORT_CONTROL_FRAMEWORK is not set
@ -340,6 +348,7 @@ CONFIG_ADAPTER_ETHERNET_HFA21="hfa21_ethernet"
# Security
#
# CONFIG_CRYPTO is not set
# CONFIG_MBEDTLS is not set
#
# Applications
@ -377,7 +386,21 @@ CONFIG_MAIN_KTASK_STACK_SIZE=1024
#
# sensor app
#
# CONFIG_APPLICATION_SENSOR is not set
CONFIG_APPLICATION_SENSOR=y
# CONFIG_APPLICATION_SENSOR_HCHO is not set
# CONFIG_APPLICATION_SENSOR_TVOC is not set
# CONFIG_APPLICATION_SENSOR_IAQ is not set
# CONFIG_APPLICATION_SENSOR_CH4 is not set
# CONFIG_APPLICATION_SENSOR_CO2 is not set
# CONFIG_APPLICATION_SENSOR_PM1_0 is not set
# CONFIG_APPLICATION_SENSOR_PM2_5 is not set
# CONFIG_APPLICATION_SENSOR_PM10 is not set
# CONFIG_APPLICATION_SENSOR_VOICE is not set
# CONFIG_APPLICATION_SENSOR_TEMPERATURE is not set
# CONFIG_APPLICATION_SENSOR_HUMIDITY is not set
# CONFIG_APPLICATION_SENSOR_WINDDIRECTION is not set
# CONFIG_APPLICATION_SENSOR_WINDSPEED is not set
# CONFIG_APPLICATION_SENSOR_ALTITUDE is not set
# CONFIG_USING_EMBEDDED_DATABASE_APP is not set
# CONFIG_APP_USING_WEBNET is not set
@ -389,4 +412,9 @@ CONFIG_APP_SELECT_NEWLIB=y
# CONFIG_LIB_USING_CJSON is not set
# CONFIG_LIB_USING_QUEUE is not set
# CONFIG_LIB_LV is not set
#
# LVGL configuration
#
# CONFIG_LV_CONF_MINIMAL is not set
# CONFIG_USING_EMBEDDED_DATABASE is not set

View File

@ -33,14 +33,98 @@
#endif
#define LED0_PIN GET_PIN(G, 15)
extern int FrameworkInit();
extern int FrameworkInit(void);
int main(void)
{
int count = 1;
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
rt_thread_mdelay(100);
FrameworkInit();
printf("XIUOS stm32f4 build %s %s\n",__DATE__,__TIME__);
printf("XIUOS stm32f4 build %s %s\n",__DATE__,__TIME__);
#ifdef APPLICATION_SENSOR_ALTITUDE_BMP180
extern int AltitudeBmp180();
AltitudeBmp180();
#endif
#ifdef APPLICATION_SENSOR_CH4_AS830
extern void Ch4As830();
Ch4As830();
#endif
#ifdef APPLICATION_SENSOR_TVOC_TB600B_TVOC10
extern void TvocTb600bTvoc10();
TvocTb600bTvoc10();
#endif
#ifdef APPLICATION_SENSOR_CO2_G8S
extern void Co2G8s();
printf("Waiting for Co2G8s to start...\n");
rt_thread_mdelay(9000);
Co2G8s();
#endif
#ifdef APPLICATION_SENSOR_CO2_ZG09
extern void Co2Zg09();
printf("Waiting for Co2ZG09 to start...\n");
rt_thread_mdelay(8000);
Co2Zg09();
#endif
#ifdef APPLICATION_SENSOR_PM1_0_PS5308
extern void Pm10Ps5308();
Pm10Ps5308();
#endif
#ifdef APPLICATION_SENSOR_PM2_5_PS5308
extern void Pm25Ps5308();
Pm25Ps5308();
#endif
#ifdef APPLICATION_SENSOR_PM10_PS5308
extern void Pm100Ps5308();
Pm100Ps5308();
#endif
#ifdef APPLICATION_SENSOR_TEMPERATURE_HS300X
extern void TempHs300x();
TempHs300x();
#endif
#ifdef APPLICATION_SENSOR_HUMIDITY_HS300X
extern void HumiHs300x();
HumiHs300x();
#endif
#ifdef APPLICATION_SENSOR_HCHO_TB600B_WQ_HCHO1OS
extern void HchoTb600bHcho1os();
printf("Waiting for HchoTb600bHcho1os to start...\n");
rt_thread_mdelay(10000);
HchoTb600bHcho1os();
#endif
#ifdef APPLICATION_SENSOR_IAQ_TB600B_IAQ10
extern void IaqTb600bIaq10();
printf("Waiting for IaqTb600bIaq10 to start...\n");
rt_thread_mdelay(9000);
IaqTb600bIaq10();
#endif
#ifdef APPLICATION_SENSOR_VOICE_D124
extern void VoiceD124();
VoiceD124();
#endif
#ifdef APPLICATION_SENSOR_WINDDIRECTION_QS_FX
extern void WindDirectionQsFx();
WindDirectionQsFx();
#endif
#ifdef APPLICATION_SENSOR_WINDSPEED_QS_FS
extern void WindSpeedQsFs();
WindSpeedQsFs();
#endif
while (count++)
{
rt_pin_write(LED0_PIN, PIN_HIGH);

View File

@ -9,6 +9,7 @@ cwd = GetCurrentDir()
# add general drivers
src = Split('''
board.c
ch438.c
CubeMX_Config/Src/stm32f4xx_hal_msp.c
''')

View File

@ -40,6 +40,9 @@ extern int __bss_end;
#define HEAP_END STM32_SRAM_END
#define BSP_I2C1_SCL_PIN GET_PIN(B,6)
#define BSP_I2C1_SDA_PIN GET_PIN(B,7)
void SystemClock_Config(void);
#ifdef __cplusplus

View File

@ -0,0 +1,614 @@
#include <rtthread.h>
#include <rtdevice.h>
#include "ch438.h"
#include <math.h>
/* Offset address of serial port number */
static rt_uint8_t offsetadd[] = {0x00,0x10,0x20,0x30,0x08,0x18,0x28,0x38,};
struct rt_serial_device *extuart_serial_parm[8];
static void CH438_udelay(rt_uint64_t us)
{
rt_uint64_t ticks;
rt_uint64_t told, tnow, tcnt = 0;
rt_uint64_t reload = SysTick->LOAD;
ticks = us * reload / (1000000 / RT_TICK_PER_SECOND);
told = SysTick->VAL;
while (1) {
tnow = SysTick->VAL;
if (tnow != told) {
if (tnow < told) {
tcnt += told - tnow;
}
else {
tcnt += reload - tnow + told;
}
told = tnow;
if (tcnt >= ticks) {
break;
}
}
}
}
void CH438_INIT(void)
{
CH438_set_output();
rt_pin_mode(CH438_NWR_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(CH438_NRD_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(CH438_NCS_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(CH438_ALE_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(DIR_485CH1_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(DIR_485CH2_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(DIR_485CH3_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(CH438_INT_PIN, PIN_MODE_INPUT_PULLUP);
rt_pin_write(CH438_NWR_PIN, PIN_HIGH);
rt_pin_write(CH438_NRD_PIN, PIN_HIGH);
rt_pin_write(CH438_NCS_PIN, PIN_HIGH);
rt_pin_write(CH438_ALE_PIN, PIN_HIGH);
}
void CH438_PORT_INIT( rt_uint8_t ext_uart_no,rt_uint32_t BaudRate )
{
rt_uint32_t div;
rt_uint8_t DLL,DLM,dlab;
rt_uint8_t REG_LCR_ADDR;
rt_uint8_t REG_DLL_ADDR;
rt_uint8_t REG_DLM_ADDR;
rt_uint8_t REG_IER_ADDR;
rt_uint8_t REG_MCR_ADDR;
rt_uint8_t REG_FCR_ADDR;
REG_LCR_ADDR = offsetadd[ext_uart_no] | REG_LCR0_ADDR;
REG_DLL_ADDR = offsetadd[ext_uart_no] | REG_DLL0_ADDR;
REG_DLM_ADDR = offsetadd[ext_uart_no] | REG_DLM0_ADDR;
REG_IER_ADDR = offsetadd[ext_uart_no] | REG_IER0_ADDR;
REG_MCR_ADDR = offsetadd[ext_uart_no] | REG_MCR0_ADDR;
REG_FCR_ADDR = offsetadd[ext_uart_no] | REG_FCR0_ADDR;
/* Reset the serial port */
WriteCH438Data( REG_IER_ADDR, BIT_IER_RESET );
rt_thread_mdelay(50);
dlab = ReadCH438Data(REG_IER_ADDR);
dlab &= 0xDF;
WriteCH438Data(REG_IER_ADDR, dlab);
/* set LCR register DLAB bit 1 */
dlab = ReadCH438Data(REG_LCR_ADDR);
dlab |= 0x80;
WriteCH438Data(REG_LCR_ADDR, dlab);
div = ( Fpclk >> 4 ) / BaudRate;
DLM = div >> 8;
DLL = div & 0xff;
/* Set baud rate */
WriteCH438Data( REG_DLL_ADDR, DLL );
WriteCH438Data( REG_DLM_ADDR, DLM );
/* set FIFO mode, 112 bytes */
WriteCH438Data( REG_FCR_ADDR, BIT_FCR_RECVTG1 | BIT_FCR_RECVTG0 | BIT_FCR_FIFOEN );
/* 8 bit word size, 1 bit stop bit, no crc */
WriteCH438Data( REG_LCR_ADDR, BIT_LCR_WORDSZ1 | BIT_LCR_WORDSZ0 );
/* enable interrupt */
WriteCH438Data( REG_IER_ADDR, BIT_IER_IERECV );
/* allow interrupt output, DTR and RTS is 1 */
WriteCH438Data( REG_MCR_ADDR, BIT_MCR_OUT2 );
/* release the data in FIFO */
WriteCH438Data( REG_FCR_ADDR,ReadCH438Data(REG_FCR_ADDR)| BIT_FCR_TFIFORST );
}
static void CH438_set_output(void)
{
rt_pin_mode(CH438_D0_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(CH438_D1_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(CH438_D2_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(CH438_D3_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(CH438_D4_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(CH438_D5_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(CH438_D6_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(CH438_D7_PIN, PIN_MODE_OUTPUT);
}
static void CH438_set_input(void)
{
rt_pin_mode(CH438_D0_PIN, PIN_MODE_INPUT_PULLUP);
rt_pin_mode(CH438_D1_PIN, PIN_MODE_INPUT_PULLUP);
rt_pin_mode(CH438_D2_PIN, PIN_MODE_INPUT_PULLUP);
rt_pin_mode(CH438_D3_PIN, PIN_MODE_INPUT_PULLUP);
rt_pin_mode(CH438_D4_PIN, PIN_MODE_INPUT_PULLUP);
rt_pin_mode(CH438_D5_PIN, PIN_MODE_INPUT_PULLUP);
rt_pin_mode(CH438_D6_PIN, PIN_MODE_INPUT_PULLUP);
rt_pin_mode(CH438_D7_PIN, PIN_MODE_INPUT_PULLUP);
}
void set_485_input(rt_uint8_t ch_no)
{
if(ch_no == 1) {
rt_pin_write(DIR_485CH1_PIN, PIN_LOW);
}
if(ch_no == 2) {
rt_pin_write(DIR_485CH2_PIN, PIN_LOW);
}
if(ch_no == 3) {
rt_pin_write(DIR_485CH3_PIN, PIN_LOW);
}
}
void set_485_output(rt_uint8_t ch_no)
{
if(ch_no == 1) {
rt_pin_write(DIR_485CH1_PIN, PIN_HIGH);
}
if(ch_no == 2) {
rt_pin_write(DIR_485CH2_PIN, PIN_HIGH);
}
if(ch_no == 3) {
rt_pin_write(DIR_485CH3_PIN, PIN_HIGH);
}
}
rt_uint8_t ReadCH438Data( rt_uint8_t addr )
{
rt_uint8_t dat = 0;
rt_pin_write(CH438_NWR_PIN, PIN_HIGH);
rt_pin_write(CH438_NRD_PIN, PIN_HIGH);
rt_pin_write(CH438_ALE_PIN, PIN_HIGH);
rt_pin_write(CH438_NCS_PIN, PIN_HIGH);
CH438_set_output();
CH438_udelay(1);
if(addr &0x80) rt_pin_write(CH438_D7_PIN,PIN_HIGH); else rt_pin_write(CH438_D7_PIN,PIN_LOW);
if(addr &0x40) rt_pin_write(CH438_D6_PIN,PIN_HIGH); else rt_pin_write(CH438_D6_PIN,PIN_LOW);
if(addr &0x20) rt_pin_write(CH438_D5_PIN,PIN_HIGH); else rt_pin_write(CH438_D5_PIN,PIN_LOW);
if(addr &0x10) rt_pin_write(CH438_D4_PIN,PIN_HIGH); else rt_pin_write(CH438_D4_PIN,PIN_LOW);
if(addr &0x08) rt_pin_write(CH438_D3_PIN,PIN_HIGH); else rt_pin_write(CH438_D3_PIN,PIN_LOW);
if(addr &0x04) rt_pin_write(CH438_D2_PIN,PIN_HIGH); else rt_pin_write(CH438_D2_PIN,PIN_LOW);
if(addr &0x02) rt_pin_write(CH438_D1_PIN,PIN_HIGH); else rt_pin_write(CH438_D1_PIN,PIN_LOW);
if(addr &0x01) rt_pin_write(CH438_D0_PIN,PIN_HIGH); else rt_pin_write(CH438_D0_PIN,PIN_LOW);
CH438_udelay(1);
rt_pin_write(CH438_ALE_PIN,PIN_LOW);
CH438_udelay(1);
rt_pin_write(CH438_NCS_PIN, PIN_LOW);
CH438_udelay(1);
CH438_set_input();
CH438_udelay(1);
rt_pin_write(CH438_NRD_PIN,PIN_LOW);
CH438_udelay(1);
if (rt_pin_read(CH438_D7_PIN)) dat |= 0x80;
if (rt_pin_read(CH438_D6_PIN)) dat |= 0x40;
if (rt_pin_read(CH438_D5_PIN)) dat |= 0x20;
if (rt_pin_read(CH438_D4_PIN)) dat |= 0x10;
if (rt_pin_read(CH438_D3_PIN)) dat |= 0x08;
if (rt_pin_read(CH438_D2_PIN)) dat |= 0x04;
if (rt_pin_read(CH438_D1_PIN)) dat |= 0x02;
if (rt_pin_read(CH438_D0_PIN)) dat |= 0x01;
rt_pin_write(CH438_NRD_PIN,PIN_HIGH);
rt_pin_write(CH438_ALE_PIN,PIN_HIGH);
rt_pin_write(CH438_NCS_PIN,PIN_HIGH);
CH438_udelay(1);
return dat;
}
static void WriteCH438Data( rt_uint8_t addr, char dat )
{
rt_pin_write(CH438_ALE_PIN, PIN_HIGH);
rt_pin_write(CH438_NWR_PIN, PIN_HIGH);
rt_pin_write(CH438_NRD_PIN, PIN_HIGH);
rt_pin_write(CH438_NCS_PIN, PIN_HIGH);
CH438_set_output();
CH438_udelay(1);
if(addr &0x80) rt_pin_write(CH438_D7_PIN,PIN_HIGH); else rt_pin_write(CH438_D7_PIN,PIN_LOW);
if(addr &0x40) rt_pin_write(CH438_D6_PIN,PIN_HIGH); else rt_pin_write(CH438_D6_PIN,PIN_LOW);
if(addr &0x20) rt_pin_write(CH438_D5_PIN,PIN_HIGH); else rt_pin_write(CH438_D5_PIN,PIN_LOW);
if(addr &0x10) rt_pin_write(CH438_D4_PIN,PIN_HIGH); else rt_pin_write(CH438_D4_PIN,PIN_LOW);
if(addr &0x08) rt_pin_write(CH438_D3_PIN,PIN_HIGH); else rt_pin_write(CH438_D3_PIN,PIN_LOW);
if(addr &0x04) rt_pin_write(CH438_D2_PIN,PIN_HIGH); else rt_pin_write(CH438_D2_PIN,PIN_LOW);
if(addr &0x02) rt_pin_write(CH438_D1_PIN,PIN_HIGH); else rt_pin_write(CH438_D1_PIN,PIN_LOW);
if(addr &0x01) rt_pin_write(CH438_D0_PIN,PIN_HIGH); else rt_pin_write(CH438_D0_PIN,PIN_LOW);
CH438_udelay(1);
rt_pin_write(CH438_ALE_PIN,PIN_LOW);
CH438_udelay(1);
rt_pin_write(CH438_NCS_PIN, PIN_LOW);
CH438_udelay(1);
if(dat &0x80) rt_pin_write(CH438_D7_PIN,PIN_HIGH); else rt_pin_write(CH438_D7_PIN,PIN_LOW);
if(dat &0x40) rt_pin_write(CH438_D6_PIN,PIN_HIGH); else rt_pin_write(CH438_D6_PIN,PIN_LOW);
if(dat &0x20) rt_pin_write(CH438_D5_PIN,PIN_HIGH); else rt_pin_write(CH438_D5_PIN,PIN_LOW);
if(dat &0x10) rt_pin_write(CH438_D4_PIN,PIN_HIGH); else rt_pin_write(CH438_D4_PIN,PIN_LOW);
if(dat &0x08) rt_pin_write(CH438_D3_PIN,PIN_HIGH); else rt_pin_write(CH438_D3_PIN,PIN_LOW);
if(dat &0x04) rt_pin_write(CH438_D2_PIN,PIN_HIGH); else rt_pin_write(CH438_D2_PIN,PIN_LOW);
if(dat &0x02) rt_pin_write(CH438_D1_PIN,PIN_HIGH); else rt_pin_write(CH438_D1_PIN,PIN_LOW);
if(dat &0x01) rt_pin_write(CH438_D0_PIN,PIN_HIGH); else rt_pin_write(CH438_D0_PIN,PIN_LOW);
CH438_udelay(1);
rt_pin_write(CH438_NWR_PIN,PIN_LOW);
CH438_udelay(1);
rt_pin_write(CH438_NWR_PIN,PIN_HIGH);
rt_pin_write(CH438_ALE_PIN,PIN_HIGH);
rt_pin_write(CH438_NCS_PIN,PIN_HIGH);
CH438_udelay(1);
CH438_set_input();
return;
}
static void WriteCH438Block( rt_uint8_t mAddr, rt_uint8_t mLen, char *mBuf )
{
while ( mLen -- ) {
WriteCH438Data( mAddr, *mBuf++ );
}
}
static void CH438Irq(void *parameter)
{
rt_uint8_t gInterruptStatus;
rt_uint8_t port = 0;
/* multi irq may happen*/
gInterruptStatus = ReadCH438Data(REG_SSR_ADDR);
port = log(gInterruptStatus & 0xFF)/log(2);
rt_hw_serial_isr(extuart_serial_parm[port], RT_SERIAL_EVENT_RX_IND);
}
static rt_err_t rt_extuart_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
{
rt_uint32_t baud_rate = cfg->baud_rate;
rt_uint16_t port = cfg->reserved;
CH438_PORT_INIT(port, baud_rate);
return RT_EOK;
}
static rt_err_t extuart_control(struct rt_serial_device *serial, int cmd, void *arg)
{
static rt_uint16_t register_flag = 0;
switch (cmd)
{
case RT_DEVICE_CTRL_CLR_INT:
if(1 == register_flag)
{
rt_pin_irq_enable(CH438_INT_PIN, PIN_IRQ_DISABLE);
register_flag = 0;
}
break;
case RT_DEVICE_CTRL_SET_INT:
if(0 == register_flag)
{
rt_pin_mode(CH438_INT_PIN, PIN_MODE_INPUT_PULLUP);
rt_pin_attach_irq(CH438_INT_PIN, PIN_IRQ_MODE_FALLING, CH438Irq, (void *)serial);
rt_pin_irq_enable(CH438_INT_PIN, PIN_IRQ_ENABLE);
register_flag = 1;
}
break;
}
return (RT_EOK);
}
static int drv_extuart_putc(struct rt_serial_device *serial, char c)
{
rt_uint16_t ext_uart_no = serial->config.reserved;
rt_uint8_t REG_LSR_ADDR,REG_THR_ADDR;
REG_LSR_ADDR = offsetadd[ext_uart_no] | REG_LSR0_ADDR;
REG_THR_ADDR = offsetadd[ext_uart_no] | REG_THR0_ADDR;
if (2 == ext_uart_no) {
set_485_output(2);
CH438_udelay(950);
} else if (3 == ext_uart_no) {
set_485_output(1);
CH438_udelay(950);
} else if (7 == ext_uart_no) {
set_485_output(3);
CH438_udelay(950);
}
#if defined APPLICATION_SENSOR_WINDSPEED_QS_FS || defined APPLICATION_SENSOR_WINDDIRECTION_QS_FX
#else
rt_thread_mdelay(2);
#endif
if((ReadCH438Data( REG_LSR_ADDR ) & BIT_LSR_TEMT) != 0)
{
WriteCH438Block( REG_THR_ADDR, 1, &c );
if (2 == ext_uart_no) {
CH438_udelay(950);
set_485_input(2);
} else if (3 == ext_uart_no) {
CH438_udelay(950);
set_485_input(1);
} else if (7 == ext_uart_no) {
CH438_udelay(950);
set_485_input(3);
}
return 1;
} else {
return 0;
}
}
static int drv_extuart_getc(struct rt_serial_device *serial)
{
rt_uint8_t dat = 0;
rt_uint8_t REG_LSR_ADDR,REG_RBR_ADDR;
rt_uint16_t ext_uart_no = serial->config.reserved;///< get extern uart port
REG_LSR_ADDR = offsetadd[ext_uart_no] | REG_LSR0_ADDR;
REG_RBR_ADDR = offsetadd[ext_uart_no] | REG_RBR0_ADDR;
rt_thread_mdelay(2);
if((ReadCH438Data(REG_LSR_ADDR) & BIT_LSR_DATARDY) == 0x01)
{
dat = ReadCH438Data( REG_RBR_ADDR );
if(dat >= 0) return dat;
else return -1;
} else {
return -1;
}
}
const struct rt_uart_ops extuart_ops =
{
rt_extuart_configure,
extuart_control,
drv_extuart_putc,
drv_extuart_getc,
RT_NULL
};
int rt_hw_ch438_init(void)
{
struct rt_serial_device *extserial;
struct device_uart *extuart;
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
rt_err_t ret;
{// extserial0
static struct rt_serial_device extserial0;
extserial = &extserial0;
extserial->ops = &extuart_ops;
extserial->config = config;
extserial->config.baud_rate = 115200;
extserial->config.reserved = 0; ///< extern uart port
extuart_serial_parm[0] = &extserial0;
ret = rt_hw_serial_register(extserial,
"extuart_dev0",
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
extuart);
if(ret < 0){
rt_kprintf("extuart_dev0 register failed.\n");
}
}
{// extserial1
static struct rt_serial_device extserial1;
extserial = &extserial1;
extserial->ops = &extuart_ops;
extserial->config = config;
extserial->config.baud_rate = 115200;
extserial->config.reserved = 1; ///< extern uart port
extuart_serial_parm[1] = &extserial1;
ret = rt_hw_serial_register(extserial,
"extuart_dev1",
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
extuart);
if(ret < 0){
rt_kprintf("extuart_dev1 register failed.\n");
}
}
{// extserial2
static struct rt_serial_device extserial2;
extserial = &extserial2;
extserial->ops = &extuart_ops;
extserial->config = config;
extserial->config.baud_rate = 9600;
extserial->config.reserved = 2; ///< extern uart port
extuart_serial_parm[2] = &extserial2;
ret = rt_hw_serial_register(extserial,
"extuart_dev2",
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
extuart);
if(ret < 0){
rt_kprintf("extuart_dev2 register failed.\n");
}
}
{// extserial3
static struct rt_serial_device extserial3;
extserial = &extserial3;
extserial->ops = &extuart_ops;
extserial->config = config;
extserial->config.baud_rate = 9600;
extserial->config.reserved = 3; ///< extern uart port
extuart_serial_parm[3] = &extserial3;
ret = rt_hw_serial_register(extserial,
"extuart_dev3",
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
extuart);
if(ret < 0){
rt_kprintf("extuart_dev3 register failed.\n");
}
}
{// extserial4
static struct rt_serial_device extserial4;
extserial = &extserial4;
extserial->ops = &extuart_ops;
extserial->config = config;
extserial->config.baud_rate = 115200;
extserial->config.reserved = 4; ///< extern uart port
extuart_serial_parm[4] = &extserial4;
ret = rt_hw_serial_register(extserial,
"extuart_dev4",
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
extuart);
if(ret < 0){
rt_kprintf("extuart_dev4 register failed.\n");
}
}
{// extserial5
static struct rt_serial_device extserial5;
extserial = &extserial5;
extserial->ops = &extuart_ops;
extserial->config = config;
extserial->config.baud_rate = 115200;
extserial->config.reserved = 5; ///< extern uart port
extuart_serial_parm[5] = &extserial5;
ret = rt_hw_serial_register(extserial,
"extuart_dev5",
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
extuart);
if(ret < 0){
rt_kprintf("extuart_dev5 register failed.\n");
}
}
{// extserial6
static struct rt_serial_device extserial6;
extserial = &extserial6;
extserial->ops = &extuart_ops;
extserial->config = config;
extserial->config.baud_rate = 115200;
extserial->config.reserved = 6; ///< extern uart port
extuart_serial_parm[6] = &extserial6;
ret = rt_hw_serial_register(extserial,
"extuart_dev6",
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
extuart);
if(ret < 0){
rt_kprintf("extuart_dev6 register failed.\n");
}
}
{// extserial7
static struct rt_serial_device extserial7;
extserial = &extserial7;
extserial->ops = &extuart_ops;
extserial->config = config;
extserial->config.baud_rate = 9600;
extserial->config.reserved = 7; ///< extern uart port
extuart_serial_parm[7] = &extserial7;
ret = rt_hw_serial_register(extserial,
"extuart_dev7",
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
extuart);
if(ret < 0){
rt_kprintf("extuart_dev7 register failed.\n");
}
}
CH438_INIT();
return 0;
}
INIT_DEVICE_EXPORT(rt_hw_ch438_init);
/* Test CH438 register */
void CH438_RegTEST(rt_uint8_t num)
{
rt_uint8_t dat;
rt_kprintf("current test serilnum: %02x \r\n",offsetadd[num]);
rt_kprintf("IER: %02x\r\n",ReadCH438Data(offsetadd[num] | REG_IER0_ADDR));//?IER
rt_kprintf("IIR: %02x\r\n",ReadCH438Data(offsetadd[num] | REG_IIR0_ADDR));//?IIR
rt_kprintf("LCR: %02x\r\n",ReadCH438Data(offsetadd[num] | REG_LCR0_ADDR));//?LCR
rt_kprintf("MCR: %02x\r\n",ReadCH438Data(offsetadd[num] | REG_MCR0_ADDR));//?MCR
rt_kprintf("LSR: %02x\r\n",ReadCH438Data(offsetadd[num] | REG_LSR0_ADDR));//?LSR
rt_kprintf("MSR: %02x\r\n",ReadCH438Data(offsetadd[num] | REG_MSR0_ADDR));//?MSR
rt_kprintf("FCR: %02x\r\n",ReadCH438Data(offsetadd[num] | REG_FCR0_ADDR));//?FCR
rt_kprintf("SSR: %02x\r\n",ReadCH438Data(offsetadd[num] | REG_SSR_ADDR ));//?SSR
rt_kprintf("SCR0: %02x\r\n",(rt_uint8_t)ReadCH438Data(offsetadd[num] | REG_SCR0_ADDR));//?SCR
dat = 0x55;
WriteCH438Data(offsetadd[num] | REG_SCR0_ADDR, dat);
rt_kprintf("SCR55: %02x\r\n",(rt_uint8_t)ReadCH438Data(offsetadd[num] | REG_SCR0_ADDR));//?SCR
dat = 0xAA;
WriteCH438Data(offsetadd[num] | REG_SCR0_ADDR, dat);
rt_kprintf("SCRAA: %02x\r\n",(rt_uint8_t)ReadCH438Data(offsetadd[num] | REG_SCR0_ADDR));//?SCR
}
void CH438_RegsTEST(rt_uint8_t num)
{
CH438_RegTEST(0);
CH438_RegTEST(1);
CH438_RegTEST(2);
CH438_RegTEST(3);
CH438_RegTEST(4);
CH438_RegTEST(5);
CH438_RegTEST(6);
CH438_RegTEST(7);
}
MSH_CMD_EXPORT(CH438_RegsTEST, CH438_RegsTEST all);
/* Test CH438 extended uart */
#define CH438_DEVICE_NAME "ch438"
static rt_device_t serial6;
int CH438_TEST_UART6(void) {
rt_uint8_t buff[64]={0};
rt_uint8_t str[]="rt device write successfully!123+###\r\n";
rt_size_t size,i;
rt_err_t res = RT_EOK;
serial6=rt_device_find("extuart_dev6");
if (!serial6) {
rt_kprintf("find %s failed!\n", CH438_DEVICE_NAME);
return RT_ERROR;
}
res=rt_device_open(serial6, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX);
if (res != RT_EOK) {
rt_kprintf("open %s failed!\n", CH438_DEVICE_NAME);
return res;
}
/* Test Sending and Receiving Data */
while(1) {
rt_device_write(serial6, 0 , str, sizeof(str));
size=rt_device_read(serial6, 0, buff, (sizeof(buff)));
rt_kprintf("receving size = %d\n",size);
for(i=0; i<size; ++i) {
rt_kprintf("ch=%c\n",buff[i]);
}
rt_thread_mdelay(1000);
rt_memset(buff, 0, 64);
}
}
MSH_CMD_EXPORT(CH438_TEST_UART6,ch438 test sample);

View File

@ -0,0 +1,270 @@
#ifndef __CH438_H_
#define __CH438_H_
#include "board.h"
#include <stm32f407xx.h>
#define CH438_BUFFSIZE 255
/******************************************************************************************/
/* chip definition */
/* CH438serial port0 register address */
#define REG_RBR0_ADDR 0x00 /* serial port0receive buffer register address */
#define REG_THR0_ADDR 0x00 /* serial port0send hold register address */
#define REG_IER0_ADDR 0x01 /* serial port0interrupt enable register address */
#define REG_IIR0_ADDR 0x02 /* serial port0interrupt identifies register address */
#define REG_FCR0_ADDR 0x02 /* serial port0FIFO controls register address */
#define REG_LCR0_ADDR 0x03 /* serial port0circuit control register address */
#define REG_MCR0_ADDR 0x04 /* serial port0MODEM controls register address */
#define REG_LSR0_ADDR 0x05 /* serial port0line status register address */
#define REG_MSR0_ADDR 0x06 /* serial port0address of MODEM status register */
#define REG_SCR0_ADDR 0x07 /* serial port0the user can define the register address */
#define REG_DLL0_ADDR 0x00 /* Baud rate divisor latch low 8-bit byte address */
#define REG_DLM0_ADDR 0x01 /* Baud rate divisor latch high 8-bit byte address */
/* CH438serial port1 register address */
#define REG_RBR1_ADDR 0x10 /* serial port1receive buffer register address */
#define REG_THR1_ADDR 0x10 /* serial port1send hold register address */
#define REG_IER1_ADDR 0x11 /* serial port1interrupt enable register address */
#define REG_IIR1_ADDR 0x12 /* serial port1interrupt identifies register address */
#define REG_FCR1_ADDR 0x12 /* serial port1FIFO controls register address */
#define REG_LCR1_ADDR 0x13 /* serial port1circuit control register address */
#define REG_MCR1_ADDR 0x14 /* serial port1MODEM controls register address */
#define REG_LSR1_ADDR 0x15 /* serial port1line status register address */
#define REG_MSR1_ADDR 0x16 /* serial port1address of MODEM status register */
#define REG_SCR1_ADDR 0x17 /* serial port1the user can define the register address */
#define REG_DLL1_ADDR 0x10 /* Baud rate divisor latch low 8-bit byte address */
#define REG_DLM1_ADDR 0x11 /* Baud rate divisor latch high 8-bit byte address */
/* CH438serial port2 register address */
#define REG_RBR2_ADDR 0x20 /* serial port2receive buffer register address */
#define REG_THR2_ADDR 0x20 /* serial port2send hold register address */
#define REG_IER2_ADDR 0x21 /* serial port2interrupt enable register address */
#define REG_IIR2_ADDR 0x22 /* serial port2interrupt identifies register address */
#define REG_FCR2_ADDR 0x22 /* serial port2FIFO controls register address */
#define REG_LCR2_ADDR 0x23 /* serial port2circuit control register address */
#define REG_MCR2_ADDR 0x24 /* serial port2MODEM controls register address */
#define REG_LSR2_ADDR 0x25 /* serial port2line status register address */
#define REG_MSR2_ADDR 0x26 /* serial port2address of MODEM status register */
#define REG_SCR2_ADDR 0x27 /* serial port2the user can define the register address */
#define REG_DLL2_ADDR 0x20 /* Baud rate divisor latch low 8-bit byte address */
#define REG_DLM2_ADDR 0x21 /* Baud rate divisor latch high 8-bit byte address */
/* CH438serial port3 register address */
#define REG_RBR3_ADDR 0x30 /* serial port3receive buffer register address */
#define REG_THR3_ADDR 0x30 /* serial port3send hold register address */
#define REG_IER3_ADDR 0x31 /* serial port3interrupt enable register address */
#define REG_IIR3_ADDR 0x32 /* serial port3interrupt identifies register address */
#define REG_FCR3_ADDR 0x32 /* serial port3FIFO controls register address */
#define REG_LCR3_ADDR 0x33 /* serial port3circuit control register address */
#define REG_MCR3_ADDR 0x34 /* serial port3MODEM controls register address */
#define REG_LSR3_ADDR 0x35 /* serial port3line status register address */
#define REG_MSR3_ADDR 0x36 /* serial port3address of MODEM status register */
#define REG_SCR3_ADDR 0x37 /* serial port3the user can define the register address */
#define REG_DLL3_ADDR 0x30 /* Baud rate divisor latch low 8-bit byte address */
#define REG_DLM3_ADDR 0x31 /* Baud rate divisor latch high 8-bit byte address */
/* CH438serial port4 register address */
#define REG_RBR4_ADDR 0x08 /* serial port4receive buffer register address */
#define REG_THR4_ADDR 0x08 /* serial port4send hold register address */
#define REG_IER4_ADDR 0x09 /* serial port4interrupt enable register address */
#define REG_IIR4_ADDR 0x0A /* serial port4interrupt identifies register address */
#define REG_FCR4_ADDR 0x0A /* serial port4FIFO controls register address */
#define REG_LCR4_ADDR 0x0B /* serial port4circuit control register address */
#define REG_MCR4_ADDR 0x0C /* serial port4MODEM controls register address */
#define REG_LSR4_ADDR 0x0D /* serial port4line status register address */
#define REG_MSR4_ADDR 0x0E /* serial port4address of MODEM status register */
#define REG_SCR4_ADDR 0x0F /* serial port4the user can define the register address */
#define REG_DLL4_ADDR 0x08 /* Baud rate divisor latch low 8-bit byte address */
#define REG_DLM4_ADDR 0x09 /* Baud rate divisor latch high 8-bit byte address */
/* CH438serial port5 register address */
#define REG_RBR5_ADDR 0x18 /* serial port5receive buffer register address */
#define REG_THR5_ADDR 0x18 /* serial port5send hold register address */
#define REG_IER5_ADDR 0x19 /* serial port5interrupt enable register address */
#define REG_IIR5_ADDR 0x1A /* serial port5interrupt identifies register address */
#define REG_FCR5_ADDR 0x1A /* serial port5FIFO controls register address */
#define REG_LCR5_ADDR 0x1B /* serial port5circuit control register address */
#define REG_MCR5_ADDR 0x1C /* serial port5MODEM controls register address */
#define REG_LSR5_ADDR 0x1D /* serial port5line status register address */
#define REG_MSR5_ADDR 0x1E /* serial port5address of MODEM status register */
#define REG_SCR5_ADDR 0x1F /* serial port5the user can define the register address */
#define REG_DLL5_ADDR 0x18 /* Baud rate divisor latch low 8-bit byte address */
#define REG_DLM5_ADDR 0x19 /* Baud rate divisor latch high 8-bit byte address */
/* CH438serial port6 register address */
#define REG_RBR6_ADDR 0x28 /* serial port6receive buffer register address */
#define REG_THR6_ADDR 0x28 /* serial port6send hold register address */
#define REG_IER6_ADDR 0x29 /* serial port6interrupt enable register address */
#define REG_IIR6_ADDR 0x2A /* serial port6interrupt identifies register address */
#define REG_FCR6_ADDR 0x2A /* serial port6FIFO controls register address */
#define REG_LCR6_ADDR 0x2B /* serial port6circuit control register address */
#define REG_MCR6_ADDR 0x2C /* serial port6MODEM controls register address */
#define REG_LSR6_ADDR 0x2D /* serial port6line status register address */
#define REG_MSR6_ADDR 0x2E /* serial port6address of MODEM status register */
#define REG_SCR6_ADDR 0x2F /* serial port6the user can define the register address */
#define REG_DLL6_ADDR 0x28 /* Baud rate divisor latch low 8-bit byte address */
#define REG_DLM6_ADDR 0x29 /* Baud rate divisor latch high 8-bit byte address */
/* CH438serial port7 register address */
#define REG_RBR7_ADDR 0x38 /* serial port7receive buffer register address */
#define REG_THR7_ADDR 0x38 /* serial port7send hold register address */
#define REG_IER7_ADDR 0x39 /* serial port7interrupt enable register address */
#define REG_IIR7_ADDR 0x3A /* serial port7interrupt identifies register address */
#define REG_FCR7_ADDR 0x3A /* serial port7FIFO controls register address */
#define REG_LCR7_ADDR 0x3B /* serial port7circuit control register address */
#define REG_MCR7_ADDR 0x3C /* serial port7MODEM controls register address */
#define REG_LSR7_ADDR 0x3D /* serial port7line status register address */
#define REG_MSR7_ADDR 0x3E /* serial port7address of MODEM status register */
#define REG_SCR7_ADDR 0x3F /* serial port7the user can define the register address */
#define REG_DLL7_ADDR 0x38 /* Baud rate divisor latch low 8-bit byte address */
#define REG_DLM7_ADDR 0x39 /* Baud rate divisor latch high 8-bit byte address */
#define REG_SSR_ADDR 0x4F /* pecial status register address */
/* IER register bit */
#define BIT_IER_RESET 0x80 /* The bit is 1 soft reset serial port */
#define BIT_IER_LOWPOWER 0x40 /* The bit is 1 close serial port internal reference clock */
#define BIT_IER_SLP 0x20 /* serial port0 is SLP, 1 close clock vibrator */
#define BIT_IER1_CK2X 0x20 /* serial port1 is CK2X, 1 force the external clock signal after 2 times as internal reference clock */
#define BIT_IER_IEMODEM 0x08 /* The bit is 1 allows MODEM input status to interrupt */
#define BIT_IER_IELINES 0x04 /* The bit is 1 allow receiving line status to be interrupted */
#define BIT_IER_IETHRE 0x02 /* The bit is 1 allows the send hold register to break in mid-air */
#define BIT_IER_IERECV 0x01 /* The bit is 1 allows receiving data interrupts */
/* IIR register bit */
#define BIT_IIR_FIFOENS1 0x80
#define BIT_IIR_FIFOENS0 0x40 /* The two is 1 said use FIFO */
/* Interrupt type: 0001 has no interrupt, 0110 receiving line status is interrupted, 0100 receiving data can be interrupted,
1100 received data timeout interrupt, 0010THR register air interrupt, 0000MODEM input change interrupt */
#define BIT_IIR_IID3 0x08
#define BIT_IIR_IID2 0x04
#define BIT_IIR_IID1 0x02
#define BIT_IIR_NOINT 0x01
/* FCR register bit */
/* Trigger point: 00 corresponds to 1 byte, 01 corresponds to 16 bytes, 10 corresponds to 64 bytes, 11 corresponds to 112 bytes */
#define BIT_FCR_RECVTG1 0x80 /* Set the trigger point for FIFO interruption and automatic hardware flow control */
#define BIT_FCR_RECVTG0 0x40 /* Set the trigger point for FIFO interruption and automatic hardware flow control */
#define BIT_FCR_TFIFORST 0x04 /* The bit is 1 empty the data sent in FIFO */
#define BIT_FCR_RFIFORST 0x02 /* The bit is 1 empty the data sent in FIFO */
#define BIT_FCR_FIFOEN 0x01 /* The bit is 1 use FIFO, 0 disable FIFO */
/* LCR register bit */
#define BIT_LCR_DLAB 0x80 /* To access DLL, DLM, 0 to access RBR/THR/IER */
#define BIT_LCR_BREAKEN 0x40 /* 1 forces a BREAK line interval*/
/* Set the check format: when PAREN is 1, 00 odd check, 01 even check, 10 MARK (set 1), 11 blank (SPACE, clear 0) */
#define BIT_LCR_PARMODE1 0x20 /* Sets the parity bit format */
#define BIT_LCR_PARMODE0 0x10 /* Sets the parity bit format */
#define BIT_LCR_PAREN 0x08 /* A value of 1 allows you to generate and receive parity bits when sending */
#define BIT_LCR_STOPBIT 0x04 /* If is 1, then two stop bits, is 0, a stop bit */
/* Set word length: 00 for 5 data bits, 01 for 6 data bits, 10 for 7 data bits and 11 for 8 data bits */
#define BIT_LCR_WORDSZ1 0x02 /* Set the word length length */
#define BIT_LCR_WORDSZ0 0x01
/* MCR register bit */
#define BIT_MCR_AFE 0x20 /* For 1 allows automatic flow control of CTS and RTS hardware */
#define BIT_MCR_LOOP 0x10 /* Is the test mode of 1 enabling internal loop */
#define BIT_MCR_OUT2 0x08 /* 1 Allows an interrupt request for the serial port output */
#define BIT_MCR_OUT1 0x04 /* The MODEM control bit defined for the user */
#define BIT_MCR_RTS 0x02 /* The bit is 1 RTS pin output effective */
#define BIT_MCR_DTR 0x01 /* The bit is 1 DTR pin output effective */
/* LSR register bit */
#define BIT_LSR_RFIFOERR 0x80 /* 1 said There is at least one error in receiving FIFO */
#define BIT_LSR_TEMT 0x40 /* 1 said THR and TSR are empty */
#define BIT_LSR_THRE 0x20 /* 1 said THR is empty*/
#define BIT_LSR_BREAKINT 0x10 /* The bit is 1 said the BREAK line interval was detected*/
#define BIT_LSR_FRAMEERR 0x08 /* The bit is 1 said error reading data frame */
#define BIT_LSR_PARERR 0x04 /* The bit is 1 said parity error */
#define BIT_LSR_OVERR 0x02 /* 1 said receive FIFO buffer overflow */
#define BIT_LSR_DATARDY 0x01 /* The bit is 1 said receive data received in FIFO */
/* MSR register bit */
#define BIT_MSR_DCD 0x80 /* The bit is 1 said DCD pin effective */
#define BIT_MSR_RI 0x40 /* The bit is 1 said RI pin effective */
#define BIT_MSR_DSR 0x20 /* The bit is 1 said DSR pin effective */
#define BIT_MSR_CTS 0x10 /* The bit is 1 said CTS pin effective */
#define BIT_MSR_DDCD 0x08 /* The bit is 1 said DCD pin The input state has changed */
#define BIT_MSR_TERI 0x04 /* The bit is 1 said RI pin The input state has changed */
#define BIT_MSR_DDSR 0x02 /* The bit is 1 said DSR pin The input state has changed */
#define BIT_MSR_DCTS 0x01 /* The bit is 1 said CTS pin The input state has changed */
/* Interrupt status code */
#define INT_NOINT 0x01 /* There is no interruption */
#define INT_THR_EMPTY 0x02 /* THR empty interruption */
#define INT_RCV_OVERTIME 0x0C /* Receive timeout interrupt */
#define INT_RCV_SUCCESS 0x04 /* Interrupts are available to receive data */
#define INT_RCV_LINES 0x06 /* Receiving line status interrupted */
#define INT_MODEM_CHANGE 0x00 /* MODEM input changes interrupt */
#define CH438_IIR_FIFOS_ENABLED 0xC0 /* use FIFO */
#define Fpclk 1843200 /* Define the internal clock frequency */
#define CH438_D0_PIN GET_PIN(E, 2)
#define CH438_D1_PIN GET_PIN(E, 3)
#define CH438_D2_PIN GET_PIN(E, 4)
#define CH438_D3_PIN GET_PIN(E, 5)
#define CH438_D4_PIN GET_PIN(E, 6)
#define CH438_D5_PIN GET_PIN(F, 6)
#define CH438_D6_PIN GET_PIN(F, 7)
#define CH438_D7_PIN GET_PIN(F, 8)
#define CH438_NWR_PIN GET_PIN(C, 4)
#define CH438_NRD_PIN GET_PIN(C, 5)
#define CH438_NCS_PIN GET_PIN(B, 1)
#define CH438_ALE_PIN GET_PIN(B, 2)
#define CH438_INT_PIN GET_PIN(C, 13)
#define DIR_485CH1_PIN GET_PIN(F, 10) //485ch1 = ext_uart3
#define DIR_485CH2_PIN GET_PIN(F, 9) //485ch2 = ext_uart2
#define DIR_485CH3_PIN GET_PIN(D, 7) //485ch3 = ext_uart7
void CH438_INIT(void);
void CH438_PORT_INIT( rt_uint8_t ext_uart_no, rt_uint32_t BaudRate );
void set_485_input(rt_uint8_t ch_no);
void set_485_output(rt_uint8_t ch_no);
rt_uint8_t ReadCH438Data( rt_uint8_t addr );
void CH438UARTSend( rt_uint8_t ext_uart_no,rt_uint8_t *Data, rt_uint8_t Num );
rt_uint8_t CH438UARTRcv( rt_uint8_t ext_uart_no, rt_uint8_t* buf );
static void CH438_set_output(void);
static void CH438_set_input(void);
static void WriteCH438Data( rt_uint8_t addr, char dat);
static void WriteCH438Block( rt_uint8_t mAddr, rt_uint8_t mLen, char *mBuf );
int rt_hw_ch438_init(void);
void CH438_RegTEST(rt_uint8_t num);
#endif

View File

@ -0,0 +1,30 @@
/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
define symbol __ICFEDIT_region_ROM_end__ = 0x080FFFFF;
define symbol __ICFEDIT_region_RAM1_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM1_end__ = 0x2001FFFF;
define symbol __ICFEDIT_region_RAM2_start__ = 0x10000000;
define symbol __ICFEDIT_region_RAM2_end__ = 0x1000FFFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x0400;
define symbol __ICFEDIT_size_heap__ = 0x000;
/**** End of ICF editor section. ###ICF###*/
define memory mem with size = 4G;
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define region RAM1_region = mem:[from __ICFEDIT_region_RAM1_start__ to __ICFEDIT_region_RAM1_end__];
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
initialize by copy { readwrite };
do not initialize { section .noinit };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place in ROM_region { readonly };
place in RAM1_region { readwrite, last block CSTACK };

View File

@ -0,0 +1,15 @@
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x08000000 0x00100000 { ; load region size_region
ER_IROM1 0x08000000 0x00100000 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000000 0x00020000 { ; RW data
.ANY (+RW +ZI)
}
}

View File

@ -1,13 +1,3 @@
config BSP_USING_I2C1
bool "Enable I2C1 BUS (software simulation)"
default y
if BSP_USING_I2C1
config BSP_I2C1_SCL_PIN
int "I2C scl pin number"
range 0 143
default 24
config BSP_I2C1_SDA_PIN
int "I2C sda pin number"
range 0 143
default 25
endif

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -11,7 +11,7 @@
/* RT-Thread Kernel */
#define RT_NAME_MAX 8
#define RT_NAME_MAX 12
#define RT_ALIGN_SIZE 4
#define RT_THREAD_PRIORITY_32
#define RT_THREAD_PRIORITY_MAX 32
@ -116,7 +116,7 @@
#define RT_SYSTEM_WORKQUEUE_PRIORITY 23
#define RT_USING_SERIAL
#define RT_USING_SERIAL_V1
#define RT_SERIAL_RB_BUFSZ 64
#define RT_SERIAL_RB_BUFSZ 256
#define RT_USING_CAN
#define RT_USING_I2C
#define RT_USING_I2C_BITOPS
@ -147,6 +147,13 @@
/* Network interface device */
#define RT_USING_NETDEV
#define NETDEV_USING_IFCONFIG
#define NETDEV_USING_PING
#define NETDEV_USING_NETSTAT
#define NETDEV_USING_AUTO_DEFAULT
#define NETDEV_IPV4 1
#define NETDEV_IPV6 0
/* light weight TCP/IP stack */
@ -173,6 +180,7 @@
#define BSP_USING_UART1
#define BSP_USING_UART2
#define BSP_USING_UART3
#define BSP_USING_I2C1
#define BSP_USING_USB
#define BSP_USING_STM32_USBH
#define USB_BUS_NAME "usb"
@ -191,12 +199,7 @@
#define TRANSFORM_LAYER_ATTRIUBUTE
#define ADD_RTTHREAD_FETURES
#define SUPPORT_CONNECTION_FRAMEWORK
#define CONNECTION_FRAMEWORK_DEBUG
#define ADAPTER_HFA21_DRIVER "/dev/uart3"
#define CONNECTION_ADAPTER_ETHERNET
#define ADAPTER_HFA21_ETHERNET
#define ADAPTER_ETHERNET_HFA21 "hfa21_ethernet"
#define SUPPORT_SENSOR_FRAMEWORK
/* Security */
@ -223,9 +226,13 @@
/* sensor app */
#define APPLICATION_SENSOR
/* lib */
#define APP_SELECT_NEWLIB
/* LVGL configuration */
#endif

View File

@ -0,0 +1,192 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_optx.xsd">
<SchemaVersion>1.0</SchemaVersion>
<Header>### uVision Project, (C) Keil Software</Header>
<Extensions>
<cExt>*.c</cExt>
<aExt>*.s*; *.src; *.a*</aExt>
<oExt>*.obj; *.o</oExt>
<lExt>*.lib</lExt>
<tExt>*.txt; *.h; *.inc; *.md</tExt>
<pExt>*.plm</pExt>
<CppX>*.cpp</CppX>
<nMigrate>0</nMigrate>
</Extensions>
<DaveTm>
<dwLowDateTime>0</dwLowDateTime>
<dwHighDateTime>0</dwHighDateTime>
</DaveTm>
<Target>
<TargetName>rt-thread</TargetName>
<ToolsetNumber>0x4</ToolsetNumber>
<ToolsetName>ARM-ADS</ToolsetName>
<TargetOption>
<CLKADS>168000000</CLKADS>
<OPTTT>
<gFlags>1</gFlags>
<BeepAtEnd>1</BeepAtEnd>
<RunSim>0</RunSim>
<RunTarget>1</RunTarget>
<RunAbUc>0</RunAbUc>
</OPTTT>
<OPTHX>
<HexSelection>1</HexSelection>
<FlashByte>65535</FlashByte>
<HexRangeLowAddress>0</HexRangeLowAddress>
<HexRangeHighAddress>0</HexRangeHighAddress>
<HexOffset>0</HexOffset>
</OPTHX>
<OPTLEX>
<PageWidth>79</PageWidth>
<PageLength>66</PageLength>
<TabStop>8</TabStop>
<ListingPath>.\build\keil\List\</ListingPath>
</OPTLEX>
<ListingPage>
<CreateCListing>1</CreateCListing>
<CreateAListing>1</CreateAListing>
<CreateLListing>1</CreateLListing>
<CreateIListing>0</CreateIListing>
<AsmCond>1</AsmCond>
<AsmSymb>1</AsmSymb>
<AsmXref>0</AsmXref>
<CCond>1</CCond>
<CCode>0</CCode>
<CListInc>0</CListInc>
<CSymb>0</CSymb>
<LinkerCodeListing>0</LinkerCodeListing>
</ListingPage>
<OPTXL>
<LMap>1</LMap>
<LComments>1</LComments>
<LGenerateSymbols>1</LGenerateSymbols>
<LLibSym>1</LLibSym>
<LLines>1</LLines>
<LLocSym>1</LLocSym>
<LPubSym>1</LPubSym>
<LXref>0</LXref>
<LExpSel>0</LExpSel>
</OPTXL>
<OPTFL>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<IsCurrentTarget>1</IsCurrentTarget>
</OPTFL>
<CpuCode>18</CpuCode>
<DebugOpt>
<uSim>0</uSim>
<uTrg>1</uTrg>
<sLdApp>1</sLdApp>
<sGomain>1</sGomain>
<sRbreak>1</sRbreak>
<sRwatch>1</sRwatch>
<sRmem>1</sRmem>
<sRfunc>1</sRfunc>
<sRbox>1</sRbox>
<tLdApp>1</tLdApp>
<tGomain>1</tGomain>
<tRbreak>1</tRbreak>
<tRwatch>1</tRwatch>
<tRmem>1</tRmem>
<tRfunc>0</tRfunc>
<tRbox>1</tRbox>
<tRtrace>1</tRtrace>
<sRSysVw>1</sRSysVw>
<tRSysVw>1</tRSysVw>
<sRunDeb>0</sRunDeb>
<sLrtime>0</sLrtime>
<bEvRecOn>1</bEvRecOn>
<bSchkAxf>0</bSchkAxf>
<bTchkAxf>0</bTchkAxf>
<nTsel>4</nTsel>
<sDll></sDll>
<sDllPa></sDllPa>
<sDlgDll></sDlgDll>
<sDlgPa></sDlgPa>
<sIfile></sIfile>
<tDll></tDll>
<tDllPa></tDllPa>
<tDlgDll></tDlgDll>
<tDlgPa></tDlgPa>
<tIfile></tIfile>
<pMon>Segger\JL2CM3.dll</pMon>
</DebugOpt>
<TargetDriverDllRegistry>
<SetRegEntry>
<Number>0</Number>
<Key>JL2CM3</Key>
<Name>-U30000299 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8001 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM)</Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
<Key>UL2CM3</Key>
<Name>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM))</Name>
</SetRegEntry>
</TargetDriverDllRegistry>
<Breakpoint/>
<Tracepoint>
<THDelay>0</THDelay>
</Tracepoint>
<DebugFlag>
<trace>0</trace>
<periodic>0</periodic>
<aLwin>0</aLwin>
<aCover>0</aCover>
<aSer1>0</aSer1>
<aSer2>0</aSer2>
<aPa>0</aPa>
<viewmode>0</viewmode>
<vrSel>0</vrSel>
<aSym>0</aSym>
<aTbox>0</aTbox>
<AscS1>0</AscS1>
<AscS2>0</AscS2>
<AscS3>0</AscS3>
<aSer3>0</aSer3>
<eProf>0</eProf>
<aLa>0</aLa>
<aPa1>0</aPa1>
<AscS4>0</AscS4>
<aSer4>0</aSer4>
<StkLoc>0</StkLoc>
<TrcWin>0</TrcWin>
<newCpu>0</newCpu>
<uProt>0</uProt>
</DebugFlag>
<LintExecutable></LintExecutable>
<LintConfigFile></LintConfigFile>
<bLintAuto>0</bLintAuto>
<bAutoGenD>0</bAutoGenD>
<LntExFlags>0</LntExFlags>
<pMisraName></pMisraName>
<pszMrule></pszMrule>
<pSingCmds></pSingCmds>
<pMultCmds></pMultCmds>
<pMisraNamep></pMisraNamep>
<pszMrulep></pszMrulep>
<pSingCmdsp></pSingCmdsp>
<pMultCmdsp></pMultCmdsp>
<DebugDescription>
<Enable>1</Enable>
<EnableFlashSeq>0</EnableFlashSeq>
<EnableLog>0</EnableLog>
<Protocol>2</Protocol>
<DbgClock>10000000</DbgClock>
</DebugDescription>
</TargetOption>
</Target>
<Group>
<GroupName>Source Group 1</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
</Group>
</ProjectOpt>

View File

@ -0,0 +1,396 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_projx.xsd">
<SchemaVersion>2.1</SchemaVersion>
<Header>### uVision Project, (C) Keil Software</Header>
<Targets>
<Target>
<TargetName>rt-thread</TargetName>
<ToolsetNumber>0x4</ToolsetNumber>
<ToolsetName>ARM-ADS</ToolsetName>
<pCCUsed>5060750::V5.06 update 6 (build 750)::ARMCC</pCCUsed>
<uAC6>0</uAC6>
<TargetOption>
<TargetCommonOption>
<Device>STM32F407ZGTx</Device>
<Vendor>STMicroelectronics</Vendor>
<PackID>Keil.STM32F4xx_DFP.2.16.0</PackID>
<PackURL>http://www.keil.com/pack/</PackURL>
<Cpu>IRAM(0x20000000,0x20000) IRAM2(0x10000000,0x10000) IROM(0x08000000,0x100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE</Cpu>
<FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile>
<FlashDriverDll>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM))</FlashDriverDll>
<DeviceId>0</DeviceId>
<RegisterFile>$$Device:STM32F407ZGTx$Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h</RegisterFile>
<MemoryEnv></MemoryEnv>
<Cmp></Cmp>
<Asm></Asm>
<Linker></Linker>
<OHString></OHString>
<InfinionOptionDll></InfinionOptionDll>
<SLE66CMisc></SLE66CMisc>
<SLE66AMisc></SLE66AMisc>
<SLE66LinkerMisc></SLE66LinkerMisc>
<SFDFile>$$Device:STM32F407ZGTx$CMSIS\SVD\STM32F40x.svd</SFDFile>
<bCustSvd>0</bCustSvd>
<UseEnv>0</UseEnv>
<BinPath></BinPath>
<IncludePath></IncludePath>
<LibPath></LibPath>
<RegisterFilePath></RegisterFilePath>
<DBRegisterFilePath></DBRegisterFilePath>
<TargetStatus>
<Error>0</Error>
<ExitCodeStop>0</ExitCodeStop>
<ButtonStop>0</ButtonStop>
<NotGenerated>0</NotGenerated>
<InvalidFlash>1</InvalidFlash>
</TargetStatus>
<OutputDirectory>.\build\keil\Obj\</OutputDirectory>
<OutputName>rt-thread</OutputName>
<CreateExecutable>1</CreateExecutable>
<CreateLib>0</CreateLib>
<CreateHexFile>0</CreateHexFile>
<DebugInformation>1</DebugInformation>
<BrowseInformation>0</BrowseInformation>
<ListingPath>.\build\keil\List\</ListingPath>
<HexFormatSelection>1</HexFormatSelection>
<Merge32K>0</Merge32K>
<CreateBatchFile>0</CreateBatchFile>
<BeforeCompile>
<RunUserProg1>0</RunUserProg1>
<RunUserProg2>0</RunUserProg2>
<UserProg1Name></UserProg1Name>
<UserProg2Name></UserProg2Name>
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
<nStopU1X>0</nStopU1X>
<nStopU2X>0</nStopU2X>
</BeforeCompile>
<BeforeMake>
<RunUserProg1>0</RunUserProg1>
<RunUserProg2>0</RunUserProg2>
<UserProg1Name></UserProg1Name>
<UserProg2Name></UserProg2Name>
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
<nStopB1X>0</nStopB1X>
<nStopB2X>0</nStopB2X>
</BeforeMake>
<AfterMake>
<RunUserProg1>1</RunUserProg1>
<RunUserProg2>0</RunUserProg2>
<UserProg1Name>fromelf --bin !L --output rtthread.bin</UserProg1Name>
<UserProg2Name></UserProg2Name>
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
<nStopA1X>0</nStopA1X>
<nStopA2X>0</nStopA2X>
</AfterMake>
<SelectedForBatchBuild>0</SelectedForBatchBuild>
<SVCSIdString></SVCSIdString>
</TargetCommonOption>
<CommonProperty>
<UseCPPCompiler>0</UseCPPCompiler>
<RVCTCodeConst>0</RVCTCodeConst>
<RVCTZI>0</RVCTZI>
<RVCTOtherData>0</RVCTOtherData>
<ModuleSelection>0</ModuleSelection>
<IncludeInBuild>1</IncludeInBuild>
<AlwaysBuild>0</AlwaysBuild>
<GenerateAssemblyFile>0</GenerateAssemblyFile>
<AssembleAssemblyFile>0</AssembleAssemblyFile>
<PublicsOnly>0</PublicsOnly>
<StopOnExitCode>3</StopOnExitCode>
<CustomArgument></CustomArgument>
<IncludeLibraryModules></IncludeLibraryModules>
<ComprImg>1</ComprImg>
</CommonProperty>
<DllOption>
<SimDllName>SARMCM3.DLL</SimDllName>
<SimDllArguments> -REMAP -MPU</SimDllArguments>
<SimDlgDll>DCM.DLL</SimDlgDll>
<SimDlgDllArguments>-pCM4</SimDlgDllArguments>
<TargetDllName>SARMCM3.DLL</TargetDllName>
<TargetDllArguments> -MPU</TargetDllArguments>
<TargetDlgDll>TCM.DLL</TargetDlgDll>
<TargetDlgDllArguments>-pCM4</TargetDlgDllArguments>
</DllOption>
<DebugOption>
<OPTHX>
<HexSelection>1</HexSelection>
<HexRangeLowAddress>0</HexRangeLowAddress>
<HexRangeHighAddress>0</HexRangeHighAddress>
<HexOffset>0</HexOffset>
<Oh166RecLen>16</Oh166RecLen>
</OPTHX>
</DebugOption>
<Utilities>
<Flash1>
<UseTargetDll>1</UseTargetDll>
<UseExternalTool>0</UseExternalTool>
<RunIndependent>0</RunIndependent>
<UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
<Capability>1</Capability>
<DriverSelection>4096</DriverSelection>
</Flash1>
<bUseTDR>1</bUseTDR>
<Flash2>BIN\UL2CM3.DLL</Flash2>
<Flash3>"" ()</Flash3>
<Flash4></Flash4>
<pFcarmOut></pFcarmOut>
<pFcarmGrp></pFcarmGrp>
<pFcArmRoot></pFcArmRoot>
<FcArmLst>0</FcArmLst>
</Utilities>
<TargetArmAds>
<ArmAdsMisc>
<GenerateListings>0</GenerateListings>
<asHll>1</asHll>
<asAsm>1</asAsm>
<asMacX>1</asMacX>
<asSyms>1</asSyms>
<asFals>1</asFals>
<asDbgD>1</asDbgD>
<asForm>1</asForm>
<ldLst>0</ldLst>
<ldmm>1</ldmm>
<ldXref>1</ldXref>
<BigEnd>0</BigEnd>
<AdsALst>1</AdsALst>
<AdsACrf>1</AdsACrf>
<AdsANop>0</AdsANop>
<AdsANot>0</AdsANot>
<AdsLLst>1</AdsLLst>
<AdsLmap>1</AdsLmap>
<AdsLcgr>1</AdsLcgr>
<AdsLsym>1</AdsLsym>
<AdsLszi>1</AdsLszi>
<AdsLtoi>1</AdsLtoi>
<AdsLsun>1</AdsLsun>
<AdsLven>1</AdsLven>
<AdsLsxf>1</AdsLsxf>
<RvctClst>0</RvctClst>
<GenPPlst>0</GenPPlst>
<AdsCpuType>"Cortex-M4"</AdsCpuType>
<RvctDeviceName></RvctDeviceName>
<mOS>0</mOS>
<uocRom>0</uocRom>
<uocRam>0</uocRam>
<hadIROM>1</hadIROM>
<hadIRAM>1</hadIRAM>
<hadXRAM>0</hadXRAM>
<uocXRam>0</uocXRam>
<RvdsVP>2</RvdsVP>
<RvdsMve>0</RvdsMve>
<RvdsCdeCp>0</RvdsCdeCp>
<hadIRAM2>1</hadIRAM2>
<hadIROM2>0</hadIROM2>
<StupSel>8</StupSel>
<useUlib>0</useUlib>
<EndSel>0</EndSel>
<uLtcg>0</uLtcg>
<nSecure>0</nSecure>
<RoSelD>3</RoSelD>
<RwSelD>4</RwSelD>
<CodeSel>0</CodeSel>
<OptFeed>0</OptFeed>
<NoZi1>0</NoZi1>
<NoZi2>0</NoZi2>
<NoZi3>0</NoZi3>
<NoZi4>0</NoZi4>
<NoZi5>0</NoZi5>
<Ro1Chk>0</Ro1Chk>
<Ro2Chk>0</Ro2Chk>
<Ro3Chk>0</Ro3Chk>
<Ir1Chk>1</Ir1Chk>
<Ir2Chk>0</Ir2Chk>
<Ra1Chk>0</Ra1Chk>
<Ra2Chk>0</Ra2Chk>
<Ra3Chk>0</Ra3Chk>
<Im1Chk>0</Im1Chk>
<Im2Chk>1</Im2Chk>
<OnChipMemories>
<Ocm1>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocm1>
<Ocm2>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocm2>
<Ocm3>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocm3>
<Ocm4>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocm4>
<Ocm5>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocm5>
<Ocm6>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocm6>
<IRAM>
<Type>0</Type>
<StartAddress>0x20000000</StartAddress>
<Size>0x20000</Size>
</IRAM>
<IROM>
<Type>1</Type>
<StartAddress>0x8000000</StartAddress>
<Size>0x100000</Size>
</IROM>
<XRAM>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</XRAM>
<OCR_RVCT1>
<Type>1</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</OCR_RVCT1>
<OCR_RVCT2>
<Type>1</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</OCR_RVCT2>
<OCR_RVCT3>
<Type>1</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</OCR_RVCT3>
<OCR_RVCT4>
<Type>1</Type>
<StartAddress>0x8000000</StartAddress>
<Size>0x100000</Size>
</OCR_RVCT4>
<OCR_RVCT5>
<Type>1</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</OCR_RVCT5>
<OCR_RVCT6>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</OCR_RVCT6>
<OCR_RVCT7>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</OCR_RVCT7>
<OCR_RVCT8>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</OCR_RVCT8>
<OCR_RVCT9>
<Type>0</Type>
<StartAddress>0x20000000</StartAddress>
<Size>0x20000</Size>
</OCR_RVCT9>
<OCR_RVCT10>
<Type>0</Type>
<StartAddress>0x10000000</StartAddress>
<Size>0x10000</Size>
</OCR_RVCT10>
</OnChipMemories>
<RvctStartVector></RvctStartVector>
</ArmAdsMisc>
<Cads>
<interw>1</interw>
<Optim>1</Optim>
<oTime>0</oTime>
<SplitLS>0</SplitLS>
<OneElfS>1</OneElfS>
<Strict>0</Strict>
<EnumInt>0</EnumInt>
<PlainCh>0</PlainCh>
<Ropi>0</Ropi>
<Rwpi>0</Rwpi>
<wLevel>2</wLevel>
<uThumb>0</uThumb>
<uSurpInc>0</uSurpInc>
<uC99>1</uC99>
<uGnu>0</uGnu>
<useXO>0</useXO>
<v6Lang>1</v6Lang>
<v6LangP>1</v6LangP>
<vShortEn>1</vShortEn>
<vShortWch>1</vShortWch>
<v6Lto>0</v6Lto>
<v6WtE>0</v6WtE>
<v6Rtti>0</v6Rtti>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
<Undefine></Undefine>
<IncludePath></IncludePath>
</VariousControls>
</Cads>
<Aads>
<interw>1</interw>
<Ropi>0</Ropi>
<Rwpi>0</Rwpi>
<thumb>0</thumb>
<SplitLS>0</SplitLS>
<SwStkChk>0</SwStkChk>
<NoWarn>0</NoWarn>
<uSurpInc>0</uSurpInc>
<useXO>0</useXO>
<ClangAsOpt>4</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
<Undefine></Undefine>
<IncludePath></IncludePath>
</VariousControls>
</Aads>
<LDads>
<umfTarg>0</umfTarg>
<Ropi>0</Ropi>
<Rwpi>0</Rwpi>
<noStLib>0</noStLib>
<RepFail>1</RepFail>
<useFile>0</useFile>
<TextAddressRange>0x08000000</TextAddressRange>
<DataAddressRange>0x20000000</DataAddressRange>
<pXoBase></pXoBase>
<ScatterFile>.\board\linker_scripts\link.sct</ScatterFile>
<IncludeLibs></IncludeLibs>
<IncludeLibsPath></IncludeLibsPath>
<Misc></Misc>
<LinkerInputFile></LinkerInputFile>
<DisabledWarnings></DisabledWarnings>
</LDads>
</TargetArmAds>
</TargetOption>
<Groups>
<Group>
<GroupName>Source Group 1</GroupName>
</Group>
</Groups>
</Target>
</Targets>
<RTE>
<apis/>
<components/>
<files/>
</RTE>
</Project>

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

View File

@ -0,0 +1,495 @@
#
# Automatically generated file; DO NOT EDIT.
# XIUOS Rt-thread Configuration
#
CONFIG_ROOT_DIR="../../../.."
CONFIG_BSP_DIR="."
CONFIG_RT_Thread_DIR="../.."
CONFIG_RTT_DIR="../../rt-thread"
CONFIG_BOARD_K210_EVB=y
#
# RT-Thread Kernel
#
CONFIG_RT_NAME_MAX=8
# CONFIG_RT_USING_BIG_ENDIAN is not set
# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
CONFIG_RT_USING_SMP=y
CONFIG_RT_CPUS_NR=2
CONFIG_RT_ALIGN_SIZE=8
# CONFIG_RT_THREAD_PRIORITY_8 is not set
CONFIG_RT_THREAD_PRIORITY_32=y
# CONFIG_RT_THREAD_PRIORITY_256 is not set
CONFIG_RT_THREAD_PRIORITY_MAX=32
CONFIG_RT_TICK_PER_SECOND=1000
CONFIG_RT_USING_OVERFLOW_CHECK=y
CONFIG_RT_USING_HOOK=y
CONFIG_RT_USING_IDLE_HOOK=y
CONFIG_RT_IDLE_HOOK_LIST_SIZE=4
CONFIG_IDLE_THREAD_STACK_SIZE=4096
CONFIG_SYSTEM_THREAD_STACK_SIZE=4096
CONFIG_RT_USING_TIMER_SOFT=y
CONFIG_RT_TIMER_THREAD_PRIO=4
CONFIG_RT_TIMER_THREAD_STACK_SIZE=2048
#
# kservice optimization
#
# CONFIG_RT_KSERVICE_USING_STDLIB is not set
# CONFIG_RT_KSERVICE_USING_TINY_SIZE is not set
# CONFIG_RT_USING_ASM_MEMCPY is not set
CONFIG_RT_DEBUG=y
CONFIG_RT_DEBUG_COLOR=y
CONFIG_RT_DEBUG_INIT_CONFIG=y
CONFIG_RT_DEBUG_INIT=1
# CONFIG_RT_DEBUG_THREAD_CONFIG is not set
# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set
# CONFIG_RT_DEBUG_IPC_CONFIG is not set
# CONFIG_RT_DEBUG_TIMER_CONFIG is not set
# CONFIG_RT_DEBUG_IRQ_CONFIG is not set
# CONFIG_RT_DEBUG_MEM_CONFIG is not set
# CONFIG_RT_DEBUG_SLAB_CONFIG is not set
# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set
# CONFIG_RT_DEBUG_MODULE_CONFIG is not set
#
# Inter-Thread communication
#
CONFIG_RT_USING_SEMAPHORE=y
CONFIG_RT_USING_MUTEX=y
CONFIG_RT_USING_EVENT=y
CONFIG_RT_USING_MAILBOX=y
CONFIG_RT_USING_MESSAGEQUEUE=y
CONFIG_RT_USING_SIGNALS=y
#
# Memory Management
#
CONFIG_RT_USING_MEMPOOL=y
CONFIG_RT_USING_MEMHEAP=y
# CONFIG_RT_USING_NOHEAP is not set
# CONFIG_RT_USING_SMALL_MEM is not set
CONFIG_RT_USING_SLAB=y
# CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set
# CONFIG_RT_USING_USERHEAP is not set
# CONFIG_RT_USING_MEMTRACE is not set
CONFIG_RT_USING_HEAP=y
#
# Kernel Device Object
#
CONFIG_RT_USING_DEVICE=y
# CONFIG_RT_USING_DEVICE_OPS is not set
# CONFIG_RT_USING_INTERRUPT_INFO is not set
CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uarths"
# CONFIG_RT_PRINTF_LONGLONG is not set
CONFIG_RT_VER_NUM=0x40004
CONFIG_ARCH_CPU_64BIT=y
# CONFIG_RT_USING_CPU_FFS is not set
CONFIG_ARCH_RISCV=y
CONFIG_ARCH_RISCV_FPU=y
CONFIG_ARCH_RISCV_FPU_S=y
CONFIG_ARCH_RISCV64=y
# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
#
# RT-Thread Components
#
CONFIG_RT_USING_COMPONENTS_INIT=y
CONFIG_RT_USING_USER_MAIN=y
CONFIG_RT_MAIN_THREAD_STACK_SIZE=10240
CONFIG_RT_MAIN_THREAD_PRIORITY=10
#
# C++ features
#
CONFIG_RT_USING_CPLUSPLUS=y
# CONFIG_RT_USING_CPLUSPLUS11 is not set
#
# Command shell
#
CONFIG_RT_USING_FINSH=y
CONFIG_RT_USING_MSH=y
CONFIG_FINSH_USING_MSH=y
CONFIG_FINSH_THREAD_NAME="tshell"
CONFIG_FINSH_THREAD_PRIORITY=20
CONFIG_FINSH_THREAD_STACK_SIZE=20480
CONFIG_FINSH_USING_HISTORY=y
CONFIG_FINSH_HISTORY_LINES=5
CONFIG_FINSH_USING_SYMTAB=y
CONFIG_FINSH_CMD_SIZE=80
CONFIG_MSH_USING_BUILT_IN_COMMANDS=y
CONFIG_FINSH_USING_DESCRIPTION=y
# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set
# CONFIG_FINSH_USING_AUTH is not set
CONFIG_FINSH_ARG_MAX=10
#
# Device virtual file system
#
CONFIG_RT_USING_DFS=y
CONFIG_DFS_USING_WORKDIR=y
CONFIG_DFS_FILESYSTEMS_MAX=16
CONFIG_DFS_FILESYSTEM_TYPES_MAX=16
CONFIG_DFS_FD_MAX=64
# CONFIG_RT_USING_DFS_MNTTABLE is not set
CONFIG_RT_USING_DFS_ELMFAT=y
#
# elm-chan's FatFs, Generic FAT Filesystem Module
#
CONFIG_RT_DFS_ELM_CODE_PAGE=437
CONFIG_RT_DFS_ELM_WORD_ACCESS=y
# CONFIG_RT_DFS_ELM_USE_LFN_0 is not set
# CONFIG_RT_DFS_ELM_USE_LFN_1 is not set
# CONFIG_RT_DFS_ELM_USE_LFN_2 is not set
CONFIG_RT_DFS_ELM_USE_LFN_3=y
CONFIG_RT_DFS_ELM_USE_LFN=3
CONFIG_RT_DFS_ELM_LFN_UNICODE_0=y
# CONFIG_RT_DFS_ELM_LFN_UNICODE_1 is not set
# CONFIG_RT_DFS_ELM_LFN_UNICODE_2 is not set
# CONFIG_RT_DFS_ELM_LFN_UNICODE_3 is not set
CONFIG_RT_DFS_ELM_LFN_UNICODE=0
CONFIG_RT_DFS_ELM_MAX_LFN=255
CONFIG_RT_DFS_ELM_DRIVES=2
CONFIG_RT_DFS_ELM_MAX_SECTOR_SIZE=4096
# CONFIG_RT_DFS_ELM_USE_ERASE is not set
CONFIG_RT_DFS_ELM_REENTRANT=y
CONFIG_RT_DFS_ELM_MUTEX_TIMEOUT=3000
CONFIG_RT_USING_DFS_DEVFS=y
# CONFIG_RT_USING_DFS_ROMFS is not set
# CONFIG_RT_USING_DFS_RAMFS is not set
#
# Device Drivers
#
CONFIG_RT_USING_DEVICE_IPC=y
CONFIG_RT_PIPE_BUFSZ=512
CONFIG_RT_USING_SYSTEM_WORKQUEUE=y
CONFIG_RT_SYSTEM_WORKQUEUE_STACKSIZE=4096
CONFIG_RT_SYSTEM_WORKQUEUE_PRIORITY=23
CONFIG_RT_USING_SERIAL=y
CONFIG_RT_USING_SERIAL_V1=y
# CONFIG_RT_USING_SERIAL_V2 is not set
CONFIG_RT_SERIAL_USING_DMA=y
CONFIG_RT_SERIAL_RB_BUFSZ=64
# CONFIG_RT_USING_CAN is not set
# CONFIG_RT_USING_HWTIMER is not set
# CONFIG_RT_USING_CPUTIME is not set
# CONFIG_RT_USING_I2C is not set
# CONFIG_RT_USING_PHY is not set
CONFIG_RT_USING_PIN=y
# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_DAC is not set
# CONFIG_RT_USING_PWM is not set
# CONFIG_RT_USING_MTD_NOR is not set
# CONFIG_RT_USING_MTD_NAND is not set
# CONFIG_RT_USING_PM is not set
# CONFIG_RT_USING_RTC is not set
# CONFIG_RT_USING_SDIO is not set
CONFIG_RT_USING_SPI=y
# CONFIG_RT_USING_QSPI is not set
CONFIG_RT_USING_SPI_MSD=y
# CONFIG_RT_USING_SFUD is not set
# CONFIG_RT_USING_ENC28J60 is not set
# CONFIG_RT_USING_SPI_WIFI is not set
# CONFIG_RT_USING_WDT is not set
# CONFIG_RT_USING_AUDIO is not set
# CONFIG_RT_USING_SENSOR is not set
# CONFIG_RT_USING_TOUCH is not set
# CONFIG_RT_USING_HWCRYPTO is not set
# CONFIG_RT_USING_PULSE_ENCODER is not set
# CONFIG_RT_USING_INPUT_CAPTURE is not set
# CONFIG_RT_USING_WIFI is not set
#
# Using USB
#
# CONFIG_RT_USING_USB_HOST is not set
# CONFIG_RT_USING_USB_DEVICE is not set
#
# POSIX layer and C standard library
#
CONFIG_RT_USING_LIBC=y
CONFIG_RT_USING_PTHREADS=y
CONFIG_PTHREAD_NUM_MAX=8
CONFIG_RT_USING_POSIX=y
# CONFIG_RT_USING_POSIX_MMAP is not set
# CONFIG_RT_USING_POSIX_TERMIOS is not set
# CONFIG_RT_USING_POSIX_GETLINE is not set
# CONFIG_RT_USING_POSIX_AIO is not set
CONFIG_RT_LIBC_USING_TIME=y
# CONFIG_RT_USING_MODULE is not set
CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8
#
# Network
#
#
# Socket abstraction layer
#
CONFIG_RT_USING_SAL=y
CONFIG_SAL_INTERNET_CHECK=y
# CONFIG_SAL_USING_POSIX is not set
CONFIG_SAL_SOCKETS_NUM=16
#
# Network interface device
#
CONFIG_RT_USING_NETDEV=y
CONFIG_NETDEV_USING_IFCONFIG=y
CONFIG_NETDEV_USING_PING=y
CONFIG_NETDEV_USING_NETSTAT=y
CONFIG_NETDEV_USING_AUTO_DEFAULT=y
# CONFIG_NETDEV_USING_IPV6 is not set
CONFIG_NETDEV_IPV4=1
CONFIG_NETDEV_IPV6=0
# CONFIG_NETDEV_IPV6_SCOPES is not set
#
# light weight TCP/IP stack
#
# CONFIG_RT_USING_LWIP is not set
#
# AT commands
#
# CONFIG_RT_USING_AT is not set
#
# VBUS(Virtual Software BUS)
#
# CONFIG_RT_USING_VBUS is not set
#
# Utilities
#
# CONFIG_RT_USING_RYM is not set
# CONFIG_RT_USING_ULOG is not set
# CONFIG_RT_USING_UTEST is not set
# CONFIG_RT_USING_VAR_EXPORT is not set
# CONFIG_RT_USING_RT_LINK is not set
#
# RT-Thread Utestcases
#
# CONFIG_RT_USING_UTESTCASES is not set
#
# Board Drivers Config
#
#
# On-chip Peripheral Drivers
#
CONFIG___STACKSIZE__=4096
CONFIG_BSP_USING_UART_HS=y
# CONFIG_BSP_USING_UART1 is not set
# CONFIG_BSP_USING_UART2 is not set
# CONFIG_BSP_USING_UART3 is not set
# CONFIG_BSP_USING_I2C1 is not set
CONFIG_BSP_USING_SPI1=y
CONFIG_BSP_SPI1_CLK_PIN=9
CONFIG_BSP_SPI1_D0_PIN=11
CONFIG_BSP_SPI1_D1_PIN=10
CONFIG_BSP_SPI1_USING_SS0=y
CONFIG_BSP_SPI1_SS0_PIN=12
# CONFIG_BSP_SPI1_USING_SS1 is not set
# CONFIG_BSP_SPI1_USING_SS2 is not set
# CONFIG_BSP_SPI1_USING_SS3 is not set
CONFIG_BSP_USING_SOFT_SPI=y
CONFIG_BSP_SOFT_SPI_CLK_PIN=26
CONFIG_BSP_SOFT_SPI_MOSI_PIN=27
CONFIG_BSP_SOFT_SPI_MISO_PIN=25
CONFIG_RT_USING_SOFT_SPI_CS0=y
CONFIG_RT_USING_SOFT_SPI_CS0_PIN=28
#
# Onboard Peripheral Drivers
#
CONFIG_BSP_USING_LCD=y
CONFIG_BSP_LCD_CS_PIN=37
CONFIG_BSP_LCD_WR_PIN=38
CONFIG_BSP_LCD_DC_PIN=39
CONFIG_BSP_LCD_RST_PIN=36
CONFIG_BSP_LCD_BACKLIGHT_PIN=-1
CONFIG_BSP_LCD_BACKLIGHT_ACTIVE_LOW=y
# CONFIG_BSP_LCD_BACKLIGHT_ACTIVE_HIGH is not set
CONFIG_BSP_LCD_CLK_FREQ=15000000
CONFIG_BSP_BOARD_KD233=y
# CONFIG_BSP_BOARD_K210_OPENMV_TEST is not set
# CONFIG_BSP_BOARD_USER is not set
CONFIG_BSP_LCD_X_MAX=320
CONFIG_BSP_LCD_Y_MAX=320
CONFIG_BSP_USING_DVP=y
#
# The default pin assignment is based on the Maix Duino K210 development board
#
CONFIG_BSP_DVP_SCCB_SDA_PIN=47
CONFIG_BSP_DVP_SCCB_SCLK_PIN=46
CONFIG_BSP_DVP_CMOS_RST_PIN=40
CONFIG_BSP_DVP_CMOS_VSYNC_PIN=45
CONFIG_BSP_DVP_CMOS_PWDN_PIN=41
CONFIG_BSP_DVP_CMOS_XCLK_PIN=42
CONFIG_BSP_DVP_CMOS_PCLK_PIN=43
CONFIG_BSP_DVP_CMOS_HREF_PIN=44
CONFIG_BSP_USING_SDCARD=y
#
# Kendryte SDK Config
#
CONFIG_PKG_KENDRYTE_SDK_VERNUM=0x0055
#
# MicroPython
#
# CONFIG_PKG_USING_MICROPYTHON is not set
#
# More Drivers
#
# CONFIG_PKG_USING_RW007 is not set
CONFIG_DRV_USING_OV2640=y
CONFIG_OV2640_JPEG_MODE=y
# CONFIG_OV2640_RGB565_MODE is not set
CONFIG_OV2640_X_RESOLUTION_IMAGE_OUTSIZE=240
CONFIG_OV2640_Y_RESOLUTION_IMAGE_OUTSIZE=240
CONFIG_OV2640_X_IMAGE_WINDOWS_SIZE=400
#
# the value must be greater than OV2640_X_RESOLUTION_IMAGE_OUTSIZE
#
CONFIG_OV2640_Y_IMAGE_WINDOWS_SIZE=400
#
# the value must be greater than OV2640_Y_RESOLUTION_IMAGE_OUTSIZE
#
# CONFIG_DRV_USING_HS300X is not set
# CONFIG_DRV_USING_SX1278 is not set
CONFIG_PKG_USING_WIZNET=y
CONFIG_PKG_WIZNET_PATH="/packages/iot/wiznet"
CONFIG_WIZ_USING_W5500=y
# CONFIG_WIZNET_DEVICE_EXTERN_CONFIG is not set
#
# WIZnet device configure
#
CONFIG_WIZ_SPI_DEVICE="spi10"
CONFIG_WIZ_RST_PIN=13
CONFIG_WIZ_IRQ_PIN=14
CONFIG_WIZ_USING_DHCP=y
CONFIG_WIZ_USING_PING=y
# CONFIG_WIZ_DEBUG is not set
# CONFIG_PKG_USING_WIZNET_V200 is not set
CONFIG_PKG_USING_WIZNET_LATEST_VERSION=y
CONFIG_PKG_WIZNET_VER="latest"
#
# APP_Framework
#
#
# Framework
#
CONFIG_TRANSFORM_LAYER_ATTRIUBUTE=y
# CONFIG_ADD_XIZI_FETURES is not set
# CONFIG_ADD_NUTTX_FETURES is not set
CONFIG_ADD_RTTHREAD_FETURES=y
# CONFIG_SUPPORT_SENSOR_FRAMEWORK is not set
# CONFIG_SUPPORT_CONNECTION_FRAMEWORK is not set
CONFIG_SUPPORT_KNOWING_FRAMEWORK=y
# CONFIG_USING_TENSORFLOWLITEMICRO is not set
# CONFIG_USING_KNOWING_FILTER is not set
# CONFIG_USING_OTA_MODEL is not set
# CONFIG_USING_IMAGE_PROCESSING is not set
# CONFIG_USING_CMSIS_5 is not set
CONFIG_USING_KPU_PROCESSING=y
CONFIG_USING_YOLOV2=y
CONFIG_USING_YOLOV2_JSONPARSER=y
CONFIG_USING_K210_YOLOV2_DETECT=y
# CONFIG_USING_NNOM is not set
# CONFIG_SUPPORT_CONTROL_FRAMEWORK is not set
#
# Security
#
# CONFIG_CRYPTO is not set
#
# Applications
#
#
# config stack size and priority of main task
#
CONFIG_MAIN_KTASK_STACK_SIZE=1024
#
# ota app
#
# CONFIG_APPLICATION_OTA is not set
#
# test app
#
# CONFIG_USER_TEST is not set
#
# connection app
#
# CONFIG_APPLICATION_CONNECTION is not set
#
# control app
#
#
# knowing app
#
CONFIG_APPLICATION_KNOWING=y
CONFIG_K210_DETECT_ENTRY=y
# CONFIG_IRIS_ML_DEMO is not set
# CONFIG_K210_FFT_TEST is not set
# CONFIG_USING_IMAGE_PROCESSING_APP is not set
#
# sensor app
#
CONFIG_APPLICATION_SENSOR=y
# CONFIG_APPLICATION_SENSOR_HCHO is not set
# CONFIG_APPLICATION_SENSOR_TVOC is not set
# CONFIG_APPLICATION_SENSOR_IAQ is not set
# CONFIG_APPLICATION_SENSOR_CH4 is not set
# CONFIG_APPLICATION_SENSOR_CO2 is not set
# CONFIG_APPLICATION_SENSOR_PM1_0 is not set
# CONFIG_APPLICATION_SENSOR_PM2_5 is not set
# CONFIG_APPLICATION_SENSOR_PM10 is not set
# CONFIG_APPLICATION_SENSOR_VOICE is not set
# CONFIG_APPLICATION_SENSOR_TEMPERATURE is not set
# CONFIG_APPLICATION_SENSOR_HUMIDITY is not set
# CONFIG_APPLICATION_SENSOR_WINDDIRECTION is not set
# CONFIG_APPLICATION_SENSOR_WINDSPEED is not set
# CONFIG_APPLICATION_SENSOR_ALTITUDE is not set
# CONFIG_USING_EMBEDDED_DATABASE_APP is not set
# CONFIG_APP_USING_WEBNET is not set
#
# lib
#
CONFIG_APP_SELECT_NEWLIB=y
# CONFIG_APP_SELECT_OTHER_LIB is not set
CONFIG_LIB_USING_CJSON=y
# CONFIG_LIB_USING_QUEUE is not set
# CONFIG_LIB_LV is not set
#
# LVGL configuration
#
# CONFIG_LV_CONF_MINIMAL is not set
# CONFIG_USING_EMBEDDED_DATABASE is not set

View File

@ -0,0 +1,228 @@
# this
*.old
*.dblite
cconfig.h
*.bin
*.map
# rtconfig.h
# .config
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
# Prerequisites
*.d
# Object files
*.o
*.ko
*.obj
*.elf
# Linker output
*.ilk
*.map
*.exp
# Precompiled Headers
*.gch
*.pch
# Libraries
*.lib
*.a
*.la
*.lo
# Shared objects (inc. Windows DLLs)
*.dll
*.so
*.so.*
*.dylib
# Executables
*.exe
*.out
*.app
*.i*86
*.x86_64
*.hex
# Debug files
*.dSYM/
*.su
*.idb
*.pdb
# Kernel Module Compile Results
*.mod*
*.cmd
.tmp_versions/
modules.order
Module.symvers
Mkfile.old
dkms.con

View File

@ -0,0 +1,37 @@
mainmenu "XIUOS Rt-thread Configuration"
config ROOT_DIR
string
default "../../../.."
config BSP_DIR
string
default "."
config RT_Thread_DIR
string
default "../.."
config RTT_DIR
string
default "../../rt-thread"
config BOARD_K210_EVB
bool
select ARCH_RISCV64
select ARCH_RISCV_FPU_S
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
default y
config APP_DIR
string
default "../../../../APP_Framework"
source "$RTT_DIR/Kconfig"
source "base-drivers/Kconfig"
source "kendryte-sdk/Kconfig"
source "$RT_Thread_DIR/micropython/Kconfig"
source "$RT_Thread_DIR/app_match_rt-thread/Kconfig"
source "$ROOT_DIR/APP_Framework/Kconfig"

View File

@ -0,0 +1,64 @@
# 教育开发板k210_edu说明
## 板载资源
该教育开发板板载摄像头dvp接口可外接ov2640、ov5640等同时还外接屏幕lcd320*320以及W5500网卡。
| 功能 | **引脚序号**<br />(并非原理图连接线序号) | 引脚定义 |
| :---------------: | :----------------------------------------: | :------------: |
| 高速串口作为shell | 5 | ISP_RX |
| | 6 | ISP_TX |
| W5500 | 9 | SPI1_ENET_SCLK |
| | 10 | SPI1_ENET_MISO |
| | 11 | SPI1_ENET_MOSI |
| | 12 | SPI1_ENET_nCS |
| | 13 | SPI1_ENET_nRST |
| | 14 | ENET_nINT |
| ov2640接口 | 47 | SCCB_SDA |
| | 46 | SCCB_SCLK |
| | 40 | CMOS_RST |
| | 45 | CMOS_VSYNC |
| | 41 | CMOS_PWDN |
| | 42 | CMOS_XCLK |
| | 43 | CMOS_PCLK |
| | 44 | CMOS_HREF |
| LCD接口 | 37 | LCD_CS |
| | 38 | LCD_WR |
| | 39 | LCD_DC |
| | 36 | LCD_RST |
| SD卡 | 26 | SPI_CLK |
| | 27 | SPI_MOSI |
| | 25 | SPI_MISO |
| | 28 | SOFT_SPI_CS0 |
| | | |
| | | |
| | | |
## 编译说明
先下载源码进入xiuos根目录
git submodule init
git submodule update Ubiquitous/RT-Thread_Fusion_XiUOS/rt-thread
git submodule update Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/k210_edu/kendryte-sdk/kendryte-sdk-source
下载好相应的源码以及勘智官方K210 sdk到指定目录
下载risc-v的工具链[下载地址](https://github.com/xpack-dev-tools/riscv-none-embed-gcc-xpack/releases)
在`rtconfig.py`中将risc-v工具链的本地路径加入文档。
然后执行scons编译
scons
也可以利用env工具编译指定工具链路径
set RTT_EXEC_PATH=D:\xpack-riscv-none-embed-gcc-8.2.0-3.1-win32-x64\xPack\RISC-V Embedded GCC\8.2.0-3.1\bin
scons

View File

@ -0,0 +1,13 @@
import os
from building import *
cwd = GetCurrentDir()
objs = []
list = os.listdir(cwd)
for d in list:
path = os.path.join(cwd, d)
if os.path.isfile(os.path.join(path, 'SConscript')):
objs = objs + SConscript(os.path.join(d, 'SConscript'))
Return('objs')

View File

@ -0,0 +1,69 @@
import os
import sys
import rtconfig
if os.getenv('RTT_ROOT'):
RTT_ROOT = os.getenv('RTT_ROOT')
else:
RTT_ROOT = os.path.normpath(os.getcwd() + '/../../rt-thread')
sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
from building import *
TARGET = 'rtthread.' + rtconfig.TARGET_EXT
DefaultEnvironment(tools=[])
env = Environment(tools = ['mingw'],
AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,
CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS,
AR = rtconfig.AR, ARFLAGS = '-rc',
LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)
env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
# use ASPPCOM to replace ASCOM, ASPPCOM will use CFLAGS/CPPFLAGS with AS
env['ASCOM'] = env['ASPPCOM']
AddOption('--compiledb',
dest = 'compiledb',
action = 'store_true',
default = False,
help = 'generate compile_commands.json')
if GetOption('compiledb'):
if int(SCons.__version__.split('.')[0]) >= 4:
env['COMPILATIONDB_USE_ABSPATH'] = True
env.Tool('compilation_db')
env.CompilationDatabase('compile_commands.json')
else:
print('Warning: --compiledb only support on SCons 4.0+')
Export('RTT_ROOT')
Export('rtconfig')
# prepare building environment
objs = PrepareBuilding(env, RTT_ROOT, has_libcpu = False)
stack_size = 4096
stack_lds = open('link_stacksize.lds', 'w')
if GetDepend('__STACKSIZE__'): stack_size = GetDepend('__STACKSIZE__')
stack_lds.write('__STACKSIZE__ = %d;' % stack_size)
stack_lds.close()
# include more drivers
objs.extend(SConscript(os.getcwd() + '/../../app_match_rt-thread/SConscript'))
# include APP_Framework/Framework
objs.extend(SConscript(os.getcwd() + '/../../../../APP_Framework/Framework/SConscript'))
# include APP_Framework/Applications
objs.extend(SConscript(os.getcwd() + '/../../../../APP_Framework/Applications/SConscript'))
# include APP_Framework/lib
objs.extend(SConscript(os.getcwd() + '/../../../../APP_Framework/lib/SConscript'))
# include Ubiquitous/RT-Thread/micropython
objs.extend(SConscript(os.getcwd() + '/../../micropython/SConscript'))
# make a building
DoBuilding(TARGET, objs)

View File

@ -0,0 +1,26 @@
from building import *
cwd = GetCurrentDir()
src = [
'main.c'
]
CPPPATH = [cwd]
## 设置 lcd_test.c 的依赖宏
if GetDepend('DRV_USING_OV2640'):
src += ['ov2640_test.c']
if GetDepend('BSP_USING_LCD'):
src += ['lcd_test.c']
## 设置 tcp_client.c 和 tcp_server.c 的依赖宏
if GetDepend('PKG_USING_WIZNET'):
src += ['tcp_client.c']
src += ['tcp_server.c']
src += ['iperf.c']
if GetDepend('BSP_USING_SDCARD'):
src += ['sdcard_wr_test.c']
group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)
Return('group')

View File

@ -0,0 +1,522 @@
/**
* iperf-liked network performance tool
*
*/
#include <rtthread.h>
#include <string.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <sys/select.h>
#include <netdb.h>
#define DBG_SECTION_NAME "iperf"
#define DBG_LEVEL DBG_INFO
#include <rtdbg.h>
#define IPERF_PORT 5001
#define IPERF_BUFSZ (4 * 1024)
#define IPERF_MODE_STOP 0
#define IPERF_MODE_SERVER 1
#define IPERF_MODE_CLIENT 2
typedef struct
{
int mode;
char *host;
int port;
} IPERF_PARAM;
static IPERF_PARAM param = {IPERF_MODE_STOP, NULL, IPERF_PORT};
static void iperf_udp_client(void *thread_param)
{
int sock;
rt_uint32_t *buffer;
struct sockaddr_in server;
rt_uint32_t packet_count = 0;
rt_uint32_t tick;
int send_size;
send_size = IPERF_BUFSZ > 1470 ? 1470 : IPERF_BUFSZ;
buffer = rt_malloc(IPERF_BUFSZ);
if (buffer == NULL)
{
return;
}
memset(buffer, 0x00, IPERF_BUFSZ);
sock = socket(PF_INET, SOCK_DGRAM, 0);
if(sock < 0)
{
LOG_E("can't create socket! exit!");
return;
}
server.sin_family = PF_INET;
server.sin_port = htons(param.port);
server.sin_addr.s_addr = inet_addr(param.host);
LOG_I("iperf udp mode run...");
while (param.mode != IPERF_MODE_STOP)
{
packet_count++;
tick = rt_tick_get();
buffer[0] = htonl(packet_count);
buffer[1] = htonl(tick / RT_TICK_PER_SECOND);
buffer[2] = htonl((tick % RT_TICK_PER_SECOND) * 1000);
sendto(sock, buffer, send_size, 0, (struct sockaddr *)&server, sizeof(struct sockaddr_in));
}
closesocket(sock);
rt_free(buffer);
}
static void iperf_udp_server(void *thread_param)
{
int sock;
rt_uint32_t *buffer;
struct sockaddr_in server;
struct sockaddr_in sender;
int sender_len, r_size;
rt_uint64_t sentlen;
rt_uint32_t pcount = 0, last_pcount = 0;
rt_uint32_t lost, total;
rt_tick_t tick1, tick2;
struct timeval timeout;
buffer = rt_malloc(IPERF_BUFSZ);
if (buffer == NULL)
{
return;
}
sock = socket(PF_INET, SOCK_DGRAM, 0);
if(sock < 0)
{
LOG_E("can't create socket! exit!");
return;
}
server.sin_family = PF_INET;
server.sin_port = htons(param.port);
server.sin_addr.s_addr = inet_addr("0.0.0.0");
timeout.tv_sec = 2;
timeout.tv_usec = 0;
if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout)) == -1)
{
LOG_E("setsockopt failed!");
closesocket(sock);
rt_free(buffer);
return;
}
if (bind(sock, (struct sockaddr *)&server, sizeof(struct sockaddr_in)) < 0)
{
LOG_E("iperf server bind failed! exit!");
closesocket(sock);
rt_free(buffer);
return;
}
while (param.mode != IPERF_MODE_STOP)
{
tick1 = rt_tick_get();
tick2 = tick1;
lost = 0;
total = 0;
sentlen = 0;
while ((tick2 - tick1) < (RT_TICK_PER_SECOND * 5))
{
r_size = recvfrom(sock, buffer, IPERF_BUFSZ, 0, (struct sockaddr *)&sender, (socklen_t*)&sender_len);
if (r_size > 12)
{
pcount = ntohl(buffer[0]);
if (last_pcount < pcount)
{
lost += pcount - last_pcount - 1;
total += pcount - last_pcount;
}
else
{
last_pcount = pcount;
}
last_pcount = pcount;
sentlen += r_size;
}
tick2 = rt_tick_get();
}
if (sentlen > 0)
{
long data;
int integer, decimal;
rt_thread_t tid;
tid = rt_thread_self();
data = sentlen * RT_TICK_PER_SECOND / 125 / (tick2 - tick1);
integer = data/1000;
decimal = data%1000;
LOG_I("%s: %d.%03d0 Mbps! lost:%d total:%d\n", tid->name, integer, decimal, lost, total);
}
}
rt_free(buffer);
closesocket(sock);
}
static void iperf_client(void *thread_param)
{
int i;
int sock;
int ret;
int tips = 1;
uint8_t *send_buf;
rt_uint64_t sentlen;
rt_tick_t tick1, tick2;
struct sockaddr_in addr;
send_buf = (uint8_t *) rt_malloc(IPERF_BUFSZ);
if (!send_buf) return ;
for (i = 0; i < IPERF_BUFSZ; i ++)
send_buf[i] = i & 0xff;
while (param.mode != IPERF_MODE_STOP)
{
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock < 0)
{
LOG_E("create socket failed!");
rt_thread_delay(RT_TICK_PER_SECOND);
continue;
}
addr.sin_family = PF_INET;
addr.sin_port = htons(param.port);
addr.sin_addr.s_addr = inet_addr((char *)param.host);
ret = connect(sock, (const struct sockaddr *)&addr, sizeof(addr));
if (ret == -1)
{
if (tips)
{
LOG_E("Connect to iperf server faile, Waiting for the server to open!");
tips = 0;
}
closesocket(sock);
rt_thread_delay(RT_TICK_PER_SECOND);
continue;
}
LOG_I("Connect to iperf server successful!");
{
int flag = 1;
setsockopt(sock,
IPPROTO_TCP, /* set option at TCP level */
TCP_NODELAY, /* name of option */
(void *) &flag, /* the cast is historical cruft */
sizeof(int)); /* length of option value */
}
sentlen = 0;
tick1 = rt_tick_get();
while (param.mode != IPERF_MODE_STOP)
{
tick2 = rt_tick_get();
if (tick2 - tick1 >= RT_TICK_PER_SECOND * 5)
{
long data;
int integer, decimal;
rt_thread_t tid;
tid = rt_thread_self();
data = sentlen * RT_TICK_PER_SECOND / 125 / (tick2 - tick1);
integer = data/1000;
decimal = data%1000;
LOG_I("%s: %d.%03d0 Mbps!", tid->name, integer, decimal);
tick1 = tick2;
sentlen = 0;
}
ret = send(sock, send_buf, IPERF_BUFSZ, 0);
if (ret > 0)
{
sentlen += ret;
}
if (ret < 0) break;
}
closesocket(sock);
rt_thread_delay(RT_TICK_PER_SECOND * 2);
LOG_W("Disconnected, iperf server shut down!");
tips = 1;
}
rt_free(send_buf);
}
void iperf_server(void *thread_param)
{
uint8_t *recv_data;
socklen_t sin_size;
rt_tick_t tick1, tick2;
int sock = -1, connected, bytes_received;
rt_uint64_t recvlen;
struct sockaddr_in server_addr, client_addr;
fd_set readset;
struct timeval timeout;
recv_data = (uint8_t *)rt_malloc(IPERF_BUFSZ);
if (recv_data == RT_NULL)
{
LOG_E("No memory!");
goto __exit;
}
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0)
{
LOG_E("Socket error!");
goto __exit;
}
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(param.port);
server_addr.sin_addr.s_addr = INADDR_ANY;
memset(&(server_addr.sin_zero), 0x0, sizeof(server_addr.sin_zero));
if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
{
LOG_E("Unable to bind!");
goto __exit;
}
if (listen(sock, 5) == -1)
{
LOG_E("Listen error!");
goto __exit;
}
timeout.tv_sec = 3;
timeout.tv_usec = 0;
while (param.mode != IPERF_MODE_STOP)
{
FD_ZERO(&readset);
FD_SET(sock, &readset);
if (select(sock + 1, &readset, RT_NULL, RT_NULL, &timeout) == 0)
continue;
sin_size = sizeof(struct sockaddr_in);
connected = accept(sock, (struct sockaddr *)&client_addr, &sin_size);
LOG_I("new client connected from (%s, %d)",
inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
{
int flag = 1;
setsockopt(connected,
IPPROTO_TCP, /* set option at TCP level */
TCP_NODELAY, /* name of option */
(void *) &flag, /* the cast is historical cruft */
sizeof(int)); /* length of option value */
}
recvlen = 0;
tick1 = rt_tick_get();
while (param.mode != IPERF_MODE_STOP)
{
bytes_received = recv(connected, recv_data, IPERF_BUFSZ, 0);
if (bytes_received <= 0) break;
recvlen += bytes_received;
tick2 = rt_tick_get();
if (tick2 - tick1 >= RT_TICK_PER_SECOND * 5)
{
long data;
int integer, decimal;
rt_thread_t tid;
tid = rt_thread_self();
data = recvlen * RT_TICK_PER_SECOND / 125 / (tick2 - tick1);
integer = data/1000;
decimal = data%1000;
LOG_I("%s: %d.%03d0 Mbps!", tid->name, integer, decimal);
tick1 = tick2;
recvlen = 0;
}
}
LOG_W("client disconnected (%s, %d)",
inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
if (connected >= 0) closesocket(connected);
connected = -1;
}
__exit:
if (sock >= 0) closesocket(sock);
if (recv_data) rt_free(recv_data);
}
void iperf_usage(void)
{
rt_kprintf("Usage: iperf [-s|-c host] [options] [multi-threaded]\n");
rt_kprintf(" iperf [-h|--stop]\n");
rt_kprintf("\n");
rt_kprintf("Client/Server:\n");
rt_kprintf(" -p # server port to listen on/connect to\n");
rt_kprintf("\n");
rt_kprintf("Server specific:\n");
rt_kprintf(" -s run in server mode\n");
rt_kprintf("\n");
rt_kprintf("Client specific:\n");
rt_kprintf(" -c <host> run in client mode, connecting to <host>\n");
rt_kprintf("\n");
rt_kprintf("Miscellaneous:\n");
rt_kprintf(" -h print this message and quit\n");
rt_kprintf(" --stop stop iperf program\n");
rt_kprintf(" -u testing UDP protocol\n");
rt_kprintf(" -m <time> the number of multi-threaded ");
return;
}
int iperf(int argc, char **argv)
{
int mode = 0; /* server mode */
char *host = NULL;
int port = IPERF_PORT;
int numtid = 1;
int use_udp = 0;
int index = 1;
if (argc == 1)
{
goto __usage;
}
if (strcmp(argv[1], "-u") == 0)
{
index = 2;
use_udp = 1;
}
if (strcmp(argv[index], "-h") == 0) goto __usage;
else if (strcmp(argv[index], "--stop") == 0)
{
/* stop iperf */
param.mode = IPERF_MODE_STOP;
return 0;
}
else if (strcmp(argv[index], "-s") == 0)
{
mode = IPERF_MODE_SERVER; /* server mode */
/* iperf -s -p 5000 */
if (argc >= 4)
{
if (strcmp(argv[index + 1], "-p") == 0)
{
port = atoi(argv[index + 2]);
}
else goto __usage;
}
}
else if (strcmp(argv[index], "-c") == 0)
{
mode = IPERF_MODE_CLIENT; /* client mode */
if (argc < 3) goto __usage;
host = argv[index + 1];
if (argc >= 5)
{
/* iperf -c host -p port */
if (strcmp(argv[index + 2], "-p") == 0)
{
port = atoi(argv[index + 3]);
}
else goto __usage;
}
}
else goto __usage;
if (argc >= 7)
{
if(strcmp(argv[argc - 2], "-m") == 0)
{
numtid = atoi(argv[argc - 1]);
}
else goto __usage;
}
/* start iperf */
if (param.mode == IPERF_MODE_STOP)
{
int i = 0;
char tid_name[RT_NAME_MAX + 1] = {0};
param.mode = mode;
param.port = port;
if (param.host)
{
rt_free(param.host);
param.host = NULL;
}
if (host) param.host = rt_strdup(host);
for (i = 0; i < numtid; i++)
{
rt_thread_t tid = RT_NULL;
void (*function)(void *parameter);
if (use_udp)
{
if (mode == IPERF_MODE_CLIENT)
{
rt_snprintf(tid_name, sizeof(tid_name), "iperfc%02d", i + 1);
function = iperf_udp_client;
}
else if (mode == IPERF_MODE_SERVER)
{
rt_snprintf(tid_name, sizeof(tid_name), "iperfd%02d", i + 1);
function = iperf_udp_server;
}
}
else
{
if (mode == IPERF_MODE_CLIENT)
{
rt_snprintf(tid_name, sizeof(tid_name), "iperfc%02d", i + 1);
function = iperf_client;
}
else if (mode == IPERF_MODE_SERVER)
{
rt_snprintf(tid_name, sizeof(tid_name), "iperfd%02d", i + 1);
function = iperf_server;
}
}
tid = rt_thread_create(tid_name, function, RT_NULL, 2048, 20, 100);
if (tid) rt_thread_startup(tid);
}
}
else
{
rt_kprintf("Please stop iperf firstly, by:\n");
rt_kprintf("iperf --stop\n");
}
return 0;
__usage:
iperf_usage();
return 0;
}
#ifdef FINSH_USING_MSH
#include <finsh.h>
MSH_CMD_EXPORT(iperf, the network bandwidth measurement tool);
#endif

View File

@ -0,0 +1,75 @@
/*
* @Author: your name
* @Date: 2021-10-11 22:04:25
* @LastEditTime: 2021-10-14 11:12:52
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: \xiuos\Ubiquitous\RT_Thread\bsp\k210\applications\main.c
*/
/*
* Copyright (c) 2020 AIIT XUOS Lab
* XiUOS is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
#include <rtthread.h>
#include <rtdevice.h>
#include <stdio.h>
#define LED_G 29
#define KEY0_PIN_NUM 31
extern int msh_exec(char *cmd, rt_size_t length);
/* 中断回调函数 */
void beep_on(void *args)
{
rt_kprintf("The KEY is pressed!\n");
}
static void key_sample(void)
{
/* 按键0引脚为输入模式 */
rt_pin_mode(KEY0_PIN_NUM, PIN_MODE_INPUT_PULLUP);
/* 绑定中断下降沿模式回调函数名为beep_on */
rt_pin_attach_irq(KEY0_PIN_NUM, PIN_IRQ_MODE_FALLING, beep_on, RT_NULL);
/* 使能中断 */
rt_pin_irq_enable(KEY0_PIN_NUM, PIN_IRQ_ENABLE);
}
int main(void)
{
/**
such as :Power on Run commands
static char detect_start[] = "ov2640_test 0";
msh_exec(detect_start,rt_strlen(detect_start));
**/
rt_pin_mode(LED_G, PIN_MODE_OUTPUT);
rt_thread_mdelay(100);
char info1[25] ={0};
char info2[25] ={0};
sprintf(info1,"xuos-intelligence k210 ");
sprintf(info2,"build %s %s",__DATE__,__TIME__);
printf("%s %s \n",info1,info2);
key_sample();
#ifdef BSP_USING_LCD
#include<drv_lcd.h>
lcd_show_string(0,60,24,info1);
lcd_show_string(0,90,24,info2);
#endif
while(1)
{
rt_pin_write(LED_G, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED_G, PIN_LOW);
rt_thread_mdelay(500);
}
return 0;
}

View File

@ -0,0 +1,151 @@
#include <rtthread.h>
#include <rtdevice.h>
#include "stdio.h"
#include "string.h"
#include "dvp.h"
#include "fpioa.h"
#include "plic.h"
#include "sysctl.h"
#if(defined DRV_USING_OV2640 && defined BSP_USING_LCD)
#include<drv_ov2640.h>
#include<drv_lcd.h>
#define RGB_BUF_SIZE (320*240*2)
#define RGB_BUF_RGB888_BUF_SIZE (320*240*2)
#ifdef RT_USING_POSIX
#include <pthread.h>
#include <unistd.h>
#include <stdio.h>
#include <dfs_poll.h>
#ifdef RT_USING_POSIX_TERMIOS
#include <posix_termios.h>
#endif
#endif
static int g_fd = 0;
static _ioctl_shoot_para shoot_para_t = {0};
extern void lcd_show_image(int x, int y, int wide, int height,const rt_uint8_t *buf);
extern void lcd_draw_picture(uint16_t x1, uint16_t y1, uint16_t width, uint16_t height, uint32_t *ptr);
void resize_rgb565in_rgb888out(uint8_t *camera_image, uint8_t *resize_image,uint8_t height,uint8_t width)
{
uint8_t *psrc_temp = (uint8_t *)camera_image;
uint8_t *pdst_temp = (uint8_t *)resize_image;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
uint8_t pixel_lo = *psrc_temp++;
uint8_t pixel_hi = *psrc_temp++;
*pdst_temp++ = (0xF8 & pixel_hi);
*pdst_temp++ = ((0x07 & pixel_hi) << 5) | ((0xE0 & pixel_lo) >> 3);
*pdst_temp++ = (0x1F & pixel_lo) << 3;
}
}
}
void ov2640_test(int argc, char **argv)
{
uint16_t * ppp = NULL;
g_fd = open("/dev/ov2640",O_RDONLY);
if(g_fd < 0)
{
printf("open ov2640 fail !!");
return;
}
if (argc < 2)
{
printf("Usage:ov2640 display images in real time or take photos \n");
printf("Like: ov2640_test 1(take photos )\n");
printf("Like: ov2640_test 0(display images in real time )\n");
close(g_fd);
return ;
}
uint32_t* rgbbuffer = rt_malloc(RGB_BUF_SIZE);
uint16_t* rgbbuffer888 = rt_malloc(RGB_BUF_RGB888_BUF_SIZE);
rt_thread_t tid;
rt_err_t ret = 0;
int temf = 0;
if(NULL == rgbbuffer)
{
printf("malloc rgbbuffer failed ! \n");
close(g_fd);
return;
}
temf = strtoul(argv[1],0, 10);
printf("ov2640_test choose %d mode \n",temf);
shoot_para_t.pdata = (uint32_t)(rgbbuffer);
shoot_para_t.length = RGB_BUF_SIZE;
lcd_clear(WHITE);
if(temf == 0)
{
void lcd_show_ov2640_thread(uint32_t* rgbbuffer);
tid = rt_thread_create("lcdshow", lcd_show_ov2640_thread, rgbbuffer,3000, 9, 20);
rt_thread_startup(tid);
}
else
{
ret = ioctl(g_fd,IOCTRL_CAMERA_START_SHOT,&shoot_para_t);
if(RT_ERROR == ret)
{
printf("ov2640 can't wait event flag");
close(g_fd);
return;
}
//resize_rgb565in_rgb888out(rgbbuffer,rgbbuffer888,320,240);
memset(rgbbuffer888,0,RGB_BUF_RGB888_BUF_SIZE);
ppp = rgbbuffer888;
printf("===========================\n\r");
for(int i = 0 ;i <320*240;i++)
{
if(i < 320*240/2)
{
*(ppp+i) = 0X7FF;
}
else
{
*(ppp+i) = YELLOW;
}
}
lcd_show_image(0, 0, 320, 240, (char*)rgbbuffer888);
rt_thread_mdelay(100);
printf("the lcd has shown the image \n");
rt_free(rgbbuffer);
close(g_fd);
}
}
MSH_CMD_EXPORT(ov2640_test,lcd show camera shot image);
void lcd_show_ov2640_thread(uint32_t* rgbbuffer)
{
rt_err_t ret = 0;
int i = 0;
while(1)
{
//memset(rgbbuffer,0,320*240*2);
ret = ioctl(g_fd,IOCTRL_CAMERA_START_SHOT,&shoot_para_t);
if(RT_ERROR == ret)
{
printf("ov2640 can't wait event flag");
rt_free(rgbbuffer);
return;
}
//lcd_show_image(0, 0, 320, 240, rgbbuffer);
lcd_draw_picture(0, 0, 320-1, 240-1, rgbbuffer);
rt_thread_mdelay(2);
}
}
#endif

View File

@ -0,0 +1,59 @@
#include <rtthread.h>
#include <rtdevice.h>
#include <stdio.h>
#ifdef RT_USING_POSIX
#include <dfs_posix.h>
#include <dfs_poll.h>
#endif
#define WRITE_SIZE (1024)
#define ONCE_SIZE (256)
#define BIG_BLOCK (1024*1024*2)
void sd_write_speed_test()
{
printf("sd_write_speed_test \n");
int fd = 0;
int ret = 0;
rt_uint32_t tick1 = rt_tick_get();
char ready_writedata[ONCE_SIZE] ={0};
memset(ready_writedata,0xAE,ONCE_SIZE);
char *ready_writedata1 = NULL;
ready_writedata1 = rt_malloc(BIG_BLOCK);
memset(ready_writedata1,0xBE,BIG_BLOCK);
printf("the moment tick is %d\n",tick1);
fd = open("/ready_writedata", O_WRONLY | O_CREAT);
if(fd >0)
{
printf("fd >0 \n");
}
else
{
printf("fd <0 \n");
return;
}
for(int i = 0;i <1;i++)
{
ret = write(fd,ready_writedata1,BIG_BLOCK);
}
rt_uint32_t tick2 = rt_tick_get();
printf("ret is %d \n",ret);
printf("the moment tick is %d\n",tick2);
printf(" time-consuming %d s\n",(tick2 - tick1)/1000);
ret = close(fd);
printf("ret is %d \n",ret);
free(ready_writedata1);
return;
}
MSH_CMD_EXPORT(sd_write_speed_test,write_speed);

View File

@ -0,0 +1,144 @@
/*
* tcp
*
* tcp
* tcpclient
* tcpclient URL PORT
* URL PORT:
* 'q' 'Q' 退
* Created by Ybeichen on 2022/7/28.
*/
#include "tcp_client.h"
#include <rtthread.h>
#include <wiz_socket.h> /* 使用BSD socket需要包含socket.h头文件 */
#include <netdb.h>
#include <stdlib.h>
#define BUFSZ 1024
static const char send_data[] = "This is TCP Client from RT-Thread."; /* 发送用到的数据 */
static void tcp_client(int argc, char **argv)
{
int ret;
char *recv_data;
struct hostent *host;
int sock, bytes_received;
struct sockaddr_in server_addr;
const char *url;
int port;
if (argc < 3)
{
rt_kprintf("Usage: tcp_client URL PORT\n");
rt_kprintf("Like: tcp_client 192.168.12.44 5000\n");
return ;
}
url = argv[1];
port = strtoul(argv[2], 0, 10);
/* 通过函数入口参数url获得host地址如果是域名会做域名解析 */
host = gethostbyname(url);
/* 分配用于存放接收数据的缓冲 */
recv_data = rt_malloc(BUFSZ);
if (recv_data == RT_NULL)
{
rt_kprintf("No memory\n");
return;
}
/* 创建一个socket类型是SOCKET_STREAMTCP类型 */
if ((sock = socket(AF_WIZ, SOCK_STREAM, 0)) == -1)
{
/* 创建socket失败 */
rt_kprintf("Socket error\n");
/* 释放已分配的接收缓冲 */
rt_free(recv_data);
return;
}
/* 初始化预连接的服务端地址 */
server_addr.sin_family = AF_WIZ;
server_addr.sin_port = htons(port);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));
/* 连接到服务端 */
if (connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
{
/* 连接失败 */
rt_kprintf("Connect fail!\n");
closesocket(sock);
/*释放接收缓冲 */
rt_free(recv_data);
return;
}
while (1)
{
/* 从sock连接中接收最大BUFSZ - 1字节数据 */
bytes_received = recv(sock, recv_data, BUFSZ - 1, 0);
if (bytes_received < 0)
{
/* 接收失败,关闭这个连接 */
closesocket(sock);
rt_kprintf("\nreceived error,close the socket.\r\n");
/* 释放接收缓冲 */
rt_free(recv_data);
break;
}
else if (bytes_received == 0)
{
/* 默认 recv 为阻塞模式此时收到0认为连接出错关闭这个连接 */
closesocket(sock);
rt_kprintf("\nreceived error,close the socket.\r\n");
/* 释放接收缓冲 */
rt_free(recv_data);
break;
}
/* 有接收到数据,把末端清零 */
recv_data[bytes_received] = '\0';
if (strncmp(recv_data, "q", 1) == 0 || strncmp(recv_data, "Q", 1) == 0)
{
/* 如果是首字母是q或Q关闭这个连接 */
closesocket(sock);
rt_kprintf("\n got a 'q' or 'Q',close the socket.\r\n");
/* 释放接收缓冲 */
rt_free(recv_data);
break;
}
else
{
/* 在控制终端显示收到的数据 */
rt_kprintf("\nReceived data = %s ", recv_data);
}
/* 发送数据到sock连接 */
ret = send(sock, send_data, strlen(send_data), 0);
if (ret < 0)
{
/* 接收失败,关闭这个连接 */
closesocket(sock);
rt_kprintf("\nsend error,close the socket.\r\n");
rt_free(recv_data);
break;
}
else if (ret == 0)
{
/* 打印send函数返回值为0的警告信息 */
rt_kprintf("\n Send warning,send function return 0.\r\n");
}
}
return;
}
MSH_CMD_EXPORT(tcp_client, a tcp client sample);

View File

@ -0,0 +1,11 @@
//
// Created by Y北辰 on 2022/7/28.
//
#ifndef RT_THREAD_FUSION_XIUOS_TCP_CLIENT_H
#define RT_THREAD_FUSION_XIUOS_TCP_CLIENT_H
static void tcpclient(int argc, char **argv);
#endif //RT_THREAD_FUSION_XIUOS_TCP_CLIENT_H

View File

@ -0,0 +1,174 @@
/*
* tcp
*
* tcp
* tcp_server
* tcp_server
*
* exit 退
* Created by Ybeichen on 2022/7/28.
*/
#include "tcp_server.h"
#include <rtthread.h>
#include <wiz_socket.h> /* 使用BSD socket需要包含socket.h头文件 */
#include "netdb.h"
#include <rtdef.h>
#include <errno.h>
#define BUFSZ (2048)
static int port = 5000;
static int is_running = 0; /* 停止标志 */
static const char send_data[] = "This is TCP Server from RT-Thread."; /* 发送用到的数据 */
static void tcp_server(void *argr)
{
char *recv_data; /* 用于接收的指针,后面会做一次动态分配以请求可用内存 */
socklen_t sin_size;
int sock, connected, bytes_received;
struct sockaddr_in server_addr, client_addr;
int ret;
recv_data = rt_malloc(BUFSZ + 1); /* 分配接收用的数据缓冲 */
if (recv_data == RT_NULL)
{
rt_kprintf("No memory\n");
return;
}
/* 创建一个socket类型是SOCKET_STREAMTCP类型 */
if ((sock = socket(AF_WIZ, SOCK_STREAM, IPPROTO_TCP)) == -1)
{
/* 创建socket失败 */
rt_kprintf("Socket error\n");
/* 释放已分配的接收缓冲 */
rt_free(recv_data);
return;
}
/* 初始化本地服务端地址 */
server_addr.sin_family = AF_WIZ;
server_addr.sin_port = htons(port); /* 服务端工作的端口 */
server_addr.sin_addr.s_addr = INADDR_ANY;
rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero));
/* 绑定socket到服务端地址 */
if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
{
/* 绑定失败 */
rt_kprintf("Unable to bind\n");
/* 释放已分配的接收缓冲 */
rt_free(recv_data);
return;
}
/* 在socket上进行监听 */
if (listen(sock, 5) == -1)
{
rt_kprintf("Listen error\n");
/* release recv buffer */
rt_free(recv_data);
return;
}
rt_kprintf("\nTCPServer Waiting for client on port %d...\n", port);
is_running=1;
while (is_running)
{
/* 接受一个客户端连接socket的请求这个函数调用是阻塞式的 */
connected = accept(sock, (struct sockaddr *)&client_addr, (socklen_t *)sizeof(struct sockaddr_in));
/* 返回的是连接成功的socket */
if (connected < 0)
{
rt_kprintf("accept connection failed! errno = %d\n", errno);
/* release recv buffer */
rt_free(recv_data);
continue;
}
/* 接受返回的client_addr指向了客户端的地址信息 */
rt_kprintf("I got a connection from (%s , %d)\n",
inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
/* 客户端连接的处理 */
while (is_running)
{
/* 发送数据到connected socket */
ret = send(connected, send_data, strlen(send_data), 0);
if (ret < 0)
{
/* 发送失败,关闭这个连接 */
rt_kprintf("\nsend error,close the socket.\r\n");
closesocket(connected);
/* 释放接收缓冲 */
rt_free(recv_data);
break;
}
else if (ret == 0)
{
/* 打印send函数返回值为0的警告信息 */
rt_kprintf("\n Send warning,send function return 0.\r\n");
}
/* 从connected socket中接收数据接收buffer是1024大小但并不一定能够收到1024大小的数据 */
bytes_received = recv(connected, recv_data, BUFSZ, 0);
if (bytes_received < 0)
{
/* 接收失败关闭这个connected socket */
rt_kprintf("\nReceived error, close the connect.\r\n");
closesocket(connected);
/* 释放接收缓冲 */
rt_free(recv_data);
break;
}
else if (bytes_received == 0)
{
/* 打印recv函数返回值为0的警告信息 */
rt_kprintf("\nReceived warning,recv function return 0.\r\n");
closesocket(connected);
/* 释放接收缓冲 */
rt_free(recv_data);
break;
}
/* 有接收到数据,把末端清零 */
recv_data[bytes_received] = '\0';
if (strncmp(recv_data, "q", 1) == 0 || strncmp(recv_data, "Q", 1) == 0)
{
/* 如果是首字母是q或Q关闭这个连接 */
rt_kprintf("\nGot a 'q' or 'Q', close the connect.\r\n");
closesocket(connected);
/* 释放接收缓冲 */
rt_free(recv_data);
break;
}
else if (strcmp(recv_data, "exit") == 0)
{
/* 如果接收的是exit则关闭整个服务端 */
closesocket(connected);
is_running=0;
break;
}
else
{
/* 在控制终端显示收到的数据 */
rt_kprintf("RECEIVED DATA = %s \n", recv_data);
}
}
}
/* 退出服务 */
closesocket(sock);
/* 释放接收缓冲 */
rt_free(recv_data);
return;
}
MSH_CMD_EXPORT(tcp_server, a tcp server sample);

View File

@ -0,0 +1,11 @@
//
// Created by Y北辰 on 2022/7/28.
//
#ifndef RT_THREAD_FUSION_XIUOS_TCP_SERVER_H
#define RT_THREAD_FUSION_XIUOS_TCP_SERVER_H
static void tcp_server(void *argr);
#endif //RT_THREAD_FUSION_XIUOS_TCP_SERVER_H

View File

@ -0,0 +1,248 @@
menu "Board Drivers Config"
menu "On-chip Peripheral Drivers"
config __STACKSIZE__
int "stack size for interrupt"
default 4096
config BSP_USING_UART_HS
bool "Enable High Speed UART"
default n
menuconfig BSP_USING_UART1
bool "Enable UART1"
default n
if BSP_USING_UART1
config BSP_UART1_TXD_PIN
int "uart1 TXD pin number"
default 19
config BSP_UART1_RXD_PIN
int "uart1 RXD pin number"
default 18
config BSP_UART1_RTS_PIN
int "uart1 RTS pin number (-1 for not used)"
default -1
config BSP_UART1_CTS_PIN
int "uart1 CTS pin number (-1 for not used)"
default -1
endif
menuconfig BSP_USING_UART2
bool "Enable UART2"
default n
if BSP_USING_UART2
config BSP_UART2_TXD_PIN
int "uart2 TXD pin number"
default 20
config BSP_UART2_RXD_PIN
int "uart2 RXD pin number"
default 21
config BSP_UART2_RTS_PIN
int "uart2 RTS pin number (-1 for not used)"
default -1
config BSP_UART2_CTS_PIN
int "uart2 CTS pin number (-1 for not used)"
default -1
endif
menuconfig BSP_USING_UART3
bool "Enable UART3"
default n
if BSP_USING_UART3
config BSP_UART3_TXD_PIN
int "uart3 TXD pin number"
default 22
config BSP_UART3_RXD_PIN
int "uart3 RXD pin number"
default 23
config BSP_UART3_RTS_PIN
int "uart3 RTS pin number (-1 for not used)"
default -1
config BSP_UART3_CTS_PIN
int "uart3 CTS pin number (-1 for not used)"
default -1
endif
menuconfig BSP_USING_I2C1
bool "Enable I2C1"
select RT_USING_I2C
default n
if BSP_USING_I2C11
config BSP_I2C1_SDA_PIN
int "I2C1 sda pin number"
default 15
config BSP_I2C1_CLK_PIN
int "I2C1 clk pin number"
default 17
endif
menuconfig BSP_USING_SPI1
bool "Enable SPI1"
select RT_USING_SPI
default n
if BSP_USING_SPI1
config BSP_SPI1_CLK_PIN
int "spi1 clk pin number"
default 9
config BSP_SPI1_D0_PIN
int "spi1 d0 pin number"
default 11
config BSP_SPI1_D1_PIN
int "spi1 d1 pin number"
default 10
menuconfig BSP_SPI1_USING_SS0
bool "SPI1 Enable SS0(spi10 dev)"
default n
if BSP_SPI1_USING_SS0
config BSP_SPI1_SS0_PIN
int "spi1 ss0 pin number"
default 12
endif
menuconfig BSP_SPI1_USING_SS1
bool "SPI1 Enable SS1(spi11 dev)"
default n
if BSP_SPI1_USING_SS1
config BSP_SPI1_SS1_PIN
int "spi1 ss1 pin number"
default 8
endif
menuconfig BSP_SPI1_USING_SS2
bool "SPI1 Enable SS2(spi12 dev)"
default n
if BSP_SPI1_USING_SS2
config BSP_SPI1_SS2_PIN
int "spi1 ss2 pin number"
default 26
endif
menuconfig BSP_SPI1_USING_SS3
bool "SPI1 Enable SS3(spi13 dev)"
default n
if BSP_SPI1_USING_SS3
config BSP_SPI1_SS3_PIN
int "spi1 ss3 pin number"
default 27
endif
endif
menuconfig BSP_USING_SOFT_SPI
bool "Enable SOFT SIMULATION SPI"
default n
if BSP_USING_SOFT_SPI
config BSP_SOFT_SPI_CLK_PIN
int "soft spi clk pin number"
default 26
config BSP_SOFT_SPI_MOSI_PIN
int "soft spi MOSI pin number"
default 27
config BSP_SOFT_SPI_MISO_PIN
int "soft spi MISO pin number"
default 25
menuconfig RT_USING_SOFT_SPI_CS0
bool "SOFT SPI Enable CS0(soft spi0 dev)"
default y
if RT_USING_SOFT_SPI_CS0
config RT_USING_SOFT_SPI_CS0_PIN
int "SOFT SPI Enable CS0"
default 28
endif
endif
endmenu
menu "Onboard Peripheral Drivers"
menuconfig BSP_USING_LCD
bool "Enable LCD on SPI0"
default n
if BSP_USING_LCD
config BSP_LCD_CS_PIN
int "CS pin number of 8080 interface"
default 37
config BSP_LCD_WR_PIN
int "WR pin number of 8080 interface"
default 38
config BSP_LCD_DC_PIN
int "DC pin number of 8080 interface"
default 39
config BSP_LCD_RST_PIN
int "RESET pin number of 8080 interface (-1 for not used)"
default 36
config BSP_LCD_BACKLIGHT_PIN
int "Backlight control pin number (-1 for not used)"
default -1
choice
prompt "backlight active polarity"
default BSP_LCD_BACKLIGHT_ACTIVE_LOW
config BSP_LCD_BACKLIGHT_ACTIVE_LOW
bool "lcd backlight on low level"
config BSP_LCD_BACKLIGHT_ACTIVE_HIGH
bool "lcd_backlight on high level"
endchoice
config BSP_LCD_CLK_FREQ
int "Lcd max clk frequency"
default 15000000
choice
prompt "lcd scan direction"
default BSP_BOARD_KD233
config BSP_BOARD_KD233
bool "board_kd233 lcd scan: DIR_YX_RLUD"
config BSP_BOARD_K210_OPENMV_TEST
bool "board_k210_openmv lcd scan: DIR_YX_LRUD"
config BSP_BOARD_USER
bool "board_user: user defined."
endchoice
config BSP_LCD_X_MAX
int "LCD Height"
default 320
config BSP_LCD_Y_MAX
int "LCD Width"
default 320
endif
menuconfig BSP_USING_DVP
bool "Enable DVP(camera)"
default n
if BSP_USING_DVP
comment "The default pin assignment is based on the Maix Duino K210 development board"
config BSP_DVP_SCCB_SDA_PIN
int "SCCB SDA pin number for camera"
default 47
config BSP_DVP_SCCB_SCLK_PIN
int "SCCB SCLK pin number for camera"
default 46
config BSP_DVP_CMOS_RST_PIN
int "CMOS RST pin number for camera"
default 40
config BSP_DVP_CMOS_VSYNC_PIN
int "CMOS VSYNC pin number for camera"
default 45
config BSP_DVP_CMOS_PWDN_PIN
int "CMOS PWDN pin number for camera"
default 41
config BSP_DVP_CMOS_XCLK_PIN
int "CMOS XCLK pin number for camera"
default 42
config BSP_DVP_CMOS_PCLK_PIN
int "CMOS PCLK pin number for camera"
default 43
config BSP_DVP_CMOS_HREF_PIN
int "CMOS HREF pin number for camera"
default 44
endif
config BSP_USING_SDCARD
bool "Enable SDCARD (soft_spi_bus)"
select BSP_USING_SOFT_SPI
select RT_USING_SPI_MSD
select RT_USING_DFS
select RT_USING_DFS_ELMFAT
select RT_USING_SOFT_SPI_CS0_PIN
default n
endmenu
endmenu

View File

@ -0,0 +1,40 @@
import os
import rtconfig
from building import *
cwd = GetCurrentDir()
drv_path = cwd+"/../../../rt-thread/bsp/k210/driver/"
src = [
'board.c',
'heap.c',
drv_path + 'drv_uart.c',
'drv_interrupt.c',
'drv_io_config.c',
'dmalock.c'
]
CPPPATH = [cwd,drv_path]
if GetDepend('RT_USING_PIN'):
src += ['drv_gpio.c']
if GetDepend('RT_USING_HWTIMER'):
src += [drv_path + 'drv_hw_timer.c']
if GetDepend('RT_USING_I2C'):
src += [drv_path + 'drv_i2c.c']
if GetDepend('RT_USING_SPI'):
src += ['drv_spi.c']
if GetDepend('RT_USING_PWM'):
src += [drv_path + 'drv_pwm.c']
if GetDepend('RT_USING_WDT'):
src += [drv_path + 'drv_wdt.c']
if GetDepend('BSP_USING_DVP'):
src += ['drv_dvp.c']
if GetDepend('BSP_USING_LCD'):
src += ['drv_lcd.c']
src += ['drv_mpylcd.c']
if GetDepend('BSP_USING_SOFT_SPI'):
src +=['drv_soft_spi.c']
if GetDepend('BSP_USING_SDCARD'):
src += ['sdcard_port.c']
group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH)
Return('group')

View File

@ -0,0 +1,144 @@
/*
* Copyright (c) 2006-2018, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
*/
#include <rthw.h>
#include <rtthread.h>
#include "board.h"
#include "tick.h"
#include "drv_uart.h"
#include "encoding.h"
#include "fpioa.h"
#include "dmac.h"
#include "dmalock.h"
void init_bss(void)
{
unsigned int *dst;
dst = &__bss_start;
while (dst < &__bss_end)
{
*dst++ = 0;
}
}
void primary_cpu_entry(void)
{
extern void entry(void);
/* disable global interrupt */
init_bss();
rt_hw_interrupt_disable();
entry();
}
#include <clint.h>
#include <sysctl.h>
int freq(void)
{
rt_uint64_t value = 0;
value = sysctl_clock_get_freq(SYSCTL_CLOCK_PLL0);
rt_kprintf("PLL0: %d\n", value);
value = sysctl_clock_get_freq(SYSCTL_CLOCK_PLL1);
rt_kprintf("PLL1: %d\n", value);
value = sysctl_clock_get_freq(SYSCTL_CLOCK_PLL2);
rt_kprintf("PLL2: %d\n", value);
value = sysctl_clock_get_freq(SYSCTL_CLOCK_CPU);
rt_kprintf("CPU : %d\n", value);
value = sysctl_clock_get_freq(SYSCTL_CLOCK_APB0);
rt_kprintf("APB0: %d\n", value);
value = sysctl_clock_get_freq(SYSCTL_CLOCK_APB1);
rt_kprintf("APB1: %d\n", value);
value = sysctl_clock_get_freq(SYSCTL_CLOCK_APB2);
rt_kprintf("APB2: %d\n", value);
value = sysctl_clock_get_freq(SYSCTL_CLOCK_HCLK);
rt_kprintf("HCLK: %d\n", value);
value = clint_get_time();
rt_kprintf("mtime: %d\n", value);
return 0;
}
MSH_CMD_EXPORT(freq, show freq info);
#ifdef RT_USING_SMP
extern int rt_hw_clint_ipi_enable(void);
#endif
extern int io_config_init(void);
void rt_hw_board_init(void)
{
sysctl_pll_set_freq(SYSCTL_PLL0, 800000000UL);
sysctl_pll_set_freq(SYSCTL_PLL1, 400000000UL);
sysctl_pll_set_freq(SYSCTL_PLL2, 45158400UL);
sysctl_clock_set_threshold(SYSCTL_THRESHOLD_APB1, 2);
/* Init FPIOA */
fpioa_init();
io_config_init();
/* Dmac init */
dmac_init();
dmalock_init();
/* initalize interrupt */
rt_hw_interrupt_init();
/* initialize hardware interrupt */
rt_hw_uart_init();
rt_hw_tick_init();
#ifdef RT_USING_SMP
rt_hw_clint_ipi_enable();
#endif
#ifdef RT_USING_CONSOLE
/* set console device */
rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
#endif /* RT_USING_CONSOLE */
#ifdef RT_USING_HEAP
rt_kprintf("heap: [0x%08x - 0x%08x]\n", (rt_ubase_t) RT_HW_HEAP_BEGIN, (rt_ubase_t) RT_HW_HEAP_END);
/* initialize memory system */
rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
#endif
#ifdef RT_USING_COMPONENTS_INIT
rt_components_board_init();
#endif
}
void rt_hw_cpu_reset(void)
{
sysctl->soft_reset.soft_reset = 1;
while(1);
}
MSH_CMD_EXPORT_ALIAS(rt_hw_cpu_reset, reboot, reset machine);
/**
* This function will delay for some us.
*
* @param us the delay time of us
*/
void rt_hw_us_delay(rt_uint32_t usec)
{
rt_uint32_t cycle = read_cycle();
rt_uint32_t nop_all = usec * sysctl_clock_get_freq(SYSCTL_CLOCK_CPU) / 1000000UL;
while (1)
{
if(read_cycle() - cycle >= nop_all)
break;
}
}

View File

@ -0,0 +1,26 @@
/*
* Copyright (c) 2006-2018, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2017-5-30 Bernard the first version
*/
#ifndef BOARD_H__
#define BOARD_H__
#include "fpioa.h"
#include "platform.h"
#include <rtconfig.h>
extern unsigned int __bss_start;
extern unsigned int __bss_end;
#define RT_HW_HEAP_BEGIN (void*)&__bss_end
#define RT_HW_HEAP_END (void*)(0x80000000 + 6 * 1024 * 1024)
void rt_hw_board_init(void);
#endif

Some files were not shown because too many files have changed in this diff Show More