diff options
Diffstat (limited to 'package/utils/usbgadget/files/usbgadget.init')
-rw-r--r-- | package/utils/usbgadget/files/usbgadget.init | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/package/utils/usbgadget/files/usbgadget.init b/package/utils/usbgadget/files/usbgadget.init new file mode 100644 index 0000000000..f2e105caae --- /dev/null +++ b/package/utils/usbgadget/files/usbgadget.init @@ -0,0 +1,144 @@ +#!/bin/sh /etc/rc.common + +START=19 + +GADGET_FS=/sys/kernel/config/usb_gadget +GADGET_PRESETS_DIR=/usr/share/usbgadget +GADGET_PREFIX=owrt_ + +log() { + logger -t usbgadget "$@" +} + +apply_configs() { + local fs_path="$1" + local cfg="$2" + for param in $(find "$fs_path" -maxdepth 1 -type f -exec basename '{}' ';'); do + [ "$param" = "UDC" ] && continue + + config_get val "$cfg" "$param" + [ -n "$val" ] && echo "$val" > "${fs_path}/${param}" + done +} + +setup_gadget() { + local cfg="$1" + local gadget_path="${GADGET_FS}/${GADGET_PREFIX}${cfg}" + local param udc + + config_get udc "$cfg" UDC + [ -z "$udc" ] && return + + mkdir "$gadget_path" || return + apply_configs "$gadget_path" "$cfg" + + local strings_path="${gadget_path}/strings/0x409" + mkdir "$strings_path" + apply_configs "$strings_path" "$cfg" +} + +setup_configuration() { + local cfg="$1" + local gadget + config_get gadget "$cfg" gadget + local cfgs_path="${GADGET_FS}/${GADGET_PREFIX}${gadget}/configs" + [ -d "${cfgs_path}" ] || return + local cfg_path="${cfgs_path}/${cfg}.1" + mkdir "$cfg_path" || { + log "failed to create configuration ${cfg}" + return + } + + apply_configs "$cfg_path" "$cfg" + + local strings_path="${cfg_path}/strings/0x409" + mkdir "$strings_path" + apply_configs "$strings_path" "$cfg" +} + +setup_function() { + local cfg="$1" + local usbcfg gadget usbfun + + config_get usbcfg "$cfg" configuration + [ -z "$usbcfg" ] && return + config_get usbfun "$cfg" function + [ -z "$usbfun" ] && return + + config_get gadget "$usbcfg" gadget + local gadget_path="${GADGET_FS}/${GADGET_PREFIX}${gadget}" + local cfg_path="${gadget_path}/configs/${usbcfg}.1" + [ -d "${cfg_path}" ] || return + + local fun_path="${gadget_path}/functions/${usbfun}.${cfg}" + mkdir "$fun_path" || { + log "failed to create function ${usbfun}.${cfg}" + return + } + + apply_configs "$fun_path" "$cfg" + + ln -s "$fun_path" "$cfg_path" +} + +attach_gadget() { + local cfg="$1" + local gadget_path="${GADGET_FS}/${GADGET_PREFIX}${cfg}" + local param udc + + config_get udc "$cfg" UDC + [ -z "$udc" ] && return + + echo "$udc" > "$gadget_path/UDC" +} + +load_gadget() { + config_foreach setup_gadget gadget + config_foreach setup_configuration configuration + config_foreach setup_function function + config_foreach attach_gadget gadget +} + +# use subshell for isolated env +apply_preset() ( + local preset="$1" + local gadget="$2" + UCI_CONFIG_DIR=$GADGET_PRESETS_DIR config_load "$1" + config_set g1 UDC "$2" + load_gadget +) + +load_preset() { + local cfg="$1" + config_get name "$cfg" name + config_get udc "$cfg" UDC + [ -z "$udc" ] && return + apply_preset $name $udc +} + +start() { + grep -q /sys/kernel/config /proc/mounts || \ + mount -t configfs configfs /sys/kernel/config + + [ -d /sys/kernel/config/usb_gadget ] || { + log "usb_gadget support not found." + return 1 + } + + config_load usbgadget + config_foreach load_preset preset + load_gadget +} + +stop() { + for gadget_path in ${GADGET_FS}/${GADGET_PREFIX}* ; do + [ -d "$gadget_path" ] || continue + echo "" > ${gadget_path}/UDC + find ${gadget_path}/configs -maxdepth 2 -type l -exec rm '{}' ';' + rmdir ${gadget_path}/configs/*/strings/* + rmdir ${gadget_path}/configs/* + rmdir ${gadget_path}/functions/* + rmdir ${gadget_path}/strings/* + rmdir $gadget_path + done +} |