背景:
由于exfat是常用的文件系统格式,而Linux由于版权的问题,没有在官方中添加有关的驱动。
但是 微软也同意开源了,所以比较新的 Linux 会支持这一块。
为了支持exfat的驱动,我们需要手动添加第三方的驱动支持。
这里演示2种添加exfat格式的驱动,而不将驱动编译进内核。
有关文章:《Linux 内核 编译模块》,《简单添加自己的驱动程序到Linux内核树中》
驱动来源:https://github.com/arter97/exfat-linux
准备:
下载exfat驱动:
git clone https://github.com/arter97/exfat-linux.git
略:准备Linux内核源码,配置内核编译用的gcc
注:由于实际编译的时候,提示了函数重定义这个错误。所以需要注释掉冲突的代码
备份:为了方便演示,复制两份linux内核源码。
linux3.18_module_in : 驱动放进内核源码中进行编译
linux3.18_module_out : 驱动作为独立编译的组件。
放入linux内核源码中编译:
实际上,这一步只要在最后将驱动配置成 y 就可以编译到内核中。
根据:README.md中 “Merging the drivers to existing Linux kernel source” 这一章的内容
1)拷贝驱动源码到内核对应的位置中
cp exfat-linux ~/linux3.18_module_in/fs/exfat
2)修改exfat同级目录中的Kconfig,与Makefile
Kconfig:在 "source/fs/fat/Kconfig"之后添加此行
source "fs/exfat/Kconfig"
Makefile:在 "obj-$(CONFIG_FAT_FS) += fat/"之后添加此行
obj-$(CONFIG_EXFAT_FS) += exfat/
3)配置并编译内核
配置:
make ARCH=arm CROSS_COMPILE=arm-hisiv500-linux- menuconfig
根据实际情况,按Y(配置进内核)或者M(配置成模块),笔者这里编译成模块
编译:(根据内核配置的选项)
make ARCH=arm CROSS_COMPILE=arm-hisiv500-linux- modules
#make ARCH=arm CROSS_COMPILE=arm-hisiv500-linux- uImage 编译内核
略:拷贝驱动到开发板中
4)加载烧录,测试。
一切正常。
独立编译:
根据《Linux 内核 编译模块》中参考的Makefile,参考驱动源码中的Makefile做修改
由于exfat驱动的编译不单单是一个文件,所以需要添加依赖关系。
obj-m += exfat.o
# exfat makefile 中原有的依赖关系
exfat-objs := super.o core.o core_exfat.o blkdev.o fatent.o cache.o
nls.o misc.o extent.o xattr.o
KERNELDIR:=/home/schips/linux3.18_module_out
CROSS_COMPILE:=/opt/hisi-linux/x86-arm/arm-hisiv500-linux/bin/arm-hisiv500-linux-uclibcgnueabi-
PWD:=$(shell pwd)
default:
$(MAKE) ARCH=arm CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *.o *.order .*.cmd *.ko *.mod.c *.symvers *.tmp_versions
编译:make
同样地,生成了一份exfat.ko,正常使用即可。
注:笔者发现根据不同方式生成的ko文件大小和内容上都有小的差异。
diff exfat.ko*
Binary file exfat.ko_in and file exfat.ko_out differ
ls -al exfat.ko*
114K Dec 24 11:41 exfat.ko_in
115K Dec 24 11:41 exfat.ko_out
全文完。