项目背景

WiFi模块rlt8812au 替换成rlt8812cu,支持rlt8812cu驱动且保持兼容原有模块

驱动移植

根据厂家提供的驱动包,修改makefile和Kconfig文件,根据需要修改部分源码,完成驱动移植。移植验证ok之后,rlt8812cu驱动生效。现在考虑兼容问题:

1、将两个模块均静态编译进内核。编译时发现报错,提示很多函数重复定义,显然该方法不可行。

2、将两个WiFi驱动模块均动态编译。这种方法需要业务将两个模块都加载即可,(不会因为是一家厂两份驱动包含了很多同名的函数而造成模块的驱动加载失败,每一个驱动模块加载,系统会准备一块地址空间,将该ko映射到该空间,所以每一个ko(或者静态加载到内核的驱动所包含的函数)对用的地址是不一样的,他会根据地址来查找对应的函数,后面详细表述见验证部分)

3、将之前的模块加载的WiFi驱动保留,将另一种驱动静态包含到内核当中。这样当新模块使用时直接使用内核当中的驱动,使用老wifi模块时调用ko,也不会出现相同函数错乱调用的情况,原理一样:根据地址来查找对应的函数。这样只修改小系统即可,业务不做改动。

验证

# cat /proc/kallsyms 
分别查看新模块驱动静态加载到内核与新模块静态加载到内核并且老模块动态加载的kallsyms 文件。

1)新模块驱动静态加载到内核与新模块静态加载到内核并且老模块动态加载对比发现:新模块静态加载到内核所调用的函数地址是一样的。新模块驱动静态加载到内核与新模块静态加载到内核并且老模块动态加载函数对比,动态加载的函数虽然和静态调用 的函数名相同,但是调用的时动态加载的函数。

总结

基于以上验证加载同一厂家不同模块大胆去做吧,除了两个模块都包含到内核编译出现函数多次定义之外,不要因为有相同的函数名而造成调用错乱问题而担忧。

补充知识(参考文章如下)

https://www.xuebuyuan.com/598359.html

在内核中通过/proc/kallsyms获得符号的地址

Linux内核符号表/proc/kallsyms的形成过程
---------------------------------------------------------------------------

./scripts/kallsyms.c负责生成System.map
./kernel/kallsyms.c负责生成/proc/kallsyms

./scripts/kallsyms.c解析vmlinux(.tmp_vmlinux)生成kallsyms.S(.tmp_kallsyms.S),然后内核编译过程中将kallsyms.S(内核符号表)编入内核镜像uImage

内核启动后./kernel/kallsyms.c解析uImage形成/proc/kallsyms

/proc/kallsyms包含了内核中的函数符号(包括没有EXPORT_SYMBOL)、全局变量(用EXPORT_SYMBOL导出的全局变量)

如何将内核中的函数、全局变量、静态变量都导出到/proc/kallsyms
------------------------------------------------------------------------
./scripts/kallsyms

static int all_symbols = 0;
==>
static int all_symbols = 1;

引入kallsyms
------------------------------------------------------------------------
    在2.6内核中,为了更好地调试内核,引入了kallsyms。kallsyms抽取了内核用到的所有函数地址(全局的、静态的)和非栈数据变量地址,生成一个数据块,作为只读数据链接进kernel image,相当于内核中存了一个System.map。需要配置CONFIG_KALLSYMS

.config
CONFIG_KALLSYMS=y
CONFIG_KALLSYMS_ALL=y 符号表中包括所有的变量(包括没有用EXPORT_SYMBOL导出的变量)
CONFIG_KALLSYMS_EXTRA_PASS=y

make menuconfig
General setup  --->  
    [*] Configure standard kernel features (for small systems)  --->
        [*]   Load all symbols for debugging/ksymoops
        [*]     Include all symbols in kallsyms
        [*]     Do an extra kallsyms pass

注: 配置CONFIG_KALLSYMS_ALL之后,就不需要修改all_symbol静态变量为1了

|--------------------|
                   |                    |
                   |                    |
                   ~                    ~
                   |                    |
                   |                    |
0xc05d 1dc0        |--------------------| _end
                   |                    |
                   |                    |
                   |    BSS             |
                   |                    |
                   |                    |
0xc05a 4500        |--------------------| __bss_start
                   |                    |
0xc05a 44e8        |--------------------| _edata
                   |                    |
                   |                    |
                   |    DATA            |
                   |                    |
                   |                    |
0xc058 2000        |--------------------| __data_start  init_thread_union
                   |                    | 
0xc058 1000 _etext |--------------------|
                   |                    |
                   | rodata             |
                   |                    |
0xc056 d000        |--------------------| __start_rodata
                   |                    |
                   |                    |
                   | Real text          |
                   |                    |
                   |                    |
0xc02a 6000   TEXT |--------------------| _text        __init_end  
 
                   |                    |
                   | Exit code and data | DISCARD
这个section在内核完成初始化后
                   |                    |        
会被释放掉
0xc002 30d4        |--------------------| _einittext
                   |                    |
                   | Init code and data |
                   |                    |
0xc000 8000 _stext |--------------------|<------------ __init_begin
                   |                    |
0xc000 0000        |--------------------|

arch/arm/kernel/vmlinux.lds.S

注:
1. 文本段中的只读段均为变量
2. 文本段中的INIT断,可视为变量,因为命令中不会调用初始化函数,另外该区域在内核启动完成后,已经被bootmem释放了,所以该区域可能会被另作它用
3.
T   The symbol is in the text(code) section
D   The symbol is in the initialized data section
R   The sysbol is in a read only data section
t   static
d   static
R   const
r   static const

转存失败重新上传取消

WiFi模块驱动移植相关推荐

  1. Linux WIFI模块驱动移植

    作者 QQ群:852283276 微信:arm80x86 微信公众号:青儿创客基地 B站:主页 https://space.bilibili.com/208826118 参考 请问有知道atheros ...

  2. STM32之 ESP8266 WIFI 模块驱动代码-可以通过互联网实现数据远程传输(程序稳定,清晰明了非常容易移植到51单片机上)

    成品展示部分 :(ESP8266只是其中一个小部分而已) 实物图: 基于互联网的农业大棚环境监控系统设计 电路图: 农业大棚环境监控设计电路图(彩色)  调试部分:ESP8266 WIFI 模块串口调 ...

  3. Linux 开发板4G转WiFi热点 手机连接热点上网(三 WiFi模块的移植及AP的建立)

    这里对WiFi模块的驱动就不做详细介绍,本篇文章可能会涉及两款WiFi模块,一个是USB接口的WiFi模块,一个是SDIO接口的wifi模块,即AP6212,平台可能涉及爱特梅尔和三星的4418两个平 ...

  4. Android 开机自动加载新wifi模块驱动

    在android ROM 开发中经常会遇到产品更换wifi模块的情况,一般常见的wifi驱动android内核中自带都有,无需过多调试,要是碰上内核中没有的就需要根据厂商提供的驱动进行移植. wifi ...

  5. linux ec20 usb驱动移植,linux下EC20 4G模块驱动移植

    之前有移植过ME909s MU609,主要工作就是把4G模块当做USB设备,挂载在linux上,驱动移植主要是能够让板子识别到模块,并产生SUB多个虚拟的节点,用于操作模块,拨号上网 关于内核的配置, ...

  6. linux 7260驱动程序,Debian 7.6安装Intel Wireless 7260 wifi模块驱动和固件的方法

    0.内核以及发行版 Version 信息 Debian 7.6 Wheezy Linux fyp-tp 3.2.0-4-amd64 #1 SMP Debian 3.2.60-1+deb7u3 x86_ ...

  7. MT7601 无线wifi网卡驱动移植

    注意:本博客来源于朱老师项目积木-usb wifi移植部分,本博客仅供学习和交流 一.准备工作 1.MT7601驱动下载 点击下载 2.插入usb WiFi 启动开发板linux,lsusb查看usb ...

  8. USB无线网卡-----MT7601 无线wifi网卡驱动移植

    备注:次博客为转载,原作者地址请点击此处 注意:本博客来源于朱老师项目积木-usb wifi移植部分,本博客仅供学习和交流 一.准备工作 1.MT7601驱动下载 点击下载 2.插入usb WiFi ...

  9. RT73 wifi无线网卡驱动移植过程 和wpa支持

    转 移植环境: 主机操作系统:Ubantu 8.10 目标系统:linux-2.6.22.6 交叉编译器:arm-softfloat-linux-gnu-gcc-3.4.5 一.RT73驱动编译 1. ...

最新文章

  1. Java 分布式 RPC 框架性能大比拼,Dubbo 排第几?
  2. python右对齐输出如果结果超过30个字符_Python3 输出字符串左对齐、右对齐、居中对齐...
  3. java 默认网关,java 获得默认网关 和 子网掩码 本机
  4. 关于添加图片到svg中,rails下使用js, 用parseFloat来调整force.on时的位置
  5. Redis中的Sentinel 连接使用
  6. μC/OS-Ⅱ的移植
  7. 运营管理最新版史蒂文森_运营增长人都在看的硬核案例拆解是怎么做的?
  8. Diango博客--25.使用Coverage统计测试覆盖率
  9. Express接口综合案例(创建项目、配置常用中间件、路由设计、提取控制器模块、配置错误统一处理中间件、用户注册的数据验证,密码加密)
  10. Java 串口 mysql_java串口通讯
  11. 《Flume日志收集与MapReduce模式》一2.1 下载Flume
  12. 在网页上获取当前日期,数字时钟
  13. 全球五百强IT名企智力题精选
  14. nvivo服务器项目,【NVivo教程】在Nvivo中设置案例路线图
  15. Renascence架构介绍——目录
  16. ROM RAM FLASH说明
  17. 因果分析:原理、方法论、应用
  18. TIOBE 8 月编程语言排行榜:数据挖掘和人工智能语言强势崛起!
  19. android studio一个好看的字体设置
  20. VICA 架构设计(1)

热门文章

  1. 计算机岗位需要具备什么技能点
  2. AutoCAD .Net 入门实例
  3. 计算机等级考试二级公共基础(C语言)(二)
  4. SPWM波调制度原理
  5. jmeter tcp sampler 测试网速
  6. 三本毕业论文查重吗?
  7. 计算机图形学(2):OpenGL画球体
  8. JAVA爬取虎嗅网截图_java爬虫爬取网站使用多线程(虎嗅网站)
  9. 重磅 | 阿里宣布组织架构大调整,新成立阿里云智能事业群,张建锋兼任总裁...
  10. 关于取模运算(mod)和求余(rem)运算