Browse Source

recode project

master
zhaohe 1 year ago
parent
commit
9a3e6ab4df
  1. 14
      .cproject
  2. 2
      .project
  3. 4
      .settings/language.settings.xml
  4. 2
      .vscode/settings.json
  5. 10
      camera_light_src_timing_controller_stm32 Debug.launch
  6. 0
      camera_light_src_timing_controller_stm32.cfg
  7. 4
      camera_light_src_timing_controller_stm32.ioc
  8. 0
      camera_light_src_timing_controller_stm32.launch
  9. 10
      libzaf/README.md
  10. 234
      libzaf/pin.c
  11. 119
      libzaf/pin.h
  12. 16
      libzaf/zaf.h
  13. 0
      libzaf/zaf_basic.c
  14. 9
      libzaf/zaf_basic.h
  15. 60
      libzaf/zaf_delay.c
  16. 7
      libzaf/zaf_delay.h
  17. 110
      libzaf/zaf_flash.c
  18. 68
      libzaf/zaf_flash.h
  19. 327
      libzaf/zaf_gpio.c
  20. 36
      libzaf/zaf_gpio.h
  21. 31
      libzaf/zaf_id.c
  22. 12
      libzaf/zaf_id.h
  23. 39
      libzaf/zaf_log.c
  24. 39
      libzaf/zaf_log.h
  25. 104
      libzaf/zaf_udp.c
  26. 40
      libzaf/zaf_udp.h
  27. 18
      usrc/base_service/config_service.c
  28. 2
      usrc/base_service/config_service.h
  29. 32
      usrc/base_service/fpga_if.c
  30. 12
      usrc/base_service/fpga_if.h
  31. 44
      usrc/main.cpp
  32. 2
      usrc/project_configs.h
  33. 4
      usrc/project_dep.h
  34. 4
      usrc/service/device_info.cpp
  35. 2
      usrc/service/device_info.hpp
  36. 8
      usrc/service/extern_if_service.c
  37. 1
      usrc/service/extern_if_service.h
  38. 0
      usrc/service/global_flag.c
  39. 1
      usrc/service/reg_manager.c
  40. 3
      usrc/service/reg_manager.h
  41. 17
      usrc/service/report_generator_service.c
  42. 4
      usrc/service/report_generator_service.h
  43. BIN
      xsync_v3.pdf
  44. 191
      zaf_protocol/zaf_protocol.h

14
.cproject

@ -146,12 +146,13 @@
</toolChain>
</folderInfo>
<sourceEntries>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="iflytop_xsync"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Core"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Drivers"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="LWIP"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Middlewares"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="libzaf"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="usrc"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="LWIP"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Drivers"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="zaf_protocol"/>
</sourceEntries>
</configuration>
</storageModule>
@ -278,12 +279,13 @@
</toolChain>
</folderInfo>
<sourceEntries>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="iflytop_xsync"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Core"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Drivers"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="LWIP"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Middlewares"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="libzaf"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="usrc"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="LWIP"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Drivers"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="zaf_protocol"/>
</sourceEntries>
</configuration>
</storageModule>

2
.project

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>a8000_hbot_robot_controler</name>
<name>camera_light_src_timing_controller_stm32</name>
<comment></comment>
<projects>
</projects>

4
.settings/language.settings.xml

@ -5,7 +5,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1904270345635912855" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="201303414476292090" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
@ -16,7 +16,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1789632813386339464" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="148507298767213675" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>

2
.vscode/settings.json

@ -90,7 +90,7 @@
"project_dep.h": "c",
"project_configs.h": "c",
"sockets.h": "c",
"xs_udp.h": "c",
"zaf_udp.h": "c",
"api.h": "c",
"sys.h": "c",
"reg_manager.h": "c",

10
xsync_stm32 Debug.launch → camera_light_src_timing_controller_stm32 Debug.launch

@ -12,7 +12,7 @@
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.ip_address_local" value="localhost"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.limit_swo_clock.enabled" value="false"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.limit_swo_clock.value" value=""/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.loadList" value="{&quot;fItems&quot;:[{&quot;fIsFromMainTab&quot;:true,&quot;fPath&quot;:&quot;Debug/xsync_stm32.elf&quot;,&quot;fProjectName&quot;:&quot;xsync_stm32&quot;,&quot;fPerformBuild&quot;:true,&quot;fDownload&quot;:true,&quot;fLoadSymbols&quot;:true}]}"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.loadList" value="{&quot;fItems&quot;:[{&quot;fIsFromMainTab&quot;:true,&quot;fPath&quot;:&quot;Debug/camera_light_src_timing_controller_stm32.elf&quot;,&quot;fProjectName&quot;:&quot;camera_light_src_timing_controller_stm32&quot;,&quot;fPerformBuild&quot;:true,&quot;fDownload&quot;:true,&quot;fLoadSymbols&quot;:true}]}"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.override_start_address_mode" value="default"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.remoteCommand" value="target remote"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.startServer" value="true"/>
@ -32,7 +32,7 @@
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.enable_shared_stlink" value="false"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.frequency" value="0"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.halt_all_on_reset" value="false"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.log_file" value="D:\workspace\p_lusterinc\xsync_stm32\Debug\st-link_gdbserver_log.txt"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.log_file" value="D:\workspace\p_lusterinc\camera_light_src_timing_controller_stm32\Debug\st-link_gdbserver_log.txt"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.low_power_debug" value="disable"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.max_halt_delay" value="2"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.reset_strategy" value="system_reset"/>
@ -67,13 +67,13 @@
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="remote"/>
<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="Debug/xsync_stm32.elf"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="xsync_stm32"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="Debug/camera_light_src_timing_controller_stm32.elf"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="camera_light_src_timing_controller_stm32"/>
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="true"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1853947771"/>
<booleanAttribute key="org.eclipse.debug.core.ATTR_FORCE_SYSTEM_CONSOLE_ENCODING" value="false"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/xsync_stm32"/>
<listEntry value="/camera_light_src_timing_controller_stm32"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>

0
xsync_stm32.cfg → camera_light_src_timing_controller_stm32.cfg

4
xsync_stm32.ioc → camera_light_src_timing_controller_stm32.ioc

@ -255,8 +255,8 @@ ProjectManager.MainLocation=Core/Src
ProjectManager.NoMain=false
ProjectManager.PreviousToolchain=STM32CubeIDE
ProjectManager.ProjectBuild=false
ProjectManager.ProjectFileName=xsync_stm32.ioc
ProjectManager.ProjectName=xsync_stm32
ProjectManager.ProjectFileName=camera_light_src_timing_controller_stm32.ioc
ProjectManager.ProjectName=camera_light_src_timing_controller_stm32
ProjectManager.ProjectStructure=
ProjectManager.RegisterCallBack=
ProjectManager.StackSize=0x1000

0
xsync_stm32.launch → camera_light_src_timing_controller_stm32.launch

10
libzaf/README.md

@ -0,0 +1,10 @@
```
libzaf
Iflytop ARM and FPGA based Zynq Acceleration Framework
功能:
```

234
libzaf/pin.c

@ -0,0 +1,234 @@
#include "pin.h"
const char* pinname(Pin_t pin) {
switch (pin) {
case PinNull:
return "PinNull";
case PA0:
return "PA0";
case PA1:
return "PA1";
case PA2:
return "PA2";
case PA3:
return "PA3";
case PA4:
return "PA4";
case PA5:
return "PA5";
case PA6:
return "PA6";
case PA7:
return "PA7";
case PA8:
return "PA8";
case PA9:
return "PA9";
case PA10:
return "PA10";
case PA11:
return "PA11";
case PA12:
return "PA12";
case PA13:
return "PA13";
case PA14:
return "PA14";
case PA15:
return "PA15";
case PB0:
return "PB0";
case PB1:
return "PB1";
case PB2:
return "PB2";
case PB3:
return "PB3";
case PB4:
return "PB4";
case PB5:
return "PB5";
case PB6:
return "PB6";
case PB7:
return "PB7";
case PB8:
return "PB8";
case PB9:
return "PB9";
case PB10:
return "PB10";
case PB11:
return "PB11";
case PB12:
return "PB12";
case PB13:
return "PB13";
case PB14:
return "PB14";
case PB15:
return "PB15";
case PC0:
return "PC0";
case PC1:
return "PC1";
case PC2:
return "PC2";
case PC3:
return "PC3";
case PC4:
return "PC4";
case PC5:
return "PC5";
case PC6:
return "PC6";
case PC7:
return "PC7";
case PC8:
return "PC8";
case PC9:
return "PC9";
case PC10:
return "PC10";
case PC11:
return "PC11";
case PC12:
return "PC12";
case PC13:
return "PC13";
case PC14:
return "PC14";
case PC15:
return "PC15";
case PD0:
return "PD0";
case PD1:
return "PD1";
case PD2:
return "PD2";
case PD3:
return "PD3";
case PD4:
return "PD4";
case PD5:
return "PD5";
case PD6:
return "PD6";
case PD7:
return "PD7";
case PD8:
return "PD8";
case PD9:
return "PD9";
case PD10:
return "PD10";
case PD11:
return "PD11";
case PD12:
return "PD12";
case PD13:
return "PD13";
case PD14:
return "PD14";
case PD15:
return "PD15";
case PE0:
return "PE0";
case PE1:
return "PE1";
case PE2:
return "PE2";
case PE3:
return "PE3";
case PE4:
return "PE4";
case PE5:
return "PE5";
case PE6:
return "PE6";
case PE7:
return "PE7";
case PE8:
return "PE8";
case PE9:
return "PE9";
case PE10:
return "PE10";
case PE11:
return "PE11";
case PE12:
return "PE12";
case PE13:
return "PE13";
case PE14:
return "PE14";
case PE15:
return "PE15";
case PF0:
return "PF0";
case PF1:
return "PF1";
case PF2:
return "PF2";
case PF3:
return "PF3";
case PF4:
return "PF4";
case PF5:
return "PF5";
case PF6:
return "PF6";
case PF7:
return "PF7";
case PF8:
return "PF8";
case PF9:
return "PF9";
case PF10:
return "PF10";
case PF11:
return "PF11";
case PF12:
return "PF12";
case PF13:
return "PF13";
case PF14:
return "PF14";
case PF15:
return "PF15";
case PG0:
return "PG0";
case PG1:
return "PG1";
case PG2:
return "PG2";
case PG3:
return "PG3";
case PG4:
return "PG4";
case PG5:
return "PG5";
case PG6:
return "PG6";
case PG7:
return "PG7";
case PG8:
return "PG8";
case PG9:
return "PG9";
case PG10:
return "PG10";
case PG11:
return "PG11";
case PG12:
return "PG12";
case PG13:
return "PG13";
case PG14:
return "PG14";
case PG15:
return "PG15";
default:
break;
}
return "UNKNOWN_PIN";
};

119
libzaf/pin.h

@ -0,0 +1,119 @@
#pragma once
typedef enum {
PinNull = 0,
PA0 = 0x10,
PA1,
PA2,
PA3,
PA4,
PA5,
PA6,
PA7,
PA8,
PA9,
PA10,
PA11,
PA12,
PA13,
PA14,
PA15,
PB0 = 0x20,
PB1,
PB2,
PB3,
PB4,
PB5,
PB6,
PB7,
PB8,
PB9,
PB10,
PB11,
PB12,
PB13,
PB14,
PB15,
PC0 = 0x30,
PC1,
PC2,
PC3,
PC4,
PC5,
PC6,
PC7,
PC8,
PC9,
PC10,
PC11,
PC12,
PC13,
PC14,
PC15,
PD0 = 0x40,
PD1,
PD2,
PD3,
PD4,
PD5,
PD6,
PD7,
PD8,
PD9,
PD10,
PD11,
PD12,
PD13,
PD14,
PD15,
PE0 = 0x50,
PE1,
PE2,
PE3,
PE4,
PE5,
PE6,
PE7,
PE8,
PE9,
PE10,
PE11,
PE12,
PE13,
PE14,
PE15,
PF0 = 0x60,
PF1,
PF2,
PF3,
PF4,
PF5,
PF6,
PF7,
PF8,
PF9,
PF10,
PF11,
PF12,
PF13,
PF14,
PF15,
PG0 = 0x70,
PG1,
PG2,
PG3,
PG4,
PG5,
PG6,
PG7,
PG8,
PG9,
PG10,
PG11,
PG12,
PG13,
PG14,
PG15,
} Pin_t;
const char* pinname(Pin_t pin);

16
libzaf/zaf.h

@ -0,0 +1,16 @@
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
#include "zaf_basic.h"
#include "zaf_delay.h"
#include "zaf_flash.h"
#include "zaf_gpio.h"
#include "zaf_log.h"
#include "zaf_id.h"
#include "zaf_udp.h"
#ifdef __cplusplus
}
#endif

0
usrc/service/global_flag.h → libzaf/zaf_basic.c

9
libzaf/zaf_basic.h

@ -0,0 +1,9 @@
#pragma once
#include "main.h"
//
#include "project_configs.h"
//
#include "cmsis_os.h"
//
#include <stdbool.h>
#include <stdint.h>

60
libzaf/zaf_delay.c

@ -0,0 +1,60 @@
#include "zaf_delay.h"
#include "zaf_basic.h"
extern TIM_HandleTypeDef PC_SYS_DELAY_US_TIMER;
static HAL_StatusTypeDef _HAL_TIM_Base_Start(TIM_HandleTypeDef* htim) __attribute__((optimize("O2")));
static HAL_StatusTypeDef _HAL_TIM_Base_Stop(TIM_HandleTypeDef* htim) __attribute__((optimize("O2")));
static HAL_StatusTypeDef _HAL_TIM_Base_Start(TIM_HandleTypeDef* htim) {
uint32_t tmpsmcr;
/* Check the TIM state */
if (htim->State != HAL_TIM_STATE_READY) {
return HAL_ERROR;
}
htim->State = HAL_TIM_STATE_BUSY;
if (IS_TIM_SLAVE_INSTANCE(htim->Instance)) {
tmpsmcr = htim->Instance->SMCR & TIM_SMCR_SMS;
if (!IS_TIM_SLAVEMODE_TRIGGER_ENABLED(tmpsmcr)) {
__HAL_TIM_ENABLE(htim);
}
} else {
__HAL_TIM_ENABLE(htim);
}
return HAL_OK;
}
static HAL_StatusTypeDef _HAL_TIM_Base_Stop(TIM_HandleTypeDef* htim) {
/* Disable the Peripheral */
__HAL_TIM_DISABLE(htim);
/* Set the TIM state */
htim->State = HAL_TIM_STATE_READY;
/* Return function status */
return HAL_OK;
}
void zaf_delay_us(int var_nus) {
volatile uint32_t counter = 0;
__HAL_TIM_SET_COUNTER(&PC_SYS_DELAY_US_TIMER, 0);
_HAL_TIM_Base_Start(&PC_SYS_DELAY_US_TIMER);
while (counter < var_nus) {
counter = __HAL_TIM_GET_COUNTER(&PC_SYS_DELAY_US_TIMER);
}
_HAL_TIM_Base_Stop(&PC_SYS_DELAY_US_TIMER);
}
void zaf_delay_ms(int ms) {
for (int i = 0; i < ms; i++) {
zaf_delay_us(1000);
}
}
void zaf_os_delay_ms(int ms) { osDelay(ms); }
uint32_t zaf_get_ticket(void) { return HAL_GetTick(); }
uint32_t zaf_has_passedms(uint32_t ticket) {
uint32_t now = HAL_GetTick();
if (now >= ticket) {
return now - ticket;
} else {
return 0xFFFFFFFF - ticket + now;
}
}

7
libzaf/zaf_delay.h

@ -0,0 +1,7 @@
#pragma once
#include <stdint.h>
void zaf_delay_us(int us);
void zaf_delay_ms(int ms);
void zaf_os_delay_ms(int ms);
uint32_t zaf_get_ticket(void);
uint32_t zaf_has_passedms(uint32_t ticket);

110
libzaf/zaf_flash.c

@ -0,0 +1,110 @@
#include "zaf_flash.h"
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include "zaf_log.h"
static uint32_t* _rawstartadd;
static uint32_t* _defaultdata;
static uint32_t _rawsize;
static bool _is_first_run = false;
static bool _xs_check_raw_data() {
uint32_t checksum = 0;
ZLOGI("flash", "_rawstartadd[0] = %x", _rawstartadd[0]);
if (_rawstartadd[0] != FLASH_MASK_VAL) {
return false;
}
for (uint32_t i = 0; i < _rawsize - 1; i++) {
checksum += _rawstartadd[i];
}
if (checksum != _rawstartadd[_rawsize - 1]) {
return false;
}
return true;
}
static HAL_StatusTypeDef _flash_erase(void) {
HAL_StatusTypeDef status;
uint32_t sector_error_point;
FLASH_EraseInitTypeDef flash_erase_structer = {
//
.TypeErase = FLASH_TYPEERASE_SECTORS, //
.Sector = FLASH_EARSE_SECTOR, //
.NbSectors = 1, //
.VoltageRange = FLASH_VOLTAGE_RANGE_3 //
};
HAL_FLASH_Unlock(); //
__HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); //
status = HAL_FLASHEx_Erase(&flash_erase_structer, &sector_error_point);
if (status != HAL_OK) {
ZLOGE("flash", "erase error");
}
HAL_FLASH_Lock(); //
return status;
}
/*******************************************************************************
* EXTERN *
*******************************************************************************/
void zaf_flash_init(uint32_t* rawstartadd, uint32_t rawsize) {
_rawstartadd = rawstartadd;
_defaultdata = NULL;
_rawsize = rawsize;
// flash数据
memcpy(_rawstartadd, (uint32_t*)(FLASH_START_ADD), _rawsize * 4);
#if 0
//
if (_xs_check_raw_data()) {
return;
}
_is_first_run = true;
zaf_flash_factory_reset();
#endif
}
bool zaf_flash_check(void) { return _xs_check_raw_data(); }
bool zaf_flash_set_default_data(uint32_t* defaultdata) {
_defaultdata = defaultdata;
return true;
}
bool zaf_flash_is_first_run(void) { return _is_first_run; }
uint32_t zaf_compute_checksum(uint32_t* data, uint32_t size) {
uint32_t checksum = 0;
for (uint32_t i = 0; i < size; i++) {
checksum += data[i];
}
return checksum;
}
bool zaf_flash_factory_reset(void) {
memcpy(_rawstartadd, _defaultdata, _rawsize * 4);
zaf_flash_flush();
return true;
}
bool zaf_flash_flush(void) {
#if PC_NVS_ENABLE
_rawstartadd[0] = FLASH_MASK_VAL;
_rawstartadd[_rawsize - 1] =zaf_compute_checksum(_rawstartadd, _rawsize - 1);
_flash_erase();
HAL_FLASH_Unlock(); //
HAL_StatusTypeDef status;
for (uint32_t i = 0; i < _rawsize; i++) {
status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FLASH_START_ADD + i * 4, _rawstartadd[i]);
if (status != HAL_OK) {
ZLOGE("flash", "write error");
}
}
HAL_FLASH_Lock(); //
#endif
return true;
}

68
libzaf/zaf_flash.h

@ -0,0 +1,68 @@
#pragma once
#include <stdbool.h>
#include "main.h"
/**
* @brief
* STM32F407VETx 512k
*
* index startAdd size
* 0 0x08000000 16k
* 1 0x08004000 16k
* 2 0x08008000 16k
* 3 0x0800C000 16k
* 4 0x08010000 64k
* 5 0x08020000 128k
* 6 0x08040000 128k
* 7 0x08060000 128k
*
*
* @WARNING:
* 1. 使70x08060000~0x0807FFFF
* 2. 75%
* 3. rawstartadd第一位必须是0xABCD,
*/
#define FLASH_MASK_VAL 0xABCD
#define FLASH_START_ADD 0x08060000 //
#define FLASH_EARSE_SECTOR FLASH_SECTOR_7
/**
* @brief flash
*
* @param rawstartadd flash内存映射的地址
* @param defaultdata
* @param rawsize flash内存映射的地址大小
*/
void zaf_flash_init(uint32_t* rawstartadd, uint32_t rawsize);
/**
* @brief flash
*
* @return true
* @return false
*/
bool zaf_flash_is_first_run(void);
/**
* @brief flash中
*
* @return true
* @return false
*/
bool zaf_flash_flush(void);
/**
* @brief
*
* @return true
* @return false
*/
bool zaf_flash_factory_reset(void);
/**
* @brief
*
* @param defaultdata
* @return true
* @return false
*/
bool zaf_flash_set_default_data(uint32_t* defaultdata);
bool zaf_flash_check(void);

327
libzaf/zaf_gpio.c

@ -0,0 +1,327 @@
#include "zaf_gpio.h"
static bool gpio_enable_clock(GPIO_TypeDef *m_gpio) {
#ifdef GPIOA
if (m_gpio == GPIOA) {
__HAL_RCC_GPIOA_CLK_ENABLE();
return true;
}
#endif
#ifdef GPIOB
if (m_gpio == GPIOB) {
__HAL_RCC_GPIOB_CLK_ENABLE();
return true;
}
#endif
#ifdef GPIOC
if (m_gpio == GPIOC) {
__HAL_RCC_GPIOC_CLK_ENABLE();
return true;
}
#endif
#ifdef GPIOD
if (m_gpio == GPIOD) {
__HAL_RCC_GPIOD_CLK_ENABLE();
return true;
}
#endif
#ifdef GPIOE
if (m_gpio == GPIOE) {
__HAL_RCC_GPIOE_CLK_ENABLE();
return true;
}
#endif
#ifdef GPIOF
if (m_gpio == GPIOF) {
__HAL_RCC_GPIOF_CLK_ENABLE();
return true;
}
#endif
#ifdef GPIOG
if (m_gpio == GPIOG) {
__HAL_RCC_GPIOG_CLK_ENABLE();
return true;
}
#endif
#ifdef GPIOH
if (m_gpio == GPIOH) {
__HAL_RCC_GPIOH_CLK_ENABLE();
return true;
}
#endif
#ifdef GPIOI
if (m_gpio == GPIOI) {
__HAL_RCC_GPIOI_CLK_ENABLE();
return true;
}
#endif
#ifdef GPIOJ
if (m_gpio == GPIOJ) {
__HAL_RCC_GPIOJ_CLK_ENABLE();
return true;
}
#endif
#ifdef GPIOK
if (m_gpio == GPIOK) {
__HAL_RCC_GPIOK_CLK_ENABLE();
return true;
}
#endif
return false;
}
static GPIO_TypeDef *_chip_get_gpio(Pin_t pin) {
int port = pin >> 4;
switch (port) {
case 1:
#ifdef GPIOA
return GPIOA;
#endif
break;
case 2:
#ifdef GPIOB
return GPIOB;
#endif
break;
case 3:
#ifdef GPIOC
return GPIOC;
#endif
break;
case 4:
#ifdef GPIOD
return GPIOD;
#endif
break;
case 5:
#ifdef GPIOE
return GPIOE;
#endif
break;
case 6:
#ifdef GPIOF
return GPIOF;
#endif
break;
case 7:
#ifdef GPIOG
return GPIOG;
#endif
break;
default:
break;
}
return NULL;
}
static uint16_t _chip_get_pinoff(Pin_t pin) {
uint16_t pinoff = pin & 0x0F;
switch (pinoff) {
case 0:
return GPIO_PIN_0;
case 1:
return GPIO_PIN_1;
case 2:
return GPIO_PIN_2;
case 3:
return GPIO_PIN_3;
case 4:
return GPIO_PIN_4;
case 5:
return GPIO_PIN_5;
case 6:
return GPIO_PIN_6;
case 7:
return GPIO_PIN_7;
case 8:
return GPIO_PIN_8;
case 9:
return GPIO_PIN_9;
case 10:
return GPIO_PIN_10;
case 11:
return GPIO_PIN_11;
case 12:
return GPIO_PIN_12;
case 13:
return GPIO_PIN_13;
case 14:
return GPIO_PIN_14;
case 15:
return GPIO_PIN_15;
default:
break;
};
return 0;
}
IRQn_Type getEXTIIRQn(int32_t m_pinoff) {
switch (m_pinoff) {
case GPIO_PIN_0:
return EXTI0_IRQn;
case GPIO_PIN_1:
return EXTI1_IRQn;
case GPIO_PIN_2:
return EXTI2_IRQn;
case GPIO_PIN_3:
return EXTI3_IRQn;
case GPIO_PIN_4:
return EXTI4_IRQn;
case GPIO_PIN_5:
case GPIO_PIN_6:
case GPIO_PIN_7:
case GPIO_PIN_8:
case GPIO_PIN_9:
return EXTI9_5_IRQn;
case GPIO_PIN_10:
case GPIO_PIN_11:
case GPIO_PIN_12:
case GPIO_PIN_13:
case GPIO_PIN_14:
case GPIO_PIN_15:
return EXTI15_10_IRQn;
default:
ZASSERT(0);
}
return EXTI0_IRQn;
}
void zaf_gpio_init_as_input(zaf_gpio_t *gpio, Pin_t pin,zaf_gpio_mode_t mode,zaf_gpio_irq_t irqtype, bool mirror) {
if (pin == PinNull) return;
gpio->mirror = mirror;
gpio->mode = mode;
gpio->irqtype = irqtype;
gpio->gpiotype = kxs_gpio_input;
gpio->pin = pin;
gpio->gpio = _chip_get_gpio(pin);
gpio->pinoff = _chip_get_pinoff(pin);
// kxs_gpio_nopull, //
// kxs_gpio_pullup, //
// kxs_gpio_pulldown, //
// kxs_gpio_od,
uint32_t pulluptype = 0;
if (mode == kxs_gpio_nopull) {
pulluptype = GPIO_NOPULL;
} else if (mode == kxs_gpio_pullup) {
pulluptype = GPIO_PULLUP;
} else if (mode == kxs_gpio_pulldown) {
pulluptype = GPIO_PULLDOWN;
}
gpio_enable_clock(gpio->gpio);
// kxs_gpio_no_irq,
// kxs_gpio_rising_irq,
// kxs_gpio_falling_irq,
// kxs_gpio_rising_and_falling_irq,
GPIO_InitTypeDef init_type_def = {0};
if (gpio->irqtype == kxs_gpio_no_irq) {
init_type_def.Pin = gpio->pinoff;
init_type_def.Mode = GPIO_MODE_INPUT;
init_type_def.Pull = pulluptype;
init_type_def.Speed = GPIO_SPEED_FREQ_LOW;
} else if (gpio->irqtype == kxs_gpio_rising_irq) {
init_type_def.Pin = gpio->pinoff;
init_type_def.Mode = gpio->mirror ? GPIO_MODE_IT_FALLING : GPIO_MODE_IT_RISING;
init_type_def.Pull = pulluptype;
init_type_def.Speed = GPIO_SPEED_FREQ_LOW;
} else if (gpio->irqtype == kxs_gpio_falling_irq) {
init_type_def.Pin = gpio->pinoff;
init_type_def.Mode = !gpio->mirror ? GPIO_MODE_IT_FALLING : GPIO_MODE_IT_RISING;
init_type_def.Pull = pulluptype;
init_type_def.Speed = GPIO_SPEED_FREQ_LOW;
} else if (gpio->irqtype == kxs_gpio_rising_and_falling_irq) {
init_type_def.Pin = gpio->pinoff;
init_type_def.Mode = GPIO_MODE_IT_RISING_FALLING;
init_type_def.Pull = pulluptype;
init_type_def.Speed = GPIO_SPEED_FREQ_LOW;
}
HAL_GPIO_Init(gpio->gpio, &init_type_def);
if (gpio->irqtype != kxs_gpio_no_irq) {
HAL_NVIC_SetPriority(getEXTIIRQn(gpio->pinoff), PC_IRQ_PREEMPTPRIORITY_DEFAULT, 0);
HAL_NVIC_EnableIRQ(getEXTIIRQn(gpio->pinoff));
}
gpio->inited = true;
return;
}
void zaf_gpio_init_as_output(zaf_gpio_t *gpio, Pin_t pin,zaf_gpio_mode_t mode, bool mirror, bool initLevel) {
if (pin == PinNull) return;
gpio->mirror = mirror;
gpio->mode = mode;
gpio->irqtype = kxs_gpio_no_irq;
gpio->gpiotype = kxs_gpio_output;
gpio->pin = pin;
gpio->gpio = _chip_get_gpio(pin);
gpio->pinoff = _chip_get_pinoff(pin);
gpio_enable_clock(gpio->gpio);
GPIO_InitTypeDef init_type_def = {0};
initLevel = gpio->mirror ? !initLevel : initLevel;
GPIO_PinState pinState = initLevel ? GPIO_PIN_SET : GPIO_PIN_RESET;
HAL_GPIO_WritePin(gpio->gpio, gpio->pinoff, pinState);
if (gpio->mode == kxs_gpio_nopull) {
init_type_def.Pin = gpio->pinoff;
init_type_def.Mode = GPIO_MODE_OUTPUT_PP;
init_type_def.Pull = GPIO_NOPULL;
init_type_def.Speed = GPIO_SPEED_FREQ_LOW;
} else if (gpio->mode == kxs_gpio_pullup) {
init_type_def.Pin = gpio->pinoff;
init_type_def.Mode = GPIO_MODE_OUTPUT_PP;
init_type_def.Pull = GPIO_PULLUP;
init_type_def.Speed = GPIO_SPEED_FREQ_LOW;
} else if (gpio->mode == kxs_gpio_pulldown) {
init_type_def.Pin = gpio->pinoff;
init_type_def.Mode = GPIO_MODE_OUTPUT_PP;
init_type_def.Pull = GPIO_PULLDOWN;
init_type_def.Speed = GPIO_SPEED_FREQ_LOW;
} else if (gpio->mode == kxs_gpio_od) {
init_type_def.Pin = gpio->pinoff;
init_type_def.Mode = GPIO_MODE_OUTPUT_OD;
init_type_def.Pull = 0;
init_type_def.Speed = GPIO_SPEED_FREQ_LOW;
}
HAL_GPIO_Init(gpio->gpio, &init_type_def);
gpio->inited = true;
return;
}
bool zaf_gpio_read(zaf_gpio_t *gpio) {
GPIO_PinState pinState = HAL_GPIO_ReadPin(gpio->gpio, gpio->pinoff);
return !gpio->mirror ? pinState == GPIO_PIN_SET : pinState != GPIO_PIN_SET;
}
void zaf_gpio_write(zaf_gpio_t *gpio, bool level) {
level = gpio->mirror ? !level : level;
GPIO_PinState pinState = level ? GPIO_PIN_SET : GPIO_PIN_RESET;
HAL_GPIO_WritePin(gpio->gpio, gpio->pinoff, pinState);
}
void EXTI0_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); }
void EXTI1_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1); }
void EXTI2_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2); }
void EXTI3_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3); }
void EXTI4_IRQHandler() { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_4); }
void EXTI9_5_IRQHandler(void) {
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_6);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_7);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_9);
}
void EXTI15_10_IRQHandler(void) {
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_14);
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15);
}

36
libzaf/zaf_gpio.h

@ -0,0 +1,36 @@
#pragma once
#include "pin.h"
#include "zaf_basic.h"
#include "zaf_log.h"
typedef enum {
kxs_gpio_nopull, //
kxs_gpio_pullup, //
kxs_gpio_pulldown, //
kxs_gpio_od, //
}zaf_gpio_mode_t;
typedef enum { kxs_gpio_ain, kxs_gpio_input, kxs_gpio_output }zaf_gpio_type_t;
typedef enum {
kxs_gpio_no_irq,
kxs_gpio_rising_irq,
kxs_gpio_falling_irq,
kxs_gpio_rising_and_falling_irq,
}zaf_gpio_irq_t;
typedef struct {
Pin_t pin;
GPIO_TypeDef *gpio;
uint16_t pinoff;
zaf_gpio_mode_t mode;
zaf_gpio_type_t gpiotype;
zaf_gpio_irq_t irqtype;
bool mirror;
bool inited;
}zaf_gpio_t;
void zaf_gpio_init_as_input(zaf_gpio_t *gpio, Pin_t pin,zaf_gpio_mode_t mode,zaf_gpio_irq_t irqtype, bool mirror);
void zaf_gpio_init_as_output(zaf_gpio_t *gpio, Pin_t pin,zaf_gpio_mode_t mode, bool mirror, bool initLevel);
bool zaf_gpio_read(zaf_gpio_t *gpio);
void zaf_gpio_write(zaf_gpio_t *gpio, bool level);

31
libzaf/zaf_id.c

@ -0,0 +1,31 @@
#include "zaf_id.h"
#include "main.h"
#include "rng.h"
extern RNG_HandleTypeDef hrng;
void zaf_id_generate_random_mac(mac_t* id) {
id->mac[0] = 0x00; // 00 80 E1 ÊÇSTM32µÄMACµØÖ·Ç°Èýλ
id->mac[1] = 0x80;
id->mac[2] = 0xE1;
uint32_t random0 = 0;
uint32_t random1 = 0;
uint32_t random2 = 0;
HAL_RNG_GenerateRandomNumber(&hrng, &random0);
HAL_RNG_GenerateRandomNumber(&hrng, &random1);
HAL_RNG_GenerateRandomNumber(&hrng, &random2);
id->mac[3] = random0 % 256;
id->mac[4] = random1 % 256;
id->mac[5] = random2 % 256;
}
void zaf_id_get_cpu_id(cpu_id_t* id) {
// UID_BASE
uint8_t* uid_base = (uint8_t*)UID_BASE;
for (int32_t i = 0; i < 12; i++) {
id->id[i] = uid_base[i];
}
return;
}

12
libzaf/zaf_id.h

@ -0,0 +1,12 @@
#pragma once
#include <stdint.h>
typedef struct {
uint8_t mac[6];
} mac_t;
typedef struct {
uint8_t id[12]; // 96bit
} cpu_id_t;
void zaf_id_generate_random_mac(mac_t* id);
void zaf_id_get_cpu_id(cpu_id_t* id);

39
libzaf/zaf_log.c

@ -0,0 +1,39 @@
#include "zaf_log.h"
#include <stdarg.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
bool g_xs_enable_log = true;
extern UART_HandleTypeDef PC_DEBUG_UART;
/*********************************************************************
* @fn _write
*
* @brief Support Printf Function
*
* @param *buf - UART send Data.
* size - Data length
*
* @return size: Data length
*/
__attribute__((used)) int _write(int fd, char* buf, int size) {
int i;
for (i = 0; i < size; i++) {
uint8_t c = *buf++;
HAL_UART_Transmit(&PC_DEBUG_UART, &c, 1, 100);
}
return size;
}
void zaf_log_enable(bool enable) { g_xs_enable_log = enable; }
void zaf_log(const char* fmt, ...) {
if (g_xs_enable_log) {
va_list args;
va_start(args, fmt);
vprintf(fmt, args);
va_end(args);
}
}

39
libzaf/zaf_log.h

@ -0,0 +1,39 @@
#pragma once
#include "zaf_basic.h"
#include "zaf_delay.h"
extern bool g_xs_enable_log;
#define ZLOG_RELEASE(TAG, fmt, ...) \
if (g_xs_enable_log) { \
zaf_log(TAG "" fmt "\n", ##__VA_ARGS__); \
}
#define ZLOGI(TAG, fmt, ...) \
if (g_xs_enable_log) { \
zaf_log("%08lu INFO [%-8s] " fmt "\n", zaf_get_ticket(), TAG, ##__VA_ARGS__); \
}
#define ZLOGD(TAG, fmt, ...) \
if (g_xs_enable_log) { \
zaf_log("%08lu DEBU [%-8s] " fmt "\n", zaf_get_ticket(), TAG, ##__VA_ARGS__); \
}
#define ZLOGE(TAG, fmt, ...) \
if (g_xs_enable_log) { \
zaf_log("%08lu ERRO [%-8s] " fmt "\n", zaf_get_ticket(), TAG, ##__VA_ARGS__); \
}
#define ZLOGW(TAG, fmt, ...) \
if (g_xs_enable_log) { \
zaf_log("%08lu WARN [%-8s] " fmt "\n", zaf_get_ticket(), TAG, ##__VA_ARGS__); \
}
#define ASSERT(cond) \
if (!(cond)) { \
while (1) { \
zaf_log("ASSERT: %s [%s:%d]\n", #cond, __FILE__, __LINE__); \
zaf_delay_ms(1000); \
} \
}
#define ZASSERT(cond) ASSERT(cond)
void zaf_log(const char* fmt, ...);
void zaf_log_enable(bool enable);

104
libzaf/zaf_udp.c

@ -0,0 +1,104 @@
#include "zaf_udp.h"
#include "zaf_log.h"
#define TAG "zaf_udp"
#define UDP_DEFAULT_SEND_PORT 5000
#define SOCKET_DO(function) \
do { \
int ret = function; \
if (ret) { \
ZLOGE(TAG, "do %s fail", #function); \
return false; \
} \
} while (0)
static void udp_server_receive_thread(void const *argument) { //
udp_t *udp_handler = (udp_t *)argument;
ZLOGI(TAG, "udp server receive thread start: %s", udp_handler->name);
while (true) {
struct sockaddr_in sock;
socklen_t sock_len = sizeof(sock);
int recv_datalen = recvfrom(udp_handler->sock_fd, (char *)udp_handler->rxbuf, udp_handler->rxbuf_len, 0, (struct sockaddr *)&sock, &sock_len);
if (recv_datalen > 0) {
if (udp_handler->on_packet) udp_handler->on_packet(udp_handler, &sock, (uint8_t *)udp_handler->rxbuf, recv_datalen);
}
}
}
bool zaf_udp_init(udp_t *udp_handler, const char *name, uint16_t port, udp_on_packet_t on_packet, int32_t rxbuf_size, void *data) {
memset(udp_handler, 0, sizeof(udp_t));
udp_handler->server.sin_family = AF_INET;
udp_handler->server.sin_addr.s_addr = inet_addr("0.0.0.0");
udp_handler->server.sin_port = htons(port);
udp_handler->on_packet = on_packet;
udp_handler->data = data;
udp_handler->name = name;
if (rxbuf_size == 0) {
udp_handler->rxbuf_len = 1024;
} else {
udp_handler->rxbuf_len = rxbuf_size;
}
udp_handler->rxbuf = (char *)malloc(udp_handler->rxbuf_len);
ZASSERT(udp_handler->rxbuf != NULL);
// Socket
udp_handler->sock_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (udp_handler->sock_fd < 0) {
ZLOGE(TAG, "create socket fail");
return false;
}
//
SOCKET_DO(bind(udp_handler->sock_fd, (struct sockaddr *)&udp_handler->server, sizeof(udp_handler->server)));
//
struct timeval tv = {1, 0};
SOCKET_DO(lwip_setsockopt(udp_handler->sock_fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)));
if (on_packet) {
// 线
osThreadDef(udp_server_rx_thread, udp_server_receive_thread, osPriorityNormal, 0, 512);
udp_handler->rx_thread = osThreadCreate(osThread(udp_server_rx_thread), udp_handler);
ZASSERT(udp_handler->rx_thread != NULL);
}
return true;
}
int zaf_udp_send_message(udp_t *udp_handler, const char *ip, int port, const char *data, int len) { //
struct sockaddr_in sockaddr;
sockaddr.sin_family = AF_INET;
sockaddr.sin_addr.s_addr = inet_addr(ip);
sockaddr.sin_port = htons(port);
return sendto(udp_handler->sock_fd, data, len, 0, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
}
int zaf_udp_send_message2(udp_t *udp_handler, struct sockaddr_in *add, const char *data, int len) { //
return sendto(udp_handler->sock_fd, data, len, 0, (struct sockaddr *)add, sizeof(struct sockaddr_in));
}
bool zaf_udp_broadcast_init(udp_broadcast_handler_t *udp_handler, uint16_t localport) {
memset(udp_handler, 0, sizeof(udp_broadcast_handler_t));
udp_handler->server.sin_family = AF_INET;
udp_handler->server.sin_addr.s_addr = inet_addr("0.0.0.0");
udp_handler->server.sin_port = htons(localport);
// Socket
udp_handler->sock_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (udp_handler->sock_fd < 0) {
ZLOGE(TAG, "create socket fail");
return false;
}
//
struct timeval tv = {1, 0};
SOCKET_DO(lwip_setsockopt(udp_handler->sock_fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(tv)));
//
SOCKET_DO(bind(udp_handler->sock_fd, (struct sockaddr *)&udp_handler->server, sizeof(udp_handler->server)));
return true;
}
bool zaf_udp_broadcast(udp_broadcast_handler_t *handler, uint32_t remoteport, uint8_t *data, size_t datalen) {
struct sockaddr_in sockaddr;
sockaddr.sin_family = AF_INET;
sockaddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
sockaddr.sin_port = htons(remoteport);
return sendto(handler->sock_fd, data, datalen, 0, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
}

40
libzaf/zaf_udp.h

@ -0,0 +1,40 @@
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
#include <lwip/sockets.h>
#include <stdbool.h>
#include "lwip/api.h"
#include "lwip/opt.h"
#include "lwip/sys.h"
#include "project_configs.h"
typedef struct udp_s udp_t;
typedef void (*udp_on_packet_t)(udp_t *udp_handler, struct sockaddr_in *client, uint8_t *data, uint16_t len);
struct udp_s {
struct sockaddr_in server;
int sock_fd;
osThreadId rx_thread;
char *rxbuf;
int rxbuf_len;
udp_on_packet_t on_packet;
void *data;
const char *name;
};
typedef struct {
struct sockaddr_in server;
int sock_fd;
} udp_broadcast_handler_t;
bool zaf_udp_init(udp_t *udp_handler, const char *name, uint16_t port, udp_on_packet_t on_packet, int32_t rxbuf_size, void *data);
int zaf_udp_send_message(udp_t *udp_handler, const char *remoteip, int remoteport, const char *data, int len);
int zaf_udp_send_message2(udp_t *udp_handler, struct sockaddr_in *add, const char *data, int len);
bool zaf_udp_broadcast_init(udp_broadcast_handler_t *handler, uint16_t localport);
bool zaf_udp_broadcast(udp_broadcast_handler_t *handler, uint32_t remoteport, uint8_t *data, size_t datalen);
#ifdef __cplusplus
}
#endif

18
usrc/base_service/config_service.c

@ -27,10 +27,10 @@ static void create_default_config(config_t *now_cfg, bool cfg_is_error, config_t
static mac_t mac;
if (now_cfg->mac[0] == 0 && now_cfg->mac[1] == 0 && now_cfg->mac[2] == 0 && now_cfg->mac[3] == 0 && now_cfg->mac[4] == 0 && now_cfg->mac[5] == 0) {
xs_id_generate_random_mac(&mac);
zaf_id_generate_random_mac(&mac);
ZLOGI(TAG, "gen random mac is %02x:%02x:%02x:%02x:%02x:%02x", mac.mac[0], mac.mac[1], mac.mac[2], mac.mac[3], mac.mac[4], mac.mac[5]);
} else if (now_cfg->mac[0] == 0xff && now_cfg->mac[1] == 0xff && now_cfg->mac[2] == 0xff && now_cfg->mac[3] == 0xff && now_cfg->mac[4] == 0xff && now_cfg->mac[5] == 0xff) {
xs_id_generate_random_mac(&mac);
zaf_id_generate_random_mac(&mac);
ZLOGI(TAG, "gen random mac is %02x:%02x:%02x:%02x:%02x:%02x", mac.mac[0], mac.mac[1], mac.mac[2], mac.mac[3], mac.mac[4], mac.mac[5]);
} else {
memcpy(&mac.mac, now_cfg->mac, 6);
@ -44,15 +44,15 @@ void config_init(void) {
/**
* @brief flash³õʼ»¯
*/
xs_flash_init((uint32_t *)&_config, sizeof(config_t) / 4);
bool cfg_is_error = !xs_flash_check();
zaf_flash_init((uint32_t *)&_config, sizeof(config_t) / 4);
bool cfg_is_error = !zaf_flash_check();
create_default_config(&_config, cfg_is_error, &_default_val_config);
xs_flash_set_default_data((uint32_t *)&_default_val_config);
zaf_flash_set_default_data((uint32_t *)&_default_val_config);
if (cfg_is_error) {
xs_flash_factory_reset();
zaf_flash_factory_reset();
}
/**
* @brief ´òÓ¡ÅäÖÃÐÅÏ¢
@ -60,12 +60,12 @@ void config_init(void) {
dump_config(&_config);
}
config_t *config_get(void) { return &_config; }
void config_flush(void) { xs_flash_flush(); }
void config_factory_reset(void) { xs_flash_factory_reset(); }
void config_flush(void) {zaf_flash_flush(); }
void config_factory_reset(void) {zaf_flash_factory_reset(); }
void config_generate_random_mac(void) {
static mac_t mac;
xs_id_generate_random_mac(&mac);
zaf_id_generate_random_mac(&mac);
ZLOGI(TAG, "gen random mac is %02x:%02x:%02x:%02x:%02x:%02x", mac.mac[0], mac.mac[1], mac.mac[2], mac.mac[3], mac.mac[4], mac.mac[5]);
memset(&_config.mac[0], 0, sizeof(_config.mac));
memcpy(&_config.mac[0], mac.mac, 6);

2
usrc/base_service/config_service.h

@ -1,7 +1,7 @@
#pragma once
#include <stdint.h>
#include "iflytop_xsync\iflytop_xsync.h"
#include "project_dep.h"
#ifdef __cplusplus
extern "C" {

32
usrc/base_service/fpga_if.c

@ -6,7 +6,7 @@
*/
#define TAG "fpga_if"
static fpga_if_t fpga_if;
xs_gpio_t spi2_cs;
zaf_gpio_t spi2_cs;
SemaphoreHandle_t m_spilock;
void fpga_if_init() { //
@ -20,7 +20,7 @@ void fpga_if_init() { //
*/
fpga_if.spi2 = &hspi2;
xs_gpio_init_as_output(&spi2_cs, PB9, kxs_gpio_nopull, false, true);
zaf_gpio_init_as_output(&spi2_cs, PB9, kxs_gpio_nopull, false, true);
HAL_SPI_Receive(fpga_if.spi2, rxbuf, 1, 1000);
// fpga_if.spi2 = &hspi1;
@ -32,14 +32,14 @@ void fpga_if_init() { //
fpga_if.reset_pin = PD7;
#if 1
xs_gpio_init_as_input(&fpga_if.camera_sync_code_irq_io, fpga_if.camera_sync_code_irq_pin, kxs_gpio_pulldown, kxs_gpio_rising_irq, false);
xs_gpio_init_as_input(&fpga_if.timecode_irq_io, fpga_if.timecode_irq_pin, kxs_gpio_pulldown, kxs_gpio_rising_irq, false);
xs_gpio_init_as_input(&fpga_if.xsync_workstate_start_sig_irq_io, fpga_if.xsync_workstate_start_sig_irq_io_pin, kxs_gpio_pulldown, kxs_gpio_rising_and_falling_irq, false);
xs_gpio_init_as_output(&fpga_if.reset_pin_io, fpga_if.reset_pin, kxs_gpio_pullup, false, false);
zaf_gpio_init_as_input(&fpga_if.camera_sync_code_irq_io, fpga_if.camera_sync_code_irq_pin, kxs_gpio_pulldown, kxs_gpio_rising_irq, false);
zaf_gpio_init_as_input(&fpga_if.timecode_irq_io, fpga_if.timecode_irq_pin, kxs_gpio_pulldown, kxs_gpio_rising_irq, false);
zaf_gpio_init_as_input(&fpga_if.xsync_workstate_start_sig_irq_io, fpga_if.xsync_workstate_start_sig_irq_io_pin, kxs_gpio_pulldown, kxs_gpio_rising_and_falling_irq, false);
zaf_gpio_init_as_output(&fpga_if.reset_pin_io, fpga_if.reset_pin, kxs_gpio_pullup, false, false);
xs_gpio_write(&fpga_if.reset_pin_io, false);
xs_delay_us(1);
xs_gpio_write(&fpga_if.reset_pin_io, true);
zaf_gpio_write(&fpga_if.reset_pin_io, false);
zaf_delay_us(1);
zaf_gpio_write(&fpga_if.reset_pin_io, true);
#endif
}
void fpga_if_get_timecode(uint32_t *timecode0, uint32_t *timecode1) {
@ -105,20 +105,20 @@ void fpga_if_spi_write_data_01(uint32_t add, uint32_t txdata, uint32_t *rxdata)
void fpga_if_spi_read_data_01(uint32_t add, uint32_t *rxdata) { _fpga_if_spi_read_data(fpga_if.spi1, add, rxdata); }
void fpga_if_spi_write_data_02(uint32_t add, uint32_t txdata, uint32_t *rxdata) {
xSemaphoreTakeRecursive(m_spilock, portMAX_DELAY);
xs_gpio_write(&spi2_cs, false);
zaf_gpio_write(&spi2_cs, false);
_fpga_if_spi_write_data(fpga_if.spi2, add, txdata, rxdata);
xs_gpio_write(&spi2_cs, true);
xs_delay_us(1);
xs_gpio_write(&spi2_cs, false);
zaf_gpio_write(&spi2_cs, true);
zaf_delay_us(1);
zaf_gpio_write(&spi2_cs, false);
_fpga_if_spi_read_data(fpga_if.spi2, add, rxdata);
xs_gpio_write(&spi2_cs, true);
zaf_gpio_write(&spi2_cs, true);
xSemaphoreGiveRecursive(m_spilock);
}
void fpga_if_spi_read_data_02(uint32_t add, uint32_t *rxdata) {
xSemaphoreTakeRecursive(m_spilock, portMAX_DELAY);
xs_gpio_write(&spi2_cs, false);
zaf_gpio_write(&spi2_cs, false);
_fpga_if_spi_read_data(fpga_if.spi2, add, rxdata);
xs_gpio_write(&spi2_cs, true);
zaf_gpio_write(&spi2_cs, true);
xSemaphoreGiveRecursive(m_spilock);
}

12
usrc/base_service/fpga_if.h

@ -17,8 +17,8 @@ typedef struct {
* @brief timecode²¢¿Ú
*/
xs_gpio_t timecode_add[4];
xs_gpio_t timecode_data[8];
zaf_gpio_t timecode_add[4];
zaf_gpio_t timecode_data[8];
Pin_t timecode_add_pin[4];
Pin_t timecode_data_pin[8];
@ -28,10 +28,10 @@ typedef struct {
Pin_t xsync_workstate_start_sig_irq_io_pin;
Pin_t reset_pin;
xs_gpio_t timecode_irq_io;
xs_gpio_t camera_sync_code_irq_io;
xs_gpio_t xsync_workstate_start_sig_irq_io;
xs_gpio_t reset_pin_io;
zaf_gpio_t timecode_irq_io;
zaf_gpio_t camera_sync_code_irq_io;
zaf_gpio_t xsync_workstate_start_sig_irq_io;
zaf_gpio_t reset_pin_io;
} fpga_if_t;
/**

44
usrc/main.cpp

@ -35,9 +35,9 @@ void StartDefaultTask(void const* argument) { umain(); }
*
*/
xs_gpio_t m_debug_led;
xs_gpio_t m_factory_reset_key;
xs_gpio_t m_power_led;
zaf_gpio_t m_debug_led;
zaf_gpio_t m_factory_reset_key;
zaf_gpio_t m_power_led;
extern "C" {
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { ReportGeneratorService_irq_trigger(GPIO_Pin); }
}
@ -45,10 +45,10 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { ReportGeneratorService_irq_trig
void debug_light_ctrl() {
static uint32_t lastcall = 0;
static bool light_status = false;
if (xs_has_passedms(lastcall) > 100) {
if (zaf_has_passedms(lastcall) > 100) {
light_status = !light_status;
xs_gpio_write(&m_debug_led, light_status);
lastcall = xs_get_ticket();
zaf_gpio_write(&m_debug_led, light_status);
lastcall =zaf_get_ticket();
}
}
@ -56,25 +56,25 @@ void factory_reset_key_detect() {
static uint32_t reset_key_trigger_tp = 0;
static bool reset_key_triggered = false;
if (!reset_key_triggered) {
if (xs_gpio_read(&m_factory_reset_key)) {
reset_key_trigger_tp = xs_get_ticket();
if (zaf_gpio_read(&m_factory_reset_key)) {
reset_key_trigger_tp =zaf_get_ticket();
reset_key_triggered = true;
}
}
if (reset_key_triggered) {
if (!xs_gpio_read(&m_factory_reset_key)) {
if (!zaf_gpio_read(&m_factory_reset_key)) {
reset_key_triggered = false;
} else {
if (xs_has_passedms(reset_key_trigger_tp) > 3000) {
if (zaf_has_passedms(reset_key_trigger_tp) > 3000) {
ZLOGI(TAG, "factory reset key triggered");
config_factory_reset();
// m_power_led
while (xs_gpio_read(&m_factory_reset_key)) {
xs_gpio_write(&m_power_led, false);
while (zaf_gpio_read(&m_factory_reset_key)) {
zaf_gpio_write(&m_power_led, false);
osDelay(100);
xs_gpio_write(&m_power_led, true);
zaf_gpio_write(&m_power_led, true);
osDelay(100);
}
ZLOGI(TAG, "system reset");
@ -92,8 +92,8 @@ void umain() {
sn_t sn;
device_info_init();
device_info_get_sn(&sn);
XS_LOGI(TAG, "%s:%d", PC_PROJECT_NAME, PC_VERSION);
XS_LOGI(TAG, "sn: %x:%x:%x", sn.sn0, sn.sn1, sn.sn2);
ZLOGI(TAG, "%s:%d", PC_PROJECT_NAME, PC_VERSION);
ZLOGI(TAG, "sn: %x:%x:%x", sn.sn0, sn.sn1, sn.sn2);
/**
* @brief
@ -101,9 +101,9 @@ void umain() {
* 2.
* 3.
*/
xs_gpio_init_as_output(&m_debug_led, PC_DEBUG_LIGHT_GPIO, kxs_gpio_nopull, false, false);
xs_gpio_init_as_output(&m_power_led, POWER_LED_PIN, kxs_gpio_nopull, false, true);
xs_gpio_init_as_input(&m_factory_reset_key, FACTORY_RESET_KEY, kxs_gpio_nopull, kxs_gpio_no_irq, true);
zaf_gpio_init_as_output(&m_debug_led, PC_DEBUG_LIGHT_GPIO, kxs_gpio_nopull, false, false);
zaf_gpio_init_as_output(&m_power_led, POWER_LED_PIN, kxs_gpio_nopull, false, true);
zaf_gpio_init_as_input(&m_factory_reset_key, FACTORY_RESET_KEY, kxs_gpio_nopull, kxs_gpio_no_irq, true);
// m_power_led
/**
* @brief
@ -120,7 +120,7 @@ void umain() {
/**
* @brief report_generator init
*/
ReportGeneratorService_init(fpga_if_get_instance()->timecode_irq_pin, fpga_if_get_instance()->camera_sync_code_irq_pin);
// ReportGeneratorService_init(fpga_if_get_instance()->timecode_irq_pin, fpga_if_get_instance()->camera_sync_code_irq_pin);
/**
* @brief reg_manager init
@ -144,13 +144,13 @@ void umain() {
debug_light_ctrl();
factory_reset_key_detect();
if (xs_has_passedms(0) >= 1* 60 * 60 * 1000) {
if (zaf_has_passedms(0) >= 1* 60 * 60 * 1000) {
//限制客户使用时长
// reset_pin_io
NVIC_SystemReset();
}
// ZLOGI(TAG,"factory_reset_key_state %d",xs_gpio_read(&m_factory_reset_key));
// ZLOGI(TAG,"factory_reset_key_state %d",zaf_gpio_read(&m_factory_reset_key));
// osDelay(10);
// fpga_if_spi_write_data_01(33, count, &rxdata);
@ -166,7 +166,7 @@ void umain() {
// }
// count++;
// ZLOGI(TAG, "fpga_if_init: %d", xs_gpio_read(&fpga_if_get_instance()->xsync_workstate_start_sig_irq_io));
// ZLOGI(TAG, "fpga_if_init: %d",zaf_gpio_read(&fpga_if_get_instance()->xsync_workstate_start_sig_irq_io));
// ZLOGI(TAG, "rxdata: %x", rxdata);
}
}

2
usrc/project_configs.h

@ -3,7 +3,7 @@
#define PC_VERSION 1
#define PC_MANUFACTURER0 ('i' | 'f' << 8 | 'l' << 16 | 'y' << 24)
#define PC_MANUFACTURER1 ('t' | 'o' << 8 | 'p' << 16 | '\0' << 24)
#define PC_PROJECT_NAME "xsync"
#define PC_PROJECT_NAME "zaf_lstc"
#define PC_IFLYTOP_ENABLE_OS 1
#define PC_DEBUG_UART huart1

4
usrc/project_dep.h

@ -8,8 +8,8 @@
#include "lwip/opt.h"
#include "lwip/sys.h"
#include "iflytop_xsync_protocol\iflytop_xsync_protocol.h"
#include "iflytop_xsync\iflytop_xsync.h"
#include "libzaf\zaf.h"
#include "zaf_protocol\zaf_protocol.h"
#include "main.h"
#include "spi.h"

4
usrc/service/device_info.cpp

@ -1,13 +1,11 @@
#include "device_info.hpp"
#include "iflytop_xsync/xs_id.h"
void device_info_init() {}
void device_info_get_sn(sn_t* device_id) {
static cpu_id_t cpu_id;
xs_id_get_cpu_id(&cpu_id);
zaf_id_get_cpu_id(&cpu_id);
device_id->sn0 = cpu_id.id[0] | (cpu_id.id[1] << 8) | (cpu_id.id[2] << 16) | (cpu_id.id[3] << 24);
device_id->sn1 = cpu_id.id[4] | (cpu_id.id[5] << 8) | (cpu_id.id[6] << 16) | (cpu_id.id[7] << 24);
device_id->sn2 = cpu_id.id[8] | (cpu_id.id[9] << 8) | (cpu_id.id[10] << 16) | (cpu_id.id[11] << 24);

2
usrc/service/device_info.hpp

@ -1,5 +1,5 @@
#pragma once
#include "iflytop_xsync/iflytop_xsync.h"
#include "libzaf\zaf.h"
#include "project_configs.h"
#ifdef __cplusplus

8
usrc/service/extern_if_service.c

@ -1,8 +1,6 @@
#include "iflytop_xsync_protocol\iflytop_xsync_protocol.h"
#include "project_configs.h"
#include "project_dep.h"
//
#include "iflytop_xsync\xs_udp.h"
#include "reg_manager.h"
#define TAG "extern_if_service"
@ -37,7 +35,7 @@ static void create_and_send_receipt(extern_if_service_context_t *context, uint32
txpacket->cmd = context->rxpacket->cmd;
txpacket->ndata = ndata;
memcpy(txpacket->data, data, ndata * sizeof(uint32_t));
xs_udp_send_message2(context->server, context->client, (const char *)txbuf, sizeof(iflytop_xsync_packet_header_t) + ndata * sizeof(uint32_t));
zaf_udp_send_message2(context->server, context->client, (const char *)txbuf, sizeof(iflytop_xsync_packet_header_t) + ndata * sizeof(uint32_t));
}
#if 0
/**
@ -56,7 +54,7 @@ static void create_and_send_timecode(struct sockaddr_in client, uint32_t timecod
txpacket->ndata = 2;
txpacket->data[0] = timecode0;
txpacket->data[1] = timecode1;
xs_udp_send_message2(&m_udp_cmd_server, &client, txbuf, sizeof(iflytop_xsync_packet_header_t) + 2 * sizeof(uint32_t));
zaf_udp_send_message2(&m_udp_cmd_server, &client, txbuf, sizeof(iflytop_xsync_packet_header_t) + 2 * sizeof(uint32_t));
}
#endif
@ -118,7 +116,7 @@ static void udp_on_packet(udp_t *server, struct sockaddr_in *client, uint8_t *da
}
}
void extern_if_service_init() { ZASSERT(xs_udp_init(&m_udp_cmd_server, "extern_if_udp", IFLYTOP_XSYNC_SERVICE_XSYNC_PORT, udp_on_packet, 1024, NULL)); }
void extern_if_service_init() { ZASSERT(zaf_udp_init(&m_udp_cmd_server, "extern_if_udp", IFLYTOP_XSYNC_SERVICE_XSYNC_PORT, udp_on_packet, 1024, NULL)); }
#if 0
void extern_if_service_send_timecode(struct sockaddr_in client, uint32_t timecode0, uint32_t timecode1) { create_and_send_timecode(client, timecode0, timecode1); }
#endif

1
usrc/service/extern_if_service.h

@ -1,5 +1,6 @@
#pragma once
#include <stdint.h>
#include "project_dep.h"
#ifdef __cplusplus
extern "C" {
#endif

0
usrc/service/global_flag.c

1
usrc/service/reg_manager.c

@ -3,7 +3,6 @@
#include "base_service/config_service.h"
#include "base_service/fpga_if.h"
#include "device_info.hpp"
#include "iflytop_xsync_protocol/iflytop_xsync_protocol.h"
#include "service/report_generator_service.h"
uint32_t m_action_val0;

3
usrc/service/reg_manager.h

@ -2,8 +2,7 @@
#ifdef __cplusplus
extern "C" {
#endif
#include "iflytop_xsync/iflytop_xsync.h"
#include "project_configs.h"
#include "project_dep.h"
#define MAX_REG_NUM 256

17
usrc/service/report_generator_service.c

@ -1,11 +1,8 @@
#include "iflytop_xsync_protocol\iflytop_xsync_protocol.h"
#include "project_configs.h"
#include "project_dep.h"
//
#include "report_generator_service.h"
#include "base_service/fpga_if.h"
#include "base_service/task_level_config.h"
#include "base_service/xsync_regs.hpp"
#include "iflytop_xsync\xs_udp.h"
#include "reg_manager.h"
static udp_broadcast_handler_t m_udp_camera_sync_sender; //
@ -36,7 +33,7 @@ static void create_and_send_timecode(uint32_t timecode0, uint32_t timecode1) {
txpacket->eventid = ktimecode_report_event;
txpacket->data[0] = timecode0;
txpacket->data[1] = timecode1;
xs_udp_broadcast(&m_udp_camera_timecode_sender, IFLYTOP_XSYNC_EVENT_REPORT_PC_PORT, txbuf, sizeof(iflytop_xsync_event_report_packet_t) + 8);
zaf_udp_broadcast(&m_udp_camera_timecode_sender, IFLYTOP_XSYNC_EVENT_REPORT_PC_PORT, txbuf, sizeof(iflytop_xsync_event_report_packet_t) + 8);
}
static void create_and_send_sync_record_state_packet(uint32_t workstate, uint32_t timecode0, uint32_t timecode1) {
static uint8_t txbuf[256];
@ -47,7 +44,7 @@ static void create_and_send_sync_record_state_packet(uint32_t workstate, uint32_
txpacket->data[1] = timecode0;
txpacket->data[2] = timecode1;
xs_udp_broadcast(&m_udp_camera_timecode_sender, IFLYTOP_XSYNC_EVENT_REPORT_PC_PORT, txbuf, sizeof(iflytop_xsync_event_report_packet_t) + 4 * packetdatalen);
zaf_udp_broadcast(&m_udp_camera_timecode_sender, IFLYTOP_XSYNC_EVENT_REPORT_PC_PORT, txbuf, sizeof(iflytop_xsync_event_report_packet_t) + 4 * packetdatalen);
}
/**
* @brief
@ -65,7 +62,7 @@ static void create_and_send_camera_sync_msg(uint32_t count) {
txbuf[5] = (count >> 16) & 0xFF;
txbuf[4] = (count >> 24) & 0xFF;
xs_udp_broadcast(&m_udp_camera_sync_sender, IFLYTOP_XSYNC_CAMERA_SYNC_PACKET_PC_PORT, txbuf, sizeof(txbuf));
zaf_udp_broadcast(&m_udp_camera_sync_sender, IFLYTOP_XSYNC_CAMERA_SYNC_PACKET_PC_PORT, txbuf, sizeof(txbuf));
}
static void timecode_report_thread(void const *argument) {
@ -103,7 +100,7 @@ static void xync_signal_report_thread(void const *argument) {
m_xyns_camera_sync_packet_last_report_tp = HAL_GetTick();
create_and_send_camera_sync_msg(m_sync_count);
m_sync_count++;
} else if (xs_has_passedms(m_xyns_camera_sync_packet_last_report_tp) >= 998) {
} else if (zaf_has_passedms(m_xyns_camera_sync_packet_last_report_tp) >= 998) {
// TODO:500HZ的时候1s上报一次消息
m_xyns_camera_sync_packet_last_report_tp = HAL_GetTick();
create_and_send_camera_sync_msg(m_sync_count);
@ -122,7 +119,7 @@ void ReportGeneratorService_irq_trigger(uint16_t gpiopin) {
osSignalSet(timecode_report_thread_id, 0x01);
}
if (m_xsync_workstate_start_sig_irq_pin_off == gpiopin) {
if (xs_gpio_read(&fpga_if_get_instance()->xsync_workstate_start_sig_irq_io)) {
if (zaf_gpio_read(&fpga_if_get_instance()->xsync_workstate_start_sig_irq_io)) {
osSignalSet(timecode_report_thread_id, 0x02); //
} else {
osSignalSet(timecode_report_thread_id, 0x04); //

4
usrc/service/report_generator_service.h

@ -1,7 +1,7 @@
#pragma once
#include <stdint.h>
#include "iflytop_xsync\pin.h"
#include "project_dep.h"
#ifdef __cplusplus
extern "C" {
@ -23,7 +23,7 @@ extern "C" {
* @param timecode_trigger_pin
* @param xync_trigger_pin
*/
void ReportGeneratorService_init(Pin_t timecode_trigger_pin, Pin_t xync_trigger_pin);
void ReportGeneratorService_init();
/**
* @brief IO中断触发时

BIN
xsync_v3.pdf

191
zaf_protocol/zaf_protocol.h

@ -0,0 +1,191 @@
#pragma once
#include <stdint.h>
/**
* @brief XSYNC协议端口
*/
#define IFLYTOP_XSYNC_SERVICE_XSYNC_PORT 19900 // xsync端端口
#define IFLYTOP_XSYNC_SERVICE_PC_PORT 19901 // pc 端端口
#define IFLYTOP_XSYNC_EVENT_REPORT_XSYNC_PORT 19902 // xsync端端口
#define IFLYTOP_XSYNC_EVENT_REPORT_PC_PORT 19903 // pc端端口
#define IFLYTOP_XSYNC_CAMERA_SYNC_PACKET_XSYNC_PORT 13013 // xsync端端口
#define IFLYTOP_XSYNC_CAMERA_SYNC_PACKET_PC_PORT 13014 // pc端端口
/**
* @brief
*
*
* kxsync_packet_type_reg_read:
* tx: regadd
* rx: ecode,regdata
*
* kxsync_packet_type_reg_write
* tx: regadd,regdata
* rx: ecode,regdata
*
* kxsync_packet_type_reg_read_regs
* tx: regstartadd,nreg
* rx: ecode,regdatas
*
*/
typedef enum {
kxsync_packet_type_none = 0,
kxsync_packet_type_reg_read = 1,
kxsync_packet_type_reg_write = 2,
kxsync_packet_type_reg_read_regs = 3,
kxsync_packet_type_timecode_report = 4,
} xsync_protocol_cmd_t;
typedef enum {
kxsync_packet_type_cmd = 0,
kxsync_packet_type_receipt = 1,
kxsync_packet_type_report = 2,
} xsync_protocol_packet_type_t;
typedef enum {
kxs_ec_success = 0,
kxs_ec_overtime = 1,
kxs_ec_socket_fail = 2,
kxs_ec_bind_fail = 3,
kxs_ec_send_fail = 4,
kxs_ec_receive_fail = 5,
kxs_ec_setsockopt_rx_timeout_fail = 6,
kxs_ec_lose_connect = 7,
kxs_ec_param_error = 8,
}zaf_error_code_t;
static inline const char*zaf_error_code_2_str(zaf_error_code_t ecode) {
switch (ecode) {
case kxs_ec_success:
return "success";
case kxs_ec_overtime:
return "overtime";
case kxs_ec_socket_fail:
return "socket fail";
case kxs_ec_bind_fail:
return "bind fail";
case kxs_ec_send_fail:
return "send fail";
case kxs_ec_receive_fail:
return "receive fail";
case kxs_ec_setsockopt_rx_timeout_fail:
return "setsockopt rx timeout fail";
case kxs_ec_lose_connect:
return "lose connect";
case kxs_ec_param_error:
return "param error";
default:
return "unknown error";
}
}
#pragma pack(1)
typedef struct {
uint16_t type;
uint16_t index;
uint16_t cmd;
uint16_t ndata;
uint32_t data[]; // first is always checksum
} iflytop_xsync_packet_header_t;
typedef struct {
uint32_t eventid;
uint32_t data[];
} iflytop_xsync_event_report_packet_t;
typedef enum {
ktimecode_report_event = 0,
kxsync_work_state_report_event = 1,
} iflytop_event_type_t;
#define XYSNC_REG_DEVICE_INFO_START_ADD 0
#define XYSNC_REG_STM32_CONFIG_START_ADD 16
#define XYSNC_REG_FPGA_REG_START 32
#define REG_ADD_OFF_STM32 (0x0000)
#define REG_ADD_OFF_FPGA_TEST (0x00020)
//
#define REG_ADD_OFF_CONTROL_SENSOR (0x00030)
//
#define REG_ADD_OFF_TTLIN1 (0x0100)
#define REG_ADD_OFF_TTLIN2 (0x0110)
#define REG_ADD_OFF_TTLIN3 (0x0120)
#define REG_ADD_OFF_TTLIN4 (0x0130)
#define REG_ADD_OFF_TIMECODE_IN (0x0140)
#define REG_ADD_OFF_GENLOCK_IN (0x0150)
//
#define REG_ADD_OFF_TTLOUT1 (0x0200)
#define REG_ADD_OFF_TTLOUT2 (0x0210)
#define REG_ADD_OFF_TTLOUT3 (0x0220)
#define REG_ADD_OFF_TTLOUT4 (0x0230)
#define REG_ADD_OFF_TIMECODE_OUT (0x0240)
#define REG_ADD_OFF_GENLOCK_OUT (0x0250)
#define REG_ADD_OFF_STM32_IF (0x0260)
//
#define REG_ADD_OFF_DEBUGER (0x0300)
typedef enum {
/**
* @brief
* REG 0(16)
*/
kxsync_reg_software_version = 0,
kxsync_reg_manufacturer0 = 1,
kxsync_reg_manufacturer1 = 2,
kxsync_reg_product_type_id = 3,
kxsync_reg_sn_id0 = 4,
kxsync_reg_sn_id1 = 5,
kxsync_reg_sn_id2 = 6,
kxsync_reg_mac0 = 7,
kxsync_reg_mac1 = 8,
/**
* @brief
* REG 16(32) STM32配置寄存器0
*/
kxsync_reg_stm32_obtaining_ip_mode = XYSNC_REG_STM32_CONFIG_START_ADD + 0,
kxsync_reg_stm32_ip = XYSNC_REG_STM32_CONFIG_START_ADD + 1,
kxsync_reg_stm32_gw = XYSNC_REG_STM32_CONFIG_START_ADD + 2,
kxsync_reg_stm32_netmask = XYSNC_REG_STM32_CONFIG_START_ADD + 3,
kxsync_reg_stm32_config0 = XYSNC_REG_STM32_CONFIG_START_ADD + 4, // bit0: timecode report enable, bit1: camera sync report enable
kxsync_reg_stm32_camera_sync_signal_count = XYSNC_REG_STM32_CONFIG_START_ADD + 5, //
// kxsync_reg_stm32_camera_sync_signal_report_period = XYSNC_REG_STM32_CONFIG_START_ADD + 6, //
kxsync_reg_stm32_action0 = XYSNC_REG_STM32_CONFIG_START_ADD + 14, // action reg
kxsync_reg_stm32_action_val0 = XYSNC_REG_STM32_CONFIG_START_ADD + 15, // action val reg
} xsync_reg_add_t;
#define KXSYNC_REG_STM32_CONFIG0_MASK_TIMECODE_REPORT_ENABLE 0x01
#define KXSYNC_REG_STM32_CONFIG0_MASK_CAMERA_SYNC_REPORT_ENABLE 0x02
typedef enum {
xsync_stm32_action_none, //
xsync_stm32_action_generator_new_mac, //
xsync_stm32_action_factory_reset, //
xsync_stm32_action_reboot, //
xsync_stm32_action_storage_cfg, //
} xsync_stm32_action_t;
typedef enum {
kxsync_device_type_none = 0,
kxsync_device_type_xsync = 1,
kxsync_device_type_puck_station = 2,
kxsync_device_type_encoder = 3,
} xsync_device_type_t;
typedef enum { obtaining_ip_mode_type_static = 0, obtaining_ip_mode_type_dhcp = 1 } obtaining_ip_mode_t;
static inline const char* obtaining_ip_mode_to_string(obtaining_ip_mode_t mode) {
switch (mode) {
case obtaining_ip_mode_type_static:
return "static";
case obtaining_ip_mode_type_dhcp:
return "dhcp";
default:
return "unknown";
}
}
#pragma pack()
Loading…
Cancel
Save