调试LTE模块碰到的4字节对齐问题

    最近在调试LTE模块,有两个模块,碰到两种4字节对齐问题,其错误提示都是类似如下的内容:
    DWC_OTG: dwc_otg_hcd_urb_enqueue urb->transfer_buffer address not align to 4-byte 0xee419e8e
    都是USB控制器处理的数据时需要4字节对齐要求。
    第一种情况是驱动时处理GPS数据时出现上面的错误提示,处理方法如下:
    将原来的:
    const char startMessage[] = "$GPS_START";
    const char stopMessage[] = "$GPS_STOP";
    修改为:
    const char startMessage[] __attribute__((aligned (4))) = "$GPS_START";
    const char stopMessage[] __attribute__((aligned (4))) = "$GPS_STOP";
    第二种情况是模块上网后收发数据时均提示对齐问题,这样模块根本就无法上网了,相应的处理如下:
    将相应的rx_submit函数中的skb_reserve (skb, NET_IP_ALIGN);函数注释掉;
    在相应的xxxx_start_xmit函数的变量定义后添加如下内容:
    length = ((unsigned long)skb->data) & 0x3;
    if (length) {
            if (skb_cloned(skb) ||
                ((skb_headroom(skb) < length) &&
                 (skb_tailroom(skb) < (4-length)))) {
                    struct sk_buff *skb2;
                   
                    skb2 = skb_copy_expand(skb, 0, 4, GFP_ATOMIC);
                    dev_kfree_skb_any(skb);
                    skb = skb2;
                    if (!skb)
                            goto drop;
            } else {
                   
                    length = ((skb_headroom(skb) >= length) ? 0 : 4)-length;
                    memmove(skb->data+length, skb->data, skb->len);
                    skb_reserve(skb, length);
            }
    }
    至此,驱动部分的4字节对齐问题就处理好了。
    参考网址:

评论

此博客中的热门博文

I/O映射之I/O端口

通过Netlink检测网线插拔

使用seq_file