diff --git a/default-permissions.xml b/default-permissions.xml
index 12b40378..a5d79bbb 100644
--- a/default-permissions.xml
+++ b/default-permissions.xml
@@ -79,6 +79,8 @@
+
+
-
+
+
+
+
+
+
+
+
diff --git a/uwb/calibration/init.uwb.calib.sh b/uwb/calibration/init.uwb.calib.sh
new file mode 100644
index 00000000..a604885a
--- /dev/null
+++ b/uwb/calibration/init.uwb.calib.sh
@@ -0,0 +1,57 @@
+#!/vendor/bin/sh
+if [ -z "$2" ]
+then
+ echo "usage is $0 input-calibration output_calibration"
+ exit 0
+fi
+OUTPUT_CALIB="$2"
+if [ ! -f "$OUTPUT_CALIB" ]; then
+ touch $OUTPUT_CALIB
+ chmod 0600 $OUTPUT_CALIB
+ file="$1"
+ while IFS=, read -r f1 f2
+ do
+ case $f1 in
+ "UWB_cal_tx_xtal_reg_final_value")
+ if [ $((0x$f2)) -gt 63 ]; then
+ f2=63
+ fi
+ echo 'xtal_trim=0x'$f2 >> $OUTPUT_CALIB
+ ;;
+ "UWB_TX1RX1_CH5_tx_ant_delay_cal_data")
+ echo 'ant0.ch5.prf64.ant_delay=0x'$f2 >> $OUTPUT_CALIB
+ ;;
+ "UWB_TX1RX1_CH5_rx_ant_delay_cal_data")
+ echo 'ant1.ch5.prf64.ant_delay=0x'$f2 >> $OUTPUT_CALIB
+ ;;
+ "UWB_TX1RX1_CH9_tx_ant_delay_cal_data")
+ echo 'ant0.ch9.prf64.ant_delay=0x'$f2 >> $OUTPUT_CALIB
+ ;;
+ "UWB_TX1RX1_CH9_rx_ant_delay_cal_data")
+ echo 'ant1.ch9.prf64.ant_delay=0x'$f2 >> $OUTPUT_CALIB
+ ;;
+ "UWB_RX2_CH5_cal_pdoa_data")
+ # float value * 2048
+ #/vendor/bin/sh does not support "bc"
+ base=2048
+ ones=${f2%%.*}
+ dec=${f2#*.}
+ ones="$(($ones*$base))"
+ if [ ${#dec} -eq 2 ]; then
+ dec="$(($dec*$base/100))"
+ echo 'ant1.ant3.ch5.pdoa_offset='$(($ones+$dec)) >> $OUTPUT_CALIB
+ fi
+ ;;
+ "UWB_RX2_CH9_cal_pdoa_data")
+ base=2048
+ ones=${f2%%.*}
+ dec=${f2#*.}
+ ones="$(($ones*$base))"
+ if [ ${#dec} -eq 2 ]; then
+ dec="$(($dec*$base/100))"
+ echo 'ant1.ant3.ch9.pdoa_offset='$(($ones+$dec)) >> $OUTPUT_CALIB
+ fi
+ esac
+ done <"$file"
+ exit 0
+fi
diff --git a/uwb/calibration/init.uwb.calib.xtal.sh b/uwb/calibration/init.uwb.calib.xtal.sh
new file mode 100644
index 00000000..c0dc8640
--- /dev/null
+++ b/uwb/calibration/init.uwb.calib.xtal.sh
@@ -0,0 +1,25 @@
+#!/vendor/bin/sh
+# only use xtal_trim from factory calibration
+if [ -z "$2" ]
+then
+ echo "usage is $0 input-calibration output_calibration"
+ exit 0
+fi
+OUTPUT_CALIB="$2"
+if [ ! -f "$OUTPUT_CALIB" ]; then
+ touch $OUTPUT_CALIB
+ chmod 0600 $OUTPUT_CALIB
+ file="$1"
+ while IFS=, read -r f1 f2
+ do
+ case $f1 in
+ "UWB_cal_tx_xtal_reg_final_value")
+ if [ $((0x$f2)) -gt 63 ]; then
+ f2=63
+ fi
+ echo 'xtal_trim=0x'$f2 >> $OUTPUT_CALIB
+ ;;
+ esac
+ done <"$file"
+ exit 0
+fi
diff --git a/uwb/uwb.mk b/uwb/uwb.mk
index 72663b41..58cdc3cf 100644
--- a/uwb/uwb.mk
+++ b/uwb/uwb.mk
@@ -35,7 +35,8 @@ PRODUCT_COPY_FILES += \
$(LOCAL_UWB_CAL_DIR)/UWB-calibration-tj.conf:$(TARGET_COPY_OUT_VENDOR)/etc/UWB-calibration-tj.conf \
$(LOCAL_UWB_CAL_DIR)/UWB-calibration-tm.conf:$(TARGET_COPY_OUT_VENDOR)/etc/UWB-calibration-tm.conf \
$(LOCAL_UWB_CAL_DIR)/UWB-calibration-ua.conf:$(TARGET_COPY_OUT_VENDOR)/etc/UWB-calibration-ua.conf \
- $(LOCAL_UWB_CAL_DIR)/UWB-calibration-uz.conf:$(TARGET_COPY_OUT_VENDOR)/etc/UWB-calibration-uz.conf
+ $(LOCAL_UWB_CAL_DIR)/UWB-calibration-uz.conf:$(TARGET_COPY_OUT_VENDOR)/etc/UWB-calibration-uz.conf \
+ $(LOCAL_UWB_CAL_DIR)/init.uwb.calib.xtal.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.uwb.calib.sh \
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.uwb.xml:$(TARGET_COPY_OUT_SYSTEM_EXT)/etc/permissions/android.hardware.uwb.xml