在前面一节中,描述了otg配置U盘时涉及到的知识点,本篇用统一的脚本完成。
目标
将3588开发板子配置为一个U盘。
配置文件和脚本
配置文件
默认配置文件路径: cat /etc/profile.d/usbdevice.sh
说明:
1)USB_FUNCS是将开发板配置为什么类型的设备,例如u盘,配置ums等等。
2)UMS_FILE 即对应的具体存储设备,本文就着重讲解此处的应用。
存储设备可以是
a. 一个文件,里面在内存或者磁盘上创建一个img文件。
b. 一个分区
#!/bin/sh
# The env variables below can be overridden
# option: adb acm hid mtp ntb rndis uac1 uac2 ums uvc
#export USB_FUNCS="adb"
export USB_FUNCS="ums"
#export UMS_FILE=/userdata/ums_shared.img
#export UMS_FILE=/dev/mmcblk0p7
export UMS_FILE=/dev/sda5
#export UMS_SIZE=1024M
export UMS_SIZE=7G
export UMS_FSTYPE=ntfs
export UMS_MOUNT=0
export UMS_MOUNTPOINT=/mnt/ums
export UMS_RO=0
设置u盘脚本
脚本运行 usbdevice start等参数
#!/bin/sh
# Uncomment below to see more logs
# set -x
# Load default env variables from profiles
. /etc/profile
LOG_FILE=/tmp/usbdevice.log
USB_FUNCS_FILE=/tmp/.usbdevice
alias usb_enable='touch $USB_FUNCS_FILE'
alias usb_disable='rm -f $USB_FUNCS_FILE'
alias usb_is_enabled='[ -f $USB_FUNCS_FILE ]'
alias usb_set_started='echo $USB_FUNCS > $USB_FUNCS_FILE'
usb_get_started()
{
usb_is_enabled || return 0
cat $USB_FUNCS_FILE
}
CONFIGFS_DIR=/sys/kernel/config
USB_GROUP=rockchip
USB_STRINGS_ATTR=strings/0x409
USB_GADGET_DIR=$CONFIGFS_DIR/usb_gadget/$USB_GROUP
USB_GADGET_STRINGS_DIR=$USB_GADGET_DIR/$USB_STRINGS_ATTR
USB_FUNCTIONS_DIR=$USB_GADGET_DIR/functions
USB_CONFIGS_DIR=$USB_GADGET_DIR/configs/b.1
USB_CONFIGS_STRINGS_DIR=$USB_CONFIGS_DIR/$USB_STRINGS_ATTR
# Make sure that we own this session (pid equals sid)
if ! ps x -o cmd,pid,sid | grep -wq "$$$"; then
setsid $0 $@
exit $?
fi
# ---- helper functions
usb_msg()
{
logger -t $(basename $0) "[$$]: $@"
echo "[$(date +"%F %T")] $@"
}
usb_pid()
{
case $1 in
ums) echo 0x0000;;
mtp) echo 0x0001;;
uvc) echo 0x0005;;
adb) echo 0x0006;;
adb_mtp) echo 0x0011;;
adb_ums) echo 0x0018;;
adb_uvc) echo 0x0015;;
ntb_uvc) echo 0x0017;;
acm) echo 0x1005;;
*) echo 0x0019;;
esac
}
usb_instances()
{
for func in $@; do
VAR=$(echo $func | tr 'a-z' 'A-Z')_INSTANCES
eval echo "\${$VAR:-$func.gs0}"
done
}
usb_run_stage()
{
for f in $1_pre_$2_hook $1_$2 $1_post_$2_hook; do
type $f >/dev/null 2>/dev/null || continue
usb_msg "Run stage: $f"
eval $f || break
done
}
usb_wait_files()
{
for i in `seq 200`;do
fuser -s $@ 2>/dev/null && break
sleep .01
done
}
usb_release_files()
{
for i in `seq 200`;do
fuser -s -k $@ 2>/dev/null || break
sleep .01
done
}
# usage: usb_mount <src> <mountpoint> <options>
usb_mount()
{
mkdir -p $2
mountpoint -q $2 || mount $@
}
usb_umount()
{
mountpoint -q $1 || return 0
usb_release_files -m $1
umount $1
}
usb_symlink()
{
mkdir -p $1
[ -e $2 ] || ln -s $1 $2