@@ -26,8 +26,17 @@ pub(super) mod config {
2626         clk_cfg :  TdmClkConfig , 
2727
2828        /// TDM mode channel slot configuration. 
29+          #[ cfg( esp_idf_version_major = "4" ) ]  
2930        slot_cfg :  TdmSlotConfig , 
3031
32+         /// TDM mode channel rx slot configuration. 
33+          #[ cfg( not( esp_idf_version_major = "4" ) ) ]  
34+         pub ( super )  slot_rx_cfg :  Option < TdmSlotConfig > , 
35+ 
36+         /// TDM mode channel tx slot configuration. 
37+          #[ cfg( not( esp_idf_version_major = "4" ) ) ]  
38+         pub ( super )  slot_tx_cfg :  Option < TdmSlotConfig > , 
39+ 
3140        /// TDM mode channel data configuration. 
3241         #[ cfg( not( esp_idf_version_major = "4" ) ) ]  
3342        gpio_cfg :  TdmGpioConfig , 
@@ -40,14 +49,21 @@ pub(super) mod config {
4049        pub  fn  new ( 
4150            channel_cfg :  Config , 
4251            clk_cfg :  TdmClkConfig , 
43-             slot_cfg :  TdmSlotConfig , 
52+             #[ cfg( esp_idf_version_major = "4" ) ]   slot_cfg :  TdmSlotConfig , 
53+             #[ cfg( not( esp_idf_version_major = "4" ) ) ]   slot_rx_cfg :  Option < TdmSlotConfig > , 
54+             #[ cfg( not( esp_idf_version_major = "4" ) ) ]   slot_tx_cfg :  Option < TdmSlotConfig > , 
4455            #[ cfg( not( esp_idf_version_major = "4" ) ) ]   gpio_cfg :  TdmGpioConfig , 
4556        )  -> Self  { 
4657            Self  { 
4758                channel_cfg, 
4859                clk_cfg, 
60+                 #[ cfg( esp_idf_version_major = "4" ) ]  
4961                slot_cfg, 
5062                #[ cfg( not( esp_idf_version_major = "4" ) ) ]  
63+                 slot_rx_cfg, 
64+                 #[ cfg( not( esp_idf_version_major = "4" ) ) ]  
65+                 slot_tx_cfg, 
66+                 #[ cfg( not( esp_idf_version_major = "4" ) ) ]  
5167                gpio_cfg, 
5268            } 
5369        } 
@@ -62,12 +78,23 @@ pub(super) mod config {
6278            dout :  Option < PeripheralRef < ' d ,  impl  OutputPin > > , 
6379            mclk :  Option < PeripheralRef < ' d ,  impl  InputPin  + OutputPin > > , 
6480            ws :  PeripheralRef < ' d ,  impl  InputPin  + OutputPin > , 
65-         )  -> i2s_tdm_config_t  { 
66-             i2s_tdm_config_t  { 
67-                 clk_cfg :  self . clk_cfg . as_sdk ( ) , 
68-                 slot_cfg :  self . slot_cfg . as_sdk ( ) , 
69-                 gpio_cfg :  self . gpio_cfg . as_sdk ( bclk,  din,  dout,  mclk,  ws) , 
70-             } 
81+         )  -> ( Option < i2s_tdm_config_t > ,  Option < i2s_tdm_config_t > )  { 
82+             let  clk_cfg = self . clk_cfg . as_sdk ( ) ; 
83+             let  gpio_cfg = self . gpio_cfg . as_sdk ( bclk,  din,  dout,  mclk,  ws) ; 
84+ 
85+             let  rx = self . slot_rx_cfg . map ( |slot_cfg| i2s_tdm_config_t  { 
86+                 clk_cfg, 
87+                 slot_cfg :  slot_cfg. as_sdk ( ) , 
88+                 gpio_cfg, 
89+             } ) ; 
90+ 
91+             let  tx = self . slot_tx_cfg . map ( |slot_cfg| i2s_tdm_config_t  { 
92+                 clk_cfg, 
93+                 slot_cfg :  slot_cfg. as_sdk ( ) , 
94+                 gpio_cfg, 
95+             } ) ; 
96+ 
97+             ( rx,  tx) 
7198        } 
7299
73100        /// Convert to the ESP-IDF SDK `i2s_driver_config_t` representation. 
@@ -984,27 +1011,32 @@ impl<'d, Dir> I2sDriver<'d, Dir> {
9841011        mclk :  Option < impl  Peripheral < P  = impl  InputPin  + OutputPin >  + ' d > , 
9851012        ws :  impl  Peripheral < P  = impl  InputPin  + OutputPin >  + ' d , 
9861013    )  -> Result < Self ,  EspError >  { 
1014+         // Check that the configuration is correct for the selected mode 
1015+         if  rx && config. slot_rx_cfg . is_none ( )  || tx && config. slot_tx_cfg . is_none ( )  { 
1016+             return  Err ( EspError :: from_infallible :: < ESP_ERR_INVALID_ARG > ( ) ) ; 
1017+         } 
1018+ 
9871019        let  chan_cfg = config. channel_cfg . as_sdk ( I2S :: port ( ) ) ; 
9881020
9891021        let  this = Self :: internal_new :: < I2S > ( & chan_cfg,  rx,  tx) ?; 
9901022
9911023        // Create the channel configuration. 
992-         let  tdm_config  = config. as_sdk ( 
1024+         let  ( tdm_rx_config ,  tdm_tx_config )  = config. as_sdk ( 
9931025            bclk. into_ref ( ) , 
9941026            din. map ( |d_in| d_in. into_ref ( ) ) , 
9951027            dout. map ( |d_out| d_out. into_ref ( ) ) , 
9961028            mclk. map ( |m_clk| m_clk. into_ref ( ) ) , 
9971029            ws. into_ref ( ) , 
9981030        ) ; 
9991031
1000-         if  rx  { 
1032+         if  let   Some ( tdm_config )  = tdm_rx_config  { 
10011033            unsafe  { 
10021034                // Open the RX channel. 
10031035                esp ! ( i2s_channel_init_tdm_mode( this. rx_handle,  & tdm_config) ) ?; 
10041036            } 
10051037        } 
10061038
1007-         if  tx  { 
1039+         if  let   Some ( tdm_config )  = tdm_tx_config  { 
10081040            unsafe  { 
10091041                // Open the TX channel. 
10101042                esp ! ( i2s_channel_init_tdm_mode( this. tx_handle,  & tdm_config) ) ?; 
0 commit comments