ver2.0 Beta2
This commit is contained in:
parent
742e68b482
commit
7a4e9f6742
22 changed files with 358 additions and 106 deletions
|
|
@ -94,7 +94,7 @@ LCD имеет разную разводку сегментов в зависи
|
||||||
| 1.7 | <ul><li>Исправление ошибки (> 42 C) для сенсора CHT8305</li></ul> |
|
| 1.7 | <ul><li>Исправление ошибки (> 42 C) для сенсора CHT8305</li></ul> |
|
||||||
| 1.8 | <ul><li>Добавлено отображение температуры в градусах Фаренгейта</li></ul> |
|
| 1.8 | <ul><li>Добавлено отображение температуры в градусах Фаренгейта</li></ul> |
|
||||||
| 1.9 | <ul><li>Исправлена ошибка восстановления измененного имени устройства после сброса питания</li></ul> |
|
| 1.9 | <ul><li>Исправлена ошибка восстановления измененного имени устройства после сброса питания</li></ul> |
|
||||||
| 2.0beta | <ul><li>Добавлена обработка датчика CHT832x (поддержка платы TH05Y_v3.1)</li></ul> |
|
| 2.0beta2 | <ul><li>Добавлена обработка датчика CHT832x (поддержка платы TH05Y_v3.1)</li><li>Исправление ошибки в bin-файлах BOOT OTA</li><li>Добалена функуия сна при полном разряде батареи.</li><li>Добавлена опытная прошивка для брелков "iSearching" на чипе ST17H66</li></ul> |
|
||||||
|
|
||||||
## Прошивка
|
## Прошивка
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -96,7 +96,7 @@ The sensors are detected automatically, but have different ports depending on th
|
||||||
| 1.7 | <ul><li>Fixed en error (> 42 C) for sensor CHT8305</li></ul> |
|
| 1.7 | <ul><li>Fixed en error (> 42 C) for sensor CHT8305</li></ul> |
|
||||||
| 1.8 | <ul><li>Added display of temperature in degrees Fahrenheit</li></ul> |
|
| 1.8 | <ul><li>Added display of temperature in degrees Fahrenheit</li></ul> |
|
||||||
| 1.9 | <ul><li>Fixed the bug of restoring the changed device name after power reset</li></ul> |
|
| 1.9 | <ul><li>Fixed the bug of restoring the changed device name after power reset</li></ul> |
|
||||||
| 2.0beta | <ul><li>Added processing of the CHT832x sensor (Support board TH05Y_v3.1)</li></ul> |
|
| 2.0beta2 | <ul><li>Added processing of the CHT832x sensor (Support board TH05Y_v3.1)</li><li>Fixing a bug in BOOT OTA bin files.</li></ul> |
|
||||||
|
|
||||||
## Firmware
|
## Firmware
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
PROJECT_NAME ?= bthome_phy6222
|
PROJECT_NAME ?= bthome_phy6222
|
||||||
#POJECT_DEF ?= -DDEVICE=DEVICE_THB2
|
#POJECT_DEF ?= -DDEVICE=DEVICE_THB2
|
||||||
##############################################################################
|
##############################################################################
|
||||||
COM_PORT = COM11
|
COM_PORT = COM5
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# Source
|
# Source
|
||||||
SRC_PATH = ./source
|
SRC_PATH = ./source
|
||||||
|
|
|
||||||
|
|
@ -460,9 +460,10 @@ void hal_pwrmgr_poweroff(pwroff_cfg_t* pcfg, uint8_t wakeup_pin_num)
|
||||||
config reset casue as RSTC_OFF_MODE
|
config reset casue as RSTC_OFF_MODE
|
||||||
reset path walkaround dwc
|
reset path walkaround dwc
|
||||||
*/
|
*/
|
||||||
|
|
||||||
AON_CLEAR_XTAL_TRACKING_AND_CALIB;
|
AON_CLEAR_XTAL_TRACKING_AND_CALIB;
|
||||||
AP_AON->SLEEP_R[0] = 2;
|
AP_AON->SLEEP_R[0] = 2;
|
||||||
enter_sleep_off_mode(SYSTEM_OFF_MODE);
|
enter_sleep_off_mode(SYSTEM_OFF_MODE); // = write_reg(0x4000f000, 0x5a5aa5a5) - enter system off mode
|
||||||
|
|
||||||
while(1);
|
while(1);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,8 @@
|
||||||
#ifndef __SDK_VER_H__
|
#ifndef __SDK_VER_H__
|
||||||
#define __SDK_VER_H__
|
#define __SDK_VER_H__
|
||||||
|
|
||||||
|
//#include "config.h"
|
||||||
|
|
||||||
#define __DEF_CHIP_QFN32__ (0x0001)
|
#define __DEF_CHIP_QFN32__ (0x0001)
|
||||||
#define __DEF_CHIP_TSOP16__ (0x0002)
|
#define __DEF_CHIP_TSOP16__ (0x0002)
|
||||||
#define SDK_VER_MAJOR 3
|
#define SDK_VER_MAJOR 3
|
||||||
|
|
@ -16,7 +18,9 @@
|
||||||
#define SDK_VER_REVISION 1
|
#define SDK_VER_REVISION 1
|
||||||
#define SDK_SUB_CODE 2
|
#define SDK_SUB_CODE 2
|
||||||
#define SDK_VER_RELEASE_ID ((SDK_VER_MAJOR<<24)|(SDK_VER_MINOR<<16)|(SDK_VER_REVISION<<8)|(SDK_SUB_CODE<<0))
|
#define SDK_VER_RELEASE_ID ((SDK_VER_MAJOR<<24)|(SDK_VER_MINOR<<16)|(SDK_VER_REVISION<<8)|(SDK_SUB_CODE<<0))
|
||||||
|
#ifndef SDK_VER_CHIP
|
||||||
#define SDK_VER_CHIP __DEF_CHIP_QFN32__ // __DEF_CHIP_TSOP16__
|
#define SDK_VER_CHIP __DEF_CHIP_QFN32__ // __DEF_CHIP_TSOP16__
|
||||||
|
#endif
|
||||||
//#define SDK_VER_TEST_BUILD ""
|
//#define SDK_VER_TEST_BUILD ""
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,13 @@
|
||||||
@if not exist "build\THB3%SWVER%.hex" goto :error
|
@if not exist "build\THB3%SWVER%.hex" goto :error
|
||||||
@copy "build\THB3%SWVER%.bin" .\bin
|
@copy "build\THB3%SWVER%.bin" .\bin
|
||||||
@
|
@
|
||||||
|
@del /Q "build\KEY2%SWVER%.hex"
|
||||||
|
@del /Q "build\KEY2%SWVER%.bin"
|
||||||
|
@make -s clean
|
||||||
|
@make -s -j PROJECT_NAME=KEY2%SWVER% POJECT_DEF="-DDEVICE=DEVICE_KEY2"
|
||||||
|
@if not exist "build\KEY2%SWVER%.hex" goto :error
|
||||||
|
@copy "build\KEY2%SWVER%.bin" .\bin
|
||||||
|
@
|
||||||
@del /Q "build\BOOT_THB2%SWVER%.hex"
|
@del /Q "build\BOOT_THB2%SWVER%.hex"
|
||||||
@make -s clean
|
@make -s clean
|
||||||
@make -s -j PROJECT_NAME=BOOT_THB2%SWVER% BOOT_OTA=1 POJECT_DEF="-DDEVICE=DEVICE_THB2"
|
@make -s -j PROJECT_NAME=BOOT_THB2%SWVER% BOOT_OTA=1 POJECT_DEF="-DDEVICE=DEVICE_THB2"
|
||||||
|
|
@ -99,6 +106,13 @@
|
||||||
@if not exist "build\BOOT_THB3%SWVER%.hex" goto :error
|
@if not exist "build\BOOT_THB3%SWVER%.hex" goto :error
|
||||||
@copy "build\BOOT_THB3%SWVER%.hex" .\bin
|
@copy "build\BOOT_THB3%SWVER%.hex" .\bin
|
||||||
@copy "build\BOOT_THB3%SWVER%.bin" .\boot
|
@copy "build\BOOT_THB3%SWVER%.bin" .\boot
|
||||||
|
@
|
||||||
|
@del /Q "build\BOOT_KEY2%SWVER%.hex"
|
||||||
|
@make -s clean
|
||||||
|
@make -s -j PROJECT_NAME=BOOT_KEY2%SWVER% BOOT_OTA=1 POJECT_DEF="-DDEVICE=DEVICE_KEY2"
|
||||||
|
@if not exist "build\BOOT_KEY2%SWVER%.hex" goto :error
|
||||||
|
@copy "build\BOOT_KEY2%SWVER%.hex" .\bin
|
||||||
|
@copy "build\BOOT_KEY2%SWVER%.bin" .\boot
|
||||||
@exit
|
@exit
|
||||||
:error
|
:error
|
||||||
@echo "Error!"
|
@echo "Error!"
|
||||||
Binary file not shown.
|
|
@ -76,7 +76,7 @@ void __attribute__((used)) hal_ADC_IRQHandler(void) {
|
||||||
#endif
|
#endif
|
||||||
adv_wrk.new_battery = 1; // new battery
|
adv_wrk.new_battery = 1; // new battery
|
||||||
#if ((DEV_SERVICES & SERVICE_THS) == 0)
|
#if ((DEV_SERVICES & SERVICE_THS) == 0)
|
||||||
measured_data.count++;
|
// measured_data.count++;
|
||||||
#endif
|
#endif
|
||||||
hal_pwrmgr_unlock(MOD_ADCC);
|
hal_pwrmgr_unlock(MOD_ADCC);
|
||||||
|
|
||||||
|
|
@ -161,13 +161,38 @@ static void init_adc_batt(void) {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void low_vbat(void) {
|
||||||
|
#if (DEV_SERVICES & SERVICE_BUTTON)
|
||||||
|
pwroff_cfg_t pwr_wkp_cfg[]= {
|
||||||
|
#if (DEV_SERVICES & SERVICE_BUTTON)
|
||||||
|
{ GPIO_KEY, KEY_PRESSED, 0 },
|
||||||
|
#endif
|
||||||
|
//#if (DEV_SERVICES & SERVICE_RDS)
|
||||||
|
// { GPIO_INP, POL_FALLING, 0 }
|
||||||
|
//#endif
|
||||||
|
};
|
||||||
|
// 0.48 uA at 3.0V
|
||||||
|
hal_pwrmgr_poweroff( pwr_wkp_cfg, sizeof(pwr_wkp_cfg)/sizeof(pwr_wkp_cfg[0]) );
|
||||||
|
#else
|
||||||
|
// 1.67 uA at 3.0V
|
||||||
|
hal_pwrmgr_enter_sleep_rtc_reset((60*60)<<15); // 60 minutes
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void check_battery(void) {
|
void check_battery(void) {
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
uint32_t summ;
|
uint32_t summ;
|
||||||
if(bat_average.battery_mv == 0)
|
if(bat_average.battery_mv == 0)
|
||||||
return;
|
return;
|
||||||
//if (bat_average.battery_mv < 2000) // It is not recommended to write Flash below 2V
|
#if defined(OTA_TYPE) && OTA_TYPE == OTA_TYPE_BOOT
|
||||||
// low_vbat(); // TODO
|
if (bat_average.battery_mv < 2000) // It is not recommended to write Flash below 2V
|
||||||
|
low_vbat();
|
||||||
|
#else
|
||||||
|
if (bat_average.battery_mv < 1900)
|
||||||
|
low_vbat();
|
||||||
|
#endif
|
||||||
if(bat_average.buf1[0] == 0) {
|
if(bat_average.buf1[0] == 0) {
|
||||||
for(i = 0; i < BAT_AVERAGE1_COUNT; i++)
|
for(i = 0; i < BAT_AVERAGE1_COUNT; i++)
|
||||||
bat_average.buf1[i] = bat_average.battery_mv;
|
bat_average.buf1[i] = bat_average.battery_mv;
|
||||||
|
|
|
||||||
|
|
@ -86,6 +86,12 @@ uint8_t adv_set_data(void * pd) {
|
||||||
p->battery_level = measured_data.battery;
|
p->battery_level = measured_data.battery;
|
||||||
p->v_id = BtHomeID_voltage;
|
p->v_id = BtHomeID_voltage;
|
||||||
p->battery_mv = measured_data.battery_mv; // x mV
|
p->battery_mv = measured_data.battery_mv; // x mV
|
||||||
|
#if (DEV_SERVICES & SERVICE_BUTTON)
|
||||||
|
p->u_id = BtHomeID_button;
|
||||||
|
p->button = measured_data.button;
|
||||||
|
p->c_id = BtHomeID_count32;
|
||||||
|
p->counter = adv_wrk.rds_count;
|
||||||
|
#endif
|
||||||
return sizeof(adv_bthome_data2_t);
|
return sizeof(adv_bthome_data2_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -100,6 +106,15 @@ uint8_t adv_set_event(void * ped) {
|
||||||
p->counter = adv_wrk.rds_count;
|
p->counter = adv_wrk.rds_count;
|
||||||
return sizeof(adv_bthome_event1_t);
|
return sizeof(adv_bthome_event1_t);
|
||||||
}
|
}
|
||||||
|
#elif (DEV_SERVICES & SERVICE_BUTTON)
|
||||||
|
uint8_t adv_set_event(void * ped) {
|
||||||
|
padv_bthome_event1_t p = (padv_bthome_event1_t)ped;
|
||||||
|
p->b_id = BtHomeID_button;
|
||||||
|
p->button = measured_data.button;
|
||||||
|
p->c_id = BtHomeID_count32;
|
||||||
|
p->counter = adv_wrk.rds_count;
|
||||||
|
return sizeof(adv_bthome_event1_t);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint8_t bthome_data_beacon(void * padbuf) {
|
uint8_t bthome_data_beacon(void * padbuf) {
|
||||||
|
|
@ -121,7 +136,7 @@ uint8_t bthome_data_beacon(void * padbuf) {
|
||||||
if (cfg.flg & FLG_ADV_CRYPT) {
|
if (cfg.flg & FLG_ADV_CRYPT) {
|
||||||
padv_bthome_encrypt_t pe = (padv_bthome_encrypt_t)p;
|
padv_bthome_encrypt_t pe = (padv_bthome_encrypt_t)p;
|
||||||
pe->info = BtHomeID_Info_Encrypt;
|
pe->info = BtHomeID_Info_Encrypt;
|
||||||
#if (DEV_SERVICES & SERVICE_RDS)
|
#if (DEV_SERVICES & (SERVICE_RDS | SERVICE_BUTTON))
|
||||||
if(adv_wrk.adv_event) {
|
if(adv_wrk.adv_event) {
|
||||||
p->head.size = adv_encrypt(pe->data, adv_set_event(pe->data)) + sizeof(pe->head) - sizeof(pe->head.size) + sizeof(pe->info);
|
p->head.size = adv_encrypt(pe->data, adv_set_event(pe->data)) + sizeof(pe->head) - sizeof(pe->head.size) + sizeof(pe->info);
|
||||||
} else
|
} else
|
||||||
|
|
@ -135,11 +150,11 @@ uint8_t bthome_data_beacon(void * padbuf) {
|
||||||
p->info = BtHomeID_Info;
|
p->info = BtHomeID_Info;
|
||||||
p->p_id = BtHomeID_PacketId;
|
p->p_id = BtHomeID_PacketId;
|
||||||
p->pid = (uint8)measured_data.count;
|
p->pid = (uint8)measured_data.count;
|
||||||
#if (DEV_SERVICES & SERVICE_RDS)
|
#if (DEV_SERVICES & (SERVICE_RDS | SERVICE_BUTTON))
|
||||||
if(adv_wrk.adv_event) {
|
if(adv_wrk.adv_event) {
|
||||||
p->head.size = adv_set_event(p->data) + sizeof(p->head) - sizeof(p->head.size) + sizeof(p->info) + sizeof(p->p_id) + sizeof(p->pid);
|
p->head.size = adv_set_event(p->data) + sizeof(p->head) - sizeof(p->head.size) + sizeof(p->info) + sizeof(p->p_id) + sizeof(p->pid);
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
p->head.size = adv_set_data(p->data) + sizeof(p->head) - sizeof(p->head.size) + sizeof(p->info) + sizeof(p->p_id) + sizeof(p->pid);
|
p->head.size = adv_set_data(p->data) + sizeof(p->head) - sizeof(p->head.size) + sizeof(p->info) + sizeof(p->p_id) + sizeof(p->pid);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -126,15 +126,27 @@ typedef struct __attribute__((packed)) _adv_bthome_data2_t {
|
||||||
uint8 battery_level; // 0..100 %
|
uint8 battery_level; // 0..100 %
|
||||||
uint8 v_id; // = BtHomeID_voltage
|
uint8 v_id; // = BtHomeID_voltage
|
||||||
uint16 battery_mv; // x 0.001 V
|
uint16 battery_mv; // x 0.001 V
|
||||||
|
#if (DEV_SERVICES & SERVICE_BUTTON)
|
||||||
|
uint8_t u_id; // = BtHomeID_button ?
|
||||||
|
uint8_t button; // =1 press, =2 double_press ... https://bthome.io/format/
|
||||||
|
uint8_t c_id; // = BtHomeID_count32
|
||||||
|
uint32_t counter;
|
||||||
|
#endif
|
||||||
} adv_bthome_data2_t, * padv_bthome_data2_t; // size: 5
|
} adv_bthome_data2_t, * padv_bthome_data2_t; // size: 5
|
||||||
|
|
||||||
typedef struct __attribute__((packed)) _adv_bthome_event1_t {
|
typedef struct __attribute__((packed)) _adv_bthome_event1_t {
|
||||||
|
#if (DEV_SERVICES & SERVICE_RDS)
|
||||||
uint8_t o_id; // = BtHomeID_opened ?
|
uint8_t o_id; // = BtHomeID_opened ?
|
||||||
uint8_t opened;
|
uint8_t opened;
|
||||||
|
#elif (DEV_SERVICES & SERVICE_BUTTON)
|
||||||
|
uint8_t b_id; // = BtHomeID_button ?
|
||||||
|
uint8_t button; // =1 press, =2 double_press ... https://bthome.io/format/
|
||||||
|
#endif
|
||||||
uint8_t c_id; // = BtHomeID_count32
|
uint8_t c_id; // = BtHomeID_count32
|
||||||
uint32_t counter;
|
uint32_t counter;
|
||||||
} adv_bthome_event1_t, * padv_bthome_event1_t; // size: 7
|
} adv_bthome_event1_t, * padv_bthome_event1_t; // size: 7
|
||||||
|
|
||||||
|
|
||||||
// BTHOME data1, no security
|
// BTHOME data1, no security
|
||||||
typedef struct __attribute__((packed)) _adv_bthome_ns1_t {
|
typedef struct __attribute__((packed)) _adv_bthome_ns1_t {
|
||||||
uint8 flag[3]; // Advertise type flags
|
uint8 flag[3]; // Advertise type flags
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ typedef enum {
|
||||||
CMD_ID_FLASH_ID = 0x06, // Get Flash JEDEC ID
|
CMD_ID_FLASH_ID = 0x06, // Get Flash JEDEC ID
|
||||||
CMD_ID_SERIAL = 0x07, // Get serial string
|
CMD_ID_SERIAL = 0x07, // Get serial string
|
||||||
CMD_ID_DEV_MAC = 0x10, // Get/Set MAC [+RandMAC], [size]<mac[6][randmac[2]]>
|
CMD_ID_DEV_MAC = 0x10, // Get/Set MAC [+RandMAC], [size]<mac[6][randmac[2]]>
|
||||||
CMD_ID_FIX_MAC = 0x11, // Fixed MAC (не безопасная операция, переписывает сектор 0x1000 Flash)
|
CMD_ID_FIX_MAC = 0x11, // Fixed MAC (не безопасная операция, переписывает сектор 0x0 Flash)
|
||||||
CMD_ID_BKEY = 0x18, // Get/Set beacon bindkey in EEP
|
CMD_ID_BKEY = 0x18, // Get/Set beacon bindkey in EEP
|
||||||
CMD_ID_COMFORT = 0x20, // Get/Set comfort parameters
|
CMD_ID_COMFORT = 0x20, // Get/Set comfort parameters
|
||||||
CMD_ID_EXTDATA = 0x22, // Get/Set show ext. data
|
CMD_ID_EXTDATA = 0x22, // Get/Set show ext. data
|
||||||
|
|
|
||||||
|
|
@ -43,9 +43,10 @@
|
||||||
#define DEVICE_TH05D 24 // TH05_V1.3
|
#define DEVICE_TH05D 24 // TH05_V1.3
|
||||||
#define DEVICE_TH05F 25 // TH05Y_V1.2
|
#define DEVICE_TH05F 25 // TH05Y_V1.2
|
||||||
#define DEVICE_THB3 26
|
#define DEVICE_THB3 26
|
||||||
|
#define DEVICE_KEY2 30
|
||||||
|
|
||||||
#ifndef DEVICE
|
#ifndef DEVICE
|
||||||
#define DEVICE DEVICE_THB3
|
#define DEVICE DEVICE_KEY2
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// supported services by the device (bits)
|
// supported services by the device (bits)
|
||||||
|
|
@ -61,10 +62,16 @@
|
||||||
#define SERVICE_KEY 0x00000200 // есть кнопка
|
#define SERVICE_KEY 0x00000200 // есть кнопка
|
||||||
#define SERVICE_OUTS 0x00000400 // пока нет // есть обслуживние выходных пинов
|
#define SERVICE_OUTS 0x00000400 // пока нет // есть обслуживние выходных пинов
|
||||||
#define SERVICE_INS 0x00000800 // пока нет // есть обслуживние входных пинов
|
#define SERVICE_INS 0x00000800 // пока нет // есть обслуживние входных пинов
|
||||||
#define SERVICE_TIME_ADJUST 0x00001000 // пока нет // есть функция коррекции счета времени
|
//#define SERVICE_TIME_ADJUST 0x00001000 // пока нет // есть функция коррекции счета времени
|
||||||
#define SERVICE_HARD_CLOCK 0x00002000 // пока нет // есть реальные часы RTC
|
#define SERVICE_HARD_CLOCK 0x00002000 // пока нет // есть реальные часы RTC
|
||||||
#define SERVICE_TH_TRG 0x00004000 // триггер по температуре и влажности
|
#define SERVICE_TH_TRG 0x00004000 // триггер по температуре и влажности
|
||||||
#define SERVICE_LED 0x00008000 // use led
|
#define SERVICE_LED 0x00008000 // use led
|
||||||
|
//#define SERVICE_MI_KEYS 0x00010000 // use mi keys (не используется)
|
||||||
|
//#define SERVICE_PRESSURE 0x00020000 // pressure sensor (пока нет реализации)
|
||||||
|
//#define SERVICE_18B20 0x00040000 // use sensor(s) MY18B20 (пока нет реализации)
|
||||||
|
//#define SERVICE_IUS 0x00080000 // use I and U sensor (INA226) (пока нет реализации)
|
||||||
|
//#define SERVICE_PLM 0x00100000 // use PWM-RH and NTC (пока нет реализации)
|
||||||
|
#define SERVICE_BUTTON 0x00200000 // кнопка, активность только при нажатии
|
||||||
|
|
||||||
#define OTA_TYPE_NONE 0 // нет OTA, только переключение из APP на boot прошивку
|
#define OTA_TYPE_NONE 0 // нет OTA, только переключение из APP на boot прошивку
|
||||||
#define OTA_TYPE_BOOT SERVICE_OTA // вариант для прошивки boot + OTA
|
#define OTA_TYPE_BOOT SERVICE_OTA // вариант для прошивки boot + OTA
|
||||||
|
|
@ -105,6 +112,7 @@
|
||||||
#define I2C_SDA GPIO_P18
|
#define I2C_SDA GPIO_P18
|
||||||
#define I2C_SCL GPIO_P20
|
#define I2C_SCL GPIO_P20
|
||||||
#define GPIO_KEY GPIO_P07
|
#define GPIO_KEY GPIO_P07
|
||||||
|
#define KEY_PRESSED 0
|
||||||
#define GPIO_LED GPIO_P26
|
#define GPIO_LED GPIO_P26
|
||||||
#define LED_ON 0
|
#define LED_ON 0
|
||||||
#define LED_OFF 1
|
#define LED_OFF 1
|
||||||
|
|
@ -142,6 +150,7 @@
|
||||||
#define I2C_SCL GPIO_P34 // SCL
|
#define I2C_SCL GPIO_P34 // SCL
|
||||||
#define GPIO_SPWR GPIO_P00 // питание сенсора
|
#define GPIO_SPWR GPIO_P00 // питание сенсора
|
||||||
#define GPIO_KEY GPIO_P14
|
#define GPIO_KEY GPIO_P14
|
||||||
|
#define KEY_PRESSED 0
|
||||||
#define GPIO_LED GPIO_P15
|
#define GPIO_LED GPIO_P15
|
||||||
#define LED_ON 1
|
#define LED_ON 1
|
||||||
#define LED_OFF 0
|
#define LED_OFF 0
|
||||||
|
|
@ -188,6 +197,7 @@
|
||||||
|
|
||||||
#define GPIO_SPWR GPIO_P00 // питание сенсора
|
#define GPIO_SPWR GPIO_P00 // питание сенсора
|
||||||
#define GPIO_KEY GPIO_P14
|
#define GPIO_KEY GPIO_P14
|
||||||
|
#define KEY_PRESSED 0
|
||||||
#define GPIO_LPWR GPIO_P02 // питание LCD драйвера
|
#define GPIO_LPWR GPIO_P02 // питание LCD драйвера
|
||||||
|
|
||||||
#define GPIO_TRG GPIO_P20 // mark TX2
|
#define GPIO_TRG GPIO_P20 // mark TX2
|
||||||
|
|
@ -235,6 +245,7 @@
|
||||||
#define I2C_LCD_SCL GPIO_P33 // SCL
|
#define I2C_LCD_SCL GPIO_P33 // SCL
|
||||||
|
|
||||||
#define GPIO_KEY GPIO_P01
|
#define GPIO_KEY GPIO_P01
|
||||||
|
#define KEY_PRESSED 0
|
||||||
|
|
||||||
#define GPIO_TRG GPIO_P09 // mark TX
|
#define GPIO_TRG GPIO_P09 // mark TX
|
||||||
#define GPIO_INP GPIO_P10 // mark RX
|
#define GPIO_INP GPIO_P10 // mark RX
|
||||||
|
|
@ -286,6 +297,7 @@
|
||||||
#define I2C_LCD_SCL GPIO_P14 // SCL
|
#define I2C_LCD_SCL GPIO_P14 // SCL
|
||||||
|
|
||||||
#define GPIO_KEY GPIO_P02
|
#define GPIO_KEY GPIO_P02
|
||||||
|
#define KEY_PRESSED 0
|
||||||
|
|
||||||
#define GPIO_TRG GPIO_P09 // mark TX
|
#define GPIO_TRG GPIO_P09 // mark TX
|
||||||
#define GPIO_INP GPIO_P10 // mark RX
|
#define GPIO_INP GPIO_P10 // mark RX
|
||||||
|
|
@ -333,6 +345,7 @@
|
||||||
|
|
||||||
#define GPIO_SPWR GPIO_P00 // питание сенсора
|
#define GPIO_SPWR GPIO_P00 // питание сенсора
|
||||||
#define GPIO_KEY GPIO_P14
|
#define GPIO_KEY GPIO_P14
|
||||||
|
#define KEY_PRESSED 0
|
||||||
#define GPIO_LPWR GPIO_P02 // питание LCD драйвера
|
#define GPIO_LPWR GPIO_P02 // питание LCD драйвера
|
||||||
|
|
||||||
#define GPIO_TRG GPIO_P20 // mark TX2
|
#define GPIO_TRG GPIO_P20 // mark TX2
|
||||||
|
|
@ -342,6 +355,41 @@
|
||||||
#define DEF_HARDWARE_REVISION "0019"
|
#define DEF_HARDWARE_REVISION "0019"
|
||||||
#define DEF_MANUFACTURE_NAME_STR "Tuya"
|
#define DEF_MANUFACTURE_NAME_STR "Tuya"
|
||||||
|
|
||||||
|
#elif DEVICE == DEVICE_KEY2
|
||||||
|
/* Model: iSearch ver2 ST17H66 (TSSOP16) */
|
||||||
|
#define SDK_VER_CHIP __DEF_CHIP_TSOP16__
|
||||||
|
|
||||||
|
#if OTA_TYPE == OTA_TYPE_BOOT
|
||||||
|
#define DEV_SERVICES (OTA_TYPE \
|
||||||
|
| SERVICE_BUTTON \
|
||||||
|
| SERVICE_BINDKEY \
|
||||||
|
)
|
||||||
|
#else
|
||||||
|
#define DEV_SERVICES (OTA_TYPE \
|
||||||
|
| SERVICE_BUTTON \
|
||||||
|
| SERVICE_BINDKEY \
|
||||||
|
)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ADC_PIN_USE_OUT 1 // hal_gpio_write(ADC_PIN, 1);
|
||||||
|
#define ADC_PIN GPIO_P11
|
||||||
|
#define ADC_VBAT_CHL VBAT_ADC_P11
|
||||||
|
|
||||||
|
#define GPIO_KEY GPIO_P15
|
||||||
|
#define KEY_PRESSED 1
|
||||||
|
#define GPIO_LED GPIO_P03
|
||||||
|
#define LED_ON 1
|
||||||
|
#define LED_OFF 0
|
||||||
|
|
||||||
|
#define GPIO_BUZZER GPIO_P09
|
||||||
|
|
||||||
|
//#define GPIO_INP GPIO_P15
|
||||||
|
|
||||||
|
#define DEF_MODEL_NUMBER_STR "KEY"
|
||||||
|
#define DEF_HARDWARE_REVISION "0020"
|
||||||
|
#define DEF_MANUFACTURE_NAME_STR "DIY"
|
||||||
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#error "DEVICE Not released!"
|
#error "DEVICE Not released!"
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -386,14 +434,14 @@ extern const cfg_t def_cfg;
|
||||||
typedef struct _adv_work_t {
|
typedef struct _adv_work_t {
|
||||||
uint32_t measure_interval_ms;
|
uint32_t measure_interval_ms;
|
||||||
uint32_t measure_batt_tik;
|
uint32_t measure_batt_tik;
|
||||||
#if (DEV_SERVICES & SERVICE_RDS)
|
#if (DEV_SERVICES & (SERVICE_RDS | SERVICE_BUTTON))
|
||||||
uint32_t rds_timer_tik;
|
uint32_t rds_timer_tik; // rds & button time tik (in 32768 Hz)
|
||||||
uint32_t rds_count;
|
uint32_t rds_count; // rds & button count
|
||||||
#endif
|
#endif
|
||||||
uint8_t meas_count;
|
uint8_t meas_count; // счет до нового измерения в кол-ве вызовов adv_measure()
|
||||||
uint8_t adv_reload_count;
|
uint8_t adv_reload_count; // кол-во передач рекламы до перехода к новому типу и установкам рекламы
|
||||||
uint8_t new_battery; // new battery
|
uint8_t new_battery; // flag: new battery
|
||||||
uint8_t adv_event; // rds event
|
uint8_t adv_event; // flag: rds event
|
||||||
} adv_work_t;
|
} adv_work_t;
|
||||||
extern adv_work_t adv_wrk;
|
extern adv_work_t adv_wrk;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
#define FMEMORY_SCFG_BANK_SIZE FLASH_SECTOR_SIZE // размер сектора, 4096 bytes
|
#define FMEMORY_SCFG_BANK_SIZE FLASH_SECTOR_SIZE // размер сектора, 4096 bytes
|
||||||
#define FMEMORY_SCFG_BANKS 4 // кол-во секторов для работы - min 2
|
#define FMEMORY_SCFG_BANKS 4 // кол-во секторов для работы - min 2
|
||||||
#define FMEMORY_SCFG_BASE_ADDR (FLASH_SIZE - (FMEMORY_SCFG_BANKS*FMEMORY_SCFG_BANK_SIZE)) // 0x7C000
|
#define FMEMORY_SCFG_BASE_ADDR (FLASH_SIZE - (FMEMORY_SCFG_BANKS*FMEMORY_SCFG_BANK_SIZE)) // 0xFC000, 0x7C000, 0x3C000
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
enum eFMEMORY_ERRORS {
|
enum eFMEMORY_ERRORS {
|
||||||
FMEM_NOT_FOUND = -1, // -1 - не найден
|
FMEM_NOT_FOUND = -1, // -1 - не найден
|
||||||
|
|
|
||||||
|
|
@ -108,7 +108,6 @@ volatile sysclk_t g_spif_clk_config;
|
||||||
static void hal_low_power_io_init(void) {
|
static void hal_low_power_io_init(void) {
|
||||||
//========= disable all gpio pullup/down to preserve juice
|
//========= disable all gpio pullup/down to preserve juice
|
||||||
const ioinit_cfg_t ioInit[] = {
|
const ioinit_cfg_t ioInit[] = {
|
||||||
#if(SDK_VER_CHIP == __DEF_CHIP_QFN32__)
|
|
||||||
#if DEVICE == DEVICE_THB2
|
#if DEVICE == DEVICE_THB2
|
||||||
{ GPIO_P00, GPIO_PULL_DOWN },
|
{ GPIO_P00, GPIO_PULL_DOWN },
|
||||||
{ GPIO_P01, GPIO_PULL_DOWN },
|
{ GPIO_P01, GPIO_PULL_DOWN },
|
||||||
|
|
@ -295,22 +294,24 @@ const ioinit_cfg_t ioInit[] = {
|
||||||
{ GPIO_P32, GPIO_PULL_DOWN },
|
{ GPIO_P32, GPIO_PULL_DOWN },
|
||||||
{ GPIO_P33, GPIO_FLOATING }, // CHT8305 SDA
|
{ GPIO_P33, GPIO_FLOATING }, // CHT8305 SDA
|
||||||
{ GPIO_P34, GPIO_FLOATING } // CHT8305 SCL
|
{ GPIO_P34, GPIO_FLOATING } // CHT8305 SCL
|
||||||
|
#elif (DEVICE == DEVICE_KEY2)
|
||||||
|
{ GPIO_P02, GPIO_FLOATING }, // connect to +Vbat ?
|
||||||
|
#ifdef GPIO_LED
|
||||||
|
{ GPIO_P03, GPIO_FLOATING }, // LED - GPIO_LED
|
||||||
|
#else
|
||||||
|
{ GPIO_P03, GPIO_PULL_DOWN },
|
||||||
|
#endif
|
||||||
|
{ GPIO_P07, GPIO_PULL_DOWN }, // mark "SWS"
|
||||||
|
{ GPIO_P09, GPIO_PULL_DOWN }, // TX Buzzer
|
||||||
|
{ GPIO_P10, GPIO_PULL_DOWN}, // GPIO_PULL_UP }, // RX
|
||||||
|
{ GPIO_P11, GPIO_PULL_UP }, // ADC Vbat
|
||||||
|
{ GPIO_P14, GPIO_PULL_DOWN }, // PN8 ?
|
||||||
|
{ GPIO_P15, GPIO_PULL_DOWN }, // KEY
|
||||||
|
{ GPIO_P18, GPIO_PULL_DOWN }, // PN10 ?
|
||||||
|
{ GPIO_P20, GPIO_FLOATING }, // connect to GND
|
||||||
|
{ GPIO_P34, GPIO_FLOATING } // connect to +Vbat
|
||||||
#else
|
#else
|
||||||
#error "DEVICE Not released!"
|
#error "DEVICE Not released!"
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
{GPIO_P02, GPIO_FLOATING },
|
|
||||||
{GPIO_P03, GPIO_FLOATING },
|
|
||||||
{GPIO_P07, GPIO_FLOATING },
|
|
||||||
{GPIO_P09, GPIO_FLOATING },
|
|
||||||
{GPIO_P10, GPIO_FLOATING },
|
|
||||||
{GPIO_P11, GPIO_FLOATING },
|
|
||||||
{GPIO_P14, GPIO_FLOATING },
|
|
||||||
{GPIO_P15, GPIO_FLOATING },
|
|
||||||
{GPIO_P18, GPIO_FLOATING },
|
|
||||||
{GPIO_P20, GPIO_FLOATING },
|
|
||||||
{GPIO_P34, GPIO_FLOATING },
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -323,7 +324,9 @@ const ioinit_cfg_t ioInit[] = {
|
||||||
#ifdef GPIO_LED
|
#ifdef GPIO_LED
|
||||||
hal_gpio_write(GPIO_LED, LED_ON);
|
hal_gpio_write(GPIO_LED, LED_ON);
|
||||||
#endif
|
#endif
|
||||||
|
//#if SDK_VER_CHIP == __DEF_CHIP_TSOP16__
|
||||||
DCDC_CONFIG_SETTING(0x0a);
|
DCDC_CONFIG_SETTING(0x0a);
|
||||||
|
//#endif
|
||||||
DCDC_REF_CLK_SETTING(1);
|
DCDC_REF_CLK_SETTING(1);
|
||||||
DIG_LDO_CURRENT_SETTING(1);
|
DIG_LDO_CURRENT_SETTING(1);
|
||||||
#if defined ( __GNUC__ )
|
#if defined ( __GNUC__ )
|
||||||
|
|
@ -440,9 +443,9 @@ int main(void) {
|
||||||
#endif
|
#endif
|
||||||
wrk.boot_flg = (uint8_t)read_reg(OTA_MODE_SELECT_REG);
|
wrk.boot_flg = (uint8_t)read_reg(OTA_MODE_SELECT_REG);
|
||||||
#if defined(OTA_TYPE) && OTA_TYPE == OTA_TYPE_BOOT
|
#if defined(OTA_TYPE) && OTA_TYPE == OTA_TYPE_BOOT
|
||||||
#if (DEV_SERVICES & SERVICE_KEY)
|
#if (DEV_SERVICES & (SERVICE_KEY | SERVICE_BUTTON))
|
||||||
hal_gpio_pin_init(GPIO_KEY, GPIO_INPUT);
|
hal_gpio_pin_init(GPIO_KEY, GPIO_INPUT);
|
||||||
if (hal_gpio_read(GPIO_KEY) == 0
|
if (hal_gpio_read(GPIO_KEY) == KEY_PRESSED
|
||||||
|| wrk.boot_flg == BOOT_FLG_OTA
|
|| wrk.boot_flg == BOOT_FLG_OTA
|
||||||
|| wrk.boot_flg == BOOT_FLG_FW0) {
|
|| wrk.boot_flg == BOOT_FLG_FW0) {
|
||||||
#else
|
#else
|
||||||
|
|
|
||||||
|
|
@ -224,6 +224,7 @@ typedef struct _measured_data_t {
|
||||||
uint16_t battery_mv; // mV
|
uint16_t battery_mv; // mV
|
||||||
uint8_t battery; // 0..100 %
|
uint8_t battery; // 0..100 %
|
||||||
measured_flg_t flg;
|
measured_flg_t flg;
|
||||||
|
uint8_t button;
|
||||||
} measured_data_t;
|
} measured_data_t;
|
||||||
|
|
||||||
#define send_len_measured_data 5
|
#define send_len_measured_data 5
|
||||||
|
|
|
||||||
|
|
@ -222,12 +222,12 @@ static void adv_measure(void) {
|
||||||
get_utc_time_sec(); // счет UTC timestamp
|
get_utc_time_sec(); // счет UTC timestamp
|
||||||
#if (DEV_SERVICES & SERVICE_RDS)
|
#if (DEV_SERVICES & SERVICE_RDS)
|
||||||
if(!adv_wrk.adv_event) {
|
if(!adv_wrk.adv_event) {
|
||||||
if(clkt.utc_time_tik - adv_wrk.rds_timer_tik >= (RDS_STEP_TIMER_SEC << 15)) {
|
if(clkt.utc_time_tik - adv_wrk.rds_timer_tik >= (RDS_EVENT_STEP_SEC << 15)) { // шаг дублирования передачи 30 минут
|
||||||
adv_wrk.rds_timer_tik = clkt.utc_time_tik;
|
adv_wrk.rds_timer_tik = clkt.utc_time_tik;
|
||||||
adv_wrk.adv_event = 1;
|
adv_wrk.adv_event = 1;
|
||||||
adv_wrk.adv_reload_count = RDS_RETRY_ADV_COUNT;
|
adv_wrk.adv_reload_count = RDS_EVENT_ADV_COUNT; // 16
|
||||||
LL_SetAdvData(bthome_data_beacon((void *) gapRole_AdvertData), gapRole_AdvertData);
|
LL_SetAdvData(bthome_data_beacon((void *) gapRole_AdvertData), gapRole_AdvertData);
|
||||||
set_new_adv_interval(DEF_EVENT_ADV_INERVAL); // actual time * 625us
|
set_new_adv_interval(DEF_EVENT_ADV_INERVAL); // 50 ms (in 625us)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -239,6 +239,9 @@ static void adv_measure(void) {
|
||||||
if(adv_wrk.new_battery) {
|
if(adv_wrk.new_battery) {
|
||||||
adv_wrk.new_battery = 0;
|
adv_wrk.new_battery = 0;
|
||||||
check_battery();
|
check_battery();
|
||||||
|
#if (DEV_SERVICES & SERVICE_THS) == 0
|
||||||
|
measured_data.count++;
|
||||||
|
#endif
|
||||||
#if (DEV_SERVICES & SERVICE_SCREEN)
|
#if (DEV_SERVICES & SERVICE_SCREEN)
|
||||||
chow_lcd(1);
|
chow_lcd(1);
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -263,7 +266,7 @@ static void adv_measure(void) {
|
||||||
} else {
|
} else {
|
||||||
if(adv_wrk.meas_count >= cfg.measure_interval) {
|
if(adv_wrk.meas_count >= cfg.measure_interval) {
|
||||||
adv_wrk.meas_count = 0;
|
adv_wrk.meas_count = 0;
|
||||||
read_sensors();
|
read_sensors(); // measured_data.count++
|
||||||
if(adv_wrk.new_battery) {
|
if(adv_wrk.new_battery) {
|
||||||
adv_wrk.new_battery = 0;
|
adv_wrk.new_battery = 0;
|
||||||
check_battery();
|
check_battery();
|
||||||
|
|
@ -288,12 +291,38 @@ static void adv_measure(void) {
|
||||||
#endif
|
#endif
|
||||||
if(adv_wrk.adv_reload_count) {
|
if(adv_wrk.adv_reload_count) {
|
||||||
if(--adv_wrk.adv_reload_count == 0) {
|
if(--adv_wrk.adv_reload_count == 0) {
|
||||||
|
// восстановление/переключение типа и интервалов рекламы
|
||||||
#if defined(OTA_TYPE) && OTA_TYPE == OTA_TYPE_BOOT
|
#if defined(OTA_TYPE) && OTA_TYPE == OTA_TYPE_BOOT
|
||||||
if (wrk.boot_flg == BOOT_FLG_OTA) {
|
if (wrk.boot_flg == BOOT_FLG_OTA) {
|
||||||
hal_system_soft_reset();
|
hal_system_soft_reset();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if(adv_wrk.adv_event) {
|
#if (DEV_SERVICES & SERVICE_BUTTON)
|
||||||
|
if(adv_wrk.adv_event) { // передавались event ?
|
||||||
|
adv_wrk.adv_reload_count = RDS_EVENT_ADV_COUNT;
|
||||||
|
if(!measured_data.button) {
|
||||||
|
if(adv_wrk.new_battery) {
|
||||||
|
adv_wrk.new_battery = 0;
|
||||||
|
check_battery();
|
||||||
|
}
|
||||||
|
measured_data.count++;
|
||||||
|
LL_SetAdvData(bthome_data_beacon((void *) gapRole_AdvertData), gapRole_AdvertData);
|
||||||
|
adv_wrk.adv_event = 0;
|
||||||
|
set_new_adv_interval(DEF_EVENT_ADV_INERVAL);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// восстановление пользовательского (основного) интервала передачи рекламы
|
||||||
|
if(adv_wrk.new_battery) {
|
||||||
|
adv_wrk.new_battery = 0;
|
||||||
|
check_battery();
|
||||||
|
}
|
||||||
|
measured_data.count++;
|
||||||
|
LL_SetAdvData(bthome_data_beacon((void *) gapRole_AdvertData), gapRole_AdvertData);
|
||||||
|
set_new_adv_interval(cfg.advertising_interval * 100);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if(adv_wrk.adv_event) { // передавались event ?
|
||||||
|
// восстановление пользовательского (основного) интервала передачи рекламы после цикла передач event
|
||||||
adv_wrk.adv_event = 0;
|
adv_wrk.adv_event = 0;
|
||||||
if(adv_wrk.new_battery) {
|
if(adv_wrk.new_battery) {
|
||||||
adv_wrk.new_battery = 0;
|
adv_wrk.new_battery = 0;
|
||||||
|
|
@ -302,14 +331,16 @@ static void adv_measure(void) {
|
||||||
measured_data.count++;
|
measured_data.count++;
|
||||||
LL_SetAdvData(bthome_data_beacon((void *) gapRole_AdvertData), gapRole_AdvertData);
|
LL_SetAdvData(bthome_data_beacon((void *) gapRole_AdvertData), gapRole_AdvertData);
|
||||||
}
|
}
|
||||||
|
// восстановление пользовательского (основного) интервала передачи рекламы
|
||||||
set_new_adv_interval(cfg.advertising_interval * 100);
|
set_new_adv_interval(cfg.advertising_interval * 100);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
adv_wrk.meas_count++;
|
adv_wrk.meas_count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (DEV_SERVICES & SERVICE_KEY) || (DEV_SERVICES & SERVICE_RDS)
|
#if (DEV_SERVICES & (SERVICE_KEY | SERVICE_RDS | SERVICE_BUTTON))
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
* LED and Key
|
* LED and Key
|
||||||
*/
|
*/
|
||||||
|
|
@ -319,15 +350,24 @@ static void posedge_int_wakeup_cb(GPIO_Pin_e pin, IO_Wakeup_Pol_e type)
|
||||||
if(type == POSEDGE)
|
if(type == POSEDGE)
|
||||||
{
|
{
|
||||||
LOG("int or wakeup(pos):gpio:%d type:%d\n", pin, type);
|
LOG("int or wakeup(pos):gpio:%d type:%d\n", pin, type);
|
||||||
#if (DEV_SERVICES & SERVICE_KEY)
|
#if (DEV_SERVICES & (SERVICE_KEY | SERVICE_BUTTON))
|
||||||
if(pin == GPIO_KEY) {
|
if(pin == GPIO_KEY) {
|
||||||
#ifdef GPIO_LED
|
#ifdef GPIO_LED
|
||||||
|
#if KEY_PRESSED
|
||||||
|
hal_gpio_write(GPIO_LED, LED_ON);
|
||||||
|
#else
|
||||||
hal_gpio_write(GPIO_LED, LED_OFF);
|
hal_gpio_write(GPIO_LED, LED_OFF);
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
#if (DEV_SERVICES & SERVICE_KEY) && KEY_PRESSED
|
||||||
if(gapRole_AdvEnabled) {
|
if(gapRole_AdvEnabled) {
|
||||||
adv_wrk.adv_reload_count = 60000/DEF_CON_ADV_INERVAL_MS; // 60 sec
|
adv_wrk.adv_reload_count = 60000/DEF_CON_ADV_INERVAL_MS; // 60 sec
|
||||||
set_new_adv_interval(DEF_CON_ADV_INERVAL); // actual time * 625us
|
set_new_adv_interval(DEF_CON_ADV_INERVAL); // actual time * 625us
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#if (DEV_SERVICES & SERVICE_BUTTON)
|
||||||
|
osal_set_event(simpleBLEPeripheral_TaskID, PIN_INPUT_EVT);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if (DEV_SERVICES & SERVICE_RDS)
|
#if (DEV_SERVICES & SERVICE_RDS)
|
||||||
|
|
@ -348,13 +388,26 @@ static void negedge_int_wakeup_cb(GPIO_Pin_e pin, IO_Wakeup_Pol_e type)
|
||||||
if(type == NEGEDGE)
|
if(type == NEGEDGE)
|
||||||
{
|
{
|
||||||
LOG("int or wakeup(neg):gpio:%d type:%d\n", pin, type);
|
LOG("int or wakeup(neg):gpio:%d type:%d\n", pin, type);
|
||||||
#if (DEV_SERVICES & SERVICE_KEY)
|
#if (DEV_SERVICES & (SERVICE_KEY | SERVICE_BUTTON))
|
||||||
if(pin == GPIO_KEY) {
|
if(pin == GPIO_KEY) {
|
||||||
#ifdef GPIO_LED
|
#ifdef GPIO_LED
|
||||||
|
#if KEY_PRESSED
|
||||||
|
hal_gpio_write(GPIO_LED, LED_OFF);
|
||||||
|
#else
|
||||||
hal_gpio_write(GPIO_LED, LED_ON);
|
hal_gpio_write(GPIO_LED, LED_ON);
|
||||||
#endif
|
#endif // KEY_PRESSED
|
||||||
|
#endif // GPIO_LED
|
||||||
|
#if (DEV_SERVICES & SERVICE_KEY) && (KEY_PRESSED == 0)
|
||||||
|
if(gapRole_AdvEnabled) {
|
||||||
|
adv_wrk.adv_reload_count = 60000/DEF_CON_ADV_INERVAL_MS; // 60 sec
|
||||||
|
set_new_adv_interval(DEF_CON_ADV_INERVAL); // actual time * 625us
|
||||||
}
|
}
|
||||||
#endif
|
#endif // (DEV_SERVICES & SERVICE_KEY)
|
||||||
|
#if (DEV_SERVICES & SERVICE_BUTTON)
|
||||||
|
osal_set_event(simpleBLEPeripheral_TaskID, PIN_INPUT_EVT);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif // (DEV_SERVICES & (SERVICE_KEY | SERVICE_BUTTON))
|
||||||
#if (DEV_SERVICES & SERVICE_RDS)
|
#if (DEV_SERVICES & SERVICE_RDS)
|
||||||
if(pin == GPIO_INP) {
|
if(pin == GPIO_INP) {
|
||||||
osal_set_event(simpleBLEPeripheral_TaskID, PIN_INPUT_EVT);
|
osal_set_event(simpleBLEPeripheral_TaskID, PIN_INPUT_EVT);
|
||||||
|
|
@ -366,11 +419,11 @@ static void negedge_int_wakeup_cb(GPIO_Pin_e pin, IO_Wakeup_Pol_e type)
|
||||||
LOG("error\n");
|
LOG("error\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // (DEV_SERVICES & SERVICE_KEY)
|
#endif // (DEV_SERVICES & (SERVICE_KEY | SERVICE_RDS | SERVICE_BUTTON))
|
||||||
|
|
||||||
static void init_app_gpio(void)
|
static void init_app_gpio(void)
|
||||||
{
|
{
|
||||||
#if (DEV_SERVICES & SERVICE_KEY)
|
#if (DEV_SERVICES & (SERVICE_KEY | SERVICE_BUTTON))
|
||||||
hal_gpioin_register(GPIO_KEY, posedge_int_wakeup_cb, negedge_int_wakeup_cb);
|
hal_gpioin_register(GPIO_KEY, posedge_int_wakeup_cb, negedge_int_wakeup_cb);
|
||||||
#endif
|
#endif
|
||||||
#ifdef GPIO_LED
|
#ifdef GPIO_LED
|
||||||
|
|
@ -576,8 +629,8 @@ void SimpleBLEPeripheral_Init( uint8_t task_id )
|
||||||
LL_PLUS_PerStats_Init(&g_perStatsByChanTest);
|
LL_PLUS_PerStats_Init(&g_perStatsByChanTest);
|
||||||
|
|
||||||
batt_start_measure();
|
batt_start_measure();
|
||||||
#if (DEV_SERVICES & SERVICE_RDS)
|
#if (DEV_SERVICES & (SERVICE_RDS | SERVICE_BUTTON))
|
||||||
adv_wrk.rds_timer_tik = clkt.utc_time_tik - (RDS_RETRY_START_SEC << 15);
|
adv_wrk.rds_timer_tik = clkt.utc_time_tik - (RDS_EVENT_START_SEC << 15);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
LOG("=====SimpleBLEPeripheral_Init Done=======\n");
|
LOG("=====SimpleBLEPeripheral_Init Done=======\n");
|
||||||
|
|
@ -636,7 +689,7 @@ uint16_t BLEPeripheral_ProcessEvent( uint8_t task_id, uint16_t events )
|
||||||
adv_wrk.measure_batt_tik = clkt.utc_time_tik;
|
adv_wrk.measure_batt_tik = clkt.utc_time_tik;
|
||||||
batt_start_measure();
|
batt_start_measure();
|
||||||
}
|
}
|
||||||
read_sensors();
|
read_sensors(); // measured_data.count++;
|
||||||
start_measure();
|
start_measure();
|
||||||
#if (DEV_SERVICES & SERVICE_SCREEN)
|
#if (DEV_SERVICES & SERVICE_SCREEN)
|
||||||
chow_lcd(1);
|
chow_lcd(1);
|
||||||
|
|
@ -690,9 +743,24 @@ uint16_t BLEPeripheral_ProcessEvent( uint8_t task_id, uint16_t events )
|
||||||
// return unprocessed events
|
// return unprocessed events
|
||||||
return ( events ^ SBP_START_DEVICE_EVT );
|
return ( events ^ SBP_START_DEVICE_EVT );
|
||||||
}
|
}
|
||||||
#if (DEV_SERVICES & SERVICE_RDS)
|
#if (DEV_SERVICES & (SERVICE_RDS | SERVICE_BUTTON))
|
||||||
if(events & PIN_INPUT_EVT) {
|
if(events & PIN_INPUT_EVT) {
|
||||||
int ev = 0;
|
int ev = 0;
|
||||||
|
#if (DEV_SERVICES & SERVICE_BUTTON)
|
||||||
|
if(hal_gpio_read(GPIO_KEY) == KEY_PRESSED) {
|
||||||
|
if(!measured_data.flg.pin_input) {
|
||||||
|
adv_wrk.rds_count++;
|
||||||
|
measured_data.button = 1; // press
|
||||||
|
ev = 1;
|
||||||
|
}
|
||||||
|
measured_data.flg.pin_input = 1;
|
||||||
|
} else {
|
||||||
|
// if(measured_data.flg.pin_input)
|
||||||
|
// ev = 1;
|
||||||
|
measured_data.flg.pin_input = 0;
|
||||||
|
measured_data.button = 0; // None
|
||||||
|
}
|
||||||
|
#else
|
||||||
if(hal_gpio_read(GPIO_INP)) {
|
if(hal_gpio_read(GPIO_INP)) {
|
||||||
if(!measured_data.flg.pin_input) {
|
if(!measured_data.flg.pin_input) {
|
||||||
adv_wrk.rds_count++;
|
adv_wrk.rds_count++;
|
||||||
|
|
@ -704,12 +772,13 @@ uint16_t BLEPeripheral_ProcessEvent( uint8_t task_id, uint16_t events )
|
||||||
ev = 1;
|
ev = 1;
|
||||||
measured_data.flg.pin_input = 0;
|
measured_data.flg.pin_input = 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
if(ev) {
|
if(ev) {
|
||||||
if(gapRole_AdvEnabled) {
|
if(gapRole_AdvEnabled) {
|
||||||
measured_data.count++;
|
measured_data.count++;
|
||||||
adv_wrk.adv_event = 1;
|
adv_wrk.adv_event = 1;
|
||||||
adv_wrk.adv_reload_count = RDS_RETRY_ADV_COUNT;
|
adv_wrk.adv_reload_count = RDS_EVENT_ADV_COUNT;
|
||||||
adv_wrk.rds_timer_tik = clkt.utc_time_tik - (RDS_RETRY_DOUBLE_SEC << 15);
|
adv_wrk.rds_timer_tik = clkt.utc_time_tik - (RDS_EVENT_DOUBLE_SEC << 15);
|
||||||
LL_SetAdvData(bthome_data_beacon((void *) gapRole_AdvertData), gapRole_AdvertData);
|
LL_SetAdvData(bthome_data_beacon((void *) gapRole_AdvertData), gapRole_AdvertData);
|
||||||
set_new_adv_interval(DEF_EVENT_ADV_INERVAL); // 50ms, actual time * 625us
|
set_new_adv_interval(DEF_EVENT_ADV_INERVAL); // 50ms, actual time * 625us
|
||||||
} else if(cfg.flg & FLG_MEAS_NOTIFY) {
|
} else if(cfg.flg & FLG_MEAS_NOTIFY) {
|
||||||
|
|
|
||||||
|
|
@ -28,16 +28,21 @@ extern "C"
|
||||||
#define DEF_ADV_INERVAL_MS ((DEF_ADV_INERVAL*625)/1000) // 5000 ms
|
#define DEF_ADV_INERVAL_MS ((DEF_ADV_INERVAL*625)/1000) // 5000 ms
|
||||||
#define DEF_CON_ADV_INERVAL 2500 // 1.5625 sec
|
#define DEF_CON_ADV_INERVAL 2500 // 1.5625 sec
|
||||||
#define DEF_CON_ADV_INERVAL_MS ((DEF_CON_ADV_INERVAL*625)/1000) // 1562 ms
|
#define DEF_CON_ADV_INERVAL_MS ((DEF_CON_ADV_INERVAL*625)/1000) // 1562 ms
|
||||||
|
#if (DEV_SERVICES & SERVICE_BUTTON)
|
||||||
|
#define DEF_EVENT_ADV_INERVAL 120 // 75 ms
|
||||||
|
#define RDS_EVENT_ADV_COUNT 16 // 16*75 = 1200 ms
|
||||||
|
#else
|
||||||
#define DEF_EVENT_ADV_INERVAL 80 // 50 ms
|
#define DEF_EVENT_ADV_INERVAL 80 // 50 ms
|
||||||
|
#define RDS_EVENT_ADV_COUNT 16 // 16*50 = 800 ms
|
||||||
|
#endif
|
||||||
#define DEF_EVENT_ADV_INERVAL_MS ((DEF_EVENT_ADV_INERVAL*625)/1000) // 50 ms
|
#define DEF_EVENT_ADV_INERVAL_MS ((DEF_EVENT_ADV_INERVAL*625)/1000) // 50 ms
|
||||||
#define DEF_OTA_ADV_INERVAL 1600 // 1 sec
|
#define DEF_OTA_ADV_INERVAL 1600 // 1 sec
|
||||||
#define DEF_OTA_ADV_INERVAL_MS ((DEF_OTA_ADV_INERVAL*625)/1000) // 1000 ms
|
#define DEF_OTA_ADV_INERVAL_MS ((DEF_OTA_ADV_INERVAL*625)/1000) // 1000 ms
|
||||||
|
|
||||||
// adv. event
|
// adv. event
|
||||||
#define RDS_STEP_TIMER_SEC 1800 // шаг передачи 30 минут
|
#define RDS_EVENT_STEP_SEC 1800 // шаг передачи (дублирование состояния) RDS 30 минут без событий
|
||||||
#define RDS_RETRY_DOUBLE_SEC (RDS_STEP_TIMER_SEC-12) // дубль через 12 сек
|
#define RDS_EVENT_DOUBLE_SEC (RDS_EVENT_STEP_SEC - 12) // передача (дублирование состояния) RDS через 12 сек после события
|
||||||
#define RDS_RETRY_START_SEC (RDS_STEP_TIMER_SEC-120) // старт 2 минуты
|
#define RDS_EVENT_START_SEC (RDS_EVENT_STEP_SEC - 120) // передача (дублирование состояния) RDS от старта питания - 2 минуты
|
||||||
#define RDS_RETRY_ADV_COUNT 16
|
|
||||||
|
|
||||||
// How often to perform periodic event
|
// How often to perform periodic event
|
||||||
#define SBP_PERIODIC_EVT_PERIOD 5000
|
#define SBP_PERIODIC_EVT_PERIOD 5000
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -2,8 +2,8 @@
|
||||||
|
|
||||||
# rdwr_phy62x2.py 11.01.2024 pvvx #
|
# rdwr_phy62x2.py 11.01.2024 pvvx #
|
||||||
|
|
||||||
import serial;
|
import serial
|
||||||
import time;
|
import time
|
||||||
import argparse
|
import argparse
|
||||||
import io
|
import io
|
||||||
import os
|
import os
|
||||||
|
|
@ -88,15 +88,15 @@ class phyflasher:
|
||||||
self.hexf.sec.extend(bytearray(struct.pack('<IIII', phy_head[secn][0], size, addr, 0xffffffff)))
|
self.hexf.sec.extend(bytearray(struct.pack('<IIII', phy_head[secn][0], size, addr, 0xffffffff)))
|
||||||
return self.hexf
|
return self.hexf
|
||||||
def write_cmd(self, pkt):
|
def write_cmd(self, pkt):
|
||||||
self._port.write(pkt.encode());
|
self._port.write(pkt.encode())
|
||||||
read = self._port.read(6);
|
read = self._port.read(6)
|
||||||
return read == b'#OK>>:'
|
return read == b'#OK>>:'
|
||||||
def SendResetCmd(self):
|
def SendResetCmd(self):
|
||||||
return self._port.write(str.encode('reset '));
|
return self._port.write(str.encode('reset '))
|
||||||
def read_reg(self, addr):
|
def read_reg(self, addr):
|
||||||
pkt = 'rdreg%08x' % addr;
|
pkt = 'rdreg%08x' % addr
|
||||||
sent = self._port.write(pkt.encode());
|
sent = self._port.write(pkt.encode())
|
||||||
read = self._port.read(17);
|
read = self._port.read(17)
|
||||||
if len(read) == 17 and read[0:3] == b'=0x' and read[11:17] == b'#OK>>:':
|
if len(read) == 17 and read[0:3] == b'=0x' and read[11:17] == b'#OK>>:':
|
||||||
return int(read[1:11], 16)
|
return int(read[1:11], 16)
|
||||||
return None
|
return None
|
||||||
|
|
@ -124,13 +124,13 @@ class phyflasher:
|
||||||
if mbit > 0:
|
if mbit > 0:
|
||||||
regcmd = regcmd | 0x40000
|
regcmd = regcmd | 0x40000
|
||||||
if dummy > 0:
|
if dummy > 0:
|
||||||
regcmd = regcmd | (dummy << 7);
|
regcmd = regcmd | (dummy << 7)
|
||||||
if not self.write_reg(0x4000c890, regcmd | 1):
|
if not self.write_reg(0x4000c890, regcmd | 1):
|
||||||
print('Error write Flash Command Register!')
|
print('Error write Flash Command Register!')
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
def flash_wait_idle(self):
|
def flash_wait_idle(self):
|
||||||
i = 5;
|
i = 5
|
||||||
while i > 0:
|
while i > 0:
|
||||||
r = self.read_reg(0x4000c890)
|
r = self.read_reg(0x4000c890)
|
||||||
if r == None:
|
if r == None:
|
||||||
|
|
@ -179,9 +179,9 @@ class phyflasher:
|
||||||
return self.wr_flash_cmd(6) and self.wr_flash_cmd(1, 0, 1)
|
return self.wr_flash_cmd(6) and self.wr_flash_cmd(1, 0, 1)
|
||||||
def ReadRevision(self):
|
def ReadRevision(self):
|
||||||
#0x001364c8 6222M005 #OK>>:
|
#0x001364c8 6222M005 #OK>>:
|
||||||
self._port.write(str.encode('rdrev+ '));
|
self._port.write(str.encode('rdrev+ '))
|
||||||
self._port.timeout = 0.1
|
self._port.timeout = 0.1
|
||||||
read = self._port.read(26);
|
read = self._port.read(26)
|
||||||
if len(read) == 26 and read[0:2] == b'0x' and read[20:26] == b'#OK>>:':
|
if len(read) == 26 and read[0:2] == b'0x' and read[20:26] == b'#OK>>:':
|
||||||
print('Revision:', read[2:19])
|
print('Revision:', read[2:19])
|
||||||
if read[11:15] != b'6222':
|
if read[11:15] != b'6222':
|
||||||
|
|
@ -196,9 +196,9 @@ class phyflasher:
|
||||||
def SetBaud(self, baud):
|
def SetBaud(self, baud):
|
||||||
if self._port.baudrate != baud:
|
if self._port.baudrate != baud:
|
||||||
print ('Reopen %s port %i baud...' % (self.port, baud), end = ' '),
|
print ('Reopen %s port %i baud...' % (self.port, baud), end = ' '),
|
||||||
self._port.write(str.encode("uarts%i" % baud));
|
self._port.write(str.encode("uarts%i" % baud))
|
||||||
self._port.timeout = 1
|
self._port.timeout = 1
|
||||||
read = self._port.read(3);
|
read = self._port.read(3)
|
||||||
if read == b'#OK':
|
if read == b'#OK':
|
||||||
print ('ok')
|
print ('ok')
|
||||||
self.baud = baud
|
self.baud = baud
|
||||||
|
|
@ -227,12 +227,12 @@ class phyflasher:
|
||||||
self._port.setDTR(False) #TM (hi)
|
self._port.setDTR(False) #TM (hi)
|
||||||
self._port.setRTS(False) #RSTN (hi)
|
self._port.setRTS(False) #RSTN (hi)
|
||||||
self._port.timeout = 0.04
|
self._port.timeout = 0.04
|
||||||
ttcl = 50;
|
ttcl = 50
|
||||||
fct_mode = False
|
fct_mode = False
|
||||||
pkt = 'UXTDWU' # UXTL16 UDLL48 UXTDWU
|
pkt = 'UXTDWU' # UXTL16 UDLL48 UXTDWU
|
||||||
while ttcl > 0:
|
while ttcl > 0:
|
||||||
sent = self._port.write(pkt.encode());
|
sent = self._port.write(pkt.encode())
|
||||||
read = self._port.read(6);
|
read = self._port.read(6)
|
||||||
if read == b'cmd>>:' :
|
if read == b'cmd>>:' :
|
||||||
break
|
break
|
||||||
if read == b'fct>>:' :
|
if read == b'fct>>:' :
|
||||||
|
|
@ -317,7 +317,7 @@ class phyflasher:
|
||||||
def cmd_erase_all_flash(self):
|
def cmd_erase_all_flash(self):
|
||||||
print ('Erase All Chip Flash...', end = ' '),
|
print ('Erase All Chip Flash...', end = ' '),
|
||||||
if self.wr_flash_cmd(6) and self.wr_flash_cmd(0x60): #Write Enable, Chip Erase
|
if self.wr_flash_cmd(6) and self.wr_flash_cmd(0x60): #Write Enable, Chip Erase
|
||||||
i = 77;
|
i = 77
|
||||||
while i > 0:
|
while i > 0:
|
||||||
r = self.flash_read_status()
|
r = self.flash_read_status()
|
||||||
if r == None:
|
if r == None:
|
||||||
|
|
@ -387,7 +387,7 @@ class phyflasher:
|
||||||
return False
|
return False
|
||||||
data = stream.read(size)
|
data = stream.read(size)
|
||||||
self._port.write(data)
|
self._port.write(data)
|
||||||
read = self._port.read(23); #'checksum is: 0x00001d1e'
|
read = self._port.read(23) #'checksum is: 0x00001d1e'
|
||||||
#print ('%s' % read),
|
#print ('%s' % read),
|
||||||
if read[0:15] != b'checksum is: 0x':
|
if read[0:15] != b'checksum is: 0x':
|
||||||
print ('error!')
|
print ('error!')
|
||||||
|
|
@ -510,14 +510,14 @@ def arg_auto_int(x):
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
parser = argparse.ArgumentParser(description='%s version %s' % (__progname__, __version__), prog = __filename__)
|
parser = argparse.ArgumentParser(description='%s version %s' % (__progname__, __version__), prog = __filename__)
|
||||||
parser.add_argument('--port', '-p', help = 'Serial port device', default='COM1');
|
parser.add_argument('--port', '-p', help = 'Serial port device', default='COM1')
|
||||||
parser.add_argument('--baud', '-b', help = 'Set Port Baud (115200, 250000, 500000, 1000000)', type = arg_auto_int, default = DEF_RUN_BAUD);
|
parser.add_argument('--baud', '-b', help = 'Set Port Baud rate (115200, 250000, 500000, 1000000)', type = arg_auto_int, default = DEF_RUN_BAUD)
|
||||||
|
|
||||||
parser.add_argument('--allerase', '-a', action='store_true', help = 'Pre-processing: All Chip Erase');
|
parser.add_argument('--allerase', '-a', action='store_true', help = 'Pre-processing: All Chip Erase')
|
||||||
parser.add_argument('--erase', '-e', action='store_true', help = 'Pre-processing: Erase Flash work area');
|
parser.add_argument('--erase', '-e', action='store_true', help = 'Pre-processing: Erase Flash work area')
|
||||||
parser.add_argument('--reset', '-r', action='store_true', help = 'Post-processing: Reset');
|
parser.add_argument('--reset', '-r', action='store_true', help = 'Post-processing: Reset')
|
||||||
parser.add_argument('--start', '-s', help = 'Application start address for hex writer (default: 0x%08x)' % DEF_START_RUN_APP_ADDR, type = arg_auto_int, default = DEF_START_RUN_APP_ADDR);
|
parser.add_argument('--start', '-s', help = 'Application start address for hex writer (default: 0x%08x)' % DEF_START_RUN_APP_ADDR, type = arg_auto_int, default = DEF_START_RUN_APP_ADDR)
|
||||||
parser.add_argument('--write', '-w', help = 'Flash starting address for hex writer (default: 0x%08x)' % DEF_START_WR_FLASH_ADDR, type = arg_auto_int, default = DEF_START_WR_FLASH_ADDR);
|
parser.add_argument('--write', '-w', help = 'Flash starting address for hex writer (default: 0x%08x)' % DEF_START_WR_FLASH_ADDR, type = arg_auto_int, default = DEF_START_WR_FLASH_ADDR)
|
||||||
|
|
||||||
subparsers = parser.add_subparsers(
|
subparsers = parser.add_subparsers(
|
||||||
dest='operation',
|
dest='operation',
|
||||||
|
|
@ -596,11 +596,11 @@ def main():
|
||||||
#filename = "r%08x-%08x.bin" % (addr, length)
|
#filename = "r%08x-%08x.bin" % (addr, length)
|
||||||
if args.size == 0:
|
if args.size == 0:
|
||||||
print("Read Size = 0!" )
|
print("Read Size = 0!" )
|
||||||
exit(1);
|
exit(1)
|
||||||
try:
|
try:
|
||||||
ff = open(args.filename, "wb")
|
ff = open(args.filename, "wb")
|
||||||
except:
|
except:
|
||||||
print("Error file open '%s'" % filename)
|
print("Error file open '%s'" % args.filename)
|
||||||
exit(2)
|
exit(2)
|
||||||
if not phy.ReadBusToFile(ff, args.address, args.size):
|
if not phy.ReadBusToFile(ff, args.address, args.size):
|
||||||
ff.close()
|
ff.close()
|
||||||
|
|
@ -634,7 +634,7 @@ def main():
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
aerase = args.operation == 'we'
|
aerase = args.operation == 'we'
|
||||||
if args.erase == True or args.allerase == True:
|
if args.erase == True or args.allerase == True:
|
||||||
aerase = False;
|
aerase = False
|
||||||
if args.allerase == True:
|
if args.allerase == True:
|
||||||
if not phy.cmd_erase_all_flash():
|
if not phy.cmd_erase_all_flash():
|
||||||
stream.close()
|
stream.close()
|
||||||
|
|
@ -643,7 +643,7 @@ def main():
|
||||||
else:
|
else:
|
||||||
if args.erase == True:
|
if args.erase == True:
|
||||||
if not phy.cmd_erase_work_flash():
|
if not phy.cmd_erase_work_flash():
|
||||||
stream.close
|
stream.close()
|
||||||
print ('Error: Erase Flash!')
|
print ('Error: Erase Flash!')
|
||||||
sys.exit(3)
|
sys.exit(3)
|
||||||
phy.SetAutoErase(aerase)
|
phy.SetAutoErase(aerase)
|
||||||
|
|
@ -672,7 +672,7 @@ def main():
|
||||||
print ('----------------------------------------------------------')
|
print ('----------------------------------------------------------')
|
||||||
aerase = True
|
aerase = True
|
||||||
if args.erase == True or args.allerase == True:
|
if args.erase == True or args.allerase == True:
|
||||||
aerase = False;
|
aerase = False
|
||||||
if args.allerase == True:
|
if args.allerase == True:
|
||||||
if not phy.cmd_erase_all_flash():
|
if not phy.cmd_erase_all_flash():
|
||||||
stream.close()
|
stream.close()
|
||||||
|
|
@ -681,7 +681,7 @@ def main():
|
||||||
else:
|
else:
|
||||||
if args.erase == True:
|
if args.erase == True:
|
||||||
if not phy.cmd_erase_work_flash():
|
if not phy.cmd_erase_work_flash():
|
||||||
stream.close
|
stream.close()
|
||||||
print ('Error: Erase Flash!')
|
print ('Error: Erase Flash!')
|
||||||
sys.exit(3)
|
sys.exit(3)
|
||||||
phy.SetAutoErase(aerase)
|
phy.SetAutoErase(aerase)
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ extern const uint32_t _ebss;
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#define WR_BLK_SIZE 256
|
#define WR_BLK_SIZE 256
|
||||||
|
#define MAX_FLASH_SIZE 0x200000
|
||||||
|
|
||||||
/* Заголовок OTA */
|
/* Заголовок OTA */
|
||||||
typedef struct _app_info_t {
|
typedef struct _app_info_t {
|
||||||
|
|
@ -45,14 +46,68 @@ app_info_seg_t seg_info;
|
||||||
|
|
||||||
uint8_t sector_buf[WR_BLK_SIZE];
|
uint8_t sector_buf[WR_BLK_SIZE];
|
||||||
|
|
||||||
|
#define SPIF_WAIT_IDLE_CYC 32
|
||||||
|
|
||||||
|
static void spif_status_wait_idle(void) {
|
||||||
|
while((AP_SPIF->fcmd & 0x02) == 0x02);
|
||||||
|
volatile int delay_cycle = SPIF_WAIT_IDLE_CYC;
|
||||||
|
while (delay_cycle--){};
|
||||||
|
while ((AP_SPIF->config & 0x80000000) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#define flh_OK 0
|
||||||
|
#define flh_ERR 1
|
||||||
|
|
||||||
|
static uint8_t _spif_read_status_reg_x(void) {
|
||||||
|
uint8_t status;
|
||||||
|
spif_cmd(0x05, 0, 2, 0, 0, 0); // 0x05 - read status
|
||||||
|
spif_status_wait_idle();
|
||||||
|
spif_rddata(&status, 1);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern void WaitRTCCount(uint32_t rtcDelyCnt);
|
||||||
|
|
||||||
|
#define SPIF_TIMEOUT (0x7ffffff)//1000000 ; // 0x40000 - 40 сек
|
||||||
|
|
||||||
|
static int spif_wait_nobusy(uint8_t flg) {
|
||||||
|
uint8_t status;
|
||||||
|
volatile int tout = SPIF_TIMEOUT;
|
||||||
|
while(tout--) {
|
||||||
|
status = _spif_read_status_reg_x();
|
||||||
|
if ((status & flg) == 0)
|
||||||
|
return flh_OK;
|
||||||
|
}
|
||||||
|
return flh_ERR;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define SFLG_WIP 1
|
||||||
|
#define SFLG_WEL 2
|
||||||
|
#define SFLG_WELWIP 3
|
||||||
|
|
||||||
|
void flash_erase_sector(unsigned int addr) {
|
||||||
|
spif_status_wait_idle();
|
||||||
|
spif_wait_nobusy(SFLG_WIP);
|
||||||
|
AP_SPIF->fcmd = 0x6000001;
|
||||||
|
spif_status_wait_idle();
|
||||||
|
spif_wait_nobusy(SFLG_WIP);
|
||||||
|
AP_SPIF->fcmd_addr = addr;
|
||||||
|
spif_cmd(0x20,3,0,0,0,0);
|
||||||
|
spif_status_wait_idle();
|
||||||
|
spif_wait_nobusy(SFLG_WELWIP);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
__attribute__ ((naked))
|
__attribute__ ((naked))
|
||||||
void copy_app_code(void) {
|
void copy_app_code(void) {
|
||||||
uint32_t blksize = WR_BLK_SIZE;
|
uint32_t blksize = WR_BLK_SIZE;
|
||||||
uint32_t rfaddr = FADDR_APP_SEC + 0xfc;
|
uint32_t rfaddr = FADDR_APP_SEC + 0xfc;
|
||||||
uint32_t dfaddr = 0;
|
uint32_t dfaddr = 0;
|
||||||
uint32_t wfaddr = FADDR_BOOT_ROM_INFO;
|
uint32_t wfaddr = FADDR_BOOT_ROM_INFO + MAX_FLASH_SIZE;
|
||||||
uint32_t count;
|
uint32_t count;
|
||||||
__disable_irq();
|
__disable_irq();
|
||||||
|
//*(volatile uint32_t *) 0x1fff0898 = MAX_FLASH_SIZE*2;
|
||||||
spif_read(rfaddr, (uint8_t*)&rfaddr, 4);
|
spif_read(rfaddr, (uint8_t*)&rfaddr, 4);
|
||||||
spif_read(rfaddr, (uint8_t*)&info_app, sizeof(info_app));
|
spif_read(rfaddr, (uint8_t*)&info_app, sizeof(info_app));
|
||||||
if(info_app.flag == START_UP_FLAG
|
if(info_app.flag == START_UP_FLAG
|
||||||
|
|
@ -62,7 +117,7 @@ void copy_app_code(void) {
|
||||||
){
|
){
|
||||||
dfaddr = rfaddr + 0x100;
|
dfaddr = rfaddr + 0x100;
|
||||||
count = info_app.seg_count;
|
count = info_app.seg_count;
|
||||||
spif_erase_sector(wfaddr);
|
flash_erase_sector(wfaddr);
|
||||||
spif_write(wfaddr, (uint8_t*)&info_app.seg_count, 4);
|
spif_write(wfaddr, (uint8_t*)&info_app.seg_count, 4);
|
||||||
spif_write(wfaddr + 8, (uint8_t*)&info_app.start_addr, 4);
|
spif_write(wfaddr + 8, (uint8_t*)&info_app.start_addr, 4);
|
||||||
wfaddr += 0x100;
|
wfaddr += 0x100;
|
||||||
|
|
@ -72,13 +127,13 @@ void copy_app_code(void) {
|
||||||
spif_write(wfaddr, (uint8_t*)&seg_info, 12);
|
spif_write(wfaddr, (uint8_t*)&seg_info, 12);
|
||||||
wfaddr += 16;
|
wfaddr += 16;
|
||||||
}
|
}
|
||||||
wfaddr = FADDR_OTA_SEC;
|
wfaddr = FADDR_OTA_SEC + MAX_FLASH_SIZE;
|
||||||
count = info_app.app_size;
|
count = info_app.app_size;
|
||||||
while(count) {
|
while(count) {
|
||||||
if(count < WR_BLK_SIZE)
|
if(count < WR_BLK_SIZE)
|
||||||
blksize = count;
|
blksize = count;
|
||||||
if((wfaddr & (FLASH_SECTOR_SIZE - 1)) == 0)
|
if((wfaddr & (FLASH_SECTOR_SIZE - 1)) == 0)
|
||||||
spif_erase_sector(wfaddr);
|
flash_erase_sector(wfaddr);
|
||||||
spif_read(dfaddr, sector_buf, blksize);
|
spif_read(dfaddr, sector_buf, blksize);
|
||||||
spif_write(wfaddr, sector_buf, blksize);
|
spif_write(wfaddr, sector_buf, blksize);
|
||||||
dfaddr += blksize;
|
dfaddr += blksize;
|
||||||
|
|
|
||||||
|
|
@ -81,7 +81,7 @@ SECTIONS
|
||||||
*(.text .text.*)
|
*(.text .text.*)
|
||||||
|
|
||||||
_etext = ABSOLUTE(.);
|
_etext = ABSOLUTE(.);
|
||||||
} > flash : xip
|
} > sram : xip
|
||||||
|
|
||||||
.rodata : {
|
.rodata : {
|
||||||
*(.rodata .rodata.*)
|
*(.rodata .rodata.*)
|
||||||
|
|
@ -94,7 +94,7 @@ SECTIONS
|
||||||
*(.got)
|
*(.got)
|
||||||
*(.gcc_except_table)
|
*(.gcc_except_table)
|
||||||
*(.gnu.linkonce.r.*)
|
*(.gnu.linkonce.r.*)
|
||||||
} > flash : rodata
|
} > sram : rodata
|
||||||
|
|
||||||
.init_section : {
|
.init_section : {
|
||||||
_sinit = ABSOLUTE(.);
|
_sinit = ABSOLUTE(.);
|
||||||
|
|
@ -104,17 +104,17 @@ SECTIONS
|
||||||
|
|
||||||
.ARM.extab : {
|
.ARM.extab : {
|
||||||
*(.ARM.extab*)
|
*(.ARM.extab*)
|
||||||
} > flash : rodata
|
} > sram : rodata
|
||||||
|
|
||||||
.ARM.exidx : {
|
.ARM.exidx : {
|
||||||
__exidx_start = ABSOLUTE(.);
|
__exidx_start = ABSOLUTE(.);
|
||||||
*(.ARM.exidx*)
|
*(.ARM.exidx*)
|
||||||
__exidx_end = ABSOLUTE(.);
|
__exidx_end = ABSOLUTE(.);
|
||||||
} > flash : rodata
|
} > sram : rodata
|
||||||
|
|
||||||
._sjtblsstore : {
|
._sjtblsstore : {
|
||||||
_sjtblss = ABSOLUTE(.);
|
_sjtblss = ABSOLUTE(.);
|
||||||
} > flash : rodata
|
} > sram : rodata
|
||||||
|
|
||||||
/* Stabs debugging sections. */
|
/* Stabs debugging sections. */
|
||||||
.stab 0 : { *(.stab) }
|
.stab 0 : { *(.stab) }
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@
|
||||||
#ifndef FLASH_SECTOR_SIZE
|
#ifndef FLASH_SECTOR_SIZE
|
||||||
#define FLASH_SECTOR_SIZE 0x01000 // 4k (4*1024)
|
#define FLASH_SECTOR_SIZE 0x01000 // 4k (4*1024)
|
||||||
#endif
|
#endif
|
||||||
#define FADDR_START_ADDR (0x11000000)
|
#define FADDR_START_ADDR (0x11000000) // FLASH_BASE_ADDR
|
||||||
#define FADDR_BOOT_ROM_INFO (FADDR_START_ADDR + 0x02000) // 4k
|
#define FADDR_BOOT_ROM_INFO (FADDR_START_ADDR + 0x02000) // 4k
|
||||||
#define FADDR_OTA_SEC (FADDR_START_ADDR + 0x03000) // 52k
|
#define FADDR_OTA_SEC (FADDR_START_ADDR + 0x03000) // 52k
|
||||||
#define FADDR_APP_SEC (FADDR_START_ADDR + 0x10000) // 176k (for 256k Flash)
|
#define FADDR_APP_SEC (FADDR_START_ADDR + 0x10000) // 176k (for 256k Flash)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue