Hi3516EV200 Linux下WiFi驱动移植以及使用Busybox编译的文件系统

    技术2025-02-13  10

    一、操作环境

    PC:win10

    虚拟机:Ubuntu14.04 LTS 64bit

    板端:DOPI 3516EV200 (Hi3516EV200)NAND 128MB

    需要Linux SDK(Hi3516EV200_SDK_V1.0.1.0.tgz)、以及海思的开发文档。

    二、修改makefile

    在sdk中的makefile默认是采用解压压缩包然后进行编译的,这里修改makefile,使其直接编译,这样我们可以在解压后的kernel添加自己驱动。需要修改sdk/osdrv/Makefile。

    ########################################################################################## #task [2] build kernel ########################################################################################## hikernel: prepare check_package @echo "---------task [2] build kernel" # rm $(OSDRV_DIR)/opensource/kernel/$(KERNEL_VER) -rf # tar xf $(PACKAGE_KERNEL) -C $(OSDRV_DIR)/opensource/kernel/ # mv $(OSDRV_DIR)/opensource/kernel/$(KERNEL_FULL_VER) $(OSDRV_DIR)/opensource/kernel/$(KERNEL_VER) # pushd $(OSDRV_DIR)/opensource/kernel/$(KERNEL_VER);patch -p1 < ../$(KERNEL_PATCH);popd # find $(OSDRV_DIR)/opensource/kernel/$(KERNEL_VER) | xargs touch make -C $(OSDRV_DIR)/opensource/kernel/$(KERNEL_VER) ARCH=arm CROSS_COMPILE=$(OSDRV_CROSS)- $(KERNEL_CFG) pushd $(OSDRV_DIR)/opensource/kernel/$(KERNEL_VER);\ make ARCH=arm CROSS_COMPILE=$(OSDRV_CROSS)- uImage -j $(BUILD_J) >/dev/null;popd cp $(OSDRV_DIR)/opensource/kernel/$(KERNEL_VER)/arch/arm/boot/uImage $(OSDRV_DIR)/pub/$(PUB_IMAGE)/$(UIMAGE) hikernel_clean: rm $(OSDRV_DIR)/opensource/kernel/$(KERNEL_VER) -rf

    将解压kernel这部分进行屏蔽,这样的话就已经解压好的内核就可以一直使用,将驱动添加内核后再次编译不会导致驱动被覆盖掉。

    三、将驱动添加到内核 

    将esp8089文件夹移动到sdk/osdrv/opensource/kernel/linux-4.9.y/drivers/net/wireless/下,并且就将修改该目录下的Kconfig与Makefile使其在编译内核时将其编译成模块。

    在Kconfig里面添加:

    source "drivers/net/wireless/esp8089/Kconfig"

     在Makefile里面添加:

    obj-$(CONFIG_ESP8089) += esp8089/

     四、将busybox编译的文件系统输出到osdrv/pub目录下

    在海思的sdk已经自带的busybox的源码,路径是:sdk/osdrv/opensource/busybox,这个是个压缩包。同kernel一样,我们在make all的时候会自动将原先编译的busybox删掉然后进行解压,然后再重新编译。先分析下busybox,常规的移植过程是需要对busy的参数进行配置,比如在make menuconfig里面配置交叉编译链、配置板端需要生成的工具(一些默认的命令)、配置编译文件系统输出的路径,但是海思的sdk里面这个压缩包已经讲这些全部给我们做好了:

     在osdrv下的makefile可看的出,再次编译时先是将原先的解压的文件系统进行删除操作,只有tar进行解压,注意的是cp操作,海思将预先对busybox的配置拷贝到.config,这样便完成对busybox的配置,之后直接make && make install便可,可以在busybox的源码路径看配置文件:

     在osdrv下的makefile里面根据选择的交叉编译链来选择不同的config。可以在这个目录下敲make menuconfig查看一些配置,如:Busybox Settings->Cross Compiler prefix已经配置好了:

    现在对osdrv下的makefile编译busybox做些修改,就是不需要重新删除和解压。还需要将输出文件放在sdk/osdrv/pub下,于是在前面定一个变量,这个变量用于存放在pub下生成文件目录的名称,因为busy编译出来的文件系统没有文件系统/etc以及其他目录,所以还需要出在pub下创建一个目录用存放这些配置文件,每次编译时将其拷贝到busybox编译的结果目录下:

    export PUB_BUSYBOX_RF:= rootfs_busybox export PUB_ROOTFS_CFG:= rootfs_cfg

     接着在prepare里面添加对这个文件夹的创建:

    ########################################################################################## #task [0] prepare ########################################################################################## prepare: mkdir $(OSDRV_DIR)/pub/$(PUB_IMAGE) -p mkdir $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF) -p mkdir $(OSDRV_DIR)/pub/bin/$(PUB_BOARD) -p mkdir $(OSDRV_DIR)/pub/bin/pc -p

    rootfs_cfg目录是我们自己手动创建的,然后将busybox没有的完善进去,首先在osdrv/pub/创建rootfs_cfg,再进去该目录完善文件系统:

    step1:创建文件夹:mkdir lib dev etc/init.d home proc sys root opt tmp var -p

    step2:拷贝编译器lib下的so库到刚刚创建的lib目录下,主要是x86-arm\arm-himix100-linux\target\lib\a7_softfp_neon-vfpv4下的库文件,为了方便你也可以直接将osdrv/pub/rootfs_uclibc/lib下的所有拷贝到osdrv/pub/rootfs_cfg/lib下

    step3:拷贝/etc/fstab文件完善osdrv/pub/rootfs_cfg/etc目录。示例: #cp  /etc/fstab  ./etc/

    step4:完善etc。 示例: cp osdrv/opensource/busybox/busybox-1.26.2/examples/inittab  ./etc/ 

    step5: 修改上面拷贝的inittab文件(下面的注释不要)

    ::sysinit:/etc/init.d/rcS //系统上电之后首先执行的文件 console::askfirst:-/bin/sh //需要加上console ,指定控制台的脚本解析器 ::ctrlaltdel:/sbin/reboot //重新启动系统 ::shutdown:/bin/umount -a -r //取消所有文件系统节点的挂载

    step6: 创建 etc/init.d/rcS 文件,将其写入:

    #!/bin/sh mount -a mkdir /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s /bin/hostname HJ

    step7: 创建etc/profile:

    USER="id-un" LOGNAME=$USER //系统用户名称 PS1='\u\h \w\# ' //PS1使用保存终端显示格式的环境变量。 PATH=$PATH HOSTNAME='/bin/hostname' // HOSTNAME环境变量,保存了当前用户名称 export USER LOGNAME PS1 PATH //声明

    至此,文件系统相关的完善以及完毕, 然后对编译busybox部分进行以下修改:

    ########################################################################################## #task [4] build busybox ########################################################################################## hibusybox: prepare @echo "---------task [4] build busybox " # rm $(OSDRV_DIR)/opensource/busybox/$(BUSYBOX_VER) -rf # tar xzf $(OSDRV_DIR)/opensource/busybox/$(BUSYBOX_VER).tgz -C $(OSDRV_DIR)/opensource/busybox # find $(OSDRV_DIR)/opensource/busybox/$(BUSYBOX_VER) | xargs touch cp $(OSDRV_DIR)/opensource/busybox/$(BUSYBOX_VER)/$(BUSYBOX_CFG) \ $(OSDRV_DIR)/opensource/busybox/$(BUSYBOX_VER)/.config pushd $(OSDRV_DIR)/opensource/busybox/$(BUSYBOX_VER)/;make -j $(BUILD_J) >/dev/null;popd make -C $(OSDRV_DIR)/opensource/busybox/$(BUSYBOX_VER) install rm $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF)/* -rf cp -af $(OSDRV_DIR)/opensource/busybox/$(BUSYBOX_VER)/_install/* $(OSDRV_DIR)/pub/$(PUB_ROOTFS) cp -af $(OSDRV_DIR)/opensource/busybox/$(BUSYBOX_VER)/_install/* $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF) cp -af $(OSDRV_DIR)/pub/$(PUB_ROOTFS_CFG)/* $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF) hibusybox_clean: # rm $(OSDRV_DIR)/opensource/busybox/$(BUSYBOX_VER) -rf rm $(OSDRV_DIR)/opensource/busybox/$(BUSYBOX_VER)/_install/* -rf

    上面的makefile可知,将busybox生成的文件系统和rootfs_cfg拷贝到rootfs_busybox文件夹。再重新编译后会在pub生成一个rootfs_busybox文件夹里面有busybox生成的文件系统目录。再对打包成文件系统格式部分的makefile进行下修改,因为将要制作的文件系统是busybox产生的文件也就是rootfs_busybox目录进行制作打包,将制作文件系统部分的makefile进行修改下:

    ########################################################################################## #task [7] build rootfs ########################################################################################## hirootfs_build: hirootfs_prepare hibusybox hiboardtools hipctools hirootfs_notools_build hirootfs_notools_build: @echo "---------task [7] build rootfs" chmod 777 $(OSDRV_DIR)/pub/bin/$(PUB_BOARD)/* chmod 777 $(OSDRV_DIR)/pub/bin/pc/* rm $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF)/dev/* -rf rm $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF)/bin/himm -rf rm $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF)/bin/himc -rf rm $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF)/bin/himd -rf rm $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF)/bin/himd.l -rf pushd $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF);ln -s sbin/init init;popd pushd $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF); chmod 750 * -R; chmod 750 usr/* -R; popd pushd $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF); chmod -w usr/bin -R; chmod -w usr/sbin -R; chmod -w sbin -R; popd ifeq ($(BOOT_MEDIA),spi) pushd $(OSDRV_DIR)/pub/bin/pc;./mkfs.jffs2 -d $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF) -l -e 0x40000 -o $(OSDRV_DIR)/pub/$(PUB_IMAGE)/$(JFFS2_IMAGE_BIN_256K);popd pushd $(OSDRV_DIR)/pub/bin/pc;./mkfs.jffs2 -d $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF) -l -e 0x20000 -o $(OSDRV_DIR)/pub/$(PUB_IMAGE)/$(JFFS2_IMAGE_BIN_128K);popd pushd $(OSDRV_DIR)/pub/bin/pc;./mkfs.jffs2 -d $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF) -l -e 0x10000 -o $(OSDRV_DIR)/pub/$(PUB_IMAGE)/$(JFFS2_IMAGE_BIN_64K);popd cp $(OSDRV_DIR)/tools/pc/ubi_sh/mkubiimg.sh $(OSDRV_DIR)/pub/$(PUB_IMAGE) chmod +x $(OSDRV_DIR)/pub/$(PUB_IMAGE)/mkubiimg.sh # build the pagesize = 2k, blocksize = 128k, part_size = 32M # pushd $(OSDRV_DIR)/pub/$(PUB_IMAGE);./mkubiimg.sh $(CHIP) 2k 128k $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF) 32M $(OSDRV_DIR)/pub/bin/pc;popd # build the pagesize = 4k, blocksize = 256k, part_size = 50M # pushd $(OSDRV_DIR)/pub/$(PUB_IMAGE);./mkubiimg.sh $(CHIP) 4k 256k $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF) 50M $(OSDRV_DIR)/pub/bin/pc;popd rm $(OSDRV_DIR)/pub/$(PUB_IMAGE)/mkubiimg.sh endif ifeq ($(BOOT_MEDIA),emmc) pushd $(OSDRV_DIR)/pub/bin/pc;./$(EXT4_TOOL) -l 96M -s $(OSDRV_DIR)/pub/$(PUB_IMAGE)/$(EXT4_IMAGE_BIN) $(OSDRV_DIR)/pub/$(PUB_ROOTFS);popd endif ifeq ($(BOOT_MEDIA),spi) pushd $(OSDRV_DIR)/pub/bin/pc;./$(YAFFS_TOOL) $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF)/ $(OSDRV_DIR)/pub/$(PUB_IMAGE)/$(YAFFS2_IMAGE_BIN_2K_4BIT) 1 2;popd chmod 644 $(OSDRV_DIR)/pub/$(PUB_IMAGE)/$(YAFFS2_IMAGE_BIN_2K_4BIT) pushd $(OSDRV_DIR)/pub/bin/pc;./$(YAFFS_TOOL) $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF)/ $(OSDRV_DIR)/pub/$(PUB_IMAGE)/$(YAFFS2_IMAGE_BIN_2K_24BIT) 1 4;popd chmod 644 $(OSDRV_DIR)/pub/$(PUB_IMAGE)/$(YAFFS2_IMAGE_BIN_2K_24BIT) pushd $(OSDRV_DIR)/pub/bin/pc;./$(YAFFS_TOOL) $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF)/ $(OSDRV_DIR)/pub/$(PUB_IMAGE)/$(YAFFS2_IMAGE_BIN_4K_4BIT) 2 2;popd chmod 644 $(OSDRV_DIR)/pub/$(PUB_IMAGE)/$(YAFFS2_IMAGE_BIN_4K_4BIT) pushd $(OSDRV_DIR)/pub/bin/pc;./$(YAFFS_TOOL) $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF)/ $(OSDRV_DIR)/pub/$(PUB_IMAGE)/$(YAFFS2_IMAGE_BIN_4K_24BIT) 2 4;popd chmod 644 $(OSDRV_DIR)/pub/$(PUB_IMAGE)/$(YAFFS2_IMAGE_BIN_4K_24BIT) endif find $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF)/ -name '*svn' | xargs rm -rf pushd $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF); chmod +w usr/bin -R; chmod +w usr/sbin -R; chmod +w sbin -R; popd # pushd $(OSDRV_DIR)/pub;tar czf $(PUB_ROOTFS).tgz $(PUB_ROOTFS);rm $(PUB_ROOTFS) -rf;popd pushd $(OSDRV_DIR)/pub;tar czf $(PUB_BUSYBOX_RF).tgz $(PUB_BUSYBOX_RF);popd @echo "---------finish osdrv work" hirootfs_clean: ifeq ($(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF), $(wildcard $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF))) pushd $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF); chmod +w usr/bin -R; chmod +w usr/sbin -R; chmod +w sbin -R; popd endif rm $(OSDRV_DIR)/pub/$(PUB_BUSYBOX_RF)/ -rf

    五、WiFI工具编译

     

     

    Processed: 0.009, SQL: 9