linux-device-driver - 在 Netdevice 中切换 GPIO
问题描述
嗨,我想在发送包裹时总是切换 GPIO 引脚。但我有一个奇怪的行为,有时我的 pin 会被切换,有时不会。我检查了我的内核日志,没有无法切换引脚的信息。我的操作如下所示:
static const struct net_device_ops stmuart_netdev_ops = {
.ndo_init = stmuart_netdev_init,
.ndo_uninit = stmuart_netdev_uninit,
.ndo_open = stmuart_netdev_open,
.ndo_stop = stmuart_netdev_close,
.ndo_start_xmit = stmuart_netdev_xmit,
.ndo_set_mac_address = eth_mac_addr,
.ndo_tx_timeout = stmuart_netdev_tx_timeout,
.ndo_validate_addr = eth_validate_addr,
};
据我所知,只要我想发送一个包,就会调用 ndo_start_xmit 方法。所以我只在调用此方法时切换我的引脚。但是当我查看我的示波器时,我可以看到引脚有时会被切换。
我的发送方法如下:
static netdev_tx_t
stmuart_netdev_xmit(struct sk_buff *skb, struct net_device *dev)
{
struct net_device_stats *n_stats = &dev->stats;
struct stmuart *stm = netdev_priv(dev);
u8 pad_len = 0;
int written;
u8 *pos;
spin_lock(&stm->lock);
gpiod_set_value(stm->rts_gpio, 1);
WARN_ON(stm->tx_left);
if (!netif_running(dev)) {
spin_unlock(&stm->lock);
netdev_warn(stm->net_dev, "xmit: iface is down\n");
goto out;
}
pos = stm->tx_buffer;
if (skb->len < STMFRM_MIN_LEN)
pad_len = STMFRM_MIN_LEN - skb->len;
pos += stmfrm_create_header(pos, skb->len + pad_len);
memcpy(pos, skb->data, skb->len);
pos += skb->len;
if (pad_len) {
memset(pos, 0, pad_len);
pos += pad_len;
}
pos += stmfrm_create_footer(pos);
netif_stop_queue(stm->net_dev);
written = serdev_device_write_buf(stm->serdev, stm->tx_buffer,
pos - stm->tx_buffer);
if (written > 0) {
stm->tx_left = (pos - stm->tx_buffer) - written;
stm->tx_head = stm->tx_buffer + written;
n_stats->tx_bytes += written;
}
spin_unlock(&stm->lock);
out:
gpiod_set_value(stm->rts_gpio, 0);
netif_trans_update(dev);
dev_kfree_skb_any(skb);
return NETDEV_TX_OK;
}
所以我检查了 netdevice.h 但我没有看到当网络设备想要发送包时调用的另一种方法。在我看来,当网络设备发送 ARP 请求时,pin 没有被切换。
解决方案
推荐阅读
- openssl - OpenVpn TSL 失败
- react-typescript - 从 iframe 内的 PDF 工具栏中删除标题
- reactjs - 如何在componentDidMount中的按钮上设置焦点
- reactjs - 如何使 rechart 的 lineChart DOT 像滑块的拇指一样移动?
- docker - docker 在安装 label-studio 时显示有关绝对路径的错误
- azure - ILogger.LogError() 无法记录异常详细信息,它是否被 Azure Function 应用程序中的 TelemetryClient() 取代
- wso2 - WSO2 APIM 更新芭蕾舞演员证书
- python - Python - 使用 .tolist() 创建列表后无法删除数据框
- r - ggplot、构面、饼图、缺失值
- networking - 使用动态 ip 请求访问本地网络之外的路由器