/* * Copyright (C) 2014-2020 NXP Semiconductors, All Rights Reserved. * Copyright 2020 GOODIX, All Rights Reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * */ #ifndef TFA98XXPARAMETERS_H_ #define TFA98XXPARAMETERS_H_ #ifdef __KERNEL__ #include #else #include #endif #include "tfa_service.h" #if (defined(WIN32) || defined(_X64)) /* These warnings are disabled * because it is only given by Windows and there is no easy fix */ #pragma warning(disable:4200) #pragma warning(disable:4214) #endif /* * profiles & volumesteps * */ #define TFA_MAX_PROFILES (64) #define TFA_MAX_VSTEPS (64) #define TFA_MAX_VSTEP_MSG_MARKER (100) /* This marker is used to indicate * if all msgs need to be written to the device */ #define TFA_MAX_MSGS (10) /* * the pack pragma is required to make that the size in memory * matches the actual variable lenghts * This is to assure that the binary files can be transported between * different platforms. */ #pragma pack(push, 1) /* * typedef for 24 bit value using 3 bytes */ struct uint24 { uint8_t b[3]; }; /* * the generic header * all char types are in ASCII */ struct tfa_header { uint16_t id; char version[2]; /* "V_" : V=version, vv=subversion */ char subversion[2]; /* "vv" : vv=subversion */ uint16_t size; /* data size in bytes following CRC */ uint32_t crc; /* 32-bits CRC for following data */ char customer[8]; /* "name of customer" */ char application[8]; /* "application name" */ char type[8]; /* "application type name" */ }; enum tfa_sample_rate { FS_8K, /* 8kHz */ FS_11K025, /* 11.025kHz */ FS_12K, /* 12kHz */ FS_16K, /* 16kHz */ FS_22K05, /* 22.05kHz */ FS_24K, /* 24kHz */ FS_32K, /* 32kHz */ FS_44K1, /* 44.1kHz */ FS_48K, /* 48kHz */ FS_96K, /* 96kHz */ FS_COUNT /* last item */ }; /* Keep in sync with enum tfa_sample_rate! */ static const int tfa_samplerate_hz[FS_COUNT] = { 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 96000 }; /* * coolflux direct memory access */ struct tfa_dsp_mem { uint8_t type; /* 0--3: p, x, y, iomem */ uint16_t address; /* target address */ uint8_t size; /* data size in words */ int words[]; /* payload in signed 32bit integer (two's complement) */ }; /* * the biquad coefficients for the API together with index in filter * the biquad_index is the actual index in the equalizer +1 */ #define BIQUAD_COEFF_SIZE 6 /* * Output fixed point coeffs structure */ struct tfa_biquad { int a2; int a1; int b2; int b1; int b0; }; struct tfa_biquad_old { uint8_t bytes[BIQUAD_COEFF_SIZE * sizeof(struct uint24)]; }; struct tfa_biquad_float { float headroom; float b0; float b1; float b2; float a1; float a2; }; /* * EQ filter definitions * Note: This is not in line with smartstudio (JV: 12/12/2016) */ enum tfa_filter_type { f_custom, /* User defined biquad coefficients */ f_flat, /* Vary only gain */ f_lowpass, /* 2nd order Butterworth low pass */ f_highpass, /* 2nd order Butterworth high pass */ f_lowshelf, f_highshelf, f_notch, f_peak, f_bandpass, f_1st_lp, f_1st_hp, f_elliptic }; /* * filter parameters for biquad (re-)calculation */ struct tfa_filter { struct tfa_biquad_old biquad; uint8_t enabled; uint8_t type; /* (== enum FilterTypes, assure 8bits length) */ float frequency; float Q; float gain; }; /* 8 * float + int32 + byte == 37 */ /* * biquad params for calculation */ #define TFA_BQ_EQ_INDEX 0 #define TFA_BQ_ANTI_ALIAS_INDEX 10 #define TFA_BQ_INTEGRATOR_INDEX 13 /* * Loudspeaker Compensation filter definitions */ struct tfa_ls_compensation_filter { struct tfa_biquad biquad; uint8_t ls_comp_on; /* Loudspeaker compensation on/off */ uint8_t bw_ext_on; /* Bandwidth extension on/off */ float f_res; /* [Hz] speaker resonance frequency */ float Qt; /* speaker resonance Q-factor */ float f_bw_ext; /* [Hz] Band width extension frequency */ float sampling_freq; /* [Hz] Sampling frequency */ }; /* * Anti Aliasing Elliptic filter definitions */ struct tfa_anti_alias_filter { struct tfa_biquad biquad; /* Output results fixed point coeffs */ uint8_t enabled; float cut_off_freq; /* cut off frequency */ float sampling_freq; /* sampling frequency */ float ripple_db; /* range: [0.1 3.0] */ float rolloff; /* range: [-1.0 1.0] */ }; /* * Integrator filter input definitions */ struct tfa_integrator_filter { struct tfa_biquad biquad; /* Output results fixed point coeffs */ uint8_t type; /* Butterworth filter type: high or low pass */ float cut_off_freq; /* cut off frequency in Hz: [100.0 4000.0] */ float sampling_freq; /* sampling frequency in Hz */ float leakage; /* leakage factor; range [0.0 1.0] */ }; struct tfa_eq_filter { struct tfa_biquad biquad; uint8_t enabled; uint8_t type; /* (== enum FilterTypes, assure 8bits length) */ float cut_off_freq; /* cut off frequency in [100, 4000] */ float sampling_freq; /* sampling frequency */ float Q; /* range: [0.5 5.0] */ float gain_db; /* range: [-10.0 10.0] */ }; /* 8 * float + int32 + byte == 37 */ struct tfa_cont_anti_alias { int8_t index; /* index - destination type; anti-alias,integrator,eq */ uint8_t type; float cut_off_freq; /* cut off frequency */ float sampling_freq; float ripple_db; /* integrator leakage */ float rolloff; uint8_t bytes[5*3]; /* payload 5*24buts coeffs */ }; struct tfa_cont_integrator { int8_t index; /* index - destination type; anti-alias,integrator,eq */ uint8_t type; float cut_off_freq; /* cut off frequency */ float sampling_freq; float leakage; /* integrator leakage */ float reserved; uint8_t bytes[5*3]; /* payload 5*24buts coeffs */ }; struct tfa_cont_eq { int8_t index; uint8_t type; /* (== enum FilterTypes, assure 8bits length) */ float cut_off_freq; /* cut off frequency in [100, 4000] */ float sampling_freq; /* sampling frequency */ float Q; /* range: [0.5 5.0] */ float gain_db; /* range: [-10.0 10.0] */ uint8_t bytes[5*3]; /* payload 5*24buts coeffs */ }; /* 8 * float + int32 + byte == 37 */ union tfa_cont_biquad { struct tfa_cont_eq eq; struct tfa_cont_anti_alias aa; struct tfa_cont_integrator in; }; #define TFA_BQ_EQ_INDEX 0 #define TFA_BQ_ANTI_ALIAS_INDEX 10 #define TFA_BQ_INTEGRATOR_INDEX 13 #define TFA98XX_MAX_EQ 10 struct tfa_equalizer { struct tfa_filter filter[TFA98XX_MAX_EQ]; /* note: API index counts from 1..10 */ }; /* * files */ #define HDR(c1, c2) (c2<<8|c1) /* little endian */ enum tfa_header_type { params_hdr = HDR('P', 'M'), /* containter file */ volstep_hdr = HDR('V', 'P'), patch_hdr = HDR('P', 'A'), speaker_hdr = HDR('S', 'P'), preset_hdr = HDR('P', 'R'), config_hdr = HDR('C', 'O'), equalizer_hdr = HDR('E', 'Q'), drc_hdr = HDR('D', 'R'), msg_hdr = HDR('M', 'G'), /* generic message */ info_hdr = HDR('I', 'N') }; /* * equalizer file */ #define TFA_EQ_VERSION '1' #define TFA_EQ_SUBVERSION "00" struct tfa_equalizer_file { struct tfa_header hdr; uint8_t samplerate; /* ==enum samplerates, assure 8 bits */ struct tfa_filter filter[TFA98XX_MAX_EQ]; /* note: API index counts from 1..10 */ }; /* * patch file */ #define TFA_PA_VERSION '1' #define TFA_PA_SUBVERSION "00" struct tfa_patch_file { struct tfa_header hdr; uint8_t data[]; }; /* * generic message file * the payload of this file includes opcode and is send straight to the DSP */ #define TFA_MG_VERSION '3' #define TFA_MG_SUBVERSION "00" struct tfa_msg_file { struct tfa_header hdr; uint8_t data[]; }; /* * NOTE the tfa98xx API defines the enum tfa98xx_config_type that defines * the subtypes as decribes below. * tfa98xx_dsp_config_parameter_type() can be used to get the * supported type for the active device.. */ /* * config file V1 sub 1 */ #define TFA_CO_VERSION '1' #define TFA_CO3_VERSION '3' #define TFA_CO_SUBVERSION1 "01" struct tfa_config_s1_file { struct tfa_header hdr; uint8_t data[55*3]; }; /* * config file V1 sub 2 */ #define TFA_CO_SUBVERSION2 "02" struct tfa_config_s2_file { struct tfa_header hdr; uint8_t data[67*3]; }; /* * config file V1 sub 3 */ #define TFA_CO_SUBVERSION3 "03" struct tfa_config_s3_file { struct tfa_header hdr; uint8_t data[67*3]; }; /* * config file V1.0 */ #define TFA_CO_SUBVERSION "00" struct tfa_config_file { struct tfa_header hdr; uint8_t data[]; }; /* * preset file */ #define TFA_PR_VERSION '1' #define TFA_PR_SUBVERSION "00" struct tfa_preset_file { struct tfa_header hdr; uint8_t data[]; }; /* * drc file */ #define TFA_DR_VERSION '1' #define TFA_DR_SUBVERSION "00" struct tfa_drc_file { struct tfa_header hdr; uint8_t data[]; }; /* * drc file * for tfa 2 there is also a xml-version */ #define TFA_DR3_VERSION '3' #define TFA_DR3_SUBVERSION "00" struct tfa_drc_file2 { struct tfa_header hdr; uint8_t version[3]; uint8_t data[]; }; /* * volume step structures */ /* VP01 */ #define TFA_VP1_VERSION '1' #define TFA_VP1_SUBVERSION "01" struct tfa_volume_step1 { float attenuation; /* IEEE single float */ uint8_t preset[TFA98XX_PRESET_LENGTH]; }; /* VP02 */ #define TFA_VP2_VERSION '2' #define TFA_VP2_SUBVERSION "01" struct tfa_volume_step2 { float attenuation; /* IEEE single float */ uint8_t preset[TFA98XX_PRESET_LENGTH]; struct tfa_filter filter[TFA98XX_MAX_EQ]; /* note: API index counts from 1..10 */ }; /* * volumestep file */ #define TFA_VP_VERSION '1' #define TFA_VP_SUBVERSION "00" struct tfa_volume_step_file { struct tfa_header hdr; uint8_t vsteps; /* can also be calulated from size+type */ uint8_t samplerate; /* ==enum samplerates, assure 8 bits */ uint8_t payload; /* start of contents: N times volsteps */ }; /* * volumestep2 file */ struct tfa_volume_step2_file { struct tfa_header hdr; uint8_t vsteps; /* can also be calulated from size+type */ uint8_t samplerate; /* ==enum samplerates, assure 8 bits */ struct tfa_volume_step2 vstep[]; /* start of variable length contents:N times volsteps */ }; /* * volumestepMax2 file */ struct tfa_volume_step_max2_file { struct tfa_header hdr; uint8_t version[3]; uint8_t nr_of_vsteps; uint8_t vsteps_bin[]; }; /* * volumestepMax2 file * This volumestep should ONLY be used for the use of bin2hdr! * This can only be used to find the messagetype of the vstep (without header) */ struct tfa_volume_step_max2_1_file { uint8_t version[3]; uint8_t nr_of_vsteps; uint8_t vsteps_bin[]; }; struct tfa_volume_step_register_info { uint8_t nr_of_registers; uint16_t register_info[]; }; struct tfa_volume_step_message_info { uint8_t nr_of_messages; uint8_t message_type; struct uint24 message_length; uint8_t cmd_id[3]; uint8_t parameter_data[]; }; /**************************old v2 *****************************************/ /* * subv 00 volumestep file */ struct tfa_old_header { uint16_t id; char version[2]; /* "V_" : V=version, vv=subversion */ char subversion[2]; /* "vv" : vv=subversion */ uint16_t size; /* data size in bytes following CRC */ uint32_t crc; /* 32-bits CRC for following data */ }; struct tfa_old_filter { double bq[5]; int32_t type; double frequency; double Q; double gain; uint8_t enabled; }; /* 8 * float + int32 + byte == 37 */ struct tfa_old_volume_step2 { float attenuation; /* IEEE single float */ uint8_t preset[TFA98XX_PRESET_LENGTH]; struct tfa_old_filter eq[10]; }; struct tfa_old_volume_step2_file { struct tfa_old_header hdr; struct tfa_old_volume_step2 step[]; }; /******************** end old v2 ************************************/ /* * speaker file header */ struct tfa_spk_header { struct tfa_header hdr; char name[8]; /* speaker nick name (e.g. "dumbo") */ char vendor[16]; char type[8]; /* dimensions (mm) */ uint8_t height; uint8_t width; uint8_t depth; uint16_t ohm; }; /* * speaker file */ #define TFA_SP_VERSION '1' #define TFA_SP_SUBVERSION "00" struct tfa_speaker_file { struct tfa_header hdr; char name[8]; /* speaker nick name (e.g. "dumbo") */ char vendor[16]; char type[8]; /* dimensions (mm) */ uint8_t height; uint8_t width; uint8_t depth; uint8_t ohm_primary; uint8_t ohm_secondary; uint8_t data[]; /* payload TFA98XX_SPEAKERPARAMETER_LENGTH */ }; #define TFA_VP3_VERSION '3' #define TFA_VP3_SUBVERSION "00" struct tfa_fw_ver { uint8_t major; uint8_t minor; uint8_t minor_update:6; uint8_t update:2; }; struct tfa_fw_msg { struct tfa_fw_ver fw_version; struct tfa_msg payload; }; struct tfa_livedata { char name[25]; char addrs[25]; int tracker; int scalefactor; }; #define TFA_SP3_VERSION '3' #define TFA_SP3_SUBVERSION "00" struct tfa_speaker_file_max2 { struct tfa_header hdr; char name[8]; /* speaker nick name (e.g. "dumbo") */ char vendor[16]; char type[8]; /* dimensions (mm) */ uint8_t height; uint8_t width; uint8_t depth; uint8_t ohm_primary; uint8_t ohm_secondary; struct tfa_fw_msg fw_msg; /* payload including FW ver and Cmd ID */ }; /* * parameter container file */ /* * descriptors * Note 1: append new DescriptorType at the end * Note 2: add new descriptors to dsc_name[] in tfaContUtil.c */ enum tfa_descriptor_type { dsc_device, /* device list */ dsc_profile, /* profile list */ dsc_register, /* register patch */ dsc_string, /* ascii, zero terminated string */ dsc_file, /* filename + file contents */ dsc_patch, /* patch file */ dsc_marker, /* marker to indicate end of a list */ dsc_mode, dsc_set_input_select, dsc_set_output_select, dsc_set_program_config, dsc_set_lag_w, dsc_set_gains, dsc_set_vbat_factors, dsc_set_senses_cal, dsc_set_senses_delay, dsc_bit_field, dsc_default, /* used to reset bitfields to there default values */ dsc_livedata, dsc_livedata_string, dsc_group, dsc_cmd, dsc_set_mb_drc, dsc_filter, dsc_no_init, dsc_features, dsc_cf_mem, /* coolflux memory x,y,io */ dsc_set_fw_use_case, dsc_set_vddp_config, dsc_last /* trailer */ }; #define TFA_BITFIELDDSCMSK 0x7fffffff struct tfa_desc_ptr { uint32_t offset:24; uint32_t type:8; /* (== enum tfa_desc_type, assure 8bits length) */ }; /* * generic file descriptor */ struct tfa_file_dsc { struct tfa_desc_ptr name; uint32_t size; /* file data length in bytes */ uint8_t data[];/* payload */ }; /* * device descriptor list */ struct tfa_device_list { uint8_t length; /* nr of items in the list */ uint8_t bus; /* bus */ uint8_t dev; /* device */ uint8_t func; /* subfunction or subdevice */ uint32_t devid; /* device hw fw id */ struct tfa_desc_ptr name; /* device name */ struct tfa_desc_ptr list[]; /* items list */ }; /* * profile descriptor list */ struct tfa_profile_list { uint32_t length:8; /* nr of items in the list + name */ uint32_t group:8; /* profile group number */ uint32_t id:16; /* profile ID */ struct tfa_desc_ptr name; /* profile name */ struct tfa_desc_ptr list[]; /* items list (length-1 items) */ }; #define TFA_PROFID 0x1234 /* * livedata descriptor list */ struct tfa_livedata_list { uint32_t length:8; /* nr of items in the list */ uint32_t id:24; /* profile ID */ struct tfa_desc_ptr name; /* livedata name */ struct tfa_desc_ptr list[]; /* items list */ }; #define TFA_LIVEDATAID 0x5678 /* * Bitfield descriptor */ struct tfa_bitfield { uint16_t value; uint16_t field; /* ==datasheet defined, 16 bits */ }; /* * Bitfield enumuration bits descriptor */ struct tfa_bf_enum { unsigned int len:4; /* this is the actual length-1 */ unsigned int pos:4; unsigned int address:8; }; /* * Register patch descriptor */ struct tfa_reg_patch { uint8_t address; /* register address */ uint16_t value; /* value to write */ uint16_t mask; /* mask of bits to write */ }; /* * Mode descriptor */ struct tfa_mode { int value; /* mode value, maps to enum tfa98xx_mode */ }; /* * NoInit descriptor */ struct tfa_no_init { uint8_t value; /* noInit value */ }; /* * Features descriptor */ struct tfa_features { uint16_t value[3]; /* features value */ }; /* * the container file * - the size field is 32bits long (generic=16) * - all char types are in ASCII */ #define TFA_PM_VERSION '1' #define TFA_PM3_VERSION '3' #define TFA_PM_SUBVERSION '1' struct tfa_container { char id[2]; /* "XX" : XX=type */ char version[2]; /* "V_" : V=version, vv=subversion */ char subversion[2]; /* "vv" : vv=subversion */ uint32_t size; /* data size in bytes following CRC */ uint32_t crc; /* 32-bits CRC for following data */ uint16_t rev; /* "extra chars for rev nr" */ char customer[8]; /* "name of customer" */ char application[8]; /* "application name" */ char type[8]; /* "application type name" */ uint16_t ndev; /* "nr of device lists" */ uint16_t nprof; /* "nr of profile lists" */ uint16_t nlivedata; /* "nr of livedata lists" */ struct tfa_desc_ptr index[]; /* start of item index table */ }; #pragma pack(pop) #endif /* TFA98XXPARAMETERS_H_ */