#!/bin/sh -e

SYSPATH=/sys/bus/i2c/devices/2-0010
CAMDPATH=/etc/camd
REVIDX=0x0002
ILPIDX=0x3800
FWPATH=/lib/firmware
TMPPATH=/var/tmp
MSBTAG=252
LSBTAG=245
AIVTAG=132	# auto-increment valid
EODTAG=007	# end-of-data

#	av     msb lsb nvm
AVMAP="	0x3B20 073 040 0x3409
	0x3B21 073 041 0x3438
	0x3B22 073 042 0x3439
	0x3B24 073 044 0x340D
	0x3B25 073 045 0x340C
	0x3B26 073 046 0x340F
	0x3B27 073 047 0x340E
	0x3B28 073 050 0x3409
	0x3B29 073 051 0x3430
	0x3B2A 073 052 0x3431
	0x3B2C 073 054 0x340D
	0x3B2D 073 055 0x340C
	0x3B2E 073 056 0x340F
	0x3B2F 073 057 0x340E
	0x3B30 073 060 0x3409
	0x3B31 073 061 0x3428
	0x3B32 073 062 0x3429
	0x3B34 073 064 0x340D
	0x3B35 073 065 0x340C
	0x3B36 073 066 0x340F
	0x3B37 073 067 0x340E
	0x3B38 073 070 0x3409
	0x3B39 073 071 0x340A
	0x3B3A 073 072 0x340B
	0x3B3C 073 074 0x340D
	0x3B3D 073 075 0x340C
	0x3B3E 073 076 0x340F
	0x3B3F 073 077 0x340E
	0x3B40 073 100 0x3411
	0x3B41 073 101 0x343A
	0x3B42 073 102 0x343B
	0x3B44 073 104 0x3415
	0x3B45 073 105 0x3414
	0x3B46 073 106 0x3417
	0x3B47 073 107 0x3416
	0x3B48 073 110 0x3411
	0x3B49 073 111 0x3432
	0x3B4A 073 112 0x3433
	0x3B4C 073 114 0x3415
	0x3B4D 073 115 0x3414
	0x3B4E 073 116 0x3417
	0x3B4F 073 117 0x3416
	0x3B50 073 120 0x3411
	0x3B51 073 121 0x342A
	0x3B52 073 122 0x342B
	0x3B54 073 124 0x3415
	0x3B55 073 125 0x3414
	0x3B56 073 126 0x3417
	0x3B57 073 127 0x3416
	0x3B58 073 130 0x3411
	0x3B59 073 131 0x3412
	0x3B5A 073 132 0x3413
	0x3B5C 073 134 0x3415
	0x3B5D 073 135 0x3414
	0x3B5E 073 136 0x3417
	0x3B5F 073 137 0x3416
	0x3B60 073 140 0x3419
	0x3B61 073 141 0x343C
	0x3B62 073 142 0x343D
	0x3B64 073 144 0x341D
	0x3B65 073 145 0x341C
	0x3B66 073 146 0x341F
	0x3B67 073 147 0x341E
	0x3B68 073 150 0x3419
	0x3B69 073 151 0x3434
	0x3B6A 073 152 0x3435
	0x3B6C 073 154 0x341D
	0x3B6D 073 155 0x341C
	0x3B6E 073 156 0x341F
	0x3B6F 073 157 0x341E
	0x3B70 073 160 0x3419
	0x3B71 073 161 0x342C
	0x3B72 073 162 0x342D
	0x3B74 073 164 0x341D
	0x3B75 073 165 0x341C
	0x3B76 073 166 0x341F
	0x3B77 073 167 0x341E
	0x3B78 073 170 0x3419
	0x3B79 073 171 0x341A
	0x3B7A 073 172 0x341B
	0x3B7C 073 174 0x341D
	0x3B7D 073 175 0x341C
	0x3B7E 073 176 0x341F
	0x3B7F 073 177 0x341E
	0x3B80 073 200 0x3421
	0x3B81 073 201 0x343E
	0x3B82 073 202 0x343F
	0x3B84 073 204 0x3425
	0x3B85 073 205 0x3424
	0x3B86 073 206 0x3427
	0x3B87 073 207 0x3426
	0x3B88 073 210 0x3421
	0x3B89 073 211 0x3436
	0x3B8A 073 212 0x3437
	0x3B8C 073 214 0x3425
	0x3B8D 073 215 0x3424
	0x3B8E 073 216 0x3427
	0x3B8F 073 217 0x3426
	0x3B90 073 220 0x3421
	0x3B91 073 221 0x342E
	0x3B92 073 222 0x342F
	0x3B94 073 224 0x3425
	0x3B95 073 225 0x3424
	0x3B96 073 226 0x3427
	0x3B97 073 227 0x3426
	0x3B98 073 230 0x3421
	0x3B99 073 231 0x3422
	0x3B9A 073 232 0x3423
	0x3B9C 073 234 0x3425
	0x3B9D 073 235 0x3424
	0x3B9E 073 236 0x3427
	0x3B9F 073 237 0x3426"

# power up sensor
echo 1 > $SYSPATH/vdig

# choose firmware
echo -n hex > $SYSPATH/cci_data_format
echo -n $REVIDX > $SYSPATH/cci_index
rev=$(cat $SYSPATH/cci_data)
echo -n $ILPIDX > $SYSPATH/cci_index
ilp=$(cat $SYSPATH/cci_data)

if [ "2" = `expr substr $rev 1 1` ] && [ "21" = "$ilp" ]
then
	fwrev=2.21
elif [ "1" = `expr substr $rev 1 1` ] && [ "20" = "$ilp" ]
then
	fwrev=1.20
elif [ "0" = `expr substr $rev 1 1` ] && [ "10" = "$ilp" ]
then
	fwrev=0.10
else
	fwrev=0.00
fi

fwname="vx6852-once.bin"
cp $CAMDPATH/vx6852-once-$fwrev.bin $TMPPATH/$fwname

# nvram pre-populated for anti-vignetting?
if [ 3 -le `expr substr $rev 2 1` ]
then
	echo -n octal > $SYSPATH/cci_data_format

	# enable non-volatile memory
	echo -n '0x3481' > $SYSPATH/cci_index
	echo -n '001' > $SYSPATH/cci_data

	# power up non-volatile memory
	echo -n '0x3508' > $SYSPATH/cci_index
	echo -n '003' > $SYSPATH/cci_data

	i=0
	msb=0
	lsb=0

	for item in $AVMAP
	do
		# msb
		if [ 1 -eq $((i % 4)) ] && [ $item -ne $msb ]
		then
			msb=$item
			echo -ne "\0$MSBTAG" >> $TMPPATH/$fwname
			echo -ne "\0$msb" >> $TMPPATH/$fwname
		fi

		# lsb
		if [ 2 -eq $((i % 4)) ] && [ $((item+0)) -ne $lsb ]
		then
			lsb=$item
			echo -ne "\0$LSBTAG" >> $TMPPATH/$fwname
			echo -ne "\0$lsb" >> $TMPPATH/$fwname
		fi

		# nvm
		if [ 3 -eq $((i % 4)) ]
		then
			nvm=$item
			echo -n "$nvm" > $SYSPATH/cci_index
			data=$(cat $SYSPATH/cci_data)
			echo -ne "\0$AIVTAG" >> $TMPPATH/$fwname
			echo -ne "\0$data" >> $TMPPATH/$fwname
			lsb=$((lsb+01))
		fi

		i=$((i+1))
	done

	echo -ne "\0$EODTAG" >> $TMPPATH/$fwname
fi

# power down sensor
echo 0 > $SYSPATH/vdig

# load settings
echo -n $fwname > $SYSPATH/register_reprogram_once

rm -f $TMPPATH/$fwname
touch /tmp/vx6852.loaded
