From 8fb718a4ecacca5ce6d4361e6b53984a43bec821 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Thu, 27 Jun 2024 14:16:33 +0800 Subject: [PATCH] update --- sdk | 2 +- .../subboard100_idcard_reader/eeprom_service.cpp | 62 ++++++++++++++++------ .../subboard100_idcard_reader/eeprom_service.hpp | 4 ++ 3 files changed, 50 insertions(+), 18 deletions(-) diff --git a/sdk b/sdk index 986dbc2..0437a22 160000 --- a/sdk +++ b/sdk @@ -1 +1 @@ -Subproject commit 986dbc2bbbdc5754b0338ecd0a4dbfa349b2cad6 +Subproject commit 0437a229bf75aae0e61b2287218af82a70ec0718 diff --git a/usrc/subboards/subboard100_idcard_reader/eeprom_service.cpp b/usrc/subboards/subboard100_idcard_reader/eeprom_service.cpp index 01ce9be..bca5c67 100644 --- a/usrc/subboards/subboard100_idcard_reader/eeprom_service.cpp +++ b/usrc/subboards/subboard100_idcard_reader/eeprom_service.cpp @@ -8,9 +8,9 @@ using namespace std; using namespace iflytop; -#define SECTOR_SIZE (128) -#define SECTOR_NUM (2 * 8) // 2k -#define MAX_SIZE (SECTOR_SIZE * SECTOR_NUM) +#define SECTOR_SIZE (64) +#define SECTOR_NUM (4 * 8) +#define MAX_SIZE (SECTOR_SIZE * SECTOR_NUM)// 2k #define TAG "EEPROMService" @@ -55,6 +55,11 @@ void EEPROMService::initialize(int id, I2C_HandleTypeDef* i2c_handle, ProtocolEv // write_test_data_rom(&m_subdevice_p24c16); // write_test_data_rom(&m_subdevice_m24lrxxe); + // MAX_SIZE + m_idcardcache = (uint8_t*)malloc(MAX_SIZE + 10); + ZASSERT(m_idcardcache); + memset(m_idcardcache, 0, MAX_SIZE + 10); + start_monitor_status(); } @@ -116,22 +121,37 @@ void EEPROMService::detect_online() { * * @param i2c_ping_state */ - + bool detect = false; if (i2c_ping_state[0x50] && i2c_ping_state[0x51] && i2c_ping_state[0x52]) { m_nowonline = &m_subdevice_p24c16; - change_is_online_flag(true); - m_writeunlock = false; ZLOGI(TAG, "detect eerpom p24c16"); + detect = true; } else if (!i2c_ping_state[0x50] && i2c_ping_state[0x53] && i2c_ping_state[0x57]) { m_nowonline = &m_subdevice_m24lrxxe; - change_is_online_flag(true); - m_writeunlock = false; ZLOGI(TAG, "detect eerpom M24LR16E"); // - // uint32_t rdbak = 0; - // m_subdevice_m24lrxxe.readCfgReg(2332, &rdbak); - // ZLOGI(TAG, "m24lrxxe cfg reg: %08x", rdbak); + detect = true; + } + if (!detect) return; + + /** + * @brief + * 直接读取数据进行缓存 + * + */ + + for (uint16_t i = 0; i < SECTOR_NUM; i++) { + int32_t len = SECTOR_SIZE; + int32_t suc = m_nowonline->read(i * SECTOR_SIZE, m_idcardcache + i * SECTOR_SIZE, &len); + if (suc != 0) { + return; + } } + ZLOGI(TAG, "detect_online: %d", m_nowonline->isOnline()); + + m_writeunlock = false; + change_is_online_flag(true); + } else { if (!m_nowonline->isOnline()) { m_nowonline = nullptr; @@ -148,19 +168,27 @@ int32_t EEPROMService::a8000_idcard_reader_read_raw(int32_t index, uint8_t* data uint16_t add = index * SECTOR_SIZE; *len = SECTOR_SIZE; - ZLOGI(TAG, "read: %d, %d", add, *len); - int32_t val = m_nowonline->read(add, data, len); - // dumpbuf(data, *len); - return val; + memcpy(data, m_idcardcache + add, *len); + return 0; } int32_t EEPROMService::a8000_idcard_write_raw(int32_t add, uint8_t* data, int32_t len) { zlock_guard guard(m_mutex); + /** + * @brief 每次写入需要大于5ms + */ if (!m_nowonline) return err::kdevice_offline; if (!m_writeunlock) return err::killegal_operation; + if (add % 4 != 0) return err::kparam_out_of_range; + if (len != 4) return err::kparam_out_of_range; + if (add >= MAX_SIZE) return err::kparam_out_of_range; + if (HAL_GetTick() - m_lastwritetime < 5) return err::kdevice_is_busy; + + ZLOGI(TAG, "write: 0x%08x, 0x%08x ", add, *(uint32_t*)data); + m_nowonline->write(add, data, len); + m_nowonline->read(add, m_idcardcache + add, &len); - ZLOGI(TAG, "write: 0x%08x, %d", add, len); - m_nowonline->write(add, (uint8_t*)&data, len); + m_lastwritetime = HAL_GetTick(); return 0; } diff --git a/usrc/subboards/subboard100_idcard_reader/eeprom_service.hpp b/usrc/subboards/subboard100_idcard_reader/eeprom_service.hpp index fe4b745..fe8bb90 100644 --- a/usrc/subboards/subboard100_idcard_reader/eeprom_service.hpp +++ b/usrc/subboards/subboard100_idcard_reader/eeprom_service.hpp @@ -41,6 +41,10 @@ class EEPROMService : public ZIModule, public ZIA8000IDCardReaderModule { M24LRXXE_I2C_EEPROM m_subdevice_m24lrxxe; bool m_writeunlock = false; + uint32_t m_lastwritetime = 0; + + uint8_t* m_idcardcache = nullptr; + public: EEPROMService(){}; ~EEPROMService(){};