硬件环境:天嵌IMX6q_coreC
内核版本:4.1.15
目的:板子做USB从机,通过otg连接PC机进行通信。即PC机上IMX6Q相当与U盘
如果板卡作为PC的外设,通过USB线连接,那么板卡处于USB Device工作模式,也即是USB Gadget工作模式,这种模式下常见的功能是PC识别板卡为U盘(USB Gadget Mass Storage Class),双方交换数据,还有板卡通过PC上网(USB Gadget CDC),板卡端虚拟出一个网络设备。本篇文章主要介绍板卡作为PC的外部存储设备。
飞思卡尔源码原生支持MSC ,即usb gadget 设备中的MSC
MSC即 Mass Storage Class.
一.修改内核配置单
make ARCH=arm menuconfig
Device Drivers --->
[*] USB support --->
<*> USB Gadget Support --->
<M> USB Gadget Drivers
<M> Mass Storage Gadget
编译模块:make modules
只能编译为模块,原因其加载有依赖项目。
驱动模块生成位置:drivers/usb/gadget/legacy/g_mass_storage.ko
查看其Makefile,有依赖项目:
obj-$(CONFIG_USB_MASS_STORAGE) += g_mass_storage.o
USB_LIBCOMPOSITE [=m] && USB_F_MASS_STORAGE [=m]
可以追到另外依赖的两个驱动:1.drivers/usb/gadget/libcomposite.ko
2.drivers/usb/gadget/function/usb_f_mass_storage.ko
将这一共3个驱动ko文件一起拷贝到文件系统。
二.加载驱动
1.分别先按顺序加载依赖驱动:
insmod libcomposite.ko
insmod usb_f_mass_storage.ko
2.因为加载MSC驱动是需要参数的,可以直接让PC机识别SD卡,emmc,nandflash(emmc和nand默认格式为extn,PC机必须为linux才能识别):
(1)让ubuntuPC机识别板子上的SD卡:
使用命令df查看SD卡分区,
/dev/mmcblk1p1 15248320 929240 14319080 7% /run/media/mmcblk1p1
使用命令挂载MSC驱动并传参,SD卡dev路径:insmod g_mass_storage.ko file=/dev/mmcblk1p1 removable=1
插上otg连接到PC机就可以读写板子上的SD卡数据了,因为SD卡的格式是fat的在windows下也能识别,
读写emmc,nandflash使用方法一样,指定的路径分别改为emmc和nandflash的路径就可以了,但是不能被windows识别,因为windows仅能识别fat格式
(2)在内存创建指定格式的小空间,并跟PC机通讯
创建一个镜像(本例放到/opt目录下,名为:test.img,容量:10MB):(仅需第一次创建时执行)
dd if=/dev/zero of=/opt/test.img bs=1M count=10
格式化镜像为fat格式,因为windows仅能识别fat格式:(仅需第一次创建时执行)
mkfs.vfat /opt/test.img
关联镜像和loop设备(利用loop设备来挂载):(每次开机都要执行)
losetup /dev/loop0 /opt/test.img
挂载loop0到某个目录下:(每次开机都要执行)
mount -t vfat /dev/loop0 /mnt
挂载MSC驱动:(每次开机都有执行),先挂载两个依赖驱动
insmod libcomposite.ko
insmod usb_f_mass_storage.ko
insmod g_mass_storage.ko file=/dev/loop0 removable=1
加载之后插入usb连接到PC,就可以在PC(win7)上访问板卡了。
一切完成之后,验证是否正确。发现在windows下写入文件或者新建文件夹。在开发板的挂载点的文件夹中能同步到windows的信息。而在开发板中新建的文件或文件夹,需要拔下设备,重连之后才能同步到windows的可移动设备中。