USB以太网4字节对齐问题

在移植USB以太网时遇到DWC_OTG错误,提示urb->transfer_buffer地址未按4字节对齐。通过分析源码发现,问题在于u16 buf的内存对齐。解决方案是在定义buf时添加__attribute__ ((aligned (16)))使其满足16字节对齐,从而修复网卡无法使用的状况。

<6>[   40.917524] DWC_OTG: dwc_otg_hcd_urb_enqueue urb->transfer_buffer address not align to 4-byte 0xde215bf6

在移植usb以太网的时候遇到上面字节对齐问题,导致网卡无法使用,

分析:


u16 buf __attribute__ ((aligned (16)));
buf = *((u16 *)data);
cpu_to_le16s(&buf);
ret = __ax88179_write_cmd(dev, cmd, value, index,
 size, &buf, 1);


static int __ax88179_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
      u16 size, void *data, int in_pm)
{
int ret;

#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
int (*fn)(struct usbnet *, u8, u8, u16, u16, const void *, u16);


BUG_ON(!dev);


if (!in_pm)
fn = usbnet_write_cmd;
else
fn = usbnet_write_cmd_nopm;


ret = fn(dev, cmd, USB_DIR_OUT | USB_TYPE_VENDOR |
USB_RECIP_DEVICE, value, index, data, size);


if (unlikely(ret < 0))
netdev_warn(dev->net, "Failed to write reg index 0x%04x: %d\n",
   index, ret);
#else
//printk("zougui  %s  %i date =  0x%x\n",__func__,__LINE__,data);
ret = usb_control_msg(
dev->udev,
usb_sndctrlpipe(dev->udev, 0),
cmd,
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
value,
index,
data,
size,
USB_CTRL_SET_TIMEOUT);


#endif
return ret;
}


上面将会从u16 buf的地址传到dwc_otg_hcd_urb_enqueue

    if((uint32_t)_urb->transfer_buffer & 3){
        retval = -EPERM;
        DWC_PRINT("%s urb->transfer_buffer address not align to 4-byte 0x%x\n", __func__, (uint32_t)_urb->transfer_buffer);
        goto out;
    }

其中urb->transfer_buffer就是buf的地址,


解决方法 把u16 buf ;改为   u16 buf __attribute__ ((aligned (16)));

<think>好的,我需要帮助用户查找关于USB CDC规范的相关信息。首先,用户的问题是关于USB CDC规范的细节,我需要根据提供的引用内容来整理答案。 先看一下用户提供的引用内容。引用[3]提到USB CDC类传输使用管道机制,特别是批量传输和中断传输。引用[4]和[5]讨论了CDC的分类,分为通信设备类、通信接口类和数据接口类。引用[5]还提到CDC协议分为三个部分。引用[1]和[2]虽然涉及CDC模型和USB主机初始化的代码,但可能对规范细节帮助不大。 接下来,我需要组织这些信息。首先介绍CDC的基本概念,然后分类描述各个部分,接着讲数据传输类型,可能还要提到规范中的注意事项,如CRC校验的问题。同时,用户可能需要知道如何实现或配置CDC,所以可以提及代码示例中的初始化和管道设置。 需要注意引用标记,每段引用的信息末尾添加对应的引用标识。例如,提到管道机制时引用[3],分类部分引用[4]和[5]。还要确保使用正确的中文术语,比如“批量传输”而不是“Bulk传输”。 可能用户还想了解规范的具体结构或如何获取官方文档,但现有引用中没有提到,所以可能需要建议查阅USB-IF的官方文档。此外,用户的问题可能涉及应用中的具体问题,比如数据传输错误处理,引用[1]提到CRC校验不被接受,这点需要强调。 最后,生成相关问题,考虑用户可能的后续疑问,如CDC与其它类的区别、具体实现步骤或常见问题等。</think>关于USB CDC规范的核心技术细节整理如下: ### 1. CDC类基本结构 USB CDC(Communications Device Class)规范将设备划分为三个逻辑部分: - **通信设备类**:定义设备作为通信网关的整体属性(如调制解调器、以太网适配器) - **通信接口类**:管理设备控制与状态报告,采用$中断传输$方式 - **数据接口类**:处理实际数据传输,使用$批量传输$方式[^4][^5] ### 2. 管道传输机制 在具体实现中: - 使用$IN/OUT$管道进行双向通信 - 典型配置包含: - 控制端点(端点0) - 批量传输端点(BULK IN/OUT) - 中断传输端点(用于状态监控) - TI Cortex-M4芯片示例包含7个IN/7个OUT管道[^3] ### 3. 数据传输特征 | 传输类型 | 用途 | 可靠性保证 | |------------|----------------------|------------| | 批量传输 | 大数据传输(文件等) | CRC校验 | | 中断传输 | 状态/控制信号 | 定时轮询 | | 控制传输 | 设备配置 | 最高优先级 | ### 4. 实现注意事项 - 需规避硬件限制:某些嵌入式控制器存在数据丢失风险,需通过驱动层检测处理[^1] - 协议栈初始化示例: ```c /* STM32 USB主机初始化代码片段 */ USBH_Init(&USB_OTG_Core, USB_OTG_HS_CORE_ID, &USB_Host, &USBH_MSC_cb, &USR_cb); ``` 需特别注意DMA缓冲区的4字节对齐要求[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值