142 lines
4.5 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* SPDX-License-Identifier: GPL-2.0+ */
#ifndef __AW_BIN_PARSE_H__
#define __AW_BIN_PARSE_H__
#include "aw_device.h"
#define NULL ((void *)0)
#define GET_32_DATA(w, x, y, z) ((unsigned int)((((uint8_t)w) << 24) | (((uint8_t)x) << 16) | (((uint8_t)y) << 8) | ((uint8_t)z)))
#define BIN_NUM_MAX 100
#define HEADER_LEN 60
/*********************************************************
*
* header information
*
********************************************************/
enum return_enum {
BIN_HEADER_VER_ERR = 1,
BIN_DATA_TYPE_ERR = 2,
BIN_DATA_LEN_ERR = 3,
DATA_VER_ERR = 4,
REG_NUM_ERR = 5,
DSP_REG_NUM_ERR = 6,
SOC_APP_NUM_ERR = 7,
BIN_IS_NULL = 8,
};
enum bin_header_version_enum {
HEADER_VERSION_1_0_0 = 0x01000000,
};
enum data_type_enum {
DATA_TYPE_REGISTER = 0x00000000,
DATA_TYPE_DSP_REG = 0x00000010,
DATA_TYPE_DSP_CFG = 0x00000011,
DATA_TYPE_SOC_REG = 0x00000020,
DATA_TYPE_SOC_APP = 0x00000021,
DATA_TYPE_DSP_FW = DATA_TYPE_SOC_APP,
DATA_TYPE_MULTI_BINS = 0x00002000,
};
/**
* @DATA_VERSION_V1default little edian
*/
enum data_version_enum {
DATA_VERSION_V1 = 0X00000001,
DATA_VERSION_MAX,
};
/**
* @header_len: Frame header length
* @check_sum: Frame header information-Checksum
* @header_ver: Frame header information-Frame header version
* @bin_data_type: Frame header information-Data type
* @bin_data_ver: Frame header information-Data version
* @bin_data_len: Frame header information-Data length
* @ui_ver: Frame header information-ui version
* @chip_type[8]: Frame header information-chip type
* @reg_byte_len: Frame header information-reg byte len
* @data_byte_len: Frame header information-data byte len
* @device_addr: Frame header information-device addr
* @valid_data_len: Length of valid data obtained after parsing
* @valid_data_addr: The offset address of the valid data obtained
* after parsing relative to info
* @reg_num: The number of registers obtained after parsing
* @reg_data_byte_len: The byte length of the register obtained after parsing
* @download_addr: The starting address or download address obtained
* after parsing
* @app_version: The software version number obtained after parsing
*/
struct bin_header_info {
unsigned int header_len;
unsigned int check_sum;
unsigned int header_ver;
unsigned int bin_data_type;
unsigned int bin_data_ver;
unsigned int bin_data_len;
unsigned int ui_ver;
unsigned char chip_type[8];
unsigned int reg_byte_len;
unsigned int data_byte_len;
unsigned int device_addr;
unsigned int valid_data_len;
unsigned int valid_data_addr;
unsigned int reg_num;
unsigned int reg_data_byte_len;
unsigned int download_addr;
unsigned int app_version;
};
/************************************************************
*
* function define
*
************************************************************/
/**
* @len: The size of the bin file obtained from the firmware
* @data[]: Store the bin file obtained from the firmware
*/
struct bin_container {
unsigned int len;
unsigned char data[];
};
/**
* @p_addr: Offset pointer (backward offset pointer to obtain frame header
* information and important information)
* @all_bin_parse_num: The number of all bin files
* @multi_bin_parse_num: The number of single bin files
* @single_bin_parse_num: The number of multiple bin files
* @header_info[BIN_NUM_MAX]: Frame header information and other important data
* obtained after parsing
* @info: Obtained bin file data that needs to be parsed
*/
struct aw_bin {
unsigned char *p_addr;
unsigned int all_bin_parse_num;
unsigned int multi_bin_parse_num;
unsigned int single_bin_parse_num;
struct bin_header_info header_info[BIN_NUM_MAX];
struct bin_container info;
};
int aw_parsing_bin_file(struct aw_bin *bin);
int aw_parse_bin_header_1_0_0(struct aw_bin *bin);
/*******************awinic audio parse acf***********************/
int aw_dev_dsp_data_order(struct aw_device *aw_dev,
uint8_t *data, uint32_t data_len);
int aw_dev_get_prof_data(struct aw_device *aw_dev, int index,
struct aw_prof_desc **prof_desc);
char *aw_dev_get_prof_name(struct aw_device *aw_dev, int index);
int aw_dev_set_profile_index(struct aw_device *aw_dev, int index);
int aw_dev_get_profile_index(struct aw_device *aw_dev);
int aw_dev_check_profile_index(struct aw_device *aw_dev, int index);
int aw_dev_get_profile_count(struct aw_device *aw_dev);
int aw_dev_cfg_load(struct aw_device *aw_dev, struct aw_container *aw_cfg);
int aw_dev_load_acf_check(struct aw_container *aw_cfg);
#endif