mirror of
				https://github.com/Telecominfraproject/OpenCellular.git
				synced 2025-10-30 18:07:50 +00:00 
			
		
		
		
	Merge pull request #250 from Telecominfraproject/ocware_alert_fw
Alert code for FW
This commit is contained in:
		| @@ -150,6 +150,7 @@ typedef struct AlertData { | ||||
| } AlertData; | ||||
|  | ||||
| void OCMP_GenerateAlert(const AlertData *alert_data, unsigned int alert_id, | ||||
|                         const void *data); | ||||
|                         const void *data, const void *lValue, | ||||
|                         OCMPActionType actionType); | ||||
|  | ||||
| #endif /* _SYS_CFG_FRAMEWORK_H */ | ||||
|   | ||||
| @@ -18,6 +18,7 @@ SCHEMA_IMPORT const Driver_fxnTable CAT24C04_gbc_sid_fxnTable; | ||||
| SCHEMA_IMPORT const Driver_fxnTable CAT24C04_gbc_inv_fxnTable; | ||||
| SCHEMA_IMPORT const Driver_fxnTable CAT24C04_sdr_inv_fxnTable; | ||||
| SCHEMA_IMPORT const Driver_fxnTable CAT24C04_fe_inv_fxnTable; | ||||
| SCHEMA_IMPORT const Driver_fxnTable AT45DB641E_fxnTable; | ||||
|  | ||||
| static const Driver CAT24C04_gbc_sid = { | ||||
|     .name = "EEPROM", | ||||
|   | ||||
| @@ -34,8 +34,7 @@ ReturnStatus spi_reg_read(SPI_Handle spiHandle, OcGpio_Pin *chip_select, | ||||
|                           uint32_t byte, uint8_t numofBytes); | ||||
|  | ||||
| ReturnStatus spi_reg_write(SPI_Handle spiHandle, OcGpio_Pin *chip_select, | ||||
|                            void *regAddress, const uint8_t *data, | ||||
|                            uint32_t data_size, uint32_t byte, | ||||
|                            uint8_t numofBytes); | ||||
|                            void *regAddress, uint8_t *data, uint32_t data_size, | ||||
|                            uint32_t byte, uint8_t numofBytes); | ||||
|  | ||||
| #endif /* INC_COMMON_SPIBUS_H_ */ | ||||
|   | ||||
| @@ -29,6 +29,8 @@ typedef void (*AT45DB_CallbackFn)(AT45DB_Event evt, uint16_t value, | ||||
| typedef struct AT45DB_Cfg { | ||||
|     SPI_Dev dev; | ||||
|     OcGpio_Pin *pin_alert; | ||||
|     const char *fileName[5]; | ||||
|     uint8_t noOfFiles; | ||||
| } AT45DB_Cfg; | ||||
|  | ||||
| typedef struct AT45DB_Obj { | ||||
|   | ||||
| @@ -13,6 +13,7 @@ | ||||
|  *                               HEADER FILES | ||||
|  *****************************************************************************/ | ||||
| #include "common/inc/global/post_frame.h" | ||||
| #include "common/inc/global/ocmp_frame.h" | ||||
| #include "drivers/OcGpio.h" | ||||
| #include "inc/common/i2cbus.h" | ||||
|  | ||||
| @@ -76,7 +77,8 @@ typedef enum INA226_Event { | ||||
|     INA226_EVT_CUL, /* Current under limit - based on SUL */ | ||||
| } INA226_Event; | ||||
|  | ||||
| typedef void (*INA226_CallbackFn)(INA226_Event evt, uint16_t value, | ||||
| typedef void (*INA226_CallbackFn)(INA226_Event evt, OCMPActionType alertAction, | ||||
|                                   uint16_t value, uint16_t lValue, | ||||
|                                   void *context); | ||||
|  | ||||
| typedef struct INA226_Cfg { | ||||
|   | ||||
| @@ -13,6 +13,7 @@ | ||||
|  *                               HEADER FILES | ||||
|  *****************************************************************************/ | ||||
| #include "common/inc/global/post_frame.h" | ||||
| #include "common/inc/global/ocmp_frame.h" | ||||
| #include "common/inc/global/Framework.h" | ||||
| #include "drivers/OcGpio.h" | ||||
| #include "inc/common/i2cbus.h" | ||||
| @@ -50,7 +51,8 @@ typedef enum Se98aAlert { | ||||
|     SE98A_ALERT_CRITICAL | ||||
| } Se98aAlert; | ||||
|  | ||||
| typedef void (*SE98A_CallbackFn)(SE98A_Event evt, int8_t temperature, | ||||
| typedef void (*SE98A_CallbackFn)(SE98A_Event evt, OCMPActionType alertAction, | ||||
|                                  int8_t temperature, int8_t lValue, | ||||
|                                  void *context); | ||||
|  | ||||
| typedef struct SE98A_Cfg { | ||||
|   | ||||
| @@ -75,6 +75,8 @@ AT45DB_Dev gbc_spi_flash_memory = { | ||||
|                     .chip_select = &(OcGpio_Pin){ &ec_io, OC_EC_FLASH_nCS }, | ||||
|                 }, | ||||
|             .pin_alert = NULL, | ||||
|             .fileName = { "alertLog", "configLog", "bootLog" }, | ||||
|             .noOfFiles = 3, | ||||
|         }, | ||||
|     .obj = {}, | ||||
| }; | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -19,7 +19,7 @@ | ||||
|  *                              MACRO DEFINITIONS | ||||
|  *****************************************************************************/ | ||||
| #define GOSSIPER_TASK_PRIORITY 6 | ||||
| #define GOSSIPER_TASK_STACK_SIZE 2048 | ||||
| #define GOSSIPER_TASK_STACK_SIZE 4096 | ||||
|  | ||||
| #define SET_DEBEUG_MODE(debugMode) ((debugMode | 0x00)) | ||||
| #define UNSET_DEBUG_MODE(debugMode) ((debugMode & 0x0f)) | ||||
|   | ||||
| @@ -17,6 +17,8 @@ | ||||
| #include "inc/common/spibus.h" | ||||
| #include "inc/common/global_header.h" | ||||
| #include "inc/global/OC_CONNECT1.h" | ||||
| #include <ti/sysbios/BIOS.h> | ||||
| #include "src/filesystem/fs_wrapper.h" | ||||
|  | ||||
| #define AT45DB_DATA_WR_OPCODE_WR_COUNT 4 | ||||
| #define AT45DB_DATA_RD_OPCODE_WR_COUNT 8 | ||||
| @@ -81,6 +83,8 @@ static ReturnStatus AT45DB_read_reg(AT45DB_Dev *dev, | ||||
|  **    RETURN TYPE     : Success or failure | ||||
|  ** | ||||
|  *****************************************************************************/ | ||||
| #pragma GCC diagnostic push | ||||
| #pragma GCC diagnostic ignored "-Wdiscarded-qualifiers" | ||||
| static ReturnStatus AT45DB_write_reg(AT45DB_Dev *dev, | ||||
|                                      void *cmdbuffer, /* cmd or opcode buffer */ | ||||
|                                      const uint8_t *regValue, | ||||
| @@ -94,6 +98,7 @@ static ReturnStatus AT45DB_write_reg(AT45DB_Dev *dev, | ||||
|             "AT45DBFLASHMEMORY:ERROR:: Failed to get SPI Bus for at45db flash memory " | ||||
|             "0x%x on bus 0x%x.\n", | ||||
|             dev->cfg.dev.chip_select, dev->cfg.dev.bus); | ||||
|         Semaphore_pend(semFilesysMsg, BIOS_WAIT_FOREVER); | ||||
|     } else { | ||||
|         status = | ||||
|             spi_reg_write(at45dbHandle, dev->cfg.dev.chip_select, cmdbuffer, | ||||
| @@ -101,7 +106,7 @@ static ReturnStatus AT45DB_write_reg(AT45DB_Dev *dev, | ||||
|     } | ||||
|     return status; | ||||
| } | ||||
|  | ||||
| #pragma GCC diagnostic pop | ||||
| /***************************************************************************** | ||||
|  **    FUNCTION NAME   : at45db_readStatusRegister | ||||
|  ** | ||||
| @@ -246,14 +251,16 @@ ReturnStatus at45db_data_write(AT45DB_Dev *dev, const uint8_t *data, | ||||
|  **    RETURN TYPE     : Success or failure | ||||
|  ** | ||||
|  *****************************************************************************/ | ||||
| static ReturnStatus at45db_getDevID(AT45DB_Dev *dev, uint8_t *devID) | ||||
| #pragma GCC diagnostic push | ||||
| #pragma GCC diagnostic ignored "-Wincompatible-pointer-types" | ||||
| static ReturnStatus at45db_getDevID(AT45DB_Dev *dev, uint32_t *devID) | ||||
| { | ||||
|     uint8_t txBuffer = AT45DB_DEVID_RD_OPCODE; /* opcode to get device id */ | ||||
|  | ||||
|     return AT45DB_read_reg(dev, &txBuffer, devID, NULL, AT45DB_DEVID_RD_BYTES, | ||||
|                            AT45DB_DEVID_OPCODE_WR_COUNT); | ||||
| } | ||||
|  | ||||
| #pragma GCC diagnostic pop | ||||
| /***************************************************************************** | ||||
|  **    FUNCTION NAME   : at45db_probe | ||||
|  ** | ||||
| @@ -266,7 +273,7 @@ static ReturnStatus at45db_getDevID(AT45DB_Dev *dev, uint8_t *devID) | ||||
|  *****************************************************************************/ | ||||
| ePostCode at45db_probe(AT45DB_Dev *dev, POSTData *postData) | ||||
| { | ||||
|     uint8_t value = 0; | ||||
|     uint32_t value = 0; | ||||
|     uint16_t devId = 0; | ||||
|     uint8_t manfId = 0; | ||||
|  | ||||
|   | ||||
| @@ -93,12 +93,14 @@ static void call_state_cb(const GsmClccInfo *info, void *context) | ||||
|     switch (info->call_state) { | ||||
|         case GSM_CALL_STATE_INCOMING: { | ||||
|             eTEST_MODE_CallEvent callState = TWOG_CALL_EVT_RING; | ||||
|             OCMP_GenerateAlert(context, TWOG_SIM_CALLSTATE_CHANGE, &callState); | ||||
|             OCMP_GenerateAlert(context, TWOG_SIM_CALLSTATE_CHANGE, &callState, | ||||
|                                NULL, OCMP_AXN_TYPE_ACTIVE); | ||||
|             break; | ||||
|         } | ||||
|         case GSM_CALL_STATE_RELEASED: { | ||||
|             eTEST_MODE_CallEvent callState = TWOG_CALL_EVT_CALL_END; | ||||
|             OCMP_GenerateAlert(context, TWOG_SIM_CALLSTATE_CHANGE, &callState); | ||||
|             OCMP_GenerateAlert(context, TWOG_SIM_CALLSTATE_CHANGE, &callState, | ||||
|                                NULL, OCMP_AXN_TYPE_ACTIVE); | ||||
|             break; | ||||
|         } | ||||
|         default: | ||||
| @@ -269,7 +271,8 @@ static void testModule_task(UArg a0, UArg a1) | ||||
|             if (GSM_cmgr(s_hGsm, sms_idx, sms, NULL)) { | ||||
|                 LOGGER("SMS: %.*s\n", 50, | ||||
|                        sms); // System_printf has a limited buffer | ||||
|                 OCMP_GenerateAlert(alert_token, TWOG_SIM_INCOMING_MSG, sms); | ||||
|                 OCMP_GenerateAlert(alert_token, TWOG_SIM_INCOMING_MSG, sms, | ||||
|                                    NULL, OCMP_AXN_TYPE_ACTIVE); | ||||
|             } else { | ||||
|                 LOGGER_ERROR("TESTMOD:Failed to read SMS\n"); | ||||
|             } | ||||
|   | ||||
| @@ -469,7 +469,17 @@ static void _ina226_isr(void *context) | ||||
|             _enable_alert(dev, new_mask); | ||||
|         } | ||||
|  | ||||
|         dev->obj.alert_cb(evt, value, dev->obj.cb_context); | ||||
|         OCMPActionType alertAction = OCMP_AXN_TYPE_ACTIVE; | ||||
|         if (evt != INA226_EVT_COL) { | ||||
|             if ((alert_mask & INA_MSK_AFF)) { | ||||
|                 alertAction = OCMP_AXN_TYPE_CLEAR; | ||||
|             } else { | ||||
|                 LOGGER_WARNING("IN226::Unsupported INA event 0x%x\n", evt); | ||||
|                 return; | ||||
|             } | ||||
|         } | ||||
|         dev->obj.alert_cb(evt, alertAction, value, alert_lim, | ||||
|                           dev->obj.cb_context); | ||||
|     } | ||||
|     /* TODO: Conversion ready not handled */ | ||||
| } | ||||
|   | ||||
| @@ -17,20 +17,22 @@ | ||||
| /* TI-RTOS driver files */ | ||||
| #include <ti/drivers/I2C.h> | ||||
|  | ||||
| bool i2c_read(void *i2c_cfg, void *oci2c) | ||||
| bool i2c_read(void *i2c_cfg, void *pMsgFrame) | ||||
| { | ||||
|     OCMPMessageFrame *pMsg = (OCMPMessageFrame *)pMsgFrame; | ||||
|     S_I2C_Cfg *s_oc_i2c_cfg = (S_I2C_Cfg *)i2c_cfg; | ||||
|     S_OCI2C *s_oci2c = (S_OCI2C *)oci2c; | ||||
|     S_OCI2C *s_oci2c = (S_OCI2C *)pMsg->message.ocmp_data; | ||||
|     I2C_Handle i2cHandle = i2c_open_bus(s_oc_i2c_cfg->bus); | ||||
|     return (i2c_reg_read(i2cHandle, s_oci2c->slaveAddress, s_oci2c->reg_address, | ||||
|                          &s_oci2c->reg_value, | ||||
|                          s_oci2c->number_of_bytes) == RETURN_OK); | ||||
| } | ||||
|  | ||||
| bool i2c_write(void *i2c_cfg, void *oci2c) | ||||
| bool i2c_write(void *i2c_cfg, void *pMsgFrame) | ||||
| { | ||||
|     OCMPMessageFrame *pMsg = (OCMPMessageFrame *)pMsgFrame; | ||||
|     S_I2C_Cfg *s_oc_i2c_cfg = (S_I2C_Cfg *)i2c_cfg; | ||||
|     S_OCI2C *s_oci2c = (S_OCI2C *)oci2c; | ||||
|     S_OCI2C *s_oci2c = (S_OCI2C *)pMsg->message.ocmp_data; | ||||
|     I2C_Handle i2cHandle = i2c_open_bus(s_oc_i2c_cfg->bus); | ||||
|     return (i2c_reg_write(i2cHandle, s_oci2c->slaveAddress, | ||||
|                           s_oci2c->reg_address, s_oci2c->reg_value, | ||||
|   | ||||
| @@ -36,10 +36,11 @@ bool check_clause_22(uint8_t port) | ||||
|     return status; | ||||
| } | ||||
|  | ||||
| bool mdio_read(void *mdio_cfg, void *ocmdio) | ||||
| bool mdio_read(void *mdio_cfg, void *pMsgFrame) | ||||
| { | ||||
|     OCMPMessageFrame *pMsg = (OCMPMessageFrame *)pMsgFrame; | ||||
|     S_MDIO_Cfg *s_oc_mdio_cfg = (S_MDIO_Cfg *)mdio_cfg; | ||||
|     S_OCMDIO *s_ocmdio = (S_OCMDIO *)ocmdio; | ||||
|     S_OCMDIO *s_ocmdio = (S_OCMDIO *)pMsg->message.ocmp_data; | ||||
|     s_ocmdio->reg_value = 0xf00f; | ||||
|  | ||||
|     if (CLAUSE_45_REQUEST(reg_address)) | ||||
| @@ -59,10 +60,11 @@ bool mdio_read(void *mdio_cfg, void *ocmdio) | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| bool mdio_write(void *mdio_cfg, void *ocmdio) | ||||
| bool mdio_write(void *mdio_cfg, void *pMsgFrame) | ||||
| { | ||||
|     OCMPMessageFrame *pMsg = (OCMPMessageFrame *)pMsgFrame; | ||||
|     S_MDIO_Cfg *s_oc_mdio_cfg = (S_MDIO_Cfg *)mdio_cfg; | ||||
|     S_OCMDIO *s_ocmdio = (S_OCMDIO *)ocmdio; | ||||
|     S_OCMDIO *s_ocmdio = (S_OCMDIO *)pMsg->message.ocmp_data; | ||||
|  | ||||
|     if (CLAUSE_45_REQUEST(reg_address)) { | ||||
|         /*PHY registers use Reg 13 and Reg 14 as paging mechanism to access | ||||
|   | ||||
| @@ -18,10 +18,11 @@ | ||||
| #define NO_GPIO_PINS_IN_GROUP 8 | ||||
| extern GPIO_PinConfig gpioPinConfigs[]; | ||||
|  | ||||
| bool ocgpio_set(void *gpio_cfg, void *oc_gpio) | ||||
| bool ocgpio_set(void *gpio_cfg, void *pMsgFrame) | ||||
| { | ||||
|     OCMPMessageFrame *pMsg = (OCMPMessageFrame *)pMsgFrame; | ||||
|     S_OCGPIO_Cfg *oc_gpio_cfg = (S_OCGPIO_Cfg *)gpio_cfg; | ||||
|     S_OCGPIO *s_oc_gpio = (S_OCGPIO *)oc_gpio; | ||||
|     S_OCGPIO *s_oc_gpio = (S_OCGPIO *)pMsg->message.ocmp_data; | ||||
|     int ret = 0; | ||||
|     uint8_t idx = ((oc_gpio_cfg->group != 0) ? | ||||
|                        (((oc_gpio_cfg->group - 1) * NO_GPIO_PINS_IN_GROUP) + | ||||
| @@ -36,10 +37,11 @@ bool ocgpio_set(void *gpio_cfg, void *oc_gpio) | ||||
|     return (ret == 0); | ||||
| } | ||||
|  | ||||
| bool ocgpio_get(void *gpio_cfg, void *oc_gpio) | ||||
| bool ocgpio_get(void *gpio_cfg, void *pMsgFrame) | ||||
| { | ||||
|     OCMPMessageFrame *pMsg = (OCMPMessageFrame *)pMsgFrame; | ||||
|     S_OCGPIO_Cfg *oc_gpio_cfg = (S_OCGPIO_Cfg *)gpio_cfg; | ||||
|     S_OCGPIO *s_oc_gpio = (S_OCGPIO *)oc_gpio; | ||||
|     S_OCGPIO *s_oc_gpio = (S_OCGPIO *)pMsg->message.ocmp_data; | ||||
|     int ret = 0; | ||||
|     uint8_t idx = ((oc_gpio_cfg->group != 0) ? | ||||
|                        (((oc_gpio_cfg->group - 1) * NO_GPIO_PINS_IN_GROUP) + | ||||
|   | ||||
| @@ -186,11 +186,8 @@ static ePostCode _probe(void *driver, POSTData *postData) | ||||
|     eth_sw_configure(driver); | ||||
|     return eth_sw_probe(postData); | ||||
| } | ||||
|  | ||||
| #if 0 | ||||
| /* NOTE: Commented out because unused, triggers -Wunused-function warning. | ||||
|  *       The function might be useful in the future. | ||||
|  */ | ||||
| #pragma GCC diagnostic push | ||||
| #pragma GCC diagnostic ignored "-Wunused-function" | ||||
| static void _alert_handler(Eth_Sw_Events evt, int16_t value, void *alert_data) | ||||
| { | ||||
|     unsigned int alert; | ||||
| @@ -222,10 +219,10 @@ static void _alert_handler(Eth_Sw_Events evt, int16_t value, void *alert_data) | ||||
|             return; | ||||
|     } | ||||
|  | ||||
|     OCMP_GenerateAlert(alert_data, alert, &value); | ||||
|     OCMP_GenerateAlert(alert_data, alert, &value, NULL, OCMP_AXN_TYPE_ACTIVE); | ||||
|     LOGGER_DEBUG("ETH_SW:: Event: %d Value: %d\n", evt, value); | ||||
| } | ||||
| #endif | ||||
| #pragma GCC diagnostic pop | ||||
|  | ||||
| static ePostCode _init(void *driver, const void *config, | ||||
|                        const void *alert_token) | ||||
|   | ||||
| @@ -67,14 +67,18 @@ static ePostCode _probe(void *driver, POSTData *postData) | ||||
|     return ina226_probe(driver, postData); | ||||
| } | ||||
|  | ||||
| static void _alert_handler(INA226_Event evt, uint16_t value, void *alert_data) | ||||
| static void _alert_handler(INA226_Event evt, OCMPActionType alertAction, | ||||
|                            uint16_t value, uint16_t lValue, void *alert_data) | ||||
| { | ||||
|     if (evt != INA226_EVT_COL) { | ||||
|         LOGGER_WARNING("IN226::Unsupported INA event 0x%x\n", evt); | ||||
|         return; | ||||
|         if (evt != INA226_EVT_CUL) { | ||||
|             LOGGER_WARNING("IN226::Unsupported INA event 0x%x\n", evt); | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     OCMP_GenerateAlert(alert_data, INA226_ALERT_OVERCURRENT, &value); | ||||
|     OCMP_GenerateAlert(alert_data, INA226_ALERT_OVERCURRENT, &value, &lValue, | ||||
|                        alertAction); | ||||
|     LOGGER_DEBUG("INA226 Event: 0x%x Current: %u\n", evt, value); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -204,7 +204,7 @@ static void _alert_handler(LTC4015_Event evt, int16_t value, void *alert_data) | ||||
|             return; | ||||
|     } | ||||
|  | ||||
|     OCMP_GenerateAlert(alert_data, alert, &value); | ||||
|     OCMP_GenerateAlert(alert_data, alert, &value, NULL, OCMP_AXN_TYPE_ACTIVE); | ||||
|     LOGGER_DEBUG("LTC4015 Event: %d Value: %d\n", evt, value); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -226,7 +226,7 @@ static void _alert_handler(LTC4274_Event evt, void *context) | ||||
|         } | ||||
|     } | ||||
|     uint8_t alert_data = 0x00; | ||||
|     OCMP_GenerateAlert(context, alert, &alert_data); | ||||
|     OCMP_GenerateAlert(context, alert, &alert_data, NULL, OCMP_AXN_TYPE_ACTIVE); | ||||
|     LOGGER_DEBUG("LTC7274 Event: %d \n", evt); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -64,7 +64,7 @@ static void _alert_handler(LTC4275_Event evt, void *context) | ||||
|             LOGGER_ERROR("Unknown LTC4275evt: %d\n", evt); | ||||
|             return; | ||||
|     } | ||||
|     OCMP_GenerateAlert(context, alert, &evt); | ||||
|     OCMP_GenerateAlert(context, alert, &evt, NULL, OCMP_AXN_TYPE_ACTIVE); | ||||
|     LOGGER_DEBUG("LTC4275A alert: %d generated.\n", alert); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -14,14 +14,15 @@ void _rffe_watchdog_handler(void *context) | ||||
| { | ||||
|     RfWatchdog_Cfg *cfg = context; | ||||
|     if (OcGpio_read(cfg->pin_alert_lb) > 0) { | ||||
|         OCMP_GenerateAlert(context, 0, NULL); | ||||
|         OCMP_GenerateAlert(context, 0, NULL, NULL, OCMP_AXN_TYPE_ACTIVE); | ||||
|     } | ||||
|     if (OcGpio_read(cfg->pin_alert_hb) > 0) { | ||||
|         OCMP_GenerateAlert(context, 1, NULL); | ||||
|         OCMP_GenerateAlert(context, 1, NULL, NULL, OCMP_AXN_TYPE_ACTIVE); | ||||
|     } | ||||
| } | ||||
| #pragma GCC diagnostic push | ||||
| #pragma GCC diagnostic ignored "-Wunused-parameter" | ||||
|  | ||||
| static ePostCode _rffe_watchdog_init(void *driver, const void *config, | ||||
|                                      const void *alert_token) | ||||
| { | ||||
|   | ||||
| @@ -72,7 +72,8 @@ static ePostCode _probe(void *driver, POSTData *postData) | ||||
|     return se98a_probe(driver, postData); | ||||
| } | ||||
|  | ||||
| static void _alert_handler(SE98A_Event evt, int8_t temperature, void *context) | ||||
| static void _alert_handler(SE98A_Event evt, OCMPActionType alertAction, | ||||
|                            int8_t temperature, int8_t lValue, void *context) | ||||
| { | ||||
|     unsigned int alert; | ||||
|     switch (evt) { | ||||
| @@ -91,7 +92,7 @@ static void _alert_handler(SE98A_Event evt, int8_t temperature, void *context) | ||||
|     } | ||||
|  | ||||
|     uint8_t alert_data = (uint8_t)MAX((int8_t)0, temperature); | ||||
|     OCMP_GenerateAlert(context, alert, &alert_data); | ||||
|     OCMP_GenerateAlert(context, alert, &alert_data, &lValue, alertAction); | ||||
|     LOGGER_DEBUG("SE98A Event: %d Temperature: %d\n", evt, temperature); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -56,6 +56,8 @@ | ||||
| /* Default CFG plus interrupt mode (we don't support comparator mode) */ | ||||
| #define SE98A_CONFIG_DEFAULT (0x0000 | SE98A_CFG_EMD | SE98A_CFG_HYS_1P5) | ||||
|  | ||||
| static uint8_t alertStatus = 0x00; | ||||
|  | ||||
| /***************************************************************************** | ||||
|  * Helper to read from a SE98A register | ||||
|  *****************************************************************************/ | ||||
| @@ -306,14 +308,41 @@ static void se98a_handle_irq(void *context) | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     if (trip_stat) { | ||||
|         alertStatus = trip_stat; | ||||
|     } | ||||
|  | ||||
|     /* Since > CRIT implies above window, we only handle the highest priority | ||||
|      * event to avoid duplicate events being sent */ | ||||
|     if (trip_stat & SE98A_EVT_ACT) { | ||||
|         dev->obj.alert_cb(SE98A_EVT_ACT, temperature, dev->obj.cb_context); | ||||
|     } else if (trip_stat & SE98A_EVT_AAW) { | ||||
|         dev->obj.alert_cb(SE98A_EVT_AAW, temperature, dev->obj.cb_context); | ||||
|     } else if (trip_stat & SE98A_EVT_BAW) { | ||||
|         dev->obj.alert_cb(SE98A_EVT_BAW, temperature, dev->obj.cb_context); | ||||
|     OCMPActionType alertAction = OCMP_AXN_TYPE_ACTIVE; | ||||
|     int8_t regLim = 0; | ||||
|     if (alertStatus & SE98A_EVT_ACT) { | ||||
|         if (se98a_get_limit(dev, CONF_TEMP_SE98A_CRITICAL_LIMIT_REG, ®Lim) == | ||||
|             RETURN_OK) { | ||||
|             if (regLim > temperature) { | ||||
|                 alertAction = OCMP_AXN_TYPE_CLEAR; | ||||
|             } | ||||
|         } | ||||
|         dev->obj.alert_cb(SE98A_EVT_ACT, alertAction, temperature, regLim, | ||||
|                           dev->obj.cb_context); | ||||
|     } else if (alertStatus & SE98A_EVT_AAW) { | ||||
|         if (se98a_get_limit(dev, CONF_TEMP_SE98A_HIGH_LIMIT_REG, ®Lim) == | ||||
|             RETURN_OK) { | ||||
|             if (regLim > temperature) { | ||||
|                 alertAction = OCMP_AXN_TYPE_CLEAR; | ||||
|             } | ||||
|         } | ||||
|         dev->obj.alert_cb(SE98A_EVT_AAW, alertAction, temperature, regLim, | ||||
|                           dev->obj.cb_context); | ||||
|     } else if (alertStatus & SE98A_EVT_BAW) { | ||||
|         if (se98a_get_limit(dev, CONF_TEMP_SE98A_LOW_LIMIT_REG, ®Lim) == | ||||
|             RETURN_OK) { | ||||
|             if (regLim < temperature) { | ||||
|                 alertAction = OCMP_AXN_TYPE_CLEAR; | ||||
|             } | ||||
|         } | ||||
|         dev->obj.alert_cb(SE98A_EVT_BAW, alertAction, temperature, regLim, | ||||
|                           dev->obj.cb_context); | ||||
|     } | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -121,9 +121,8 @@ ReturnStatus spi_reg_read(SPI_Handle spiHandle, OcGpio_Pin *chip_select, | ||||
|  ** | ||||
|  *****************************************************************************/ | ||||
| ReturnStatus spi_reg_write(SPI_Handle spiHandle, OcGpio_Pin *chip_select, | ||||
|                            void *regAddress, const uint8_t *data, | ||||
|                            uint32_t data_size, uint32_t byte, | ||||
|                            uint8_t numofBytes) | ||||
|                            void *regAddress, uint8_t *data, uint32_t data_size, | ||||
|                            uint32_t byte, uint8_t numofBytes) | ||||
| { | ||||
|     ReturnStatus status = RETURN_OK; | ||||
|     SPI_Transaction spiTransaction; | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| /** | ||||
|  * Copyright (c) 2017-present, Facebook, Inc. | ||||
|  * Copyright (c) 2017-present, Facebook, Inc | ||||
|  * All rights reserved. | ||||
|  * | ||||
|  * This source code is licensed under the BSD-style license found in the | ||||
| @@ -8,8 +8,9 @@ | ||||
|  * | ||||
|  * This file acts as wrapper for little filesystem, contains filesystem | ||||
|  * initialization, block read, block write, block erase as a main functions | ||||
|  * moreover provides API's like fileRead, fileWrite for external application to | ||||
|  * read and write data to at45db flash memory by using SPI interface. | ||||
|  * moreover provides API's like fileRead, fs_wrapper_data_write for external | ||||
|  * application to read and write data to at45db flash memory by using SPI | ||||
|  * interface. | ||||
|  */ | ||||
|  | ||||
| #include "Board.h" | ||||
| @@ -18,46 +19,62 @@ | ||||
| #include "inc/common/bigbrother.h" | ||||
| #include "inc/common/global_header.h" | ||||
| #include "inc/devices/at45db.h" | ||||
| #include "inc/global/OC_CONNECT1.h" | ||||
| #include <inc/global/OC_CONNECT1.h> | ||||
| #include "inc/utils/ocmp_util.h" | ||||
| #include "inc/utils/util.h" | ||||
| #include "src/filesystem/fs_wrapper.h" | ||||
| #include "src/filesystem/lfs.h" | ||||
| #include "platform/oc-sdr/schema/schema.h" | ||||
| #include <string.h> | ||||
| #include <stdlib.h> | ||||
| #include <ti/drivers/GPIO.h> | ||||
| #include <ti/drivers/SPI.h> | ||||
| #include "src/filesystem/lfs.h" | ||||
| #include "src/filesystem/fs_wrapper.h" | ||||
| #include "src/registry/SSRegistry.h" | ||||
| #include <ti/sysbios/BIOS.h> | ||||
| #include <ti/drivers/GPIO.h> | ||||
| #include <ti/sysbios/knl/Semaphore.h> | ||||
| #include <ti/sysbios/knl/Queue.h> | ||||
| #include <ti/sysbios/knl/Task.h> | ||||
| #include <ti/drivers/SPI.h> | ||||
|  | ||||
| #define AT45DB_STATUS_READY 0xBC | ||||
| #define BLOCK_SIZE 256 | ||||
| #define BLOCK_COUNT 32768 | ||||
| #define FRAME_SIZE 64 | ||||
| #define FILE_SIZE_LIMIT 8192 | ||||
| #define LOOK_AHEAD 256 | ||||
| #define NEXT_MSG_FLAG 1 | ||||
| #define PAGE_SIZE 256 | ||||
| #define PAYLOAD_SIZE 47 | ||||
| #define READ_SIZE 256 | ||||
| #define WRITE_SIZE 256 | ||||
|  | ||||
| extern OCSubsystem *ss_reg[SUBSYSTEM_COUNT]; | ||||
| #pragma GCC diagnostic push | ||||
| #pragma GCC diagnostic ignored "-Wunused-variable" | ||||
| static Queue_Struct fsRxMsg; | ||||
| static Queue_Struct fsTxMsg; | ||||
| #pragma GCC diagnostic pop | ||||
|  | ||||
| lfs_t lfs; | ||||
| lfs_file_t file; | ||||
|  | ||||
| /***************************************************************************** | ||||
|  **    FUNCTION NAME   : block_device_read | ||||
|  **    FUNCTION NAME   : fs_wrapper_block_device_read | ||||
|  ** | ||||
|  **    DESCRIPTION     : It is called by filesystem to read block device | ||||
|  **    DESCRIPTION     : This function called by filesystem to read block device | ||||
|  ** | ||||
|  **    ARGUMENTS       : context for device configuration, block or page number, | ||||
|  ** | ||||
|  **                      block or page offset, data buffer, size of data to read | ||||
|  **                      block or page offset, data buffer, size of data to be | ||||
|  *read | ||||
|  ** | ||||
|  **    RETURN TYPE     : Success or failure | ||||
|  ** | ||||
|  *****************************************************************************/ | ||||
| int block_device_read(const struct lfs_config *cfg, lfs_block_t block, | ||||
|                       lfs_off_t off, void *buffer, lfs_size_t size) | ||||
| int fs_wrapper_block_device_read(const struct lfs_config *cfg, | ||||
|                                  lfs_block_t block, lfs_offset_t offset, | ||||
|                                  void *buffer, lfs_size_t size) | ||||
| { | ||||
|     if (at45db_data_read(cfg->context, buffer, size, off, block) != RETURN_OK) { | ||||
|     if (at45db_data_read(cfg->context, buffer, size, offset, block) != | ||||
|         RETURN_OK) { | ||||
|         return LFS_ERR_IO; | ||||
|     } | ||||
|  | ||||
| @@ -65,20 +82,22 @@ int block_device_read(const struct lfs_config *cfg, lfs_block_t block, | ||||
| } | ||||
|  | ||||
| /***************************************************************************** | ||||
|  **    FUNCTION NAME   : block_device_write | ||||
|  **    FUNCTION NAME   : fs_wrapper_block_device_write | ||||
|  ** | ||||
|  **    DESCRIPTION     : it is called by filesystem to write block device | ||||
|  **    DESCRIPTION     : This function called by filesystem to write block | ||||
|  *device | ||||
|  ** | ||||
|  **    ARGUMENTS       : context for device configuration, block or page number, | ||||
|  ** | ||||
|  **                      block or page offset, data buffer, size of data to | ||||
|  *write | ||||
|  **                      block or page offset, data buffer, size of data to be | ||||
|  *written | ||||
|  ** | ||||
|  **    RETURN TYPE     : Success or failure | ||||
|  ** | ||||
|  *****************************************************************************/ | ||||
| int block_device_write(const struct lfs_config *cfg, lfs_block_t block, | ||||
|                        lfs_off_t off, const void *buffer, lfs_size_t size) | ||||
| int fs_wrapper_block_device_write(const struct lfs_config *cfg, | ||||
|                                   lfs_block_t block, lfs_offset_t off, | ||||
|                                   void *buffer, lfs_size_t size) | ||||
| { | ||||
|     if (at45db_data_write(cfg->context, buffer, size, off, block) != | ||||
|         RETURN_OK) { | ||||
| @@ -89,16 +108,18 @@ int block_device_write(const struct lfs_config *cfg, lfs_block_t block, | ||||
| } | ||||
|  | ||||
| /***************************************************************************** | ||||
|  **    FUNCTION NAME   : block_device_erase | ||||
|  **    FUNCTION NAME   : fs_wrapper_block_device_erase | ||||
|  ** | ||||
|  **    DESCRIPTION     : It is called by filesystem to erase block device | ||||
|  **    DESCRIPTION     : This function called by filesystem to erase block | ||||
|  *device | ||||
|  ** | ||||
|  **    ARGUMENTS       : context for device configuration, block or page number, | ||||
|  ** | ||||
|  **    RETURN TYPE     : Success or failure | ||||
|  ** | ||||
|  *****************************************************************************/ | ||||
| int block_device_erase(const struct lfs_config *cfg, lfs_block_t block) | ||||
| int fs_wrapper_block_device_erase(const struct lfs_config *cfg, | ||||
|                                   lfs_block_t block) | ||||
| { | ||||
|     if (at45db_erasePage(cfg->context, block) != RETURN_OK) { | ||||
|         return LFS_ERR_IO; | ||||
| @@ -108,26 +129,26 @@ int block_device_erase(const struct lfs_config *cfg, lfs_block_t block) | ||||
| } | ||||
|  | ||||
| /***************************************************************************** | ||||
|  **    FUNCTION NAME   : block_device_sync | ||||
|  **    FUNCTION NAME   : fs_wrapper_block_device_sync | ||||
|  ** | ||||
|  **    DESCRIPTION     : It is  called by filesystem to sync with block device | ||||
|  **    DESCRIPTION     : This function called by filesystem to sync with block | ||||
|  *device | ||||
|  ** | ||||
|  **    ARGUMENTS       : context for device configuration | ||||
|  ** | ||||
|  **    RETURN TYPE     : Success or failure | ||||
|  ** | ||||
|  *****************************************************************************/ | ||||
| int block_device_sync(const struct lfs_config *cfg) | ||||
| int fs_wrapper_block_device_sync(const struct lfs_config *cfg) | ||||
| { | ||||
|     if (at45db_readStatusRegister(cfg->context) != RETURN_OK) { | ||||
|         return LFS_ERR_IO; | ||||
|     } | ||||
|     while (!(AT45DB_STATUS_READY & at45db_readStatusRegister(cfg->context))) | ||||
|         ; | ||||
|  | ||||
|     return LFS_ERR_OK; | ||||
| } | ||||
|  | ||||
| /***************************************************************************** | ||||
|  **    FUNCTION NAME   : fileSize | ||||
|  **    FUNCTION NAME   : fs_wrapper_get_fileSize | ||||
|  ** | ||||
|  **    DESCRIPTION     : Returns size of saved file | ||||
|  ** | ||||
| @@ -136,21 +157,108 @@ int block_device_sync(const struct lfs_config *cfg) | ||||
|  **    RETURN TYPE     : file size | ||||
|  ** | ||||
|  *****************************************************************************/ | ||||
| int fileSize(const char *path) | ||||
| int fs_wrapper_get_fileSize(const char *path) | ||||
| { | ||||
|     uint32_t fileSize = 0; | ||||
|  | ||||
|     if (lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) == LFS_ERR_OK) { | ||||
|         LOGGER_DEBUG("FS:: File open successfully \n"); | ||||
|         fileSize = lfs_file_size(&lfs, &file); | ||||
|         lfs_file_close(&lfs, &file); | ||||
|     } | ||||
|     fileSize = lfs_file_size(&lfs, &file); | ||||
|     lfs_file_close(&lfs, &file); | ||||
|  | ||||
|     return fileSize; | ||||
| } | ||||
|  | ||||
| /***************************************************************************** | ||||
|  **    FUNCTION NAME   : fileWrite | ||||
|  **    FUNCTION NAME   : fs_wrapper_flashMemory_read | ||||
|  ** | ||||
|  **    DESCRIPTION     : Reads saved logs from at45db flash memeory and enqueue | ||||
|  ** | ||||
|  **    ARGUMENTS       : Subsystem number, filename, file size | ||||
|  ** | ||||
|  **    RETURN TYPE     : Success or failure | ||||
|  ** | ||||
|  *****************************************************************************/ | ||||
| void fs_wrapper_flashMemory_read(OCMPSubsystem subsystem, const char *fileName, | ||||
|                                  uint32_t file_size, uint8_t fileIndex) | ||||
| { | ||||
|     uint32_t numOfMsg = 0; | ||||
|     uint8_t *logFile; | ||||
|     uint8_t *logFilePtr; | ||||
|     OCMPMessageFrame *tMsg; | ||||
|     OCSubsystem *ss = ss_reg[subsystem]; | ||||
|  | ||||
|     if (file_size > 0) { | ||||
|         tMsg = (OCMPMessageFrame *)OCMP_mallocFrame(PAYLOAD_SIZE); | ||||
|         logFile = (uint8_t *)calloc(file_size, sizeof(uint8_t)); | ||||
|         if ((tMsg != NULL) && (logFile != NULL)) { | ||||
|             logFilePtr = logFile; | ||||
|             numOfMsg = file_size / FRAME_SIZE; | ||||
|             LOGGER_DEBUG("FS:: numOfMsg = %d\n", numOfMsg); | ||||
|             fs_wrapper_file_read(fileName, logFile, file_size); | ||||
|             while (numOfMsg) { | ||||
|                 logFile[NEXT_MSG_FLAG_POS] = NEXT_MSG_FLAG; | ||||
|                 if (subsystem == OC_SS_SYS) { | ||||
|                     logFile[FS_OCMP_MSGTYPE_POS] = OCMP_MSG_TYPE_COMMAND; | ||||
|                     memcpy(tMsg, logFile, FRAME_SIZE); | ||||
|  | ||||
|                     Util_enqueueMsg(ss->msgRxQueue, ss->sem, (uint8_t *)tMsg); | ||||
|                 } else { | ||||
|                     if (logFile[FS_OCMP_SUBSYSTEM_POS] == subsystem) { | ||||
|                         logFile[FS_OCMP_MSGTYPE_POS] = OCMP_MSG_TYPE_COMMAND; | ||||
|                         memcpy(tMsg, logFile, FRAME_SIZE); | ||||
|                         Util_enqueueMsg(ss->msgRxQueue, ss->sem, | ||||
|                                         (uint8_t *)tMsg); | ||||
|                     } | ||||
|                 } | ||||
|                 logFile += FRAME_SIZE; | ||||
|                 numOfMsg--; | ||||
|             } | ||||
|             if (fileIndex == 0) { | ||||
|                 logFile[NEXT_MSG_FLAG_POS] = LAST_MSG_FLAG; | ||||
|                 memcpy(tMsg, logFile, FRAME_SIZE); | ||||
|                 Util_enqueueMsg(ss->msgRxQueue, ss->sem, (uint8_t *)tMsg); | ||||
|                 LOGGER_DEBUG("FS:: Set last flag\n"); | ||||
|             } | ||||
|             free(tMsg); | ||||
|             logFile = logFilePtr; | ||||
|             free(logFile); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| /***************************************************************************** | ||||
|  **    FUNCTION NAME   : fs_wrapper_data_read | ||||
|  ** | ||||
|  **    DESCRIPTION     : Called by subsystems and passes filename to alert_msg | ||||
|  ** | ||||
|  **    ARGUMENTS       : Subsystem number | ||||
|  ** | ||||
|  **    RETURN TYPE     : Success or failure | ||||
|  ** | ||||
|  *****************************************************************************/ | ||||
| bool fs_wrapper_data_read(FILESystemStruct *fileSysStruct) | ||||
| { | ||||
|     uint8_t index = fileSysStruct->noOfFiles - 1; | ||||
|     OCMPMessageFrame *tempMsg = (OCMPMessageFrame *)fileSysStruct->pMsg; | ||||
|     OCMPSubsystem subsys = tempMsg->message.subsystem; | ||||
|     char fileName[FS_STR_SIZE] = { 0 }; | ||||
|     file.cache.buffer = | ||||
|         0; /* make buffer zero to avoid fail, might be a bug with filesystem */ | ||||
|     while (index > 0) { | ||||
|         sprintf(fileName, "%s_%d", fileSysStruct->fileName, index); | ||||
|         fs_wrapper_flashMemory_read(subsys, fileName, | ||||
|                                     fs_wrapper_get_fileSize(fileName), index); | ||||
|         index--; | ||||
|     } | ||||
|     fs_wrapper_flashMemory_read( | ||||
|         subsys, fileSysStruct->fileName, | ||||
|         fs_wrapper_get_fileSize(fileSysStruct->fileName), index); | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| /***************************************************************************** | ||||
|  **    FUNCTION NAME   : fs_wrapper_data_write | ||||
|  ** | ||||
|  **    DESCRIPTION     : It write data to specified file | ||||
|  ** | ||||
| @@ -159,24 +267,74 @@ int fileSize(const char *path) | ||||
|  **    RETURN TYPE     : true or flase | ||||
|  ** | ||||
|  *****************************************************************************/ | ||||
| bool fileWrite(const char *path, uint8_t *pMsg, uint32_t size) | ||||
| bool fs_wrapper_data_write(FILESystemStruct *fileSysStruct) | ||||
| { | ||||
|     if (lfs_file_open(&lfs, &file, path, | ||||
|                       LFS_O_RDWR | LFS_O_CREAT | LFS_O_APPEND) == LFS_ERR_OK) { | ||||
|         LOGGER_DEBUG("FS:: File open successfully \n"); | ||||
|     } | ||||
|     if (lfs_file_write(&lfs, &file, pMsg, size) == size) { | ||||
|         LOGGER_DEBUG("FS:: File written successfully \n"); | ||||
|     } | ||||
|     if (lfs_file_close(&lfs, &file) == LFS_ERR_OK) { | ||||
|         LOGGER_DEBUG("FS:: File closed successfully \n"); | ||||
|     } | ||||
|     int8_t index = fileSysStruct->noOfFiles - 2; | ||||
|     char oldfilename[50] = { 0 }; | ||||
|     char newfilename[50] = { 0 }; | ||||
|  | ||||
|     if (fs_wrapper_get_fileSize(fileSysStruct->fileName) > | ||||
|         fileSysStruct->maxFileSize) { | ||||
|         /* Create new file */ | ||||
|         if (lfs_file_open(&lfs, &file, "newfile", LFS_O_RDWR | LFS_O_CREAT) == | ||||
|             LFS_ERR_OK) { | ||||
|             LOGGER_DEBUG("FS:: File open successfully \n"); | ||||
|             if (lfs_file_write(&lfs, &file, fileSysStruct->pMsg, | ||||
|                                fileSysStruct->frameSize) == | ||||
|                 fileSysStruct->frameSize) { | ||||
|                 LOGGER_DEBUG("FS:: File written successfully \n"); | ||||
|                 if (lfs_file_close(&lfs, &file) == LFS_ERR_OK) { | ||||
|                     LOGGER_DEBUG("FS:: File closed successfully \n"); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         /* Find the last existing file */ | ||||
|         while (index > 0) { | ||||
|             sprintf(newfilename, "%s_%d", fileSysStruct->fileName, index); | ||||
|             if (lfs_file_open(&lfs, &file, newfilename, | ||||
|                               LFS_O_RDWR | LFS_O_APPEND) == LFS_ERR_OK) { | ||||
|                 if (lfs_file_close(&lfs, &file) == LFS_ERR_OK) { | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|             index--; | ||||
|         } | ||||
|  | ||||
|         /* Move the existing files by +1 */ | ||||
|         for (int i = index; i > 0; i--) { | ||||
|             sprintf(oldfilename, "%s_%d", fileSysStruct->fileName, i); | ||||
|             sprintf(newfilename, "%s_%d", fileSysStruct->fileName, i + 1); | ||||
|             lfs_rename(&lfs, oldfilename, newfilename); | ||||
|         } | ||||
|  | ||||
|         sprintf(oldfilename, "%s", fileSysStruct->fileName); | ||||
|         sprintf(newfilename, "%s_%d", fileSysStruct->fileName, 1); | ||||
|         lfs_rename(&lfs, oldfilename, newfilename); | ||||
|  | ||||
|         sprintf(newfilename, "%s", fileSysStruct->fileName); | ||||
|         lfs_rename(&lfs, "newfile", newfilename); | ||||
|  | ||||
|     } else { | ||||
|         if (lfs_file_open(&lfs, &file, fileSysStruct->fileName, | ||||
|                           LFS_O_RDWR | LFS_O_APPEND) == LFS_ERR_OK) { | ||||
|             LOGGER_DEBUG("FS:: File open successfully \n"); | ||||
|             if (lfs_file_write(&lfs, &file, fileSysStruct->pMsg, | ||||
|                                fileSysStruct->frameSize) == | ||||
|                 fileSysStruct->frameSize) { | ||||
|                 LOGGER_DEBUG("FS:: File written successfully \n"); | ||||
|                 if (lfs_file_close(&lfs, &file) == LFS_ERR_OK) { | ||||
|                     LOGGER_DEBUG("FS:: File closed successfully \n"); | ||||
|                 } | ||||
|             } | ||||
|         } else { | ||||
|             LOGGER_DEBUG("FS:: File open failed \n"); | ||||
|         } | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| /***************************************************************************** | ||||
|  **    FUNCTION NAME   : fileRead | ||||
|  **    FUNCTION NAME   : fs_wrapper_file_read | ||||
|  ** | ||||
|  **    DESCRIPTION     : It reads data from specified file | ||||
|  ** | ||||
| @@ -185,37 +343,50 @@ bool fileWrite(const char *path, uint8_t *pMsg, uint32_t size) | ||||
|  **    RETURN TYPE     : true or flase | ||||
|  ** | ||||
|  *****************************************************************************/ | ||||
| bool fileRead(const char *path, UChar *buf, uint32_t size) | ||||
| bool fs_wrapper_file_read(const char *fileName, uint8_t *buf, uint32_t size) | ||||
| { | ||||
|     if (lfs_file_open(&lfs, &file, path, LFS_O_RDONLY) == LFS_ERR_OK) { | ||||
|     if (lfs_file_open(&lfs, &file, fileName, LFS_O_RDWR) == LFS_ERR_OK) { | ||||
|         LOGGER_DEBUG("FS:: File open successfully \n"); | ||||
|         if (lfs_file_read(&lfs, &file, buf, size) == size) { | ||||
|             LOGGER_DEBUG("FS:: File read successfully \n"); | ||||
|             if (lfs_file_close(&lfs, &file) == LFS_ERR_OK) { | ||||
|                 LOGGER_DEBUG("FS:: File closed successfully \n"); | ||||
|             } else { | ||||
|                 LOGGER_DEBUG("FS:: File closed failed \n"); | ||||
|             } | ||||
|         } else { | ||||
|             LOGGER_DEBUG("FS:: File read failed \n"); | ||||
|         } | ||||
|     } else { | ||||
|         LOGGER_DEBUG("FS:: File open failed \n"); | ||||
|     } | ||||
|     if (lfs_file_read(&lfs, &file, buf, size) == size) { | ||||
|         LOGGER_DEBUG("FS:: File read successfully \n"); | ||||
|     } | ||||
|     if (lfs_file_close(&lfs, &file) == LFS_ERR_OK) { | ||||
|         LOGGER_DEBUG("FS:: File closed successfully \n"); | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| /***************************************************************************** | ||||
|  **    FUNCTION NAME   : fsMsgHandler | ||||
|  **    FUNCTION NAME   : fs_wrapper_msgHandler | ||||
|  ** | ||||
|  **    DESCRIPTION     : It is called when data to be written | ||||
|  **    DESCRIPTION     : It calls fs_wrapper_data_write function to write data | ||||
|  *by passing file name | ||||
|  ** | ||||
|  **    ARGUMENTS       : data pointer | ||||
|  ** | ||||
|  **    RETURN TYPE     : true or flase | ||||
|  ** | ||||
|  *****************************************************************************/ | ||||
| static bool fsMsgHandler(OCMPMessageFrame *pMsg) | ||||
| static bool fs_wrapper_msgHandler(FILESystemStruct *fileSysStruct) | ||||
| { | ||||
|     char fileName[] = "logs"; | ||||
|  | ||||
|     fileWrite(fileName, (uint8_t *)pMsg, FRAME_SIZE); | ||||
|  | ||||
|     switch (fileSysStruct->operation) { | ||||
|         case WRITE_FLAG: | ||||
|             fs_wrapper_data_write(fileSysStruct); | ||||
|             Semaphore_post(semFSwriteMsg); | ||||
|             break; | ||||
|         case READ_FLAG: | ||||
|             fs_wrapper_data_read(fileSysStruct); | ||||
|             break; | ||||
|         default: | ||||
|             break; | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| @@ -225,45 +396,70 @@ static bool fsMsgHandler(OCMPMessageFrame *pMsg) | ||||
|  **    DESCRIPTION     : It initializes filesystem by mounting device | ||||
|  ** | ||||
|  **    ARGUMENTS       : arg0 for SPI device configuration, arg1 for return | ||||
|  *argument | ||||
|  ** | ||||
|  **    RETURN TYPE     : true or flase | ||||
|  ** | ||||
|  *****************************************************************************/ | ||||
| void fs_init(UArg arg0, UArg arg1) | ||||
| void fs_wrapper_fileSystem_init(UArg arg0, UArg arg1) | ||||
| { | ||||
|     uint8_t index = 0; | ||||
|     FILESystemStruct *fileSysStruct; | ||||
|     memset(&lfs, 0, sizeof(lfs)); | ||||
|     memset(&file, 0, sizeof(file)); | ||||
|  | ||||
| #pragma GCC diagnostic push | ||||
| #pragma GCC diagnostic ignored "-Wincompatible-pointer-types" | ||||
|     /*configuration of the filesystem is provided by this struct */ | ||||
|     const struct lfs_config cfg = { | ||||
|         .context = (void *)arg0, | ||||
|         .read = block_device_read, | ||||
|         .prog = block_device_write, | ||||
|         .erase = block_device_erase, | ||||
|         .sync = block_device_sync, | ||||
|         .read = fs_wrapper_block_device_read, | ||||
|         .prog = fs_wrapper_block_device_write, | ||||
|         .erase = fs_wrapper_block_device_erase, | ||||
|         .sync = fs_wrapper_block_device_sync, | ||||
|         .read_size = READ_SIZE, | ||||
|         .prog_size = WRITE_SIZE, | ||||
|         .block_size = BLOCK_SIZE, | ||||
|         .block_count = BLOCK_COUNT, | ||||
|         .lookahead = LOOK_AHEAD, | ||||
|     }; | ||||
| #pragma GCC diagnostic pop | ||||
|     int err = lfs_mount(&lfs, &cfg); | ||||
|  | ||||
|     if (err) { | ||||
|         lfs_format(&lfs, &cfg); | ||||
|         lfs_mount(&lfs, &cfg); | ||||
|         err = lfs_mount(&lfs, &cfg); | ||||
|     } | ||||
|  | ||||
|     if (!err) { | ||||
|         LOGGER_DEBUG("FS:: Filesystem mounted successfully \n"); | ||||
|     } | ||||
|  | ||||
|     while (true) { | ||||
|         if (Semaphore_pend(semFilesysMsg, BIOS_WAIT_FOREVER)) { | ||||
|             while (!Queue_empty(fsTxMsgQueue)) { | ||||
|                 OCMPMessageFrame *pMsg = | ||||
|                     (OCMPMessageFrame *)Util_dequeueMsg(fsTxMsgQueue); | ||||
|                 if (pMsg != NULL) { | ||||
|                     if (!fsMsgHandler(pMsg)) { | ||||
|                         LOGGER_ERROR("ERROR:: Unable to route message \n"); | ||||
|                         free(pMsg); | ||||
|         while (index < ((AT45DB_Dev *)arg0)->cfg.noOfFiles) { | ||||
|             if (lfs_file_open(&lfs, &file, | ||||
|                               ((AT45DB_Dev *)arg0)->cfg.fileName[index], | ||||
|                               LFS_O_CREAT | LFS_O_EXCL) == LFS_ERR_OK) { | ||||
|                 LOGGER_DEBUG( | ||||
|                     "FS:: File created successfully in flash(at45db) memory \n"); | ||||
|                 if (lfs_file_close(&lfs, &file) == LFS_ERR_OK) { | ||||
|                     LOGGER_DEBUG("FS:: File closed successfully \n"); | ||||
|                 } | ||||
|             } else { | ||||
|                 LOGGER_DEBUG( | ||||
|                     "FS:: File already exist in flash(at45db) memory \n"); | ||||
|             } | ||||
|             index++; | ||||
|         } | ||||
|  | ||||
|         while (true) { | ||||
|             if (Semaphore_pend(semFilesysMsg, BIOS_WAIT_FOREVER)) { | ||||
|                 while (!Queue_empty(fsRxMsgQueue)) { | ||||
|                     fileSysStruct = | ||||
|                         (FILESystemStruct *)Util_dequeueMsg(fsRxMsgQueue); | ||||
|                     if (fileSysStruct != NULL) { | ||||
|                         if (!fs_wrapper_msgHandler(fileSysStruct)) { | ||||
|                             LOGGER_ERROR("ERROR:: Unable to route message \n"); | ||||
|                             free(fileSysStruct); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|   | ||||
| @@ -8,18 +8,60 @@ | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| #ifndef SRC_FILESYSTEM_FS_H_ | ||||
| #define SRC_FILESYSTEM_FS_H_ | ||||
| #ifndef SRC_FILESYSTEM_FS_WRAPPER_H_ | ||||
| #define SRC_FILESYSTEM_FS_WRAPPER_H_ | ||||
|  | ||||
| #include "common/inc/global/post_frame.h" | ||||
| #include "common/inc/global/ocmp_frame.h" | ||||
| #include <ti/sysbios/BIOS.h> | ||||
| #include <ti/sysbios/knl/Queue.h> | ||||
| #include <ti/sysbios/knl/Semaphore.h> | ||||
| #include <ti/sysbios/knl/Task.h> | ||||
|  | ||||
| extern Queue_Handle fsRxMsgQueue; | ||||
| extern Queue_Handle fsTxMsgQueue; | ||||
| extern Semaphore_Handle semFilesysMsg; | ||||
| #define FRAME_SIZE 64 | ||||
| #define FS_OCMP_MSGTYPE_POS 13 | ||||
| #define FS_OCMP_SUBSYSTEM_POS 11 | ||||
| #define FS_STR_SIZE 50 | ||||
| #define LAST_MSG 1 | ||||
| #define LAST_MSG_FLAG 0 | ||||
| #define MAX_ALERT_FILE_SIZE 512 | ||||
| #define NEXT_MSG_FLAG_POS 17 | ||||
| #define NO_OF_ALERT_FILES 8 | ||||
| #define READ_FLAG 0 | ||||
| #define WRITE_FLAG 1 | ||||
|  | ||||
| int fileSize(const char *path); | ||||
| void fs_init(UArg arg0, UArg arg1); | ||||
| bool fileRead(const char *path, UChar *buf, uint32_t size); | ||||
| bool fileWrite(const char *path, uint8_t *pMsg, uint32_t size); | ||||
| Semaphore_Handle semFilesysMsg; | ||||
| Semaphore_Struct semFSstruct; | ||||
|  | ||||
| #endif /* SRC_FILESYSTEM_FS_H_ */ | ||||
| Semaphore_Handle semFSreadMsg; | ||||
| Semaphore_Struct semFSreadStruct; | ||||
|  | ||||
| Semaphore_Handle semFSwriteMsg; | ||||
| Semaphore_Struct semFSwriteStruct; | ||||
|  | ||||
| #pragma GCC diagnostic push | ||||
| #pragma GCC diagnostic ignored "-Wunused-variable" | ||||
| static Queue_Struct fsRxMsg; | ||||
| static Queue_Struct fsTxMsg; | ||||
| #pragma GCC diagnostic pop | ||||
|  | ||||
| Queue_Handle fsRxMsgQueue; | ||||
| Queue_Handle fsTxMsgQueue; | ||||
|  | ||||
| typedef struct FILESystemStruct { | ||||
|     char *fileName; | ||||
|     uint8_t frameSize; | ||||
|     uint8_t noOfFiles; | ||||
|     void *pMsg; | ||||
|     uint16_t maxFileSize; | ||||
|     uint8_t operation; | ||||
| } FILESystemStruct; | ||||
|  | ||||
| int fs_wrapper_get_fileSize(const char *path); | ||||
| bool fs_wrapper_data_read(FILESystemStruct *fileSysStruct); | ||||
| void fs_wrapper_flashMemory_read(OCMPSubsystem subsystem, const char *path, | ||||
|                                  uint32_t file_size, uint8_t fileIndex); | ||||
| void fs_wrapper_fileSystem_init(UArg arg0, UArg arg1); | ||||
| bool fs_wrapper_file_read(const char *fileName, uint8_t *buf, uint32_t size); | ||||
|  | ||||
| #endif /* SRC_FILESYSTEM_FS_WRAPPER_H_ */ | ||||
|   | ||||
| @@ -5,17 +5,16 @@ | ||||
|  * SPDX-License-Identifier: BSD-3-Clause | ||||
|  */ | ||||
|  | ||||
| #include <assert.h> | ||||
| #include "lfs.h" | ||||
| #include "lfs_util.h" | ||||
|  | ||||
| #include <string.h> | ||||
| #include <stdlib.h> | ||||
| #include <assert.h> | ||||
|  | ||||
| /* Caching block device operations */ | ||||
| static int lfs_cache_read(lfs_t *lfs, lfs_cache_t *rcache, | ||||
|                           const lfs_cache_t *pcache, lfs_block_t block, | ||||
|                           lfs_off_t off, void *buffer, lfs_size_t size) | ||||
|                           lfs_offset_t off, void *buffer, lfs_size_t size) | ||||
| { | ||||
|     uint8_t *data = buffer; | ||||
|     assert(block < lfs->cfg->block_count); | ||||
| @@ -75,11 +74,11 @@ static int lfs_cache_read(lfs_t *lfs, lfs_cache_t *rcache, | ||||
|  | ||||
| static int lfs_cache_cmp(lfs_t *lfs, lfs_cache_t *rcache, | ||||
|                          const lfs_cache_t *pcache, lfs_block_t block, | ||||
|                          lfs_off_t off, const void *buffer, lfs_size_t size) | ||||
|                          lfs_offset_t off, const void *buffer, lfs_size_t size) | ||||
| { | ||||
|     const uint8_t *data = buffer; | ||||
|  | ||||
|     for (lfs_off_t i = 0; i < size; i++) { | ||||
|     for (lfs_offset_t i = 0; i < size; i++) { | ||||
|         uint8_t c; | ||||
|         int err = lfs_cache_read(lfs, rcache, pcache, block, off + i, &c, 1); | ||||
|         if (err) { | ||||
| @@ -95,9 +94,9 @@ static int lfs_cache_cmp(lfs_t *lfs, lfs_cache_t *rcache, | ||||
|  | ||||
| static int lfs_cache_crc(lfs_t *lfs, lfs_cache_t *rcache, | ||||
|                          const lfs_cache_t *pcache, lfs_block_t block, | ||||
|                          lfs_off_t off, lfs_size_t size, uint32_t *crc) | ||||
|                          lfs_offset_t off, lfs_size_t size, uint32_t *crc) | ||||
| { | ||||
|     for (lfs_off_t i = 0; i < size; i++) { | ||||
|     for (lfs_offset_t i = 0; i < size; i++) { | ||||
|         uint8_t c; | ||||
|         int err = lfs_cache_read(lfs, rcache, pcache, block, off + i, &c, 1); | ||||
|         if (err) { | ||||
| @@ -137,8 +136,8 @@ static int lfs_cache_flush(lfs_t *lfs, lfs_cache_t *pcache, lfs_cache_t *rcache) | ||||
| } | ||||
|  | ||||
| static int lfs_cache_prog(lfs_t *lfs, lfs_cache_t *pcache, lfs_cache_t *rcache, | ||||
|                           lfs_block_t block, lfs_off_t off, const void *buffer, | ||||
|                           lfs_size_t size) | ||||
|                           lfs_block_t block, lfs_offset_t off, | ||||
|                           const void *buffer, lfs_size_t size) | ||||
| { | ||||
|     const uint8_t *data = buffer; | ||||
|     assert(block < lfs->cfg->block_count); | ||||
| @@ -205,7 +204,7 @@ static int lfs_cache_prog(lfs_t *lfs, lfs_cache_t *pcache, lfs_cache_t *rcache, | ||||
| } | ||||
|  | ||||
| /* General lfs block device operations */ | ||||
| static int lfs_bd_read(lfs_t *lfs, lfs_block_t block, lfs_off_t off, | ||||
| static int lfs_bd_read(lfs_t *lfs, lfs_block_t block, lfs_offset_t off, | ||||
|                        void *buffer, lfs_size_t size) | ||||
| { | ||||
|     /* if we ever do more than writes to alternating pairs, | ||||
| @@ -214,19 +213,19 @@ static int lfs_bd_read(lfs_t *lfs, lfs_block_t block, lfs_off_t off, | ||||
|     return lfs_cache_read(lfs, &lfs->rcache, NULL, block, off, buffer, size); | ||||
| } | ||||
|  | ||||
| static int lfs_bd_prog(lfs_t *lfs, lfs_block_t block, lfs_off_t off, | ||||
| static int lfs_bd_prog(lfs_t *lfs, lfs_block_t block, lfs_offset_t off, | ||||
|                        const void *buffer, lfs_size_t size) | ||||
| { | ||||
|     return lfs_cache_prog(lfs, &lfs->pcache, NULL, block, off, buffer, size); | ||||
| } | ||||
|  | ||||
| static int lfs_bd_cmp(lfs_t *lfs, lfs_block_t block, lfs_off_t off, | ||||
| static int lfs_bd_cmp(lfs_t *lfs, lfs_block_t block, lfs_offset_t off, | ||||
|                       const void *buffer, lfs_size_t size) | ||||
| { | ||||
|     return lfs_cache_cmp(lfs, &lfs->rcache, NULL, block, off, buffer, size); | ||||
| } | ||||
|  | ||||
| static int lfs_bd_crc(lfs_t *lfs, lfs_block_t block, lfs_off_t off, | ||||
| static int lfs_bd_crc(lfs_t *lfs, lfs_block_t block, lfs_offset_t off, | ||||
|                       lfs_size_t size, uint32_t *crc) | ||||
| { | ||||
|     return lfs_cache_crc(lfs, &lfs->rcache, NULL, block, off, size, crc); | ||||
| @@ -430,7 +429,7 @@ static int lfs_dir_fetch(lfs_t *lfs, lfs_dir_t *dir, const lfs_block_t pair[2]) | ||||
| } | ||||
|  | ||||
| struct lfs_region { | ||||
|     lfs_off_t oldoff; | ||||
|     lfs_offset_t oldoff; | ||||
|     lfs_size_t oldlen; | ||||
|     const void *newdata; | ||||
|     lfs_size_t newlen; | ||||
| @@ -472,8 +471,8 @@ static int lfs_dir_commit(lfs_t *lfs, lfs_dir_t *dir, | ||||
|             } | ||||
|  | ||||
|             int i = 0; | ||||
|             lfs_off_t oldoff = sizeof(dir->d); | ||||
|             lfs_off_t newoff = sizeof(dir->d); | ||||
|             lfs_offset_t oldoff = sizeof(dir->d); | ||||
|             lfs_offset_t newoff = sizeof(dir->d); | ||||
|             while (newoff < (0x7fffffff & dir->d.size) - 4) { | ||||
|                 if (i < count && regions[i].oldoff == oldoff) { | ||||
|                     lfs_crc(&crc, regions[i].newdata, regions[i].newlen); | ||||
| @@ -1002,7 +1001,7 @@ int lfs_dir_read(lfs_t *lfs, lfs_dir_t *dir, struct lfs_info *info) | ||||
|     return 1; | ||||
| } | ||||
|  | ||||
| int lfs_dir_seek(lfs_t *lfs, lfs_dir_t *dir, lfs_off_t off) | ||||
| int lfs_dir_seek(lfs_t *lfs, lfs_dir_t *dir, lfs_offset_t off) | ||||
| { | ||||
|     /* simply walk from head dir */ | ||||
|     int err = lfs_dir_rewind(lfs, dir); | ||||
| @@ -1048,11 +1047,11 @@ int lfs_dir_rewind(lfs_t *lfs, lfs_dir_t *dir) | ||||
| } | ||||
|  | ||||
| /* File index list operations */ | ||||
| static int lfs_ctz_index(lfs_t *lfs, lfs_off_t *off) | ||||
| static int lfs_ctz_index(lfs_t *lfs, lfs_offset_t *off) | ||||
| { | ||||
|     lfs_off_t size = *off; | ||||
|     lfs_off_t b = lfs->cfg->block_size - 2 * 4; | ||||
|     lfs_off_t i = size / b; | ||||
|     lfs_offset_t size = *off; | ||||
|     lfs_offset_t b = lfs->cfg->block_size - 2 * 4; | ||||
|     lfs_offset_t i = size / b; | ||||
|     if (i == 0) { | ||||
|         return 0; | ||||
|     } | ||||
| @@ -1065,7 +1064,7 @@ static int lfs_ctz_index(lfs_t *lfs, lfs_off_t *off) | ||||
| static int lfs_ctz_find(lfs_t *lfs, lfs_cache_t *rcache, | ||||
|                         const lfs_cache_t *pcache, lfs_block_t head, | ||||
|                         lfs_size_t size, lfs_size_t pos, lfs_block_t *block, | ||||
|                         lfs_off_t *off) | ||||
|                         lfs_offset_t *off) | ||||
| { | ||||
|     if (size == 0) { | ||||
|         *block = 0xffffffff; | ||||
| @@ -1073,8 +1072,8 @@ static int lfs_ctz_find(lfs_t *lfs, lfs_cache_t *rcache, | ||||
|         return 0; | ||||
|     } | ||||
|  | ||||
|     lfs_off_t current = lfs_ctz_index(lfs, &(lfs_off_t){ size - 1 }); | ||||
|     lfs_off_t target = lfs_ctz_index(lfs, &pos); | ||||
|     lfs_offset_t current = lfs_ctz_index(lfs, &(lfs_offset_t){ size - 1 }); | ||||
|     lfs_offset_t target = lfs_ctz_index(lfs, &pos); | ||||
|  | ||||
|     while (current > target) { | ||||
|         lfs_size_t skip = | ||||
| @@ -1096,7 +1095,7 @@ static int lfs_ctz_find(lfs_t *lfs, lfs_cache_t *rcache, | ||||
|  | ||||
| static int lfs_ctz_extend(lfs_t *lfs, lfs_cache_t *rcache, lfs_cache_t *pcache, | ||||
|                           lfs_block_t head, lfs_size_t size, lfs_block_t *block, | ||||
|                           lfs_off_t *off) | ||||
|                           lfs_offset_t *off) | ||||
| { | ||||
|     while (true) { | ||||
|         /* go ahead and grab a block */ | ||||
| @@ -1123,12 +1122,12 @@ static int lfs_ctz_extend(lfs_t *lfs, lfs_cache_t *rcache, lfs_cache_t *pcache, | ||||
|             } | ||||
|  | ||||
|             size -= 1; | ||||
|             lfs_off_t index = lfs_ctz_index(lfs, &size); | ||||
|             lfs_offset_t index = lfs_ctz_index(lfs, &size); | ||||
|             size += 1; | ||||
|  | ||||
|             /* just copy out the last block if it is incomplete */ | ||||
|             if (size != lfs->cfg->block_size) { | ||||
|                 for (lfs_off_t i = 0; i < size; i++) { | ||||
|                 for (lfs_offset_t i = 0; i < size; i++) { | ||||
|                     uint8_t data; | ||||
|                     int err = | ||||
|                         lfs_cache_read(lfs, rcache, NULL, head, i, &data, 1); | ||||
| @@ -1155,7 +1154,7 @@ static int lfs_ctz_extend(lfs_t *lfs, lfs_cache_t *rcache, lfs_cache_t *pcache, | ||||
|             index += 1; | ||||
|             lfs_size_t skips = lfs_ctz(index) + 1; | ||||
|  | ||||
|             for (lfs_off_t i = 0; i < skips; i++) { | ||||
|             for (lfs_offset_t i = 0; i < skips; i++) { | ||||
|                 int err = lfs_cache_prog(lfs, pcache, rcache, nblock, 4 * i, | ||||
|                                          &head, 4); | ||||
|                 if (err) { | ||||
| @@ -1198,7 +1197,7 @@ static int lfs_ctz_traverse(lfs_t *lfs, lfs_cache_t *rcache, | ||||
|         return 0; | ||||
|     } | ||||
|  | ||||
|     lfs_off_t index = lfs_ctz_index(lfs, &(lfs_off_t){ size - 1 }); | ||||
|     lfs_offset_t index = lfs_ctz_index(lfs, &(lfs_offset_t){ size - 1 }); | ||||
|  | ||||
|     while (true) { | ||||
|         int err = cb(data, head); | ||||
| @@ -1306,7 +1305,7 @@ int lfs_file_close(lfs_t *lfs, lfs_file_t *file) | ||||
| { | ||||
|     int err = lfs_file_sync(lfs, file); | ||||
|  | ||||
|     /* remove from list of files */ | ||||
|     // remove from list of files | ||||
|     for (lfs_file_t **p = &lfs->files; *p; p = &(*p)->next) { | ||||
|         if (*p == file) { | ||||
|             *p = file->next; | ||||
| @@ -1342,7 +1341,7 @@ relocate: | ||||
|     } | ||||
|  | ||||
|     /* either read from dirty cache or disk */ | ||||
|     for (lfs_off_t i = 0; i < file->off; i++) { | ||||
|     for (lfs_offset_t i = 0; i < file->off; i++) { | ||||
|         uint8_t data; | ||||
|         err = lfs_cache_read(lfs, &lfs->rcache, &file->cache, file->block, i, | ||||
|                              &data, 1); | ||||
| @@ -1379,7 +1378,7 @@ static int lfs_file_flush(lfs_t *lfs, lfs_file_t *file) | ||||
|     } | ||||
|  | ||||
|     if (file->flags & LFS_F_WRITING) { | ||||
|         lfs_off_t pos = file->pos; | ||||
|         lfs_offset_t pos = file->pos; | ||||
|  | ||||
|         /* copy over anything after current branch */ | ||||
|         lfs_file_t orig = { | ||||
| @@ -1565,7 +1564,7 @@ lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file, const void *buffer, | ||||
|  | ||||
|     if (!(file->flags & LFS_F_WRITING) && file->pos > file->size) { | ||||
|         /* fill with zeros */ | ||||
|         lfs_off_t pos = file->pos; | ||||
|         lfs_offset_t pos = file->pos; | ||||
|         file->pos = file->size; | ||||
|  | ||||
|         while (file->pos < pos) { | ||||
| @@ -1654,13 +1653,13 @@ lfs_soff_t lfs_file_seek(lfs_t *lfs, lfs_file_t *file, lfs_soff_t off, | ||||
|     if (whence == LFS_SEEK_SET) { | ||||
|         file->pos = off; | ||||
|     } else if (whence == LFS_SEEK_CUR) { | ||||
|         if ((lfs_off_t)-off > file->pos) { | ||||
|         if ((lfs_offset_t)-off > file->pos) { | ||||
|             return LFS_ERR_INVAL; | ||||
|         } | ||||
|  | ||||
|         file->pos = file->pos + off; | ||||
|     } else if (whence == LFS_SEEK_END) { | ||||
|         if ((lfs_off_t)-off > file->size) { | ||||
|         if ((lfs_offset_t)-off > file->size) { | ||||
|             return LFS_ERR_INVAL; | ||||
|         } | ||||
|  | ||||
| @@ -1669,6 +1668,58 @@ lfs_soff_t lfs_file_seek(lfs_t *lfs, lfs_file_t *file, lfs_soff_t off, | ||||
|     return file->pos; | ||||
| } | ||||
|  | ||||
| int lfs_file_truncate(lfs_t *lfs, lfs_file_t *file, lfs_offset_t size) | ||||
| { | ||||
|     if ((file->flags & 3) == LFS_O_RDONLY) { | ||||
|         return LFS_ERR_INVAL; | ||||
|     } | ||||
|  | ||||
|     lfs_offset_t oldsize = lfs_file_size(lfs, file); | ||||
|     if (size < oldsize) { | ||||
|         /* need to flush since directly changing metadata */ | ||||
|         int err = lfs_file_flush(lfs, file); | ||||
|         if (err) { | ||||
|             return err; | ||||
|         } | ||||
|  | ||||
|         /* lookup new head in ctz skip list */ | ||||
|         err = lfs_ctz_find(lfs, &file->cache, NULL, file->head, file->size, | ||||
|                            size, &file->head, &(lfs_offset_t){ 0 }); | ||||
|         if (err) { | ||||
|             return err; | ||||
|         } | ||||
|  | ||||
|         file->size = size; | ||||
|         file->flags |= LFS_F_DIRTY; | ||||
|     } else if (size > oldsize) { | ||||
|         lfs_offset_t pos = file->pos; | ||||
|  | ||||
|         /* flush+seek if not already at end */ | ||||
|         if (file->pos != oldsize) { | ||||
|             int err = lfs_file_seek(lfs, file, 0, LFS_SEEK_END); | ||||
|             if (err < 0) { | ||||
|                 return err; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         /* fill with zeros */ | ||||
|         while (file->pos < size) { | ||||
|             lfs_ssize_t res = lfs_file_write(lfs, file, &(uint8_t){ 0 }, 1); | ||||
|             if (res < 0) { | ||||
|                 return res; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         /* restore pos */ | ||||
|         int err = lfs_file_seek(lfs, file, pos, LFS_SEEK_SET); | ||||
|         if (err < 0) { | ||||
|             return err; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| lfs_soff_t lfs_file_tell(lfs_t *lfs, lfs_file_t *file) | ||||
| { | ||||
|     return file->pos; | ||||
|   | ||||
| @@ -13,7 +13,7 @@ | ||||
|  | ||||
| /* Type definitions */ | ||||
| typedef uint32_t lfs_size_t; | ||||
| typedef uint32_t lfs_off_t; | ||||
| typedef uint32_t lfs_offset_t; | ||||
|  | ||||
| typedef int32_t lfs_ssize_t; | ||||
| typedef int32_t lfs_soff_t; | ||||
| @@ -78,13 +78,13 @@ struct lfs_config { | ||||
|     void *context; | ||||
|  | ||||
|     /* Read a region in a block */ | ||||
|     int (*read)(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, | ||||
|     int (*read)(const struct lfs_config *c, lfs_block_t block, lfs_offset_t off, | ||||
|                 void *buffer, lfs_size_t size); | ||||
|  | ||||
|     /* Program a region in a block, function must return LFS_ERR_CORRUPT | ||||
|      * if the block should be considered bad | ||||
|      */ | ||||
|     int (*prog)(const struct lfs_config *c, lfs_block_t block, lfs_off_t off, | ||||
|     int (*prog)(const struct lfs_config *c, lfs_block_t block, lfs_offset_t off, | ||||
|                 const void *buffer, lfs_size_t size); | ||||
|  | ||||
|     /* Erase a block, A block must be erased before being programmed */ | ||||
| @@ -152,7 +152,7 @@ struct lfs_info { | ||||
|  | ||||
| /* filesystem data structures */ | ||||
| typedef struct lfs_entry { | ||||
|     lfs_off_t off; | ||||
|     lfs_offset_t off; | ||||
|  | ||||
|     struct lfs_disk_entry { | ||||
|         uint8_t type; | ||||
| @@ -171,32 +171,35 @@ typedef struct lfs_entry { | ||||
|  | ||||
| typedef struct lfs_cache { | ||||
|     lfs_block_t block; | ||||
|     lfs_off_t off; | ||||
|     lfs_offset_t off; | ||||
|     uint8_t *buffer; | ||||
| } lfs_cache_t; | ||||
|  | ||||
| typedef struct lfs_file { | ||||
|     struct lfs_file *next; | ||||
|     lfs_block_t pair[2]; | ||||
|     lfs_off_t poff; | ||||
|     lfs_offset_t poff; | ||||
|  | ||||
|     lfs_block_t head; | ||||
|     lfs_size_t size; | ||||
|  | ||||
|     const struct lfs_file_config *cfg; | ||||
|  | ||||
|     uint32_t flags; | ||||
|     lfs_off_t pos; | ||||
|     lfs_offset_t pos; | ||||
|     lfs_block_t block; | ||||
|     lfs_off_t off; | ||||
|     lfs_offset_t off; | ||||
|     lfs_cache_t cache; | ||||
| } lfs_file_t; | ||||
|  | ||||
| typedef struct lfs_dir { | ||||
|     struct lfs_dir *next; | ||||
|  | ||||
|     lfs_block_t pair[2]; | ||||
|     lfs_off_t off; | ||||
|     lfs_offset_t off; | ||||
|  | ||||
|     lfs_block_t head[2]; | ||||
|     lfs_off_t pos; | ||||
|     lfs_offset_t pos; | ||||
|  | ||||
|     struct lfs_disk_dir { | ||||
|         uint32_t rev; | ||||
| @@ -206,7 +209,7 @@ typedef struct lfs_dir { | ||||
| } lfs_dir_t; | ||||
|  | ||||
| typedef struct lfs_superblock { | ||||
|     lfs_off_t off; | ||||
|     lfs_offset_t off; | ||||
|  | ||||
|     struct lfs_disk_superblock { | ||||
|         uint8_t type; | ||||
| @@ -305,7 +308,7 @@ int lfs_dir_close(lfs_t *lfs, lfs_dir_t *dir); | ||||
| int lfs_dir_read(lfs_t *lfs, lfs_dir_t *dir, struct lfs_info *info); | ||||
|  | ||||
| /* Change the position of the directory */ | ||||
| int lfs_dir_seek(lfs_t *lfs, lfs_dir_t *dir, lfs_off_t off); | ||||
| int lfs_dir_seek(lfs_t *lfs, lfs_dir_t *dir, lfs_offset_t off); | ||||
|  | ||||
| /* Return the position of the directory */ | ||||
| lfs_soff_t lfs_dir_tell(lfs_t *lfs, lfs_dir_t *dir); | ||||
| @@ -316,6 +319,9 @@ int lfs_dir_rewind(lfs_t *lfs, lfs_dir_t *dir); | ||||
| /* Traverse through all blocks in use by the filesystem */ | ||||
| int lfs_traverse(lfs_t *lfs, int (*cb)(void *, lfs_block_t), void *data); | ||||
|  | ||||
| /* Truncates the size of the file to the specified size */ | ||||
| int lfs_file_truncate(lfs_t *lfs, lfs_file_t *file, lfs_offset_t size); | ||||
|  | ||||
| /* Prunes any recoverable errors that may have occured in the filesystem | ||||
|  * Not needed to be called by user unless an operation is interrupted | ||||
|  * but the filesystem is still mounted. This is already called on first | ||||
|   | ||||
| @@ -1,12 +1,15 @@ | ||||
| /* | ||||
|  * The little filesystem | ||||
|  * lfs util functions | ||||
|  * | ||||
|  * Copyright (c) 2017, Arm Limited. All rights reserved. | ||||
|  * SPDX-License-Identifier: BSD-3-Clause | ||||
|  */ | ||||
|  | ||||
| #include "lfs_util.h" | ||||
|  | ||||
| // Only compile if user does not provide custom config | ||||
| #ifndef LFS_CONFIG | ||||
|  | ||||
| // Software CRC implementation with small lookup table | ||||
| void lfs_crc(uint32_t *restrict crc, const void *buffer, size_t size) | ||||
| { | ||||
|     static const uint32_t rtable[16] = { | ||||
| @@ -22,3 +25,5 @@ void lfs_crc(uint32_t *restrict crc, const void *buffer, size_t size) | ||||
|         *crc = (*crc >> 4) ^ rtable[(*crc ^ (data[i] >> 4)) & 0xf]; | ||||
|     } | ||||
| } | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -68,9 +68,9 @@ int main(void) | ||||
|     openCellular_init(); | ||||
|     /* Call board init functions */ | ||||
|     Board_initGeneral(); | ||||
|     Board_initSPI(); | ||||
|     Board_initGPIO(); | ||||
|     Board_initI2C(); | ||||
|     Board_initSPI(); | ||||
|     Board_initUSB(Board_USBDEVICE); | ||||
|     Board_initUART(); | ||||
|     ethernet_start(); | ||||
|   | ||||
| @@ -16,18 +16,21 @@ | ||||
| #include "inc/common/global_header.h" | ||||
| #include "inc/utils/ocmp_util.h" | ||||
| #include "inc/utils/util.h" | ||||
| #include "src/filesystem/fs_wrapper.h" | ||||
|  | ||||
| #define OCMP_ACTION_TYPE_GET 1 | ||||
| #define OCMP_ACTION_TYPE_SET 2 | ||||
| #define OCMP_ACTION_TYPE_REPLY 3 | ||||
| #define AVAL_POS 9 | ||||
| #define LVAL_POS 7 | ||||
| #define OCMP_ACTION_TYPE_ACTIVE 4 | ||||
| #define OCMP_ACTION_TYPE_GET 1 | ||||
| #define OCMP_ACTION_TYPE_REPLY 3 | ||||
| #define OCMP_ACTION_TYPE_SET 2 | ||||
|  | ||||
| /* TODO: configurable directory (allow us to target different platforms) */ | ||||
| #include "platform/oc-sdr/schema/schema.h" | ||||
|  | ||||
| #include <ti/sysbios/BIOS.h> | ||||
|  | ||||
| #define OC_TASK_STACK_SIZE 2048 | ||||
| #define OC_TASK_STACK_SIZE 4096 | ||||
| #define OC_TASK_PRIORITY 2 | ||||
|  | ||||
| static char OC_task_stack[SUBSYSTEM_COUNT][OC_TASK_STACK_SIZE]; | ||||
| @@ -86,7 +89,8 @@ static bool _paramIsValid(const Parameter *param) | ||||
| } | ||||
|  | ||||
| void OCMP_GenerateAlert(const AlertData *alert_data, unsigned int alert_id, | ||||
|                         const void *data) | ||||
|                         const void *data, const void *lValue, | ||||
|                         OCMPActionType actionType) | ||||
| { | ||||
|     if (!alert_data) { | ||||
|         return; | ||||
| @@ -113,16 +117,24 @@ void OCMP_GenerateAlert(const AlertData *alert_data, unsigned int alert_id, | ||||
|     size_t param_size = (_paramSize(param) + 3) & ~0x03; | ||||
|  | ||||
|     OCMPMessageFrame *pMsg = create_ocmp_msg_frame( | ||||
|         alert_data->subsystem, OCMP_MSG_TYPE_ALERT, OCMP_AXN_TYPE_ACTIVE, | ||||
|         alert_data->subsystem, OCMP_MSG_TYPE_ALERT, actionType, | ||||
|         alert_data->componentId + 1, /* TODO: inconsistency indexing in host */ | ||||
|         parameters, param_size); | ||||
|     if (pMsg) { | ||||
|         memcpy(pMsg->message.ocmp_data, data, _paramSize(param)); | ||||
|         memcpy(pMsg->message.ocmp_data + LVAL_POS, lValue, _paramSize(param)); | ||||
|         memcpy(pMsg->message.ocmp_data + AVAL_POS, data, _paramSize(param)); | ||||
|         Util_enqueueMsg(bigBrotherTxMsgQueue, semBigBrotherMsg, | ||||
|                         (uint8_t *)pMsg); | ||||
|     } else { | ||||
|         LOGGER_ERROR("ERROR::Unable to allocate alert packet\n"); | ||||
|     } | ||||
|     FILESystemStruct fileSysStruct = { | ||||
|         "alertLog",          FRAME_SIZE, | ||||
|         NO_OF_ALERT_FILES,   (OCMPMessageFrame *)pMsg, | ||||
|         MAX_ALERT_FILE_SIZE, WRITE_FLAG | ||||
|     }; | ||||
|     Util_enqueueMsg(fsRxMsgQueue, semFilesysMsg, (uint8_t *)&fileSysStruct); | ||||
|     Semaphore_pend(semFSwriteMsg, BIOS_WAIT_FOREVER); | ||||
| } | ||||
|  | ||||
| static bool _handleMsgTypeCmd(OCMPMessageFrame *pMsg, const Component *comp) | ||||
| @@ -141,7 +153,7 @@ static bool _handleMsgTypeCmd(OCMPMessageFrame *pMsg, const Component *comp) | ||||
|             cmd = &dev->commands[pMsg->message.action]; | ||||
|         } | ||||
|         if (cmd && cmd->cb_cmd) { | ||||
|             cmd->cb_cmd(dev->driver_cfg, pMsg->message.ocmp_data); | ||||
|             cmd->cb_cmd(dev->driver_cfg, pMsg); | ||||
|             return true; | ||||
|         } | ||||
|     } | ||||
| @@ -233,7 +245,8 @@ static bool _handleDevStatCfg(OCMPMessageFrame *pMsg, const Component *dev, | ||||
|     } | ||||
|     return dev_handled; | ||||
| } | ||||
|  | ||||
| #pragma GCC diagnostic push | ||||
| #pragma GCC diagnostic ignored "-Wincompatible-pointer-types" | ||||
| static bool _handle_post_enable(const Component *comp, OCMPMessageFrame *pMsg) | ||||
| { | ||||
|     bool ret = false; | ||||
| @@ -248,7 +261,7 @@ static bool _handle_post_enable(const Component *comp, OCMPMessageFrame *pMsg) | ||||
|     pMsg->message.ocmp_data[0] = !(ret); // RETURN_OK =0; | ||||
|     return ret; | ||||
| } | ||||
|  | ||||
| #pragma GCC diagnostic pop | ||||
| static bool _handle_post_active(OCMPMessageFrame *pMsg, | ||||
|                                 unsigned int subsystem_id) | ||||
| { | ||||
| @@ -415,9 +428,17 @@ static void subsystem_init(OCMPSubsystem ss_id) | ||||
|                      ss_id); | ||||
|     } | ||||
|  | ||||
|     /* Create Message Queue for RX Messages */ | ||||
|     /* Create Message Queue for TX Messages */ | ||||
|     ss->msgQueue = Util_constructQueue(&ss->queueStruct); | ||||
|     if (!ss->msgQueue) { | ||||
|         LOGGER_ERROR("SS REG:ERROR:: Failed in Constructing Message Queue for " | ||||
|                      "TX Message for subsystem %d\n", | ||||
|                      ss_id); | ||||
|     } | ||||
|  | ||||
|     /* Create Message Queue for RX Messages */ | ||||
|     ss->msgRxQueue = Util_constructQueue(&ss->queueRxStruct); | ||||
|     if (!ss->msgRxQueue) { | ||||
|         LOGGER_ERROR("SS REG:ERROR:: Failed in Constructing Message Queue for " | ||||
|                      "RX Message for subsystem %d\n", | ||||
|                      ss_id); | ||||
| @@ -460,3 +481,38 @@ bool SSRegistry_sendMessage(OCMPSubsystem ss_id, void *pMsg) | ||||
|  | ||||
|     return Util_enqueueMsg(ss->msgQueue, ss->sem, (uint8_t *)pMsg); | ||||
| } | ||||
|  | ||||
| bool alert_log(void *driver, void *mSgPtr) | ||||
| { | ||||
|     // OCSubsystem *ss = (OCSubsystem*)malloc(sizeof(OCSubsystem)); | ||||
|     OCMPMessageFrame *pMsg = mSgPtr; | ||||
|     OC_SS subSysId = pMsg->message.subsystem; | ||||
|     OCSubsystem *ss = ss_reg[subSysId]; | ||||
|     bool count = false; | ||||
|     FILESystemStruct fileSysStruct = { "alertLog",          FRAME_SIZE, | ||||
|                                        NO_OF_ALERT_FILES,   pMsg, | ||||
|                                        MAX_ALERT_FILE_SIZE, READ_FLAG }; | ||||
|     Util_enqueueMsg(fsRxMsgQueue, semFilesysMsg, (uint8_t *)&fileSysStruct); | ||||
|     while (1) { | ||||
|         if (Semaphore_pend(ss->sem, BIOS_WAIT_FOREVER)) { | ||||
|             while (!Queue_empty(ss->msgRxQueue)) { | ||||
|                 pMsg = (OCMPMessageFrame *)Util_dequeueMsg(ss->msgRxQueue); | ||||
|                 if (pMsg->message.ocmp_data[0] == LAST_MSG_FLAG) { | ||||
|                     count = true; | ||||
|                     break; | ||||
|                 } | ||||
|  | ||||
|                 if (pMsg) { | ||||
|                     Util_enqueueMsg(bigBrotherTxMsgQueue, semBigBrotherMsg, | ||||
|                                     (uint8_t *)pMsg); | ||||
|                 } | ||||
|             } | ||||
|             if (count == true) { | ||||
|                 LOGGER_DEBUG("FS:: LAST msg \n"); | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
| } | ||||
|   | ||||
| @@ -26,10 +26,12 @@ typedef void (*SS_ProcessMsg_Cb)(OCMPMessageFrame *pBmsMsg); | ||||
| typedef struct OCSubsystem { | ||||
|     /* Message queue handles */ | ||||
|     Queue_Handle msgQueue; | ||||
|     Queue_Handle msgRxQueue; | ||||
|     Semaphore_Handle sem; | ||||
|  | ||||
|     /* Private variables (reduce dynamic allocation needs) */ | ||||
|     Queue_Struct queueStruct; | ||||
|     Queue_Struct queueRxStruct; | ||||
|     Semaphore_Struct semStruct; | ||||
|     Task_Struct taskStruct; | ||||
|     eSubSystemStates state; | ||||
|   | ||||
| @@ -8,6 +8,7 @@ | ||||
|  */ | ||||
|  | ||||
| #include "common/inc/global/Framework.h" | ||||
| #include <driverlib/sysctl.h> | ||||
| #include "helpers/memory.h" | ||||
| #include "inc/common/bigbrother.h" | ||||
| #include "inc/common/global_header.h" | ||||
| @@ -26,23 +27,14 @@ | ||||
| #include <xdc/std.h> | ||||
| #include <xdc/cfg/global.h> | ||||
| #include <xdc/runtime/System.h> | ||||
| #include <xdc/std.h> | ||||
|  | ||||
| #define FRAME_SIZE 64 | ||||
| #define OCFS_TASK_PRIORITY 5 | ||||
| #define OCFS_TASK_PRIORITY 1 | ||||
| #define OCFS_TASK_STACK_SIZE 4096 | ||||
|  | ||||
| Task_Struct ocFSTask; | ||||
| Char ocFSTaskStack[OCFS_TASK_STACK_SIZE]; | ||||
|  | ||||
| Semaphore_Handle semFilesysMsg; | ||||
|  | ||||
| Semaphore_Struct semFSstruct; | ||||
|  | ||||
| static Queue_Struct fsTxMsg; | ||||
|  | ||||
| Queue_Handle fsRxMsgQueue; | ||||
| Queue_Handle fsTxMsgQueue; | ||||
|  | ||||
| extern POSTData PostResult[POST_RECORDS]; | ||||
|  | ||||
| typedef enum { OC_SYS_CONF_MAC_ADDRESS = 0 } eOCConfigParamId; | ||||
| @@ -156,6 +148,16 @@ bool SYS_post_get_results(void **getpostResult) | ||||
|     return status; | ||||
| } | ||||
|  | ||||
| /***************************************************************************** | ||||
|  **    FUNCTION NAME   : sys_post_init | ||||
|  ** | ||||
|  **    DESCRIPTION     : Create the task for file system | ||||
|  ** | ||||
|  **    ARGUMENTS       : SPI driver configuration, return value | ||||
|  ** | ||||
|  **    RETURN TYPE     : bool | ||||
|  ** | ||||
|  *****************************************************************************/ | ||||
| bool sys_post_init(void *driver, void *returnValue) | ||||
| { | ||||
|     Semaphore_construct(&semFSstruct, 0, NULL); | ||||
| @@ -164,12 +166,32 @@ bool sys_post_init(void *driver, void *returnValue) | ||||
|         LOGGER_DEBUG("FS:ERROR:: Failed in Creating Semaphore"); | ||||
|         return false; | ||||
|     } | ||||
|     Semaphore_construct(&semFSreadStruct, 0, NULL); | ||||
|     semFSreadMsg = Semaphore_handle(&semFSreadStruct); | ||||
|     if (!semFSreadMsg) { | ||||
|         LOGGER_DEBUG("FS:ERROR:: Failed in Creating Semaphore"); | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     Semaphore_construct(&semFSwriteStruct, 0, NULL); | ||||
|     semFSwriteMsg = Semaphore_handle(&semFSwriteStruct); | ||||
|     if (!semFSwriteMsg) { | ||||
|         LOGGER_DEBUG("FS:ERROR:: Failed in Creating Semaphore"); | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     /* Create Message Queue for RX Messages */ | ||||
|     fsTxMsgQueue = Util_constructQueue(&fsTxMsg); | ||||
|     if (!fsTxMsgQueue) { | ||||
|         LOGGER_ERROR("FS:ERROR:: Failed in Constructing Message Queue for"); | ||||
|         return false; | ||||
|     } | ||||
|     fsRxMsgQueue = Util_constructQueue(&fsRxMsg); | ||||
|     if (!fsRxMsgQueue) { | ||||
|         LOGGER_ERROR("FS:ERROR:: Failed in Constructing Message Queue for"); | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     Task_Params taskParams; | ||||
|     Task_Params_init(&taskParams); | ||||
|     taskParams.stackSize = OCFS_TASK_STACK_SIZE; | ||||
| @@ -178,7 +200,7 @@ bool sys_post_init(void *driver, void *returnValue) | ||||
|     taskParams.priority = OCFS_TASK_PRIORITY; | ||||
|     taskParams.arg0 = (UArg)driver; | ||||
|     taskParams.arg1 = (UArg)returnValue; | ||||
|     Task_construct(&ocFSTask, fs_init, &taskParams, NULL); | ||||
|     Task_construct(&ocFSTask, fs_wrapper_fileSystem_init, &taskParams, NULL); | ||||
|     LOGGER_DEBUG("FS:INFO:: Creating filesystem task function.\n"); | ||||
|     return true; | ||||
| } | ||||
|   | ||||
| @@ -20,6 +20,8 @@ | ||||
| /* ======================== Constants & variables =========================== */ | ||||
| #define INA226_ALERT_MASK 0x8000 | ||||
| #define INA226_CAL_VALUE 0 | ||||
| #define INA226_DEFAULT_ACTION 4 | ||||
| #define INA226_DEFAULT_TEMP 600 | ||||
| #define INA226_DEVICE_ID 0x2260 | ||||
| #define INA226_INVALID_CONFIG_PARAMID 1 | ||||
| #define INA226_INVALID_DEVICE_ID 0xC802 | ||||
|   | ||||
| @@ -28,8 +28,10 @@ | ||||
| #define GPP_TEMP_SENS_DEVICE_ID 0 | ||||
| #define POST_DATA_NULL 0x0000 | ||||
| #define SE98A_CFG_EOCTL 8 | ||||
| #define SE98A_DEVICE_ID 0xA102 | ||||
| #define SE98A_DEFAULT_ACTION 4 | ||||
| #define SE98A_DEFAULT_INIT_VALUE 0 | ||||
| #define SE98A_DEFAULT_TEMP 23 | ||||
| #define SE98A_DEVICE_ID 0xA102 | ||||
| #define SE98A_EVT_DEFAULT 1 << 3 | ||||
| #define SE98A_INVALID_DEVICE_ID 0xFACE | ||||
| #define SE98A_INVALID_MFG_ID 0xABCD | ||||
|   | ||||
| @@ -126,8 +126,10 @@ static struct Test_AlertData { | ||||
|     uint16_t val; | ||||
|     void *ctx; | ||||
| } s_alert_data; | ||||
|  | ||||
| static void _ina226_alert_handler(INA226_Event evt, uint16_t value, | ||||
| #pragma GCC diagnostic push | ||||
| #pragma GCC diagnostic ignored "-Wunused-parameter" | ||||
| static void _ina226_alert_handler(INA226_Event evt, OCMPActionType alertAction, | ||||
|                                   uint16_t value, uint16_t lValue, | ||||
|                                   void *context) | ||||
| { | ||||
|     s_alert_data = (struct Test_AlertData){ | ||||
| @@ -137,7 +139,7 @@ static void _ina226_alert_handler(INA226_Event evt, uint16_t value, | ||||
|         .ctx = context, | ||||
|     }; | ||||
| } | ||||
|  | ||||
| #pragma GCC diagnostic pop | ||||
| static void _test_alert(INA226_Dev *dev, INA226_Event evt, uint16_t alert_mask, | ||||
|                         uint16_t val, uint16_t new_mask) | ||||
| { | ||||
|   | ||||
| @@ -46,24 +46,33 @@ void suite_tearDown(void) | ||||
| /* ================================ Tests =================================== */ | ||||
| void test_i2c_read(void) | ||||
| { | ||||
|     OCMPMessageFrame Msg; | ||||
|     OCMPMessageFrame *pMsg = &Msg; | ||||
|     memcpy(pMsg->message.ocmp_data, &s_oci2c, sizeof(S_OCI2C)); | ||||
|     DEBUG_I2C_regs[DEBUG_I2C_INTERRUPT_MASK] = DEBUG_I2C_READ_WRITE_VALUE; | ||||
|     TEST_ASSERT_EQUAL(true, i2c_read(&debug_I2C1, &s_oci2c)); | ||||
|     TEST_ASSERT_EQUAL(true, i2c_read(&debug_I2C1, pMsg)); | ||||
|     memcpy(&s_oci2c, pMsg->message.ocmp_data, sizeof(S_OCI2C)); | ||||
|     TEST_ASSERT_EQUAL_HEX8(DEBUG_I2C_READ_WRITE_VALUE, s_oci2c.reg_value); | ||||
|  | ||||
|     /* Invalid bus */ | ||||
|     TEST_ASSERT_EQUAL(false, i2c_read(&I2C_INVALID_DEV, &s_oci2c)); | ||||
|     TEST_ASSERT_EQUAL(false, i2c_read(&debug_I2C1, &s_oci2c_invalid)); | ||||
|     TEST_ASSERT_EQUAL(false, i2c_read(&I2C_INVALID_DEV, pMsg)); | ||||
|     memcpy(pMsg->message.ocmp_data, &s_oci2c_invalid, sizeof(S_OCI2C)); | ||||
|     TEST_ASSERT_EQUAL(false, i2c_read(&debug_I2C1, pMsg)); | ||||
| } | ||||
|  | ||||
| void test_i2c_write(void) | ||||
| { | ||||
|     OCMPMessageFrame Msg; | ||||
|     OCMPMessageFrame *pMsg = &Msg; | ||||
|     DEBUG_I2C_regs[DEBUG_I2C_INTERRUPT_MASK] = DEBUG_I2C_DEFAULT_VALUE; | ||||
|     s_oci2c.reg_value = DEBUG_I2C_READ_WRITE_VALUE; | ||||
|     TEST_ASSERT_EQUAL(true, i2c_write(&debug_I2C1, &s_oci2c)); | ||||
|     memcpy(pMsg->message.ocmp_data, &s_oci2c, sizeof(S_OCI2C)); | ||||
|     TEST_ASSERT_EQUAL(true, i2c_write(&debug_I2C1, pMsg)); | ||||
|     TEST_ASSERT_EQUAL_HEX8(DEBUG_I2C_READ_WRITE_VALUE, | ||||
|                            DEBUG_I2C_regs[DEBUG_I2C_INTERRUPT_MASK]); | ||||
|  | ||||
|     /* Invalid bus */ | ||||
|     TEST_ASSERT_EQUAL(false, i2c_write(&I2C_INVALID_DEV, &s_oci2c)); | ||||
|     TEST_ASSERT_EQUAL(false, i2c_write(&debug_I2C1, &s_oci2c_invalid)); | ||||
|     TEST_ASSERT_EQUAL(false, i2c_write(&I2C_INVALID_DEV, pMsg)); | ||||
|     memcpy(pMsg->message.ocmp_data, &s_oci2c_invalid, sizeof(S_OCI2C)); | ||||
|     TEST_ASSERT_EQUAL(false, i2c_write(&debug_I2C1, pMsg)); | ||||
| } | ||||
|   | ||||
| @@ -62,56 +62,63 @@ void suite_tearDown(void) | ||||
| /* ================================ Tests =================================== */ | ||||
| void test_ocgpio_get(void) | ||||
| { | ||||
|     OCMPMessageFrame Msg; | ||||
|     OCMPMessageFrame *pMsg = &Msg; | ||||
|     S_OCGPIO *s_oc_gpio = (S_OCGPIO *)&s_fake_pin; | ||||
|     s_oc_gpio->pin = DEBUG_GPIO_PIN_VALUE; | ||||
|     s_oc_gpio->value = DEBUG_GPIO_DEFAULT_VALUE; | ||||
|  | ||||
|     memcpy(pMsg->message.ocmp_data, &s_fake_pin, sizeof(S_OCGPIO)); | ||||
|     PCA9557_regs[PCA9557_REGS_INPUT_VALUE] = DEBUG_GPIO_PIN_2; | ||||
|     SX1509_regs[SX1509_REG_DATA_B] = DEBUG_GPIO_SX1509_DATA_B_VALUE; | ||||
|     SX1509_regs[SX1509_REG_DATA_A] = DEBUG_GPIO_SX1509_DATA_A_VALUE; | ||||
|     DEBUG_GpioPins[DEBUG_GPIO_PIN_2] = OCGPIO_CFG_OUTPUT; | ||||
|     /* Native Pin */ | ||||
|     TEST_ASSERT_EQUAL(true, ocgpio_get(&debug_ec_gpio_pa, &s_fake_pin)); | ||||
|     TEST_ASSERT_EQUAL(true, ocgpio_get(&debug_ec_gpio_pa, pMsg)); | ||||
|     memcpy(&s_fake_pin, pMsg->message.ocmp_data, sizeof(S_OCGPIO)); | ||||
|     TEST_ASSERT_EQUAL(DEBUG_GPIO_PIN_VALUE, s_oc_gpio->value); | ||||
|  | ||||
|     /* connected via SX1509 */ | ||||
|     TEST_ASSERT_EQUAL(true, ocgpio_get(&debug_gbc_ioexpanderx70, &s_fake_pin)); | ||||
|     TEST_ASSERT_EQUAL(true, ocgpio_get(&debug_gbc_ioexpanderx70, pMsg)); | ||||
|     TEST_ASSERT_EQUAL(DEBUG_GPIO_PIN_VALUE, s_oc_gpio->value); | ||||
|  | ||||
|     /* connected via PCA9557 */ | ||||
|     TEST_ASSERT_EQUAL(true, ocgpio_get(&debug_sdr_ioexpanderx1E, &s_fake_pin)); | ||||
|     TEST_ASSERT_EQUAL(true, ocgpio_get(&debug_sdr_ioexpanderx1E, pMsg)); | ||||
|     TEST_ASSERT_EQUAL(DEBUG_GPIO_PIN_VALUE, s_oc_gpio->value); | ||||
|  | ||||
|     /* Invlaid Slave address */ | ||||
|     TEST_ASSERT_EQUAL( | ||||
|         false, ocgpio_get(&debug_sdr_ioexpanderx1E_invalid, &s_fake_pin)); | ||||
|     TEST_ASSERT_EQUAL(false, | ||||
|                       ocgpio_get(&debug_sdr_ioexpanderx1E_invalid, pMsg)); | ||||
| } | ||||
| void test_ocgpio_set(void) | ||||
| { | ||||
|     OCMPMessageFrame Msg; | ||||
|     OCMPMessageFrame *pMsg = &Msg; | ||||
|     S_OCGPIO *s_oc_gpio = (S_OCGPIO *)&s_fake_pin; | ||||
|     s_oc_gpio->pin = DEBUG_GPIO_PIN_2; | ||||
|     s_oc_gpio->value = DEBUG_GPIO_DEFAULT_VALUE; | ||||
|     memcpy(pMsg->message.ocmp_data, &s_fake_pin, sizeof(S_OCGPIO)); | ||||
|  | ||||
|     PCA9557_regs[PCA9557_REGS_OUTPUT_VALUE] = DEBUG_GPIO_DEFAULT_VALUE; | ||||
|     SX1509_regs[SX1509_REG_DATA_B] = DEBUG_GPIO_DEFAULT_VALUE; | ||||
|     SX1509_regs[SX1509_REG_DATA_A] = DEBUG_GPIO_DEFAULT_VALUE; | ||||
|     DEBUG_GpioPins[DEBUG_GPIO_PIN_2] = OCGPIO_CFG_INPUT; | ||||
|     /* Native Pin */ | ||||
|     TEST_ASSERT_EQUAL(true, ocgpio_set(&debug_ec_gpio_pa, &s_fake_pin)); | ||||
|     TEST_ASSERT_EQUAL(true, ocgpio_set(&debug_ec_gpio_pa, pMsg)); | ||||
|     TEST_ASSERT_EQUAL(OCGPIO_CFG_OUTPUT, DEBUG_GpioPins[DEBUG_GPIO_PIN_2]); | ||||
|  | ||||
|     /* connected via SX1509 */ | ||||
|     TEST_ASSERT_EQUAL(true, ocgpio_set(&debug_gbc_ioexpanderx70, &s_fake_pin)); | ||||
|     TEST_ASSERT_EQUAL(true, ocgpio_set(&debug_gbc_ioexpanderx70, pMsg)); | ||||
|     TEST_ASSERT_EQUAL(DEBUG_GPIO_DEFAULT_VALUE, SX1509_regs[SX1509_REG_DATA_A]); | ||||
|  | ||||
|     /* connected via PCA9557 */ | ||||
|     TEST_ASSERT_EQUAL(true, ocgpio_set(&debug_sdr_ioexpanderx1E, &s_fake_pin)); | ||||
|     TEST_ASSERT_EQUAL(true, ocgpio_set(&debug_sdr_ioexpanderx1E, pMsg)); | ||||
|     TEST_ASSERT_EQUAL(DEBUG_GPIO_DEFAULT_VALUE, | ||||
|                       PCA9557_regs[PCA9557_REGS_OUTPUT_VALUE]); | ||||
|  | ||||
|     /* Invlaid Slave address */ | ||||
|     TEST_ASSERT_EQUAL( | ||||
|         false, ocgpio_set(&debug_sdr_ioexpanderx1E_invalid, &s_fake_pin)); | ||||
|     TEST_ASSERT_EQUAL(false, | ||||
|                       ocgpio_set(&debug_sdr_ioexpanderx1E_invalid, pMsg)); | ||||
| } | ||||
| void test_ocgpio_probe(void) | ||||
| { | ||||
|   | ||||
| @@ -47,7 +47,8 @@ void suite_tearDown(void) | ||||
| #pragma GCC diagnostic push | ||||
| #pragma GCC diagnostic ignored "-Wunused-parameter" | ||||
| void OCMP_GenerateAlert(const AlertData *alert_data, unsigned int alert_id, | ||||
|                         const void *data) | ||||
|                         const void *data, const void *lValue, | ||||
|                         OCMPActionType actionType) | ||||
| { | ||||
| } | ||||
| #pragma GCC diagnostic pop | ||||
| @@ -307,14 +308,22 @@ void test_ocmp_ina226_alert_handler(void) | ||||
|                       INA226_fxnTable.cb_init(&sdr_fpga_ps, &fact_sdr_3v_ps_cfg, | ||||
|                                               alert_data_cp)); | ||||
|  | ||||
|     sdr_fpga_ps.obj.alert_cb(INA226_EVT_SOL, value, alert_data_cp); | ||||
|     sdr_fpga_ps.obj.alert_cb(INA226_EVT_SUL, value, alert_data_cp); | ||||
|     sdr_fpga_ps.obj.alert_cb(INA226_EVT_BOL, value, alert_data_cp); | ||||
|     sdr_fpga_ps.obj.alert_cb(INA226_EVT_BUL, value, alert_data_cp); | ||||
|     sdr_fpga_ps.obj.alert_cb(INA226_EVT_POL, value, alert_data_cp); | ||||
|     sdr_fpga_ps.obj.alert_cb(INA226_EVT_COL, value, alert_data_cp); | ||||
|     sdr_fpga_ps.obj.alert_cb(INA226_EVT_CUL, value, alert_data_cp); | ||||
|     sdr_fpga_ps.obj.alert_cb(INA226_EVT_SOL, INA226_DEFAULT_ACTION, | ||||
|                              INA226_DEFAULT_TEMP, value, alert_data_cp); | ||||
|     sdr_fpga_ps.obj.alert_cb(INA226_EVT_SUL, INA226_DEFAULT_ACTION, | ||||
|                              INA226_DEFAULT_TEMP, value, alert_data_cp); | ||||
|     sdr_fpga_ps.obj.alert_cb(INA226_EVT_BOL, INA226_DEFAULT_ACTION, | ||||
|                              INA226_DEFAULT_TEMP, value, alert_data_cp); | ||||
|     sdr_fpga_ps.obj.alert_cb(INA226_EVT_BUL, INA226_DEFAULT_ACTION, | ||||
|                              INA226_DEFAULT_TEMP, value, alert_data_cp); | ||||
|     sdr_fpga_ps.obj.alert_cb(INA226_EVT_POL, INA226_DEFAULT_ACTION, | ||||
|                              INA226_DEFAULT_TEMP, value, alert_data_cp); | ||||
|     sdr_fpga_ps.obj.alert_cb(INA226_EVT_COL, INA226_DEFAULT_ACTION, | ||||
|                              INA226_DEFAULT_TEMP, value, alert_data_cp); | ||||
|     sdr_fpga_ps.obj.alert_cb(INA226_EVT_CUL, INA226_DEFAULT_ACTION, | ||||
|                              INA226_DEFAULT_TEMP, value, alert_data_cp); | ||||
|  | ||||
|     /* Test for memory check */ | ||||
|     sdr_fpga_ps.obj.alert_cb(INA226_EVT_COL, value, NULL); | ||||
|     sdr_fpga_ps.obj.alert_cb(INA226_EVT_COL, INA226_DEFAULT_ACTION, | ||||
|                              INA226_DEFAULT_TEMP, value, NULL); | ||||
| } | ||||
|   | ||||
| @@ -63,7 +63,8 @@ void suite_tearDown(void) | ||||
| #pragma GCC diagnostic push | ||||
| #pragma GCC diagnostic ignored "-Wunused-parameter" | ||||
| void OCMP_GenerateAlert(const AlertData *alert_data, unsigned int alert_id, | ||||
|                         const void *data) | ||||
|                         const void *data, const void *lValue, | ||||
|                         OCMPActionType actionType) | ||||
| { | ||||
| } | ||||
| #pragma GCC diagnostic pop | ||||
|   | ||||
| @@ -180,9 +180,9 @@ void suite_tearDown(void) | ||||
| #pragma GCC diagnostic push | ||||
| #pragma GCC diagnostic ignored "-Wunused-parameter" | ||||
| void OCMP_GenerateAlert(const AlertData *alert_data, unsigned int alert_id, | ||||
|                         const void *data) | ||||
|                         const void *data, const void *lValue, | ||||
|                         OCMPActionType actionType) | ||||
| { | ||||
|     return; | ||||
| } | ||||
| #pragma GCC diagnostic pop | ||||
|  | ||||
|   | ||||
| @@ -31,7 +31,8 @@ void test_alert(void) | ||||
| #pragma GCC diagnostic push | ||||
| #pragma GCC diagnostic ignored "-Wunused-parameter" | ||||
| void OCMP_GenerateAlert(const AlertData *alert_data, unsigned int alert_id, | ||||
|                         const void *data) | ||||
|                         const void *data, const void *lValue, | ||||
|                         OCMPActionType actionType) | ||||
| { | ||||
| } | ||||
| #pragma GCC diagnostic pop | ||||
|   | ||||
| @@ -42,7 +42,8 @@ void test_alert(void) | ||||
| #pragma GCC diagnostic push | ||||
| #pragma GCC diagnostic ignored "-Wunused-parameter" | ||||
| void OCMP_GenerateAlert(const AlertData *alert_data, unsigned int alert_id, | ||||
|                         const void *data) | ||||
|                         const void *data, const void *lValue, | ||||
|                         OCMPActionType actionType) | ||||
| { | ||||
| } | ||||
| #pragma GCC diagnostic pop | ||||
|   | ||||
| @@ -62,7 +62,8 @@ void suite_tearDown(void) | ||||
| #pragma GCC diagnostic push | ||||
| #pragma GCC diagnostic ignored "-Wunused-parameter" | ||||
| void OCMP_GenerateAlert(const AlertData *alert_data, unsigned int alert_id, | ||||
|                         const void *data) | ||||
|                         const void *data, const void *lValue, | ||||
|                         OCMPActionType actionType) | ||||
| { | ||||
| } | ||||
| #pragma GCC diagnostic pop | ||||
| @@ -502,13 +503,18 @@ void test_ocmp_se98a_alert_handler(void) | ||||
|                                             &fact_ap_se98a_ts1_cfg, | ||||
|                                             &alert_data)); | ||||
|  | ||||
|     gbc_gpp_ap_ts1.obj.alert_cb(SE98A_EVT_ACT, value, &alert_data); | ||||
|     gbc_gpp_ap_ts1.obj.alert_cb(SE98A_EVT_AAW, value, &alert_data); | ||||
|     gbc_gpp_ap_ts1.obj.alert_cb(SE98A_EVT_BAW, value, &alert_data); | ||||
|     gbc_gpp_ap_ts1.obj.alert_cb(SE98A_EVT_ACT, SE98A_DEFAULT_ACTION, | ||||
|                                 SE98A_DEFAULT_TEMP, value, &alert_data); | ||||
|     gbc_gpp_ap_ts1.obj.alert_cb(SE98A_EVT_AAW, SE98A_DEFAULT_ACTION, | ||||
|                                 SE98A_DEFAULT_TEMP, value, &alert_data); | ||||
|     gbc_gpp_ap_ts1.obj.alert_cb(SE98A_EVT_BAW, SE98A_DEFAULT_ACTION, | ||||
|                                 SE98A_DEFAULT_TEMP, value, &alert_data); | ||||
|  | ||||
|     /* Test for memory check */ | ||||
|     gbc_gpp_ap_ts1.obj.alert_cb(SE98A_EVT_ACT, value, NULL); | ||||
|     gbc_gpp_ap_ts1.obj.alert_cb(SE98A_EVT_ACT, SE98A_DEFAULT_ACTION, | ||||
|                                 SE98A_DEFAULT_TEMP, value, NULL); | ||||
|  | ||||
|     /* Default case test */ | ||||
|     gbc_gpp_ap_ts1.obj.alert_cb(SE98A_EVT_DEFAULT, value, &alert_data); | ||||
|     gbc_gpp_ap_ts1.obj.alert_cb(SE98A_EVT_DEFAULT, SE98A_DEFAULT_ACTION, | ||||
|                                 SE98A_DEFAULT_TEMP, value, &alert_data); | ||||
| } | ||||
|   | ||||
| @@ -133,8 +133,10 @@ static struct Test_AlertData { | ||||
|     int8_t temp; | ||||
|     void *ctx; | ||||
| } s_alert_data; | ||||
|  | ||||
| static void alert_handler(SE98A_Event evt, int8_t temperature, void *context) | ||||
| #pragma GCC diagnostic push | ||||
| #pragma GCC diagnostic ignored "-Wunused-parameter" | ||||
| static void alert_handler(SE98A_Event evt, OCMPActionType alertAction, | ||||
|                           int8_t temperature, int8_t lValue, void *context) | ||||
| { | ||||
|     s_alert_data = (struct Test_AlertData){ | ||||
|         .triggered = true, | ||||
| @@ -143,7 +145,7 @@ static void alert_handler(SE98A_Event evt, int8_t temperature, void *context) | ||||
|         .ctx = context, | ||||
|     }; | ||||
| } | ||||
|  | ||||
| #pragma GCC diagnostic pop | ||||
| /* Helper for testing the various alerts this device can create */ | ||||
| static void _test_alert(SE98A_Dev *dev, uint16_t temp_reg, SE98A_Event exp_evt, | ||||
|                         int8_t exp_temp) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 swateeshrivastava
					swateeshrivastava