diff --git a/device.mk b/device.mk index 9282f25..4b7525f 100644 --- a/device.mk +++ b/device.mk @@ -105,6 +105,10 @@ GMS_MAKEFILE=gms_minimal.mk WITH_GMS_COMMS_SUITE := false endif +# Joycons +PRODUCT_PACKAGES += \ + jc_setup + # Kernel Modules PRODUCT_PACKAGES += \ cypress-fmac-upstream diff --git a/initfiles/Android.mk b/initfiles/Android.mk index 9d4479b..24d4352 100644 --- a/initfiles/Android.mk +++ b/initfiles/Android.mk @@ -66,3 +66,12 @@ LOCAL_SRC_FILES := init.loki_foster_e_common.rc LOCAL_VENDOR_MODULE := true LOCAL_MODULE_RELATIVE_PATH := init/hw include $(BUILD_PREBUILT) + +include $(CLEAR_VARS) +LOCAL_MODULE := jc_setup +LOCAL_SRC_FILES := jc_setup.sh +LOCAL_MODULE_SUFFIX := .sh +LOCAL_INIT_RC := nx_jc.rc +LOCAL_MODULE_CLASS := EXECUTABLES +LOCAL_VENDOR_MODULE := true +include $(BUILD_PREBUILT) diff --git a/initfiles/jc_setup.sh b/initfiles/jc_setup.sh new file mode 100644 index 0000000..2e6c743 --- /dev/null +++ b/initfiles/jc_setup.sh @@ -0,0 +1,77 @@ +#!/system/xbin/bash +set -e + +# https://stackoverflow.com/a/28409737 +# section key value path -> string +function set_ini_val { + sed -i '/^\['${1}']/,/^\[/{s/^'${2}'[[:space:]]*=.*/'${2}' = '${3}'/}' ${4} +} + +# https://stackoverflow.com/a/40778047 +# section key path -> string +function get_ini_val { + sed -nr '/^\['${1}']/ { :l /^'${2}'[ ]*=/ { s/.*=[ ]*//; s/\r//g; p; q;}; n; b l;}' ${3} +} + +# section path -> int +function ini_has_section { + grep -F "[${1}]" ${2} &> /dev/null + return $? +} + +# https://stackoverflow.com/a/19032792 +# string -> string +function string_to_lower { + echo $1 | sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' +} + +# https://stackoverflow.com/a/34327002 +# string -> string +function string_to_le { + i=${#1} + + while [ $i -gt 0 ] + do + i=$[$i-2] + echo -n ${1:$i:2} + done +} + +jc_ini="${1}" +bdroid_ini="${2}" +jc_sections=("joycon_00" "joycon_01") + +for jc_section in ${jc_sections[@]}; do + jc_type=$(get_ini_val ${jc_section} type ${jc_ini}) + if [ ${jc_type} = "0" ]; then + echo ${jc_section} not found! + continue + fi + + jc_mac=$(string_to_lower $(get_ini_val ${jc_section} mac ${jc_ini})) + jc_ltk=$(string_to_le $(string_to_lower $(get_ini_val ${jc_section} ltk ${jc_ini}))) + + if ini_has_section ${jc_mac} ${bdroid_ini}; then + echo "Joycon entry present in bluedroid ini, update LTK" + set_ini_val ${jc_mac} LinkKey ${jc_ltk} ${bdroid_ini} + else + echo "Joycon entry not present in bluedroid ini, create it" + echo "" >> ${bdroid_ini} + echo "[${jc_mac}]" >> ${bdroid_ini} + echo "LinkKey = ${jc_ltk}" >> ${bdroid_ini} + echo "LinkKeyType = 4" >> ${bdroid_ini} + if [ ${jc_type} = "1" ]; then + echo "Name = Joy-Con (L)" >> ${bdroid_ini} + echo "MetricsId = 1" >> ${bdroid_ini} + echo "SdpDiModel = 8198" >> ${bdroid_ini} + echo "HidProductId = 8198" >> ${bdroid_ini} + else + echo "Name = Joy-Con (R)" >> ${bdroid_ini} + echo "MetricsId = 2" >> ${bdroid_ini} + echo "SdpDiModel = 8199" >> ${bdroid_ini} + echo "HidProductId = 8199" >> ${bdroid_ini} + fi + fi +done + +/system/bin/umount /mnt/vendor/factory diff --git a/initfiles/nx_jc.rc b/initfiles/nx_jc.rc new file mode 100644 index 0000000..9c0211d --- /dev/null +++ b/initfiles/nx_jc.rc @@ -0,0 +1,11 @@ +on post-fs-data + mount vfat /dev/block/platform/sdhci-tegra.0/by-name/hos_data /mnt/vendor/factory rw noatime + restorecon_recursive /mnt/vendor/factory + start vendor.jc_setup + +service vendor.jc_setup /vendor/bin/jc_setup.sh /mnt/vendor/factory/switchroot/joycon_mac.ini /data/misc/bluedroid/bt_config.conf + class main + user root + group root + disabled + oneshot