Allow pins 0 and 1 as RTS/DTR for USB UART Bridge (#1864)
* Allow pins 0 and 1 as RTS/DTR for USB UART Bridge * add logic to gpio_scene_usb_uart_config, fix flow_pins * fixing count of pins * disable PC0,PC1 RTS/DTR when using LPUART * add logic to ensure flow pins dont overlap with uart lines Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
		
							parent
							
								
									56f760aa07
								
							
						
					
					
						commit
						72713d6f4e
					
				@ -24,6 +24,7 @@ struct GpioApp {
 | 
			
		||||
    Widget* widget;
 | 
			
		||||
 | 
			
		||||
    VariableItemList* var_item_list;
 | 
			
		||||
    VariableItem* var_item_flow;
 | 
			
		||||
    GpioTest* gpio_test;
 | 
			
		||||
    GpioUsbUart* gpio_usb_uart;
 | 
			
		||||
    UsbUartBridge* usb_uart_bridge;
 | 
			
		||||
 | 
			
		||||
@ -13,7 +13,7 @@ static UsbUartConfig* cfg_set;
 | 
			
		||||
 | 
			
		||||
static const char* vcp_ch[] = {"0 (CLI)", "1"};
 | 
			
		||||
static const char* uart_ch[] = {"13,14", "15,16"};
 | 
			
		||||
static const char* flow_pins[] = {"None", "2,3", "6,7"};
 | 
			
		||||
static const char* flow_pins[] = {"None", "2,3", "6,7", "16,15"};
 | 
			
		||||
static const char* baudrate_mode[] = {"Host"};
 | 
			
		||||
static const uint32_t baudrate_list[] = {
 | 
			
		||||
    2400,
 | 
			
		||||
@ -33,6 +33,24 @@ bool gpio_scene_usb_uart_cfg_on_event(void* context, SceneManagerEvent event) {
 | 
			
		||||
    return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void line_ensure_flow_invariant(GpioApp* app) {
 | 
			
		||||
    // GPIO pins PC0, PC1 (16,15) are unavailable for RTS/DTR when LPUART is
 | 
			
		||||
    // selected. This function enforces that invariant by resetting flow_pins
 | 
			
		||||
    // to None if it is configured to 16,15 when LPUART is selected.
 | 
			
		||||
 | 
			
		||||
    uint8_t available_flow_pins = cfg_set->uart_ch == FuriHalUartIdLPUART1 ? 3 : 4;
 | 
			
		||||
    VariableItem* item = app->var_item_flow;
 | 
			
		||||
    variable_item_set_values_count(item, available_flow_pins);
 | 
			
		||||
 | 
			
		||||
    if(cfg_set->flow_pins >= available_flow_pins) {
 | 
			
		||||
        cfg_set->flow_pins = 0;
 | 
			
		||||
        usb_uart_set_config(app->usb_uart_bridge, cfg_set);
 | 
			
		||||
 | 
			
		||||
        variable_item_set_current_value_index(item, cfg_set->flow_pins);
 | 
			
		||||
        variable_item_set_current_value_text(item, flow_pins[cfg_set->flow_pins]);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void line_vcp_cb(VariableItem* item) {
 | 
			
		||||
    GpioApp* app = variable_item_get_context(item);
 | 
			
		||||
    uint8_t index = variable_item_get_current_value_index(item);
 | 
			
		||||
@ -54,6 +72,7 @@ static void line_port_cb(VariableItem* item) {
 | 
			
		||||
    else if(index == 1)
 | 
			
		||||
        cfg_set->uart_ch = FuriHalUartIdLPUART1;
 | 
			
		||||
    usb_uart_set_config(app->usb_uart_bridge, cfg_set);
 | 
			
		||||
    line_ensure_flow_invariant(app);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void line_flow_cb(VariableItem* item) {
 | 
			
		||||
@ -116,9 +135,12 @@ void gpio_scene_usb_uart_cfg_on_enter(void* context) {
 | 
			
		||||
    variable_item_set_current_value_index(item, cfg_set->uart_ch);
 | 
			
		||||
    variable_item_set_current_value_text(item, uart_ch[cfg_set->uart_ch]);
 | 
			
		||||
 | 
			
		||||
    item = variable_item_list_add(var_item_list, "RTS/DTR Pins", 3, line_flow_cb, app);
 | 
			
		||||
    item = variable_item_list_add(
 | 
			
		||||
        var_item_list, "RTS/DTR Pins", COUNT_OF(flow_pins), line_flow_cb, app);
 | 
			
		||||
    variable_item_set_current_value_index(item, cfg_set->flow_pins);
 | 
			
		||||
    variable_item_set_current_value_text(item, flow_pins[cfg_set->flow_pins]);
 | 
			
		||||
    app->var_item_flow = item;
 | 
			
		||||
    line_ensure_flow_invariant(app);
 | 
			
		||||
 | 
			
		||||
    variable_item_list_set_selected_item(
 | 
			
		||||
        var_item_list, scene_manager_get_scene_state(app->scene_manager, GpioAppViewUsbUartCfg));
 | 
			
		||||
 | 
			
		||||
@ -14,6 +14,7 @@
 | 
			
		||||
static const GpioPin* flow_pins[][2] = {
 | 
			
		||||
    {&gpio_ext_pa7, &gpio_ext_pa6}, // 2, 3
 | 
			
		||||
    {&gpio_ext_pb2, &gpio_ext_pc3}, // 6, 7
 | 
			
		||||
    {&gpio_ext_pc0, &gpio_ext_pc1}, // 16, 15
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
typedef enum {
 | 
			
		||||
 | 
			
		||||
@ -396,6 +396,10 @@ void variable_item_set_current_value_index(VariableItem* item, uint8_t current_v
 | 
			
		||||
    item->current_value_index = current_value_index;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void variable_item_set_values_count(VariableItem* item, uint8_t values_count) {
 | 
			
		||||
    item->values_count = values_count;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void variable_item_set_current_value_text(VariableItem* item, const char* current_value_text) {
 | 
			
		||||
    furi_string_set(item->current_value_text, current_value_text);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -81,6 +81,13 @@ uint8_t variable_item_list_get_selected_item_index(VariableItemList* variable_it
 | 
			
		||||
 */
 | 
			
		||||
void variable_item_set_current_value_index(VariableItem* item, uint8_t current_value_index);
 | 
			
		||||
 | 
			
		||||
/** Set number of values for item
 | 
			
		||||
 *
 | 
			
		||||
 * @param      item                 VariableItem* instance
 | 
			
		||||
 * @param      values_count         The new values count
 | 
			
		||||
 */
 | 
			
		||||
void variable_item_set_values_count(VariableItem* item, uint8_t values_count);
 | 
			
		||||
 | 
			
		||||
/** Set item current selected text
 | 
			
		||||
 *
 | 
			
		||||
 * @param      item                VariableItem* instance
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user