如何解决将 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 举报,一经查实,本站将立刻删除。