微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 SKB 复制到 USART DMA

如何解决将 SKB 复制到 USART DMA

您好,我正在编写网络设备驱动程序。我已经设置了 USART。 我在探针功能注册了网络设备,如下所示:

my_net = alloc_etherdev(sizeof(struct stm32_port));
    if (my_net == NULL){
        return ENOMEM;
    }

    /* Set MAC address */
    eth_hw_addr_random(my_net);
    
    my_net -> netdev_ops = &my_net_ops;
    
    SET_NETDEV_DEV(my_net,&pdev->dev);    
    
    return register_netdev(my_net);

现在在 ndo_start_xmit 方法中,当我尝试将 socked puffer 复制到 cpu dma 地址时,我的内核总是感到恐慌

    static int my_net_send(struct sk_buff *skb,struct net_device *ndev)
{
    //struct stm32_port *priv = netdev_priv(ndev);
    //unsigned int entry = TX_BUF_L;
    //unsigned int entry = tp->cur_tx;

    struct stm32_port *lp = netdev_priv(ndev);
    struct sk_buff *sk_buff;
    unsigned pktlen = skb->len;


    /* adjust the packet length to min. required
     * and hope that the buffer is large enough
     * to provide some random data.
     */
    if (pktlen < ETH_ZLEN)
    {
        if (skb_padto(skb,ETH_ZLEN))
            return NETDEV_TX_OK;
    pktlen = ETH_ZLEN;
    }
    
    //pr_info("do_start_xmit(skb=%p,ndev=%p) len=%u\n",skb,ndev,pktlen);

    netif_stop_queue(ndev);
    //send 
    if (lp->tx_dma_busy)
        return NETDEV_TX_BUSY;
    
    //pr_info("copy to usart: %s",skb->data);
    sk_buff = skb_get(skb);
    pr_info("copy to usart: %s",sk_buff->data);
    memcpy(&lp->tx_buf[0],sk_buff,pktlen);
    //dma_addr_t dma_addr = dma_map_single(ndev->d,skb->data,skb->len,DMA_TO_DEVICE);
    
    ndev->stats.tx_packets++;
    ndev->stats.tx_bytes += pktlen;
    dev_kfree_skb (skb);
    netif_start_queue(ndev);
    return NETDEV_TX_OK;
}

struct stm32_port {
    struct uart_port port;
    struct clk *clk;
    struct stm32_usart_info *info;
    struct dma_chan *rx_ch;  /* dma rx channel            */
    dma_addr_t rx_dma_buf;   /* dma rx buffer bus address */
    unsigned char *rx_buf;   /* dma rx buffer cpu address */
    struct dma_chan *tx_ch;  /* dma tx channel            */
    dma_addr_t tx_dma_buf;   /* dma tx buffer bus address */
    unsigned char *tx_buf;   /* dma tx buffer cpu address */
    u32 cr1_irq;         /* USART_CR1_RXNEIE or RTOIE */
    u32 cr3_irq;         /* USART_CR3_RXFTIE */
    int last_res;
    bool tx_dma_busy;    /* dma tx busy               */
    bool hw_flow_control;
    bool fifoen;
    int wakeirq;
    int rdr_mask;       /* receive data register mask */
    struct mctrl_gpios *gpios; /* modem control gpios */
};

复制袜子河豚的正确方法是什么。抱歉,我是设备驱动程序的新手。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。