@@ -32,13 +32,13 @@ static esp_err_t emac_esp_gpio_matrix_init(gpio_num_t gpio_num, uint32_t signal_
3232 ESP_LOGD (TAG , "%s skipping signal in_idx %" PRIu32 ", out_idx %" PRIu32 , __func__ , signal_in_idx , signal_out_idx );
3333 return ESP_OK ;
3434 }
35- ESP_RETURN_ON_ERROR (gpio_set_direction (gpio_num , mode ), TAG , "failed to set direction %i at GPIO #%i" , mode , gpio_num );
3635 switch (mode ) {
3736 case GPIO_MODE_INPUT :
3837 ESP_RETURN_ON_FALSE (signal_in_idx != SIG_GPIO_OUT_IDX , ESP_ERR_NOT_SUPPORTED ,
3938 TAG , "requested periph signal cannot be connect via GPIO Matrix" );
4039 ESP_RETURN_ON_FALSE (esp_gpio_is_reserved (BIT64 (gpio_num )) == false, ESP_ERR_INVALID_STATE ,
4140 TAG , "GPIO %i is reserved" , gpio_num );
41+ gpio_input_enable (gpio_num );
4242 esp_rom_gpio_connect_in_signal (gpio_num , signal_in_idx , false);
4343 break ;
4444 case GPIO_MODE_OUTPUT :
@@ -55,6 +55,7 @@ static esp_err_t emac_esp_gpio_matrix_init(gpio_num_t gpio_num, uint32_t signal_
5555 TAG , "requested periph signal cannot be connect via GPIO Matrix" );
5656 ESP_RETURN_ON_FALSE ((esp_gpio_reserve (BIT64 (gpio_num )) & BIT64 (gpio_num )) == 0 , ESP_ERR_INVALID_STATE ,
5757 TAG , "GPIO %i is already reserved" , gpio_num );
58+ gpio_input_enable (gpio_num );
5859 esp_rom_gpio_connect_out_signal (gpio_num , signal_out_idx , false, false);
5960 esp_rom_gpio_connect_in_signal (gpio_num , signal_in_idx , false);
6061 break ;
@@ -67,7 +68,7 @@ static esp_err_t emac_esp_gpio_matrix_init(gpio_num_t gpio_num, uint32_t signal_
6768 return ESP_OK ;
6869}
6970
70- static esp_err_t emac_esp_iomux_init (gpio_num_t gpio_num , const emac_iomux_info_t * iomux_info , bool is_input )
71+ static esp_err_t emac_esp_iomux_init (gpio_num_t gpio_num , const emac_iomux_info_t * iomux_info , uint32_t signal_idx , bool is_input )
7172{
7273 // silently skip undefined iomux functions (for example, ESP32 does not use MII COL_IN/CRS_IN)
7374 if (iomux_info == NULL ) {
@@ -81,16 +82,23 @@ static esp_err_t emac_esp_iomux_init(gpio_num_t gpio_num, const emac_iomux_info_
8182 }
8283 // loop over target iomux_info until reached end of list indicated by invalid GPIO num
8384 while (iomux_info -> gpio_num != GPIO_NUM_MAX ) {
84- // if requested GPIO number can be IO muxed or select single pad that can be muxed on the target
85+ // if requested GPIO number can be IO muxed or select the only pad that can be muxed on the target
8586 if (gpio_num == iomux_info -> gpio_num || gpio_num == GPIO_NUM_MAX ) {
8687 ESP_RETURN_ON_FALSE ((esp_gpio_reserve (BIT64 (iomux_info -> gpio_num )) & BIT64 (iomux_info -> gpio_num )) == 0 , ESP_ERR_INVALID_STATE ,
8788 TAG , "GPIO %i is already reserved" , iomux_info -> gpio_num );
8889 s_emac_esp_used_gpio_mask |= BIT64 (iomux_info -> gpio_num );
89- ESP_RETURN_ON_ERROR (gpio_func_sel (iomux_info -> gpio_num , iomux_info -> func ), TAG , "failed to set GPIO function at GPIO %i" , iomux_info -> gpio_num );
9090 if (is_input ) {
91- PIN_INPUT_ENABLE (GPIO_PIN_MUX_REG [iomux_info -> gpio_num ]);
91+ ESP_RETURN_ON_ERROR (gpio_func_sel (iomux_info -> gpio_num , iomux_info -> func ), TAG , "failed to set GPIO function at GPIO %i" , iomux_info -> gpio_num );
92+ // if the signal can be also connected via IO matrix, disconnect it (SIG_GPIO_OUT_IDX indicates no IO matrix)
93+ if (signal_idx != SIG_GPIO_OUT_IDX ) {
94+ // enable input and disconnect from IO Matrix
95+ gpio_iomux_in (iomux_info -> gpio_num , signal_idx );
96+ } else {
97+ // just enable input
98+ gpio_input_enable (iomux_info -> gpio_num );
99+ }
92100 } else {
93- PIN_INPUT_DISABLE ( GPIO_PIN_MUX_REG [ iomux_info -> gpio_num ] );
101+ gpio_iomux_out ( iomux_info -> gpio_num , iomux_info -> func , false );
94102 }
95103 ESP_RETURN_ON_ERROR (gpio_set_pull_mode (iomux_info -> gpio_num , GPIO_FLOATING ),
96104 TAG , "failed to set pull mode at GPIO %i" , iomux_info -> gpio_num );
@@ -158,69 +166,71 @@ esp_err_t emac_esp_iomux_init_mii(const eth_mac_mii_gpio_config_t *mii_gpio)
158166{
159167 ESP_RETURN_ON_FALSE (emac_mii_iomux_pins .clk_tx != NULL , ESP_ERR_NOT_SUPPORTED , TAG , "target does not support MII IOMUX" );
160168
161- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , tx_clk_num ), emac_mii_iomux_pins .clk_tx , true),
162- TAG , "invalid TX_CLK GPIO number" );
163- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , tx_en_num ), emac_mii_iomux_pins .tx_en , false),
164- TAG , "invalid TX_EN GPIO number" );
165- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , txd0_num ), emac_mii_iomux_pins .txd0 , false),
166- TAG , "invalid TXD0 GPIO number" );
167- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , txd1_num ), emac_mii_iomux_pins .txd1 , false),
168- TAG , "invalid TXD1 GPIO number" );
169- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , txd2_num ), emac_mii_iomux_pins .txd2 , false),
170- TAG , "invalid TXD2 GPIO number" );
171- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , txd3_num ), emac_mii_iomux_pins .txd3 , false),
172- TAG , "invalid TXD3 GPIO number" );
173- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , rx_clk_num ), emac_mii_iomux_pins .clk_rx , true),
174- TAG , "invalid RX_CLK GPIO number" );
175- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , rx_dv_num ), emac_mii_iomux_pins .rx_dv , true),
176- TAG , "invalid RX_DV GPIO number" );
177- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , rxd0_num ), emac_mii_iomux_pins .rxd0 , true),
178- TAG , "invalid RXD0 GPIO number" );
179- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , rxd1_num ), emac_mii_iomux_pins .rxd1 , true),
180- TAG , "invalid RXD1 GPIO number" );
181- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , rxd2_num ), emac_mii_iomux_pins .rxd2 , true),
182- TAG , "invalid RXD2 GPIO number" );
183- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , rxd3_num ), emac_mii_iomux_pins .rxd3 , true),
184- TAG , "invalid RXD3 GPIO number" );
185- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , col_in_num ), emac_mii_iomux_pins .col_in , true),
186- TAG , "invalid COL_IN GPIO number" );
187- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , crs_in_num ), emac_mii_iomux_pins .crs_in , true),
188- TAG , "invalid CRS_IN GPIO number" );
169+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , tx_clk_num ), emac_mii_iomux_pins .clk_tx ,
170+ emac_io_idx . mii_tx_clk_i_idx , true), TAG , "invalid TX_CLK GPIO number" );
171+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , tx_en_num ), emac_mii_iomux_pins .tx_en ,
172+ emac_io_idx . mii_tx_en_o_idx , false), TAG , "invalid TX_EN GPIO number" );
173+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , txd0_num ), emac_mii_iomux_pins .txd0 ,
174+ emac_io_idx . mii_txd0_o_idx , false), TAG , "invalid TXD0 GPIO number" );
175+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , txd1_num ), emac_mii_iomux_pins .txd1 ,
176+ emac_io_idx . mii_txd1_o_idx , false), TAG , "invalid TXD1 GPIO number" );
177+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , txd2_num ), emac_mii_iomux_pins .txd2 ,
178+ emac_io_idx . mii_txd2_o_idx , false), TAG , "invalid TXD2 GPIO number" );
179+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , txd3_num ), emac_mii_iomux_pins .txd3 ,
180+ emac_io_idx . mii_txd3_o_idx , false), TAG , "invalid TXD3 GPIO number" );
181+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , rx_clk_num ), emac_mii_iomux_pins .clk_rx ,
182+ emac_io_idx . mii_rx_clk_i_idx , true), TAG , "invalid RX_CLK GPIO number" );
183+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , rx_dv_num ), emac_mii_iomux_pins .rx_dv ,
184+ emac_io_idx . mii_rx_dv_i_idx , true), TAG , "invalid RX_DV GPIO number" );
185+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , rxd0_num ), emac_mii_iomux_pins .rxd0 ,
186+ emac_io_idx . mii_rxd0_i_idx , true), TAG , "invalid RXD0 GPIO number" );
187+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , rxd1_num ), emac_mii_iomux_pins .rxd1 ,
188+ emac_io_idx . mii_rxd1_i_idx , true), TAG , "invalid RXD1 GPIO number" );
189+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , rxd2_num ), emac_mii_iomux_pins .rxd2 ,
190+ emac_io_idx . mii_rxd2_i_idx , true), TAG , "invalid RXD2 GPIO number" );
191+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , rxd3_num ), emac_mii_iomux_pins .rxd3 ,
192+ emac_io_idx . mii_rxd3_i_idx , true), TAG , "invalid RXD3 GPIO number" );
193+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , col_in_num ), emac_mii_iomux_pins .col_in ,
194+ emac_io_idx . mii_col_i_idx , true), TAG , "invalid COL_IN GPIO number" );
195+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (mii_gpio , crs_in_num ), emac_mii_iomux_pins .crs_in ,
196+ emac_io_idx . mii_crs_i_idx , true), TAG , "invalid CRS_IN GPIO number" );
189197 return ESP_OK ;
190198}
191199
192200esp_err_t emac_esp_iomux_rmii_clk_input (int num )
193201{
194202 ESP_RETURN_ON_FALSE (emac_rmii_iomux_pins .clki != NULL , ESP_ERR_NOT_SUPPORTED , TAG , "target does not support RMII CLKI IOMUX" );
195203
196- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (num , emac_rmii_iomux_pins .clki , true), TAG , "invalid RMII CLK input GPIO number" );
204+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (num , emac_rmii_iomux_pins .clki , emac_io_idx .rmii_refclk_i_idx , true),
205+ TAG , "invalid RMII CLK input GPIO number" );
197206 return ESP_OK ;
198207}
199208
200209esp_err_t emac_esp_iomux_rmii_clk_ouput (int num )
201210{
202211 ESP_RETURN_ON_FALSE (emac_rmii_iomux_pins .clko != NULL , ESP_ERR_NOT_SUPPORTED , TAG , "target does not support RMII CLKO IOMUX" );
203212
204- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (num , emac_rmii_iomux_pins .clko , false), TAG , "invalid RMII CLK output GPIO number" );
213+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (num , emac_rmii_iomux_pins .clko , emac_io_idx .rmii_refclk_o_idx , false),
214+ TAG , "invalid RMII CLK output GPIO number" );
205215 return ESP_OK ;
206216}
207217
208218esp_err_t emac_esp_iomux_init_rmii (const eth_mac_rmii_gpio_config_t * rmii_gpio )
209219{
210220 ESP_RETURN_ON_FALSE (emac_rmii_iomux_pins .clki != NULL , ESP_ERR_NOT_SUPPORTED , TAG , "target does not support RMII IOMUX" );
211221
212- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (rmii_gpio , tx_en_num ), emac_rmii_iomux_pins .tx_en , false),
213- TAG , "invalid TX_EN GPIO number" );
214- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (rmii_gpio , txd0_num ), emac_rmii_iomux_pins .txd0 , false),
215- TAG , "invalid TXD0 GPIO number" );
216- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (rmii_gpio , txd1_num ), emac_rmii_iomux_pins .txd1 , false),
217- TAG , "invalid TXD1 GPIO number" );
218- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (rmii_gpio , crs_dv_num ), emac_rmii_iomux_pins .crs_dv , true),
219- TAG ,"invalid CRS_DV GPIO number" );
220- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (rmii_gpio , rxd0_num ), emac_rmii_iomux_pins .rxd0 , true),
221- TAG ,"invalid RXD0 GPIO number" );
222- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (rmii_gpio , rxd1_num ), emac_rmii_iomux_pins .rxd1 , true),
223- TAG ,"invalid RXD1 GPIO number" );
222+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (rmii_gpio , tx_en_num ), emac_rmii_iomux_pins .tx_en ,
223+ emac_io_idx . mii_tx_en_o_idx , false), TAG , "invalid TX_EN GPIO number" );
224+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (rmii_gpio , txd0_num ), emac_rmii_iomux_pins .txd0 ,
225+ emac_io_idx . mii_txd0_o_idx , false), TAG , "invalid TXD0 GPIO number" );
226+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (rmii_gpio , txd1_num ), emac_rmii_iomux_pins .txd1 ,
227+ emac_io_idx . mii_txd1_o_idx , false), TAG , "invalid TXD1 GPIO number" );
228+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (rmii_gpio , crs_dv_num ), emac_rmii_iomux_pins .crs_dv ,
229+ emac_io_idx . mii_crs_i_idx , true), TAG ,"invalid CRS_DV GPIO number" );
230+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (rmii_gpio , rxd0_num ), emac_rmii_iomux_pins .rxd0 ,
231+ emac_io_idx . mii_rxd0_i_idx , true), TAG ,"invalid RXD0 GPIO number" );
232+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (GET_GPIO_OR_SINGLE (rmii_gpio , rxd1_num ), emac_rmii_iomux_pins .rxd1 ,
233+ emac_io_idx . mii_rxd1_i_idx , true), TAG ,"invalid RXD1 GPIO number" );
224234
225235 return ESP_OK ;
226236}
@@ -229,31 +239,35 @@ esp_err_t emac_esp_iomux_rmii_init_tx_er(int num)
229239{
230240 ESP_RETURN_ON_FALSE (emac_rmii_iomux_pins .tx_er != NULL , ESP_ERR_NOT_SUPPORTED , TAG , "target does not support RMII TX_ER IOMUX" );
231241
232- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (num , emac_rmii_iomux_pins .tx_er , false), TAG , "invalid TX_ER GPIO number" );
242+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (num , emac_rmii_iomux_pins .tx_er , emac_io_idx .mii_tx_er_o_idx , false),
243+ TAG , "invalid TX_ER GPIO number" );
233244 return ESP_OK ;
234245}
235246
236247esp_err_t emac_esp_iomux_rmii_init_rx_er (int num )
237248{
238249 ESP_RETURN_ON_FALSE (emac_rmii_iomux_pins .rx_er != NULL , ESP_ERR_NOT_SUPPORTED , TAG , "target does not support RMII RX_ER IOMUX" );
239250
240- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (num , emac_rmii_iomux_pins .rx_er , true), TAG , "invalid RX_ER GPIO number" );
251+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (num , emac_rmii_iomux_pins .rx_er , emac_io_idx .mii_rx_er_i_idx , true),
252+ TAG , "invalid RX_ER GPIO number" );
241253 return ESP_OK ;
242254}
243255
244256esp_err_t emac_esp_iomux_mii_init_tx_er (int num )
245257{
246258 ESP_RETURN_ON_FALSE (emac_mii_iomux_pins .tx_er != NULL , ESP_ERR_NOT_SUPPORTED , TAG , "target does not support MII TX_ER IOMUX" );
247259
248- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (num , emac_mii_iomux_pins .tx_er , false), TAG , "invalid TX_ER GPIO number" );
260+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (num , emac_mii_iomux_pins .tx_er , emac_io_idx .mii_tx_er_o_idx , false),
261+ TAG , "invalid TX_ER GPIO number" );
249262 return ESP_OK ;
250263}
251264
252265esp_err_t emac_esp_iomux_mii_init_rx_er (int num )
253266{
254267 ESP_RETURN_ON_FALSE (emac_mii_iomux_pins .rx_er != NULL , ESP_ERR_NOT_SUPPORTED , TAG , "target does not support RMII RX_ER IOMUX" );
255268
256- ESP_RETURN_ON_ERROR (emac_esp_iomux_init (num , emac_mii_iomux_pins .rx_er , true), TAG , "invalid RX_ER GPIO number" );
269+ ESP_RETURN_ON_ERROR (emac_esp_iomux_init (num , emac_mii_iomux_pins .rx_er , emac_io_idx .mii_rx_er_i_idx , true),
270+ TAG , "invalid RX_ER GPIO number" );
257271 return ESP_OK ;
258272}
259273
0 commit comments