The first thing to do is enable the file storage gadget module in the kernel as such:
Exit all the way out and save your changes. Rebuild the kernel by following the steps in this previous post.
I had to add a few packages to the root file system in order for the BeagleBoard to have all the tools on board to configure the backing storage for the file storage gadget. These packages were ‘dosfstools’ and ‘parted’ and they were added to my image recipe, cmma-ptrp-image.bb:
# added for file backed storage support for file storage gadget ANGSTROM_EXTRA_INSTALL += " dosfstools parted "
I was able to automate the process for creating the backing storage. The script below creates and mounts a 64MB backing store and can be copied onto the SD card in the root file system and executed from the BeagleBoard command line:
#!/bin/sh if [ "${#}" != "1" ]; then echo "usage: $0" exit 1 fi /bin/dd bs=1M count=64 if=/dev/zero of=${1} if [ "$?" != "0" ]; then echo "Failed to create block file $1" exit 2 fi /usr/sbin/parted ${1} mklabel msdos if [ "$?" != "0" ]; then echo "Failed to create partition label on $1" exit 3 fi /usr/sbin/parted ${1} mkpartfs primary fat32 0 64 if [ "$?" != "0" ]; then echo "Failed to create partition on $1" exit 4 fi NSTART=`/sbin/fdisk -lu ${1} | /usr/bin/awk '/FAT32/ { print $2*512 }'` if [ "$?" != "0" ]; then echo "Failed to set NSTART" exit 5 fi /sbin/losetup -o ${NSTART} /dev/loop0 ${1} if [ "$?" != "0" ]; then echo "Failed to create loopback for $1" exit 6 fi /usr/sbin/mkdosfs /dev/loop0 if [ "$?" != "0" ]; then echo "Failed to make dos fs for file $1" exit 7 fi MTPT=`pwd`/loopback /bin/mkdir -p ${MTPT} if [ "$?" != "0" ]; then echo "Failed to create mount point ${MTPT}" exit 8 fi /bin/mount -t vfat /dev/loop0 ${MTPT} if [ "$?" != "0" ]; then echo "Failed to mount $1 on ${MTPT}" exit 9 fi echo "Created ${1} and mounted on ${MTPT}" echo "" echo "To unmount:" echo " umount /dev/loop0" echo " losetup -d /dev/loop0"
This will allow the BeagleBoard to manipulate the data in the backing store as a local file system mounted on ${MTPT}. In my BeagleBoard-based device this will be one mode of operation.
To test this functionality I setup the backing storage file (‘fsbackfile’) and mounted it with the script above (saved as ‘mkbackfile’) then copied some files to it:
$ ./mkbackfile ./fsbackfile 64+0 records in 64+0 records out mkdosfs 2.11 (12 Mar 2005) Loop device does not match a floppy size, using default hd params Created ./fsbackfile and mounted on /home/root/loopback To unmount: umount /dev/loop0 losetup -d /dev/loop0 $ cp /etc/services ./loopback $ cp /etc/passwd ./loopback
On my device a button push will invoke the file storage gadget mode by unmounting the BeagleBoard local loopback file system and invoking the ‘modprobe’ command to load the File Storage Gadget module. For testing purposes I did this by hand on the BeagleBoard:
$ umount /dev/loop0 $ losetup -d /dev/loop0 $ modprobe g_file_storage file=/home/root/fsbackfile
Now the BeagleBoard is ready to plug into a PC as a mass storage device.
To test the file storage gadget I connected the correct cable to the mini-USB port on the BeagleBoard and to the standard USB port on my Linux development box. My BeagleBoard automounted and I was presented with a fle manager window showing the contents of the device–two files, services and passwd. Success!!!
Just to make sure everything was functional, I then used gedit to edit the passwd file and save it back to the device. I then unplugged the USB cable on the Linux development machine side. On the BeagleBoard I remounted the loopback device:
$ /sbin/losetup -o 16384 /dev/loop0 /home/root/fsbackfile $ mount /dev/loop0 /home/root/loopback $ ls /home/root/loopback services passwd ~passwd
We can see that the gedit backup file has been created. Looking at the contents of passwd and ~passwd revealed the expected contents.
This completes the successful demonstration of BeagleBoard as File Storage Gadget.