• PowerPC平台移植RTL8822BU


    编译驱动文件

    修改Makefile

    在这里插入图片描述

    修改代码

    由于我这边kernel用的是比较老的,有些接口不支持,所以需要做一些处理

    1. 关于isDirReadable接口
      os_dep\osdep_service.c代码中屏蔽掉下面函数
    int rtw_is_dir_readable(const char *path)
    
    • 1
    1. 关于IPV6支持
      由于我这边嵌入式中不需要IPV6 故关闭IPV6选项/kernel中开启IPV6
      关闭IPV6:include\rtw_br_ext.h代码中对CL_IPV6_PASS 宏进行屏蔽
    //#define CL_IPV6_PASS	1
    
    • 1
    1. 修改ieee80211头结构体信息
      include\ieee80211.h代码中
    struct rtw_ieee80211_hdr {
    	u16 frame_ctl;
    	u16 duration_id;
    	u8 addr1[ETH_ALEN];
    	u8 addr2[ETH_ALEN];
    	u8 addr3[ETH_ALEN];
    	u16 seq_ctrl;
    	u8 addr4[ETH_ALEN];
    } __attribute__((packed));
    
    struct ieee80211_hdr {
    	u16 frame_ctl;
    	u16 duration_id;
    	u8 addr1[ETH_ALEN];
    	u8 addr2[ETH_ALEN];
    	u8 addr3[ETH_ALEN];
    	u16 seq_ctrl;
    	u8 addr4[ETH_ALEN];
    } __attribute__((packed));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    1. 由于修改ieee80211头结构体信息,需要修改部分代码中的对于该结构体成员的引用
      core\crypto\ccmp.c、core\crypto\gcmp.c中所有frame_control改为frame_ctl
    2. 关闭P2P
      关闭P2P可以释放较大驱动空间
      include\autoconf.h中屏蔽CONFIG_P2P
    //#define CONFIG_P2P	1
    
    • 1
    1. 大小端问题
      hal\hal_com.c代码中某接口入参与函数原型的制定数据类型长度不一致,导致了大小端异常
    void rtw_dump_cur_efuse(PADAPTER padapter)
    {
    	//原来是  int mapsize =0;
    	u16 mapsize =0;
    	HAL_DATA_TYPE *hal_data = GET_HAL_DATA(padapter);
    
    	EFUSE_GetEfuseDefinition(padapter, EFUSE_WIFI, TYPE_EFUSE_MAP_LEN , (void *)&mapsize, _FALSE);
    
    	if (mapsize <= 0 || mapsize > EEPROM_MAX_SIZE) {
    		RTW_ERR("wrong map size %d\n", mapsize);
    		return;
    	}
    
    #ifdef CONFIG_RTW_DEBUG
    	if (hal_data->efuse_file_status == EFUSE_FILE_LOADED)
    		RTW_MAP_DUMP_SEL(RTW_DBGDUMP, "EFUSE FILE", hal_data->efuse_eeprom_data, mapsize);
    	else
    		RTW_MAP_DUMP_SEL(RTW_DBGDUMP, "HW EFUSE", hal_data->efuse_eeprom_data, mapsize);
    #endif
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    1. 增加IW_ENCODE_ALG_AES_CMAC定义
      os_dep\linux\ioctl_linux.c
    #define IW_ENCODE_ALG_AES_CMAC		5
    
    • 1

    代码修改完毕后

    安装前置工具

    	sudo apt-get -y install flex
    	sudo apt-get -y install bison
    
    • 1
    • 2

    编译openssl

    下载openssl-1.1.1a

    ./Configure linux-ppc shared no-asm --prefix=/home/lsy/work/tools/openssl CROSS_COMPILE=powerpc-e300c3-linux-
    make
    
    
    • 1
    • 2
    • 3

    异常,出现错误:PTHREAD_MUTEX_RECURSIVE未声明

    vim Makefile
    
    CNF_CPPFLAGS=-DNDEBUG -D_GNU_SOURCE
    
    • 1
    • 2
    • 3

    编译libnl

    wget http://www.infradead.org/~tgr/libnl/files/libnl-3.2.0.tar.gz
    
    tar xvf libnl-3.2.0.tar.gz
    cd libnl-3.2.0
    ./configure --host=powerpc-e300c3-linux --prefix=/home/lisuyang/work/tools/libnl CFLAGS=-I/home/lisuyang/work/code/kz_linux-2.6.20/include
    make
    make install
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    解决报错

    1. error: linux/tc_ematch/tc_em_text.h: No such file or directory
    cp ../kz_linux-2.6.20/include/linux/tc_ematch/tc_em_text.h include/linux/tc_ematch/
    
    • 1

    编译wpa_supplicant

    export PKG_CONFIG_PATH=/home/lisuyang/work/tools/libnl/lib/pkgconfig
    tar xvf wpa_supplicant-2.7.tar.gz
    cd wpa_supplicant-2.7/wpa_supplicant
    cp deconfig .config
    vim .config
    CC = powerpc-e300c3-linux-gcc
    #openssl 库和头文件路径
    CFLAGS += -I/home/lsy/work/tools/openssl/include
    LIBS += -L/home/lsy/work/tools/openssl/lib -lssl -lcrypto
    #libnl 库和头文件路径
    CFLAGS += -I/home/lsy/work/tools/libnl/libnl3
    LIBS += -L/home/lsy/work/tools/libnl/lib
    
    
    make
    make install
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    解决报错

    1. libnl3/netlink/netlink.h中缺少linux/netfilter/nfnetlink.h
      到kernel源码下面拷贝一份过来
      然后改下netlink.h中nfnetlink.h的引用路径
    cp linux-2.6.20/include/linux/netfilter/nfnetlink.h /home/lsy/work/tools/libnl/include/libnl3/netlink/netfilter/
    vim /home/lsy/work/tools/libnl/include/libnl3/netlink/netlink.h
    //#include 
    #include 
    
    • 1
    • 2
    • 3
    • 4
    1. …/src/drivers/driver_nl80211.c:缺少NLMSG_HDRLEN宏控
      到libnl目录下grep一下,发现该宏控位于include/libnl3/netlink/netlink-kernel.h文件中,但是该文件被预处理屏蔽了,打开屏蔽,
      并前往…/src/drivers/driver_nl80211.c添加该头文件的引用
    #include 
    
    • 1
    1. 缺少NL_STOP NL_SKIP等宏

    在对应代码中插入下面这个头文件

    #include 
    
    
    • 1
    • 2
    1. 解决结构体重定义
    /home/lsy/work/tools/libnl/include/libnl3/netlink/netlink-kernel.h:18: error: redefinition of 'struct sockaddr_nl'
    /home/lsy/work/tools/libnl/include/libnl3/netlink/netlink-kernel.h:42: error: redefinition of 'struct nlmsghdr'
    /home/lsy/work/tools/libnl/include/libnl3/netlink/netlink-kernel.h:182: error: redefinition of 'struct nlmsgerr'
    
    • 1
    • 2
    • 3

    将netlink-kernel.h代码中的这三个结构体删除

    1. …/src/drivers/driver_nl80211.c:461: error: ‘CTRL_ATTR_MAX’ undeclared
      经过搜索,发现这个头文件位于/opt/freescale/usr/local/gcc-4.0.2-glibc-2.3.6-nptl-2/powerpc-e300c3-linux/powerpc-e300c3-linux/sys-include/linux/genetlink.h
    vim ../src/drivers/driver_nl80211.c
    加入下述头文件
    #include 
    
    • 1
    • 2
    • 3
    1. make: *** No rule to make target ‘/home/lisuyang/work/tools/libnl/include/libnl3/netlink/netfilter/nfnetlink.h’, needed by ‘…/src/drivers/driver_nl80211_capa.o’. Stop.

    从kernel源码中拷贝

    cp./include/linux/netfilter/nfnetlink.h ../../tools/libnl/include/libnl3/netlink/netfilter/
    
    • 1
    1. …/src/drivers/driver_nl80211_event.c:2575: error: dereferencing pointer to incomplete type
      进入代码查看,发现是该变量的结构体没有被定义
      加入下述头文件
    #include 
    
    • 1
    1. 拷贝kernel源码中的头文件信息到编译链头文件路径

      抱歉,由于距离我做这个任务时间有些长,我不记得我将那些文件拷贝过去了,这里主要是编译过程中缺少某个结构体定义,那就去kernel源码/libnl输出路径中搜索哪个文件包含这个变量,将之复制到编译链的头文件中,该目录位于

    /opt/freescale/usr/local/gcc-4.0.2-glibc-2.3.6-nptl-2/powerpc-e300c3-linux/powerpc-e300c3-linux/sys-include
    
    • 1

    编译hostapd

    我这边下载的是hostapd-0.6.9

    export PKG_CONFIG_PATH=/home/lisuyang/work/tools/libnl/lib/pkgconfig
    tar xvf hostapd-0.6.9.tar.gz
    cd hostapd-0.6.9/hostapd
    cp deconfig .config
    vim .config
    
    CONFIG_DRIVER_WEXT=y
    CONFIG_DRIVER_NL80211=y
    CFLAGS += -I/home/lsy/work/tools/libnl/include/libnl3
    LIBS += -L/home/lsy/work/tools/libnl/lib
    CONFIG_LIBNL20=y
    CC = powerpc-e300c3-linux-gcc
    CONFIG_TLS = internal
    CONFIG_INTERNAL_LIBTOMMATH = y
    CFLAGS += -I/home/lsy/work/tools/openssl/include
    LIBS += -L/home/lsy/work/tools/openssl/lib -lssl -lcrypto
    
    make 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    移植入嵌入式

    需要拷贝过去的文件如下

    hostapd
    wpa_supplicant
    libnl/lib/.so
    openssl/
    .so

  • 相关阅读:
    IDEA(日常操作技巧记录)
    @FeignClient configuration参数配置
    月薪 3万人民币是一种怎样的体验?做自媒体可以达到这种水平吗
    ByteHouse云数仓版查询性能优化和MySQL生态完善
    使用股票程序交易系统应该注意哪些问题?
    比较react和vue的响应式原理
    python如何求两字典的公共区域
    SD_DATA_RECEIVE_SHIFT_REGISTER
    月薪12.8K,转行测试斩获3份过万offer,分享一些我的小秘招
    第二十二章 alibaba sentinel详解-各种规则的应用
  • 原文地址:https://blog.csdn.net/qq_34954047/article/details/127228455