首页 > 解决方案 > 在 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 没有被切换。

标签: linux-device-driverkernel-modulegpio

解决方案


推荐阅读