DWC_otg驱动要求DMA地址4字节对齐
但是在蓝牙的usb驱动中
节选自linux/net/bluetooth/hci_sock.c文件中的hci_sock_sendmsg函数
if (!test_bit(HCI_UP, &hdev->flags)) {
err = -ENETDOWN;
goto done;
}
skb = bt_skb_send_alloc(sk, len, msg->msg_flags & MSG_DONTWAIT, &err);
if (!skb)
goto done;
if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)) {
err = -EFAULT;
goto drop;
}
bt_cb(skb)->pkt_type = *((unsigned char *) skb->data);
skb_pull(skb, 1);
注意在bt_skb_send_alloc函数分配skb->data的时候预留了8个字节
此时skb->data还是4字节对齐的
但是随后内核中使用skb_pull(skb, 1);向后移动了一个字节
所以skb->data一定不是4字节对齐了
通过urb传递到控制器驱动的时候出错
在bt_skb_send_alloc完成后再使用skb_reserve(skb, 3);增加3个字节预留
这样随后skb_pull(skb, 1);便可以保证skb->data仍然是4字节对齐了
if (!test_bit(HCI_UP, &hdev->