Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 启用流控制时serdev未发送_C_Linux_Linux Device Driver - Fatal编程技术网

C 启用流控制时serdev未发送

C 启用流控制时serdev未发送,c,linux,linux-device-driver,C,Linux,Linux Device Driver,我创建了一个serdev设备驱动程序,并希望为硬件流控制启用CTS/RTS引脚。当流控制像这样被禁用时:serdev\u device\u set\u flow\u control(serdev,false)它正在发送。但一旦我启用它,它将不再发送。 所以我看了一下实施情况: void serdev_device_set_flow_control(struct serdev_device *serdev, bool enable) { struct serdev_controller *

我创建了一个serdev设备驱动程序,并希望为硬件流控制启用CTS/RTS引脚。当流控制像这样被禁用时:
serdev\u device\u set\u flow\u control(serdev,false)它正在发送。但一旦我启用它,它将不再发送。
所以我看了一下实施情况:

void serdev_device_set_flow_control(struct serdev_device *serdev, bool enable)
{
    struct serdev_controller *ctrl = serdev->ctrl;

    if (!ctrl || !ctrl->ops->set_flow_control)
        return;

    ctrl->ops->set_flow_control(ctrl, enable);
}
在调用它之前,我验证了我的控制器是否存在,并且我的属性
set\u flow\u control
是否为
true
。看起来不错。所以应该设定。但它不再发送了

感谢您的反馈,以下是我的建议:

    struct serdev_controller *ctrl = serdev->ctrl;
    struct stmuart *stm;
    int speed = 3000000u;
    int ret;

    pr_info("Insert Network driver\n");
    
    stm = devm_kzalloc(&serdev->dev, sizeof(*stm), GFP_KERNEL);
    
    stm->serdev = serdev;

    INIT_WORK(&stm->tx_work, stmuart_transmit);

    serdev_device_set_drvdata(serdev, stm);
    serdev_device_set_client_ops(serdev, &stm_serdev_ops);

    ret = serdev_device_open(serdev);
    if (ret) {
        dev_err(&serdev->dev, "Unable to open device\n");
        goto free;
    }
    
    speed = serdev_device_set_baudrate(serdev, speed);
    dev_info(&serdev->dev, "Using baudrate: %u\n", speed);

    serdev_device_set_flow_control(serdev, true);
    dev_info(&serdev->dev, "set_flow_control: %s\n", ctrl->ops->set_flow_control ? "true" : "false");
    
    return 0;
    
free:
    return ret;
我用oszi检查了它,它没有发送,CTS和RTS引脚也没有改变

这是我的设备树配置

usart3: serial@4000f000 {
            compatible = "st,stm32h7-uart";
            reg = <0x4000f000 0x400>;
            interrupts-extended = <&exti 28 IRQ_TYPE_LEVEL_HIGH>;
            clocks = <&rcc USART3_K>;
            wakeup-source;
            power-domains = <&pd_core>;
            dmas = <&dmamux1 45 0x400 0x15>,
                   <&dmamux1 46 0x400 0x11>;
            dma-names = "rx", "tx";
            status = "ok";
            
            ethernet {
                compatible = "st,stm32_usart_net";
                local-mac-address = [ A0 B0 C0 D0 E0 F0 ];
                current-speed = <38400>;
                };
        };
usart3:serial@4000f000 {
compatible=“st、stm32h7 uart”;
reg=;
中断扩展=;
时钟=;
唤醒源;
幂域=;
dmas=,
;
dma名称=“接收”、“发送”;
status=“ok”;
以太网{
compatible=“st、stm32\U usart\U net”;
本地mac地址=[A0 B0 C0 D0 E0 F0];
当前速度=;
};
};
我的另一个设备树文件

&usart3 {
    pinctrl-names = "default", "sleep", "idle";
    pinctrl-0 = <&usart3_pins_c>;
    pinctrl-1 = <&usart3_sleep_pins_c>;
    pinctrl-2 = <&usart3_idle_pins_c>;
    uart-has-rtscts;
    status = "ok";
};
&usart3{
pinctrl names=“默认”、“睡眠”、“空闲”;
pinctrl-0=;
pinctrl-1=;
pinctrl-2=;
uart具有RTSCT;
status=“ok”;
};

我禁用了硬件流量控制,并尝试使用
serdev_device_set_tiocm(serdev,0,tiocm_RTS)手动设置RTS但它不会改变。

问题比您的代码示例当前显示的要严重得多。这个函数是如何调用的?
struct serdev_device*serdev
的成员在作为参数传递之前是如何初始化的。这篇文章需要更新足够的信息(包括这些问题的答案),以便排除故障并提供建议。如果可能,请提供以下内容:
ctrl->ops->set\u flow\u control(ctrl,enable)<代码>C
不能有成员函数。我很确定你发布的代码没有编译。此外,请包括
struct
struct-serdev\u设备
struct-serdev\u控制器
@ryyker的定义,它可能只是一些函数指针。这很好。因为在启用硬件流控制时它停止了发送,这表明硬件流控制功能工作正常。只有当CTS输入信号被断言时,它才会传输。您已经提到CTS/RTS引脚没有改变,但是您没有提到这些信号的初始状态,这在这里似乎是相关的(尤其是CTS)。