20 changed files with 1 additions and 1272 deletions
-
10libzaf/README.md
-
234libzaf/pin.c
-
119libzaf/pin.h
-
17libzaf/zaf.h
-
0libzaf/zaf_basic.c
-
9libzaf/zaf_basic.h
-
6libzaf/zaf_bean.h
-
60libzaf/zaf_delay.c
-
7libzaf/zaf_delay.h
-
110libzaf/zaf_flash.c
-
69libzaf/zaf_flash.h
-
327libzaf/zaf_gpio.c
-
36libzaf/zaf_gpio.h
-
31libzaf/zaf_id.c
-
12libzaf/zaf_id.h
-
39libzaf/zaf_log.c
-
41libzaf/zaf_log.h
-
104libzaf/zaf_udp.c
-
40libzaf/zaf_udp.h
-
2zsdk
@ -1,10 +0,0 @@ |
|||||
``` |
|
||||
libzaf |
|
||||
Iflytop ARM and FPGA based Zynq Acceleration Framework |
|
||||
|
|
||||
功能: |
|
||||
|
|
||||
|
|
||||
|
|
||||
|
|
||||
``` |
|
@ -1,234 +0,0 @@ |
|||||
#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"; |
|
||||
}; |
|
@ -1,119 +0,0 @@ |
|||||
#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); |
|
@ -1,17 +0,0 @@ |
|||||
#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" |
|
||||
#include "zaf_bean.h" |
|
||||
#ifdef __cplusplus |
|
||||
} |
|
||||
#endif |
|
@ -1,9 +0,0 @@ |
|||||
#pragma once |
|
||||
#include "main.h" |
|
||||
// |
|
||||
#include "project_configs.h" |
|
||||
// |
|
||||
#include "cmsis_os.h" |
|
||||
// |
|
||||
#include <stdbool.h> |
|
||||
#include <stdint.h> |
|
@ -1,6 +0,0 @@ |
|||||
#pragma once |
|
||||
#include <stdint.h> |
|
||||
typedef struct { |
|
||||
uint8_t* data; |
|
||||
uint32_t len; |
|
||||
} zbuf_t; |
|
@ -1,60 +0,0 @@ |
|||||
#include "zaf_delay.h" |
|
||||
|
|
||||
#include "zaf_basic.h" |
|
||||
|
|
||||
extern TIM_HandleTypeDef PC_SYS_SDK_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_SDK_DELAY_US_TIMER, 0); |
|
||||
_HAL_TIM_Base_Start(&PC_SYS_SDK_DELAY_US_TIMER); |
|
||||
while (counter < var_nus) { |
|
||||
counter = __HAL_TIM_GET_COUNTER(&PC_SYS_SDK_DELAY_US_TIMER); |
|
||||
} |
|
||||
_HAL_TIM_Base_Stop(&PC_SYS_SDK_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; |
|
||||
} |
|
||||
} |
|
@ -1,7 +0,0 @@ |
|||||
#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); |
|
@ -1,110 +0,0 @@ |
|||||
#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, §or_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; |
|
||||
} |
|
@ -1,69 +0,0 @@ |
|||||
#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. 我们使用第7个扇区,即0x08060000~0x0807FFFF |
|
||||
* 2. 程序最大不能超过75% |
|
||||
* 3. rawstartadd第一位必须是0xABCD,最后一位是校验和 |
|
||||
*/ |
|
||||
|
|
||||
#define FLASH_MASK_VAL 0xABCD |
|
||||
#define FLASH_START_ADD 0x08060000 // |
|
||||
#define FLASH_EARSE_SECTOR FLASH_SECTOR_7 |
|
||||
#define FLASH_SOTRAGE_SIZE (128 * 1023) |
|
||||
|
|
||||
/** |
|
||||
* @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); |
|
@ -1,327 +0,0 @@ |
|||||
#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), SDK_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); |
|
||||
} |
|
@ -1,36 +0,0 @@ |
|||||
#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); |
|
@ -1,31 +0,0 @@ |
|||||
#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; |
|
||||
} |
|
@ -1,12 +0,0 @@ |
|||||
#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); |
|
@ -1,39 +0,0 @@ |
|||||
#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); |
|
||||
} |
|
||||
} |
|
@ -1,41 +0,0 @@ |
|||||
#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) |
|
||||
|
|
||||
#define ZARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0])) |
|
||||
|
|
||||
void zaf_log(const char* fmt, ...); |
|
||||
void zaf_log_enable(bool enable); |
|
@ -1,104 +0,0 @@ |
|||||
#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)); |
|
||||
} |
|
@ -1,40 +0,0 @@ |
|||||
#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 |
|
@ -1 +1 @@ |
|||||
Subproject commit 177cd900eba582c1380160be19949f933646af8e |
|
||||
|
Subproject commit 416dfe21dc9c7d2a06e3ee653a9d76e96e9a2a05 |
Write
Preview
Loading…
Cancel
Save
Reference in new issue