@@ -221,6 +221,7 @@ struct adrv9002_common {
221
221
struct iio_widget w [NUM_MAX_WIDGETS ];
222
222
uint16_t num_widgets ;
223
223
bool enabled ;
224
+ bool enable_gpio ;
224
225
uint8_t idx ;
225
226
};
226
227
@@ -499,24 +500,46 @@ static void save_orx_powerdown(GtkWidget *widget, struct adrv9002_orx *orx)
499
500
g_free (t_ensm );
500
501
}
501
502
502
- static void save_ensm (GtkWidget * w , struct iio_widget * widget )
503
+ static void save_ensm (GtkWidget * w , struct adrv9002_common * chann )
503
504
{
504
- widget -> save (widget );
505
+ gchar * ensm = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (chann -> ensm .widget ));
506
+ gchar * port_en = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (chann -> port_en .widget ));
507
+
508
+ if (!strcmp (port_en , "pin" ) && !strcmp (ensm , "calibrated" )) {
509
+ dialog_box_message_error (chann -> ensm .widget , "Enable State Mode" ,
510
+ "Only primed or rf_enabled possible when pin mode is enabled" );
511
+ goto out_free ;
512
+ }
513
+
514
+ chann -> ensm .save (& chann -> ensm );
505
515
/*
506
516
* If it is a transition to rf_enabled, it can take some time and so, we
507
517
* can still get the old value if we do not wait a bit...
508
518
*/
509
519
usleep (2000 );
510
- iio_widget_update_block_signals_by_data (widget );
520
+
521
+ out_free :
522
+ iio_widget_update_block_signals_by_data (& chann -> ensm );
523
+ g_free (ensm );
524
+ g_free (port_en );
511
525
}
512
526
513
527
static void save_port_en (GtkWidget * widget , struct adrv9002_common * chann )
514
528
{
515
529
char * port_en ;
516
530
517
531
iio_widget_save_block_signals_by_data (& chann -> port_en );
518
- port_en = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (widget ));
532
+ if (chann -> enable_gpio ) {
533
+ /*
534
+ * If we can control RF state when in pin mode, there's no need to
535
+ * control the sensitivity. Hence, just update the RF state widget (as
536
+ * it can change when moving from pin to spi and vice versa) and bail out.
537
+ */
538
+ iio_widget_update_block_signals_by_data (& chann -> ensm );
539
+ return ;
540
+ }
519
541
542
+ port_en = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (widget ));
520
543
if (port_en && strcmp (port_en , "spi" )) {
521
544
gtk_widget_set_sensitive (chann -> ensm .widget , false);
522
545
} else {
@@ -653,7 +676,7 @@ static void update_special_widgets(struct adrv9002_common *chann, const char *en
653
676
if (gain_ctl && strcmp (gain_ctl , "spi" ))
654
677
iio_widget_update_block_signals_by_data (& chann -> gain );
655
678
656
- if (port_en && strcmp (port_en , "spi" )) {
679
+ if (port_en && strcmp (port_en , "spi" ) && ! chann -> enable_gpio ) {
657
680
if (ensm )
658
681
iio_widget_update_value (& chann -> ensm , ensm , len );
659
682
else
@@ -2777,7 +2800,7 @@ static void connect_special_signal_widgets(struct plugin_private *priv, const in
2777
2800
& priv -> rx_widgets [chann ].rx .nco_freq );
2778
2801
/* ensm mode and port en */
2779
2802
iio_make_widget_update_signal_based (& priv -> rx_widgets [chann ].rx .ensm ,
2780
- G_CALLBACK (save_ensm ), & priv -> rx_widgets [chann ].rx . ensm );
2803
+ G_CALLBACK (save_ensm ), & priv -> rx_widgets [chann ].rx );
2781
2804
iio_make_widget_update_signal_based (& priv -> rx_widgets [chann ].rx .port_en ,
2782
2805
G_CALLBACK (save_port_en ), & priv -> rx_widgets [chann ].rx );
2783
2806
/* digital gain control */
@@ -2805,7 +2828,7 @@ static void connect_special_signal_widgets(struct plugin_private *priv, const in
2805
2828
& priv -> tx_widgets [chann ].gain );
2806
2829
/* ensm mode and port en */
2807
2830
iio_make_widget_update_signal_based (& priv -> tx_widgets [chann ].ensm ,
2808
- G_CALLBACK (save_ensm ), & priv -> tx_widgets [chann ]. ensm );
2831
+ G_CALLBACK (save_ensm ), & priv -> tx_widgets [chann ]);
2809
2832
iio_make_widget_update_signal_based (& priv -> tx_widgets [chann ].port_en ,
2810
2833
G_CALLBACK (save_port_en ), & priv -> tx_widgets [chann ]);
2811
2834
/* carrier frequency */
@@ -2929,15 +2952,59 @@ static int adrv9002_dds_init(struct plugin_private *priv)
2929
2952
return ret ;
2930
2953
}
2931
2954
2932
- static void adrv9002_update_port_en_mode (const struct plugin_private * priv , const struct adrv9002_common * chan )
2955
+ static void adrv9002_update_port_en_mode (const struct plugin_private * priv , struct adrv9002_common * chan )
2933
2956
{
2934
2957
gchar * port_en = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (chan -> port_en .widget ));
2958
+ char pin_ensm [32 ];
2959
+ int ret ;
2935
2960
2936
2961
if (!port_en )
2937
2962
return ;
2938
- if (!strcmp (port_en , "pin" ))
2963
+ if (!strcmp (port_en , "pin" )) {
2939
2964
gtk_widget_set_sensitive (chan -> ensm .widget , false);
2965
+ } else {
2966
+ /*
2967
+ * Let's check if we can control the RF enable state mode even in pin mode. For
2968
+ * that, we check which mode we're and if not in pin mode, we move to that mode
2969
+ * and try to change the state. If we succeed, then it means the driver is
2970
+ * in full control of the pin controlling the RF state.
2971
+ */
2972
+ ret = iio_channel_attr_write (chan -> port_en .chn , "port_en_mode" , "pin" );
2973
+ if (ret < 0 ) {
2974
+ printf ("Could not set port to to pin (%d)\n" , ret );
2975
+ goto out ;
2976
+ }
2977
+ }
2978
+
2979
+ ret = iio_channel_attr_read (chan -> ensm .chn , "ensm_mode" , pin_ensm , sizeof (pin_ensm ));
2980
+ if (ret < 0 )
2981
+ goto out ;
2982
+
2983
+ /*
2984
+ * If we get an error just assume we can't control the state and try to bring the device
2985
+ * to the initial state.
2986
+ */
2987
+ ret = iio_channel_attr_write (chan -> ensm .chn , "ensm_mode" , "primed" );
2988
+ if (ret > 0 )
2989
+ chan -> enable_gpio = true;
2990
+
2991
+ /*
2992
+ * Go back to the previous state and to spi mode if that was the port mode
2993
+ * Not much to do in case of error, hence ignore them...
2994
+ */
2995
+ if (chan -> enable_gpio ) {
2996
+ iio_channel_attr_write (chan -> ensm .chn , "ensm_mode" , pin_ensm );
2997
+ if (!strcmp (port_en , "pin" ))
2998
+ gtk_widget_set_sensitive (chan -> ensm .widget , true);
2999
+ }
3000
+ /*
3001
+ * If spi mode had a different ensm state than pin, it will automatically move to
3002
+ * that state after changing port modes.
3003
+ */
3004
+ if (strcmp (port_en , "pin" ))
3005
+ iio_channel_attr_write (chan -> port_en .chn , "port_en_mode" , "spi" );
2940
3006
3007
+ out :
2941
3008
g_free (port_en );
2942
3009
}
2943
3010
0 commit comments