@@ -125,7 +125,7 @@ static struct ndp120_dev_s *_ndp_debug_handle = NULL;
125125/****************************************************************************
126126 * Function Prototypes
127127 ****************************************************************************/
128- int ndp120_init (struct ndp120_dev_s * dev , bool reinit );
128+ int ndp120_init (struct ndp120_dev_s * dev , uint8_t dsp_fw_num );
129129void ndp120_aec_enable (struct ndp120_dev_s * dev );
130130void ndp120_aec_disable (struct ndp120_dev_s * dev );
131131void ndp120_test_internal_passthrough_switch (struct ndp120_dev_s * dev , int internal );
@@ -965,6 +965,65 @@ void add_dsp_flow_rules(struct syntiant_ndp_device_s *ndp)
965965
966966}
967967
968+ static
969+ void add_dsp_flow_rules_extract_raw_data (struct syntiant_ndp_device_s * ndp )
970+ {
971+ int s = 0 ;
972+ ndp120_dsp_data_flow_setup_t setup ;
973+
974+ int src_pcm = 0 ;
975+ int src_func = 0 ;
976+ int src_nn = 0 ;
977+
978+ memset (& setup , 0 , sizeof (setup ));
979+
980+ // ----------
981+ // COMBINED NORMAL + AEC FLOW
982+ /* PCM7->FUNCx */
983+ setup .src_pcm_audio [src_pcm ].src_param = NDP120_DSP_DATA_FLOW_SRC_PARAM_AUD0_STEREO ;
984+ #ifdef CONFIG_NDP120_AEC_SUPPORT
985+ setup .src_pcm_audio [src_pcm ].src_param |= NDP120_DSP_DATA_FLOW_SRC_PARAM_AUD1_LEFT ;
986+ #endif
987+ setup .src_pcm_audio [src_pcm ].dst_param = FF_ID ;
988+ setup .src_pcm_audio [src_pcm ].dst_type = NDP120_DSP_DATA_FLOW_DST_TYPE_FUNCTION ;
989+ setup .src_pcm_audio [src_pcm ].algo_config_index = 0 ;
990+ setup .src_pcm_audio [src_pcm ].set_id = COMBINED_FLOW_SET_ID ;
991+ setup .src_pcm_audio [src_pcm ].algo_exec_property = 0 ;
992+ src_pcm ++ ;
993+
994+ /* FUNCx->NN0 */
995+ setup .src_function [src_func ].src_param = FF_ID ;
996+ setup .src_function [src_func ].dst_param = KEYWORD_NETWORK_ID ;
997+ setup .src_function [src_func ].dst_type = NDP120_DSP_DATA_FLOW_DST_TYPE_NN ;
998+ setup .src_function [src_func ].algo_config_index = -1 ;
999+ setup .src_function [src_func ].set_id = COMBINED_FLOW_SET_ID ;
1000+ setup .src_function [src_func ].algo_exec_property = 0 ;
1001+ src_func ++ ;
1002+
1003+ /* PCMx->HOST_EXT_AUDIO */
1004+ setup .src_pcm_audio [src_pcm ].src_param = NDP120_DSP_DATA_FLOW_SRC_PARAM_AUD0_LEFT ;
1005+ setup .src_pcm_audio [src_pcm ].dst_param = NDP120_DSP_DATA_FLOW_DST_SUBTYPE_AUDIO ;
1006+ setup .src_pcm_audio [src_pcm ].dst_type = NDP120_DSP_DATA_FLOW_DST_TYPE_HOST_EXTRACT ;
1007+ setup .src_pcm_audio [src_pcm ].algo_config_index = 0 ;
1008+ setup .src_pcm_audio [src_pcm ].set_id = COMBINED_FLOW_SET_ID ;
1009+ setup .src_pcm_audio [src_pcm ].algo_exec_property = 0 ;
1010+ src_pcm ++ ;
1011+
1012+ /* NN0->MCU */
1013+ setup .src_nn [src_nn ].src_param = 0 ;
1014+ setup .src_nn [src_nn ].dst_param = 0 ;
1015+ setup .src_nn [src_nn ].dst_type = NDP120_DSP_DATA_FLOW_DST_TYPE_MCU ;
1016+ setup .src_nn [src_nn ].algo_config_index = -1 ;
1017+ setup .src_nn [src_nn ].set_id = COMBINED_FLOW_SET_ID ;
1018+ setup .src_nn [src_nn ].algo_exec_property = 0 ;
1019+ src_nn ++ ;
1020+
1021+ auddbg ("Applied flow rules extract raw data\n" );
1022+ s = syntiant_ndp120_dsp_flow_setup_apply (ndp , & setup );
1023+ check_status ("syntiant_ndp120_dsp_flow_setup_apply" , s );
1024+
1025+ }
1026+
9681027#if BT_MIC_SUPPORT == 1
9691028static
9701029void add_dsp_flow_rules_btmic (struct syntiant_ndp_device_s * ndp )
@@ -1237,7 +1296,7 @@ check_firmware_aliveness(struct ndp120_dev_s *dev, uint32_t wait_period_ms)
12371296
12381297 dev -> lower -> reset ();
12391298
1240- s = ndp120_init (dev , true );
1299+ s = ndp120_init (dev , dev -> cur_dsp_flow_num );
12411300
12421301 if (s ) {
12431302 /* For now do nothing, there may be some cases where init might
@@ -1285,7 +1344,7 @@ ndp120_app_device_health_check(void)
12851344}
12861345#endif
12871346
1288- int ndp120_init (struct ndp120_dev_s * dev , bool reinit )
1347+ int ndp120_init (struct ndp120_dev_s * dev , uint8_t dsp_fw_num )
12891348{
12901349 /* File names */
12911350 int s ;
@@ -1310,7 +1369,7 @@ int ndp120_init(struct ndp120_dev_s *dev, bool reinit)
13101369 /* save handle so we can use it from debug routine later, e.g. from other util/shell */
13111370 _ndp_debug_handle = dev ;
13121371
1313- if (! reinit ) {
1372+ if (dsp_fw_num == 0 ) {
13141373 s = pthread_mutex_init (& dev -> ndp_mutex_mbsync , NULL );
13151374 if (s ) {
13161375 auddbg ("failed to initialize mb sync mutex variable\n" );
@@ -1380,8 +1439,22 @@ int ndp120_init(struct ndp120_dev_s *dev, bool reinit)
13801439#if BT_MIC_SUPPORT == 1
13811440 // add special rules for BT-mic
13821441 add_dsp_flow_rules_btmic (dev -> ndp );
1442+ dev -> cur_dsp_flow_num = 1 ;
13831443#else
1384- add_dsp_flow_rules (dev -> ndp );
1444+ switch (dsp_fw_num ) {
1445+ case 1 :
1446+ add_dsp_flow_rules (dev -> ndp );
1447+ dev -> cur_dsp_flow_num = 1 ;
1448+ break ;
1449+ case 2 :
1450+ add_dsp_flow_rules_extract_raw_data (dev -> ndp );
1451+ dev -> cur_dsp_flow_num = 2 ;
1452+ break ;
1453+ default :
1454+ add_dsp_flow_rules (dev -> ndp );
1455+ dev -> cur_dsp_flow_num = 1 ;
1456+ break ;
1457+ }
13851458#endif
13861459
13871460 struct syntiant_ndp120_config_tank_s tank_config ;
@@ -1444,7 +1517,7 @@ int ndp120_init(struct ndp120_dev_s *dev, bool reinit)
14441517#endif
14451518
14461519#ifdef CONFIG_NDP120_ALIVE_CHECK
1447- if (! reinit ) {
1520+ if (dsp_fw_num == 0 ) {
14481521 pid_t pid = kernel_thread ("NDP_health_check" , 100 , 4096 , ndp120_app_device_health_check , NULL );
14491522 if (pid < 0 ) {
14501523 auddbg ("Device health check thread creation failed\n" );
@@ -1835,7 +1908,7 @@ int ndp120_change_kd(struct ndp120_dev_s *dev)
18351908
18361909 dev -> lower -> reset ();
18371910
1838- s = ndp120_init (dev , true );
1911+ s = ndp120_init (dev , dev -> cur_dsp_flow_num );
18391912
18401913 if (s ) {
18411914 /* For now do nothing, there may be some cases where init might
@@ -2015,3 +2088,32 @@ void ndp120_aec_disable(struct ndp120_dev_s *dev)
20152088 dev -> extclk_inuse = false;
20162089}
20172090#endif
2091+
2092+ void ndp120_change_dsp_flow (struct ndp120_dev_s * dev , uint8_t dsp_flow_num )
2093+ {
2094+ #if BT_MIC_SUPPORT == 1
2095+ auddbg ("To change dsp flow is not spported when BT_MIC_SUPPORT.\n" );
2096+ return ;
2097+ #endif
2098+
2099+ int s ;
2100+ ndp120_semtake (dev );
2101+ dev -> lower -> irq_enable (false);
2102+
2103+ s = syntiant_ndp_uninit (dev -> ndp , false, SYNTIANT_NDP_INIT_MODE_RESET );
2104+ audvdbg ("uninit : %d\n" , s );
2105+
2106+ dev -> lower -> reset ();
2107+
2108+ s = ndp120_init (dev , dsp_flow_num );
2109+ if (s ) {
2110+ /* For now do nothing, there may be some cases where init might
2111+ * have failed due to no memory, so retry after some time */
2112+ auddbg ("reinit failed!\n" );
2113+ } else {
2114+ /* re enable interrupts */
2115+ dev -> lower -> irq_enable (true);
2116+ }
2117+
2118+ ndp120_semgive (dev );
2119+ }
0 commit comments