diff --git a/insmod/Android.bp b/insmod/Android.bp new file mode 100644 index 0000000..084fd2c --- /dev/null +++ b/insmod/Android.bp @@ -0,0 +1,13 @@ +sh_binary { + name: "insmod.sh", + src: "insmod.sh", + init_rc: ["init.insmod.rc"], + vendor: true, +} + +prebuilt_etc { + name: "init.common.cfg", + src: "init.common.cfg", + vendor: true, +} + diff --git a/insmod/init.common.cfg b/insmod/init.common.cfg new file mode 100644 index 0000000..3a81fd2 --- /dev/null +++ b/insmod/init.common.cfg @@ -0,0 +1,11 @@ +#################################################### +# init.insmod.common.cfg # +# This file contains common kernel modules to load # +# at init time by init.insmod.sh script # +#################################################### + +# Load common kernel modules +# Modules here will be loaded *before* device specific modules +modprobe|-b * +# All common modules loaded +setprop|vendor.common.modules.ready diff --git a/insmod/init.insmod.rc b/insmod/init.insmod.rc new file mode 100644 index 0000000..de23b5b --- /dev/null +++ b/insmod/init.insmod.rc @@ -0,0 +1,10 @@ +on init + # Loading common kernel modules in background + start insmod_sh + +service insmod_sh /vendor/bin/insmod.sh /vendor/etc/init.common.cfg + class main + user root + group root system + disabled + oneshot diff --git a/insmod/insmod.mk b/insmod/insmod.mk new file mode 100644 index 0000000..ac8d555 --- /dev/null +++ b/insmod/insmod.mk @@ -0,0 +1,3 @@ +PRODUCT_PACKAGES += \ + insmod.sh \ + init.common.cfg diff --git a/insmod/insmod.sh b/insmod/insmod.sh new file mode 100755 index 0000000..2c434ef --- /dev/null +++ b/insmod/insmod.sh @@ -0,0 +1,67 @@ +#!/vendor/bin/sh + +############################################################# +### init.insmod.cfg format: ### +### ----------------------------------------------------- ### +### [insmod|setprop|enable/moprobe|wait] [path|prop name] ### +### ... ### +############################################################# + +modules_dir= + +for f in /vendor/lib/modules/*/modules.dep /vendor/lib/modules/modules.dep; do + if [[ -f "$f" ]]; then + modules_dir="$(dirname "$f")" + break + fi +done + +if [[ -z "${modules_dir}" ]]; then + echo "Unable to locate kernel modules directory" 2>&1 + exit 1 +fi + +# imitates wait_for_file() in init +wait_for_file() +{ + filename="${1}" + timeout="${2:-5}" + + expiry=$(($(date "+%s")+timeout)) + while [[ ! -e "${filename}" ]] && [[ "$(date "+%s")" -le "${expiry}" ]] + do + sleep 0.01 + done +} + +if [ $# -eq 1 ]; then + cfg_file=$1 +else + # Set property even if there is no insmod config + # to unblock early-boot trigger + setprop vendor.common.modules.ready + setprop vendor.device.modules.ready + setprop vendor.all.modules.ready + setprop vendor.all.devices.ready + exit 1 +fi + +if [ -f $cfg_file ]; then + while IFS="|" read -r action arg + do + case $action in + "insmod") insmod $arg ;; + "setprop") setprop $arg 1 ;; + "enable") echo 1 > $arg ;; + "modprobe") + case ${arg} in + "-b *" | "-b") + arg="-b --all=${modules_dir}/modules.load" ;; + "*" | "") + arg="--all=${modules_dir}/modules.load" ;; + esac + modprobe -a -d "${modules_dir}" $arg ;; + "wait") wait_for_file $arg ;; + esac + done < $cfg_file +fi