如何解决在 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 方法。所以我只在调用这个方法时切换我的 pin。但是当我查看我的示波器时,我可以看到该引脚只是有时会被切换。
我的发送方法如下:
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,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,但是我没有看到当网络设备想要发送包时调用的另一种方法。 在我看来,当 netdevice 发送 ARP 请求时,引脚不会切换。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。