7 changed files with 218 additions and 156 deletions
-
34components/api/zi_eeprom.hpp
-
108components/sensors/i2ceeprom/m24lr64e_i2c_eeprom.cpp
-
48components/sensors/i2ceeprom/m24lr64e_i2c_eeprom.hpp
-
64components/sensors/i2ceeprom/m24lrxxe_i2c_eeprom.cpp
-
29components/sensors/i2ceeprom/m24lrxxe_i2c_eeprom.hpp
-
63components/sensors/i2ceeprom/p24c16_eeprom.cpp
-
28components/sensors/i2ceeprom/p24c16_eeprom.hpp
@ -0,0 +1,34 @@ |
|||
#pragma once
|
|||
#include <stdint.h>
|
|||
|
|||
#include <functional>
|
|||
|
|||
#include "sdk\components\zprotocols\zcancmder_v2\api\errorcode.hpp"
|
|||
|
|||
namespace iflytop { |
|||
using namespace std; |
|||
|
|||
typedef enum { |
|||
kp24c16, |
|||
km24lrxxe, |
|||
} eeprom_type_t; |
|||
|
|||
class ZI_EEPROM { |
|||
public: |
|||
virtual ~ZI_EEPROM() {} |
|||
|
|||
public: |
|||
/**
|
|||
* @brief |
|||
* |
|||
* @param add 4byte¶ÔÆë |
|||
* @param val |
|||
* @param len 4µÄ±¶Êý |
|||
* @return int32_t |
|||
*/ |
|||
virtual int32_t write(int32_t add, uint8_t* val, int32_t *len) = 0; |
|||
virtual int32_t read(int32_t add, uint8_t* val, int32_t *len) = 0; |
|||
|
|||
virtual bool isOnline() = 0; |
|||
}; |
|||
} // namespace iflytop
|
@ -1,108 +0,0 @@ |
|||
#include "m24lr64e_i2c_eeprom.hpp"
|
|||
|
|||
#include <stdio.h>
|
|||
#include <string.h>
|
|||
|
|||
#include "sdk\components\zprotocols\errorcode\errorcode.hpp"
|
|||
|
|||
#ifdef HAL_I2C_MODULE_ENABLED
|
|||
|
|||
using namespace std; |
|||
using namespace iflytop; |
|||
|
|||
#define READ_ADD 0x53
|
|||
#define MAX_SIZE (128 * 16)
|
|||
#define SECTOR_SIZE (128)
|
|||
#define SECTOR_NUM (16)
|
|||
#define TAG "M24LR64E_I2CEEPROM"
|
|||
void M24LR64E_I2CEEPROM::initialize(int id, I2C_HandleTypeDef* i2c_handle, ZIEventBusSender* event_bus_sender) { |
|||
m_i2c_handle = i2c_handle; |
|||
ZASSERT(m_i2c_handle); |
|||
m_mutex.init(); |
|||
m_monitor_thread.init(TAG, 1024, osPriorityNormal); |
|||
this->id = id; |
|||
|
|||
m_event_bus_sender = event_bus_sender; |
|||
start_monitor_status(); |
|||
} |
|||
|
|||
int32_t M24LR64E_I2CEEPROM::start_monitor_status() { |
|||
ZLOGI(TAG, "start_monitor_status"); |
|||
m_monitor_thread.start([this]() { |
|||
// eeprom_status_t status;
|
|||
|
|||
#if 1
|
|||
while (!m_monitor_thread.getExitFlag()) { |
|||
bool is_online = isonline(); |
|||
change_is_online_flag(is_online); |
|||
osDelay(100); |
|||
} |
|||
#endif
|
|||
}); |
|||
return 0; |
|||
}; |
|||
int32_t M24LR64E_I2CEEPROM::stop_monitor_status() { |
|||
ZLOGI(TAG, "stop_monitor_status"); |
|||
m_monitor_thread.stop(); |
|||
return 0; |
|||
}; |
|||
int32_t M24LR64E_I2CEEPROM::module_read_raw(int32_t index, uint8_t* data, int32_t* len) { |
|||
zlock_guard guard(m_mutex); |
|||
int32_t sector_size = SECTOR_SIZE; |
|||
|
|||
if (sector_size > *len) return err::kbuffer_not_enough; |
|||
|
|||
uint16_t add = index * sector_size; |
|||
if (add >= MAX_SIZE) return err::kparam_out_of_range; |
|||
|
|||
if (add + sector_size > MAX_SIZE) { |
|||
*len = MAX_SIZE - add; |
|||
} else { |
|||
*len = sector_size; |
|||
} |
|||
HAL_StatusTypeDef status = HAL_I2C_Mem_Read(m_i2c_handle, READ_ADD, add, I2C_MEMADD_SIZE_8BIT, data, *len, 30); |
|||
if (status != HAL_OK) { |
|||
printf("M24LR64E_I2CEEPROM::read error: %d\n", status); |
|||
return err::kdevice_offline; |
|||
} |
|||
return 0; |
|||
} |
|||
|
|||
bool M24LR64E_I2CEEPROM::isonline() { |
|||
zlock_guard guard(m_mutex); |
|||
uint8_t data[2]; |
|||
HAL_StatusTypeDef status = HAL_I2C_Mem_Read(m_i2c_handle, READ_ADD, 0, I2C_MEMADD_SIZE_8BIT, data, 2, 5); |
|||
if (status != HAL_OK) { |
|||
return false; |
|||
} |
|||
return true; |
|||
} |
|||
int32_t M24LR64E_I2CEEPROM::module_xxx_reg(int32_t param_id, bool read, int32_t& val) { |
|||
switch (param_id) { |
|||
PROCESS_REG(kreg_module_raw_sector_size, /* */ val = SECTOR_SIZE, ACTION_NONE); |
|||
PROCESS_REG(kreg_module_raw_sector_num, /* */ val = SECTOR_NUM, ACTION_NONE); |
|||
PROCESS_REG(kreg_module_is_online, /* */ val = isonline(), ACTION_NONE); |
|||
default: |
|||
return err::kmodule_not_find_config_index; |
|||
break; |
|||
} |
|||
return 0; |
|||
} |
|||
|
|||
void M24LR64E_I2CEEPROM::change_is_online_flag(bool state) { |
|||
if (m_is_online_flag != state) { |
|||
m_is_online_flag = state; |
|||
if (m_event_bus_sender) { |
|||
m_event_bus_sender->push_reg_state_change_event(id, kreg_module_is_online, !m_is_online_flag, m_is_online_flag); |
|||
} |
|||
} |
|||
} |
|||
|
|||
int32_t M24LR64E_I2CEEPROM::read_status() { |
|||
if (!m_monitor_thread.isworking()) { |
|||
return 0; |
|||
} |
|||
return 1; |
|||
} |
|||
|
|||
#endif
|
@ -1,48 +0,0 @@ |
|||
#include "sdk\components\zprotocols\zcancmder_v2\api\api.hpp"
|
|||
#include "sdk\os\zos.hpp"
|
|||
|
|||
#ifdef HAL_I2C_MODULE_ENABLED
|
|||
namespace iflytop { |
|||
using namespace std; |
|||
class M24LR64E_I2CEEPROM : public ZIModule { |
|||
I2C_HandleTypeDef* m_i2c_handle; |
|||
ZThread m_monitor_thread; |
|||
bool m_is_online_flag = false; |
|||
zmutex m_mutex; |
|||
ZIEventBusSender* m_event_bus_sender; |
|||
|
|||
int32_t id = 0; |
|||
|
|||
public: |
|||
M24LR64E_I2CEEPROM(){}; |
|||
~M24LR64E_I2CEEPROM(){}; |
|||
|
|||
void initialize(int id, I2C_HandleTypeDef* i2c_handle, ZIEventBusSender* event_bus_sender); |
|||
|
|||
public: |
|||
int32_t start_monitor_status(); |
|||
int32_t stop_monitor_status(); |
|||
int32_t code_scaner_read_scaner_result(int32_t startadd, uint8_t* data, int32_t* len); |
|||
|
|||
public: |
|||
virtual int32_t getid(int32_t* id) override { |
|||
*id = this->id; |
|||
return 0; |
|||
} |
|||
virtual int32_t module_get_status(int32_t* status) { |
|||
*status = 1; |
|||
return 0; |
|||
} |
|||
virtual int32_t module_read_raw(int32_t index, uint8_t* data, int32_t* len); |
|||
|
|||
private: |
|||
virtual int32_t module_xxx_reg(int32_t param_id, bool read, int32_t& param_value) override; |
|||
int32_t read_status(); |
|||
|
|||
private: |
|||
bool isonline(); |
|||
void change_is_online_flag(bool state); |
|||
}; |
|||
} // namespace iflytop
|
|||
|
|||
#endif
|
@ -0,0 +1,64 @@ |
|||
#include "m24lrxxe_i2c_eeprom.hpp"
|
|||
using namespace iflytop; |
|||
|
|||
#define DATA_ADD 0x53
|
|||
#define CONFIG_ADD 0x57
|
|||
|
|||
static int32_t halstatustoerr(HAL_StatusTypeDef status) { |
|||
if (status == HAL_OK) { |
|||
return 0; |
|||
} else if (status == HAL_BUSY) { |
|||
return err::kdevice_is_busy; |
|||
} else if (status == HAL_TIMEOUT) { |
|||
return err::kovertime; |
|||
} else { |
|||
return err::kfail; |
|||
} |
|||
} |
|||
|
|||
void M24LRXXE_I2C_EEPROM::initialize( I2C_HandleTypeDef* i2c_handle) { m_i2c_handle = i2c_handle; } |
|||
|
|||
int32_t M24LRXXE_I2C_EEPROM::write(int32_t add, uint8_t* val, int32_t* len) { |
|||
ZASSERT(*len % 4 == 0); |
|||
ZASSERT(add % 4 == 0); |
|||
int32_t ecode = 0; |
|||
for (int32_t i = 0; i < *len; i += 4) { |
|||
ecode = write32(add + i, *(uint32_t*)&val[i]); |
|||
if (ecode != 0) return ecode; |
|||
} |
|||
return ecode; |
|||
} |
|||
int32_t M24LRXXE_I2C_EEPROM::read(int32_t add, uint8_t* val, int32_t* len) { |
|||
ZASSERT(*len % 4 == 0); |
|||
ZASSERT(add % 4 == 0); |
|||
int32_t ecode = 0; |
|||
for (int32_t i = 0; i < *len; i += 4) { |
|||
ecode = read32(add + i, (uint32_t*)&val[i]); |
|||
if (ecode != 0) return ecode; |
|||
} |
|||
return ecode; |
|||
} |
|||
bool M24LRXXE_I2C_EEPROM::isOnline() { |
|||
uint32_t val = 0; |
|||
int32_t ret = read32(0, &val); |
|||
if (ret != 0) { |
|||
return false; |
|||
} |
|||
return true; |
|||
} |
|||
|
|||
int32_t M24LRXXE_I2C_EEPROM::write32(uint16_t add, uint32_t val) { |
|||
HAL_StatusTypeDef status = HAL_I2C_Mem_Write(m_i2c_handle, DATA_ADD << 1, add, I2C_MEMADD_SIZE_16BIT, (uint8_t*)&val, 4, 10); |
|||
zos_delay(10); |
|||
return halstatustoerr(status); |
|||
} |
|||
int32_t M24LRXXE_I2C_EEPROM::read32(uint16_t add, uint32_t* val) { |
|||
HAL_StatusTypeDef status = HAL_I2C_Mem_Read(m_i2c_handle, DATA_ADD << 1, add, I2C_MEMADD_SIZE_16BIT, (uint8_t*)val, 4, 10); |
|||
return halstatustoerr(status); |
|||
} |
|||
#if 0
|
|||
int32_t M24LRXXE_I2C_EEPROM::read_reg(int32_t add, uint32_t* regval) { |
|||
HAL_StatusTypeDef status = HAL_I2C_Mem_Read(m_i2c_handle, CONFIG_ADD << 1, add, I2C_MEMADD_SIZE_16BIT, (uint8_t*)regval, 4, 10); |
|||
return halstatustoerr(status); |
|||
} |
|||
#endif
|
@ -0,0 +1,29 @@ |
|||
#include "sdk\components\api\zi_eeprom.hpp"
|
|||
#include "sdk\components\zprotocols\zcancmder_v2\api\api.hpp"
|
|||
#include "sdk\os\zos.hpp"
|
|||
|
|||
#ifdef HAL_I2C_MODULE_ENABLED
|
|||
namespace iflytop { |
|||
using namespace std; |
|||
class M24LRXXE_I2C_EEPROM : public ZI_EEPROM { |
|||
I2C_HandleTypeDef* m_i2c_handle; |
|||
|
|||
|
|||
public: |
|||
M24LRXXE_I2C_EEPROM(){}; |
|||
~M24LRXXE_I2C_EEPROM(){}; |
|||
|
|||
void initialize( I2C_HandleTypeDef* i2c_handle); |
|||
|
|||
virtual int32_t write(int32_t add, uint8_t* val, int32_t *len) override; |
|||
virtual int32_t read(int32_t add, uint8_t* val, int32_t *len) override; |
|||
virtual bool isOnline() override; |
|||
|
|||
private: |
|||
int32_t write32(uint16_t add, uint32_t val); |
|||
int32_t read32(uint16_t add, uint32_t* val); |
|||
|
|||
// int32_t read_reg(int32_t add, uint32_t* regval);
|
|||
}; |
|||
} // namespace iflytop
|
|||
#endif
|
@ -0,0 +1,63 @@ |
|||
#include "p24c16_eeprom.hpp"
|
|||
using namespace iflytop; |
|||
|
|||
#define DATA_ADD 0x50
|
|||
|
|||
static int32_t halstatustoerr(HAL_StatusTypeDef status) { |
|||
if (status == HAL_OK) { |
|||
return 0; |
|||
} else if (status == HAL_BUSY) { |
|||
return err::kdevice_is_busy; |
|||
} else if (status == HAL_TIMEOUT) { |
|||
return err::kovertime; |
|||
} else { |
|||
return err::kfail; |
|||
} |
|||
} |
|||
|
|||
void P24C16::initialize( I2C_HandleTypeDef* i2c_handle) { m_i2c_handle = i2c_handle; } |
|||
|
|||
int32_t P24C16::write(int32_t add, uint8_t* val, int32_t* len) { |
|||
ZASSERT(*len % 4 == 0); |
|||
ZASSERT(add % 4 == 0); |
|||
int32_t ecode = 0; |
|||
for (int32_t i = 0; i < *len; i += 4) { |
|||
ecode = write32(add + i, *(uint32_t*)&val[i]); |
|||
if (ecode != 0) return ecode; |
|||
} |
|||
return ecode; |
|||
} |
|||
int32_t P24C16::read(int32_t add, uint8_t* val, int32_t* len) { |
|||
ZASSERT(*len % 4 == 0); |
|||
ZASSERT(add % 4 == 0); |
|||
int32_t ecode = 0; |
|||
for (int32_t i = 0; i < *len; i += 4) { |
|||
ecode = read32(add + i, (uint32_t*)&val[i]); |
|||
if (ecode != 0) return ecode; |
|||
} |
|||
return ecode; |
|||
} |
|||
bool P24C16::isOnline() { |
|||
uint32_t val = 0; |
|||
int32_t ret = read32(0, &val); |
|||
if (ret != 0) { |
|||
return false; |
|||
} |
|||
return true; |
|||
} |
|||
|
|||
int32_t P24C16::write32(uint16_t add, uint32_t val) { |
|||
uint16_t deviceadd = DATA_ADD + (add >> 8); |
|||
uint16_t regadd = add & 0xff; |
|||
|
|||
HAL_StatusTypeDef status = HAL_I2C_Mem_Write(m_i2c_handle, deviceadd << 1, regadd, I2C_MEMADD_SIZE_8BIT, (uint8_t*)&val, 4, 10); |
|||
zos_delay(10); |
|||
return halstatustoerr(status); |
|||
} |
|||
int32_t P24C16::read32(uint16_t add, uint32_t* val) { |
|||
uint16_t deviceadd = DATA_ADD + (add >> 8); |
|||
uint16_t regadd = add & 0xff; |
|||
|
|||
HAL_StatusTypeDef status = HAL_I2C_Mem_Read(m_i2c_handle, deviceadd << 1, regadd, I2C_MEMADD_SIZE_8BIT, (uint8_t*)val, 4, 10); |
|||
return halstatustoerr(status); |
|||
} |
@ -0,0 +1,28 @@ |
|||
#include "sdk\components\api\zi_eeprom.hpp"
|
|||
#include "sdk\components\zprotocols\zcancmder_v2\api\api.hpp"
|
|||
#include "sdk\os\zos.hpp"
|
|||
|
|||
#ifdef HAL_I2C_MODULE_ENABLED
|
|||
namespace iflytop { |
|||
using namespace std; |
|||
class P24C16 : public ZI_EEPROM { |
|||
I2C_HandleTypeDef* m_i2c_handle; |
|||
|
|||
public: |
|||
P24C16(){}; |
|||
~P24C16(){}; |
|||
|
|||
void initialize( I2C_HandleTypeDef* i2c_handle); |
|||
|
|||
virtual int32_t write(int32_t add, uint8_t* val, int32_t* len) override; |
|||
virtual int32_t read(int32_t add, uint8_t* val, int32_t* len) override; |
|||
virtual bool isOnline() override; |
|||
|
|||
private: |
|||
int32_t write32(uint16_t add, uint32_t val); |
|||
int32_t read32(uint16_t add, uint32_t* val); |
|||
|
|||
// int32_t read_reg(int32_t add, uint32_t* regval);
|
|||
}; |
|||
} // namespace iflytop
|
|||
#endif
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue