C 启用流控制时serdev未发送
我创建了一个serdev设备驱动程序,并希望为硬件流控制启用CTS/RTS引脚。当流控制像这样被禁用时: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\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)。