/* * Copyright (C) 2018 Knowles Electronics * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _IAXXX_ODSP_HW_H_ #define _IAXXX_ODSP_HW_H_ #if __cplusplus extern "C" { #endif #include #include #define NAME_MAX_SIZE 256 struct iaxxx_odsp_hw; struct iaxxx_config_file { const char *filename; }; struct iaxxx_config_value { uint64_t config_val; uint32_t config_val_sz; }; union iaxxx_config_data { struct iaxxx_config_file fdata; struct iaxxx_config_value vdata; }; enum iaxxx_config_type { CONFIG_FILE, CONFIG_VALUE }; struct iaxxx_create_config_data { enum iaxxx_config_type type; union iaxxx_config_data data; }; struct iaxxx_plugin_status_data { uint32_t block_id; uint8_t create_status; uint8_t enable_status; uint16_t process_count; uint16_t process_err_count; uint32_t in_frames_consumed; uint32_t out_frames_produced; uint32_t private_memsize; uint8_t frame_notification_mode; uint8_t state_management_mode; }; struct iaxxx_plugin_endpoint_status_data { uint8_t status; uint8_t frame_status; uint8_t endpoint_status; uint8_t usage; uint8_t mandatory; uint16_t counter; uint8_t op_encoding; uint8_t op_sample_rate; uint16_t op_frame_length; }; struct iaxxx_get_event_info { uint16_t event_id; uint32_t data; }; enum clock_source { SYSCLK, INT_OSC, EXT_OSC, }; /** * Initialize the ODSP HAL * * Input - NA * Output - Handle to iaxxx_odsp_hw on success, NULL on failure */ struct iaxxx_odsp_hw* iaxxx_odsp_init(); /** * De-Initialize the ODSP HAL * * Input - odsp_hw_hdl - Handle to odsp hw structure * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_deinit(struct iaxxx_odsp_hw *odsp_hw_hdl); /** * Load a package * * Input - odsp_hw_hdl - Handle to odsp hw structure * pkg_name - Relative path to the Package binary (Should be placed in * the firmware location) * pkg_id - Package ID * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_package_load(struct iaxxx_odsp_hw *odsp_hw_hdl, const char *pkg_name, const uint32_t pkg_id); /** * Unload a package * * Input - odsp_hw_hdl - Handle to odsp hw structure * pkg_id - Package ID * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_package_unload(struct iaxxx_odsp_hw *odsp_hw_hdl, const uint32_t pkg_id); /** * Get package version * * Input - odsp_hw_hdl - Handle to odsp hw structure * inst_id - Instance ID * version - Package version string buffer * len - String buffer size * * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_plugin_get_package_version(struct iaxxx_odsp_hw *odsp_hw_hdl, uint8_t inst_id, char *version, uint32_t len); /** * Get plugin version * * Input - odsp_hw_hdl - Handle to odsp hw structure * inst_id - Instance ID * version - Plugin version string buffer * len - String buffer size * * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_plugin_get_plugin_version(struct iaxxx_odsp_hw *odsp_hw_hdl, uint8_t inst_id, char *version, uint32_t len); /** * Create a plugin * * Input - odsp_hw_hdl - Handle to odsp hw structure * inst_id - Instance ID * priority - Priority of the plugin * pkg_id - Package ID * plg_idx - Plugin Index* * block_id - Block ID * config_id - Config ID * * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_plugin_create(struct iaxxx_odsp_hw *odsp_hw_hdl, const uint32_t inst_id, const uint32_t priority, const uint32_t pkg_id, const uint32_t plg_idx, const uint32_t block_id, const uint32_t config_id); /** * Set the creation configuration on a plugin * * Input - odsp_hw_hdl - Handle to odsp hw structure * inst_id - Instance ID * block_id - Block ID * cdata - Creation configuration data * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_plugin_set_creation_config( struct iaxxx_odsp_hw *odsp_hw_hdl, const uint32_t inst_id, const uint32_t block_id, struct iaxxx_create_config_data cdata); /** * Destroy the plugin * * Input - odsp_hw_hdl - Handle to odsp hw structure * inst_id - Instance ID * block_id - Block ID * * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_plugin_destroy(struct iaxxx_odsp_hw *odsp_hw_hdl, const uint32_t inst_id, const uint32_t block_id); /** * Enable the plugin * * Input - odsp_hw_hdl - Handle to odsp hw structure * inst_id - Instance ID * block_id - Block ID * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_plugin_enable(struct iaxxx_odsp_hw *odsp_hw_hdl, const uint32_t inst_id, const uint32_t block_id); /** * Disable the plugin * * Input - odsp_hw_hdl - Handle to odsp hw structure * inst_id - Instance ID * block_id - Block ID * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_plugin_disable(struct iaxxx_odsp_hw *odsp_hw_hdl, const uint32_t inst_id, const uint32_t block_id); /** * Reset the plugin * * Input - odsp_hw_hdl - Handle to odsp hw structure * inst_id - Instance ID * block_id - Block ID * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_plugin_reset(struct iaxxx_odsp_hw *odsp_hw_hdl, const uint32_t inst_id, const uint32_t block_id); /** * Set a parameter on a plugin * * Input - odsp_hw_hdl - Handle to odsp hw structure * inst_id - Instance ID * param_id - Parameter ID * param_val - Parameter Value* * block_id - Block ID * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_plugin_set_parameter(struct iaxxx_odsp_hw *odsp_hw_hdl, const uint32_t inst_id, const uint32_t param_id, const uint32_t param_val, const uint32_t block_id); /** * Get the value of parameter on a plugin * * Input - odsp_hw_hdl - Handle to odsp hw structure * inst_id - Instance ID * param_id - Parameter ID * block_id - Block ID* * param_val - Parameter Value * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_plugin_get_parameter(struct iaxxx_odsp_hw *odsp_hw_hdl, const uint32_t inst_id, const uint32_t param_id, const uint32_t block_id, uint32_t *param_val); /** * Set a parameter block on a plugin * * Input - odsp_hw_hdl - Handle to odsp hw structure * inst_id - Instance ID * param_blk_id - Parameter block id * block_id - Block ID * param_buf - Pointer to the parameter block * param_buf_sz - Parameter block size * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_plugin_set_parameter_blk(struct iaxxx_odsp_hw *odsp_hw_hdl, const uint32_t inst_id, const uint32_t param_blk_id, const uint32_t block_id, const void *param_buf, const uint32_t param_buf_sz); /** * Set a parameter block on a plugin * * Input - odsp_hw_hdl - Handle to odsp hw structure * inst_id - Instance ID * param_blk_id - Parameter block id * block_id - Block ID * file_name - Relative path to the Parameter File(Should be placed in * the firmware location) * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_plugin_set_parameter_blk_from_file( struct iaxxx_odsp_hw *odsp_hw_hdl, const uint32_t inst_id, const uint32_t param_blk_id, const uint32_t block_id, const char *file_name); /** * Set custom configuration for plugin * * Input - odsp_hw_hdl - Handle to odsp hw structure * inst_id - Instance ID * block_id - Block ID * param_blk_id - Parameter block id * custom_config_id - Id for what type of custom configuration * filename - Name of file with custom config data * * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_plugin_set_custom_cfg(struct iaxxx_odsp_hw *odsp_hw_hdl, const uint32_t inst_id, const uint32_t block_id, const uint32_t param_blk_id, const uint32_t custom_config_id, const char *filename); /** * Subscribe to an event * * Input - odsp_hw_hdl - Handle to odsp hw structure * src_id - System Id of event source * event_id - Event Id * dst_id - System Id of event destination * dst_opaque - Info sought by destination task when even occurs * * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_evt_subscribe(struct iaxxx_odsp_hw *odsp_hw_hdl, const uint16_t src_id, const uint16_t event_id, const uint16_t dst_id, const uint32_t dst_opaque); /** * Unsubscribe an event * * Input - odsp_hw_hdl - Handle to odsp hw structure * src_id - System Id of event source * event_id - Event Id * dst_id - System Id of event destination * * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_evt_unsubscribe(struct iaxxx_odsp_hw *odsp_hw_hdl, const uint16_t src_id, const uint16_t event_id, const uint16_t dst_id); /** * Trigger an event. This may be most useful when debugging the system, * but can also be used to trigger simultaneous behavior in entities which * have subscribed, or to simply provide notifications regarding host status: * * Input - odsp_hw_hdl - Handle to odsp hw structure * src_id - SystemId of event source * evt_id - Id of event * src_opaque - Source opaque to pass with event notification * * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_evt_trigger(struct iaxxx_odsp_hw *odsp_hw_hdl, uint16_t src_id, uint16_t evt_id, uint32_t src_opaque); /** * Fetches next event subscription entry from the last read position * * Input - odsp_hw_hdl - Handle to odsp hw structure * src_id - System Id of event source * evt_id - Event Id * dst_id - System Id of event destination * dst_opaque - Destination opaque data * * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_evt_read_subscription(struct iaxxx_odsp_hw *odsp_hw_hdl, uint16_t *src_id, uint16_t *evt_id, uint16_t *dst_id, uint32_t *dst_opaque); /** * Reset index for retrieving subscription entries * * Input - odsp_hw_hdl - Handle to odsp hw structure * * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_evt_reset_read_index(struct iaxxx_odsp_hw *odsp_hw_hdl); /** * Retrieve an event notification * * Input - odsp_hw_hdl - Handle to odsp hw structure * src_id - pointer to uint16_t for reporting SystemId of * event source * evt_dd - pointer to uint16_t for reporting Id of event * src_opaque - pointer to the first parameter of event * dst_opaque - pointer to the second parameter of event * This will be destOpaque in case if event is * subscribed with valid destOpaque otherwise * it will be used as second parameter. * * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_evt_retrieve_notification(struct iaxxx_odsp_hw *odsp_hw_hdl, uint16_t *src_id, uint16_t *evt_id, uint32_t *src_opaque, uint32_t *dst_opaque); /** * Retrieve an event * * Input - odsp_hw_hdl - Handle to odsp hw structure * event_info - Struct to return event info * * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_evt_getevent(struct iaxxx_odsp_hw *odsp_hw_hdl, struct iaxxx_get_event_info *event_info); /** * Create a plugin for a statically loaded package * * Input - odsp_hw_hdl - Handle to odsp hw structure * inst_id - Instance ID * priority - Priority of the plugin * pkg_id - Package ID * plg_idx - Plugin Index* * block_id - Block ID * config_id - Config ID * * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_plugin_create_static_package(struct iaxxx_odsp_hw *odsp_hw_hdl, const uint32_t inst_id, const uint32_t priority, const uint32_t pkg_id, const uint32_t plg_idx, const uint32_t block_id, const uint32_t config_id); /** * Get a parameter block from a plugin * * Input - odsp_hw_hdl - Handle to odsp hw structure * inst_id - Instance ID * block_id - Block ID * param_blk_id - Parameter block id * param_buf - Pointer to the parameter block * param_buf_sz - Parameter block size in words * * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_plugin_get_parameter_blk(struct iaxxx_odsp_hw *odsp_hw_hdl, const uint32_t inst_id, const uint32_t block_id, const uint32_t param_blk_id, uint32_t *param_buf, const uint32_t param_buf_sz); /** * Set Event for the plugin * * Input - odsp_hw_hdl - Handle to odsp hw structure * inst_id - Instance ID * eventEnableMask - event Mask * block_id - Block ID * * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_plugin_setevent(struct iaxxx_odsp_hw *odsp_hw_hdl, const uint32_t inst_id, const uint32_t eventEnableMask, const uint32_t block_id); /* Read Plugin Error Info * * Input - odsp_hw_hdl - Handle to odsp hw structure * error_code - Pointer to uint32 to return error code * error_instance - Pointer to uint8 to return plugin instance * where error occurred. * * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_plugin_read_error(struct iaxxx_odsp_hw *odsp_hw_hdl, const uint32_t block_id, uint32_t *error_code, uint8_t *error_instance); /* Read the timestamps of all output endpoint * * Input - odsp_hw_hdl - Handle to odsp hw structure * proc_id - Proc ID * timestamps - The timestamps array(with 16 elements count) * to be filled. * * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_plugin_get_ep_timestamps(struct iaxxx_odsp_hw *odsp_hw_hdl, uint64_t *timestamps, uint8_t proc_id); /** * Set a parameter block on a plugin and get ack to * ensure the data has been sent and retry if not. * * Input - odsp_hw_hdl - Handle to odsp hw structure * inst_id - Instance ID * param_blk_id - Parameter block id * block_id - Block ID * set_param_buf - Pointer to the parameter block * set_param_buf_sz - Parameter block size in bytes * response_data_buf - Buffer for response data from plugin * response_data_sz - Size of Buffer in uint32 words for * response data from plugin * max_no_retries - Max number of retries in case of busy * response from plugin. * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_plugin_set_parameter_blk_with_ack( struct iaxxx_odsp_hw *odsp_hw_hdl, const uint32_t inst_id, const uint32_t param_blk_id, const uint32_t block_id, const void *set_param_buf, const uint32_t set_param_buf_sz, uint32_t* response_data_buf, const uint32_t response_data_sz, const uint32_t max_no_retries); /** * Get Plugin status information. * * Input - odsp_hw_hdl - Handle to odsp hw structure * inst_id - Instance ID * plugin_status_data - Pointer to struct to return plugin status. * * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_plugin_get_status_info( struct iaxxx_odsp_hw *odsp_hw_hdl, const uint32_t inst_id, struct iaxxx_plugin_status_data *plugin_status_data); /** * Get Plugin endpoint status information. * * Input - odsp_hw_hdl - Handle to odsp hw structure * inst_id - Instance ID * ep_index - Index of Endpoint * direction - If Input endpoint or Output endpoint * 0 => input, 1 => output * plugin_ep_status_data - Pointer to struct to return plugin * endpoint status. * * * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_plugin_get_endpoint_status( struct iaxxx_odsp_hw *odsp_hw_hdl, const uint32_t inst_id, const uint8_t ep_index, const uint8_t direction, struct iaxxx_plugin_endpoint_status_data *plugin_ep_status_data); /** * Returns the execution status of given processor * * Input - odsp_hw_hdl - Handle to odsp hw structure * proc_id - Proc id * status - Execution status of the processor * * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_get_proc_execution_status(struct iaxxx_odsp_hw *odsp_hw_hdl, uint8_t proc_id, uint32_t *status); /** * Returns Rom version number, Rom version string * Application version number, Application version string * * Input - odsp_hw_hdl - Handle to odsp hw structure * rom_ver_num - Rom version number * rom_ver_str - Rom version string * rom_ver_str_len - Rom version string length * app_ver_num - App version number * app_ver_str - App version string * app_ver_str_len - App version string length * * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_get_sys_versions(struct iaxxx_odsp_hw *odsp_hw_hdl, uint32_t *rom_ver_num, char *rom_ver_str, uint32_t rom_ver_str_len, uint32_t *app_ver_num, char *app_ver_str, uint32_t app_ver_str_len); /** * Returns Device ID * * Input - odsp_hw_hdl - Handle to odsp hw structure * device_id - Returned Device ID * * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_get_device_id(struct iaxxx_odsp_hw *odsp_hw_hdl, uint32_t *device_id); /** * Returns Firmware status * * Input - odsp_hw_hdl - Handle to odsp hw structure * mode - Returned firmware status * 0: Firmware has crashed * 1: Firmware is idle * 2: Firmware is active * * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_get_fw_status(struct iaxxx_odsp_hw *odsp_hw_hdl, uint32_t *status); /** * Resets the firmware by redownloading the firmware * * Input - odsp_hw_hdl - Handle to odsp hw structure * * Output - 0 on success, on failure < 0 */ int iaxxx_odsp_reset_fw(struct iaxxx_odsp_hw *odsp_hw_hdl); #if __cplusplus } // extern "C" #endif #endif // #ifndef _IAXXX_ODSP_HW_H_