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

一、操作环境

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工具编译

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值