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

在调试LTE模块,有两个模块,碰到两种4字节对齐问题,其错误提示都是类似如下的内容:

bash 复制代码
DWC_OTG: dwc_otg_hcd_urb_enqueue urb->transfer_buffer address not align to 4-byte 0xee419e8e

都是USB控制器处理的数据时需要4字节对齐要求。

第一种情况是驱动时处理GPS数据时出现上面的错误提示,处理方法如下:

将原来的:

cpp 复制代码
const char startMessage[] = "$GPS_START";
const char stopMessage[] = "$GPS_STOP";

修改为:

cpp 复制代码
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函数的变量定义后添加如下内容:

cpp 复制代码
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字节对齐问题就处理好了。

相关推荐
好奇的菜鸟17 分钟前
WSL上的Ubuntu 24.04 (Noble Numbat) 配置阿里云镜像源,提速软件安装
linux·ubuntu·阿里云
海棠蚀omo33 分钟前
Linux信号保存的核心:未决信号集与阻塞信号集——探秘内核如何实现信号的阻塞、暂存与派发
linux·操作系统
傲世(C/C++,Linux)2 小时前
Linux系统编程——TCP服务器
linux·服务器·tcp/ip
橘子真甜~3 小时前
C/C++ Linux网络编程8 - epoll + ET Reactor TCP服务器
linux·服务器·网络
万变不离其宗_83 小时前
centos 手动安装redis
linux·redis·centos
_lst_3 小时前
linux进程状态
linux·运维·服务器
稚辉君.MCA_P8_Java4 小时前
Gemini永久会员 归并排序(Merge Sort) 基于分治思想(Divide and Conquer)的高效排序算法
java·linux·算法·spring·排序算法
wanderist.4 小时前
Linux使用经验——离线运行python脚本
linux·网络·python
biter00885 小时前
Ubuntu 22.04 有线网络时好时坏?最终解决方案
linux·网络·ubuntu
zzzsde5 小时前
【Linux】基础开发工具(3):编译器
linux·运维·服务器