#!/bin/bash

## use: fuse prog [-y] bank fuse value
set -e

function f2o()
{
    value="${1}"
    hexval=$(printf "%08x" $((${value})) )
    printf "\x${hexval:6:2}\x${hexval:4:2}\x${hexval:2:2}\x${hexval:0:2}"
    #echo ${addr} ${hexval}
}

function fuse_read(){

file="/sys/bus/nvmem/devices/imx-ocotp0/nvmem"

bank="${1}"
fuse="${2}"

temp_file=$(tempfile)

if [ "$bank" -gt 0 -a "$bank" -le 14 -a "$fuse" -ge 0 -a "$fuse" -le 3 ]; then
    addr="$((${bank}*4+${fuse}))"
    dd if="${file}" bs=4 skip=$addr of="${temp_file}" count=1 >& /dev/null
    result=$(xxd -u -ps "${temp_file}")
    echo "0x${result:6:2}${result:4:2}${result:2:2}${result:0:2}"
    rm "${temp_file}"
fi

}


[ "$1" = "read" ] && { fuse_read "$2" "$3"; exit 0;}
[ "$1" = "prog" ] || { exit 1; }
shift
file=nvmem
if [ "$1" = "-y" ]; then
    file="/sys/bus/nvmem/devices/imx-ocotp0/nvmem"
    shift
fi

bank="${1}"
fuse="${2}"
value="${3}"

tmp="$(tempfile)"
if [ "$bank" -gt 0 -a "$bank" -le 14 -a "$fuse" -ge 0 -a "$fuse" -le 3 ]; then
    addr="$((${bank}*4+${fuse}))"
    f2o "$value" > "${tmp}"
    dd if="${tmp}" bs=4 seek="$addr" of="${file}" conv=notrunc
    rm "${tmp}"
fi

