#!/bin/bash PCI=$(which pci) NUM_ROWS=1088 SKIP_ROWS=0 START_ROW=0 EXP_TIME=100 #us SLEEP_VAL=0.03 if [ -z "$PCI" ]; then echo "pcitool not found." exit 1 fi function reset_dma () { pci --stop-dma dma0r sleep .1 pci --start-dma dma0r sleep .1 # check that all of the buffers are on the x1000 addresses # only 4096B buffers should be 4K alligned local VAR=`cat /sys/class/fpga/fpga0/kbuffers | awk '{print $1 $2 $3}'` VAR=`printf "%s\n" $VAR | grep 4096 | grep -v 000` local i=0 while [ -n "$VAR" ]; do echo $VAR i=$(echo $i + 1 | bc) num=`cat /sys/class/fpga/fpga0/kbuf* | grep bus | cut -c 16- | grep -v 000 | grep -c [1-9]` echo "Buffer addresses not aligned; Redo:" $i " times," $num "buffers unaligned" pci --stop-dma dma0r sleep .1 pci --start-dma dma0r sleep .05 VAR=`cat /sys/class/fpga/fpga0/kbuf* | grep bus | cut -c 16- | grep -v 000` if [ "$i" -gt 10 ]; then echo "ERROR!!! Addresses still not aligned, stopping!" break fi done if [ -z "$VAR" ]; then echo -e "\e[32mBuf addr aligned\033[1;m" else echo -e "\e[31mBuf addr UNALIGNED!!!\033[1;m" fi sleep 0.1 echo "Enable DMA" pci -w 0x4 0x1 sleep 0.1 echo "set 4k AXI packet size" pci -w 0x9100 0x20001000 sleep .01 } function reset_logic () { pci -w 0x9040 80000005 sleep .2 pci -w 0x9040 80000201 sleep .1 } function reset_cmosis () { pci -w 0x9040 80000000 sleep .3 pci -w 0x9040 80000201 sleep .3 } function reset_all () { pci -w 0x9040 80000004 sleep .2 pci -w 0x9040 80000000 sleep .3 pci -w 0x9040 80000201 sleep .3 } function check_status () { status=`pci -r 0x9050 -s 4 | awk '{print $2$3$4}'` error=0 if [ "$status" != "8449ffff0000300100000000" ]; then echo -e "\e[31m---------------------->>>> ERROR! in the camera status ...\033[1;m" echo $status error=1 fi if [ "$error" = "1" ]; then echo -e "\e[31mError in the reset and initialization\033[1;m" else echo -e "\e[32mCamera READY ..................... OK\033[1;m" fi } function read_9010 () { local val=$1 value=`pci -r 0x9010 -s 1 | grep 9010 | awk '{print $2}' | cut -c 4-8` if [ "$value" != "b$val" ]; then echo -e "\e[31m----------------->>>> ERROR! read value: $value, written value: $val\033[1;m" error=1 fi sleep $SLEEP_VAL } function write_val () { local val=$1 pci -w 0x9000 $val sleep $SLEEP_VAL read_9010 $val } function set_exp_time () { exp_time=$1 # in us echo -e "Write exp time...... \e[93m$exp_time\033[1;m us" value=`pci -r 9030 | awk '{print $2}' | cut -c 7-7` if [ "$value" == "0" ]; then clk_per=0.025 # in us else clk_per=0.02083 # in us fi #read reg73 val=4900 pci -w 9000 $val sleep .01 reg73=`pci -r 9010 | awk '{print $2}' | cut -c 7-8` reg73=$((16#$reg73)) exp_time=$(echo "scale=2;$exp_time/(129*$clk_per)-0.43*$reg73"| bc) #round exp_time=$(echo "$exp_time" | awk '{printf("%d\n",$1 + 0.5)}') #need 6 chars to write in 3 CMOSIS regs exp_time=$(printf "%06x\n" $exp_time) val=aa${exp_time:4:2} write_val $val val=ab${exp_time:2:2} write_val $val val=ac${exp_time:0:2} write_val $val } function configure_cmosis () { echo "Start CMOSIS Configuration .." #first reg read val=0100 pci -w 9000 $val sleep .01 local TST=`pci -r 9010` sleep .01 # register 82, ch_en[17:16], set to 7 write_val d207 # PLL SET # register 117 -set to 1 echo "set 117" write_val f501 # register 115, set to 1 echo "set 115" write_val f301 # register 111, bit mode, 1-10bits per pixel 0-12bits-per pixel write_val ef00 # ADC_resolution @ 10/12 bits ## register 112, ADC resolution, 0-10bit per pixel, 1-11bit per pixel, 2-12bit per pixel if [ "$MODE12b" ]; then echo -e "\e[93m12\033[1;m bit mode, set ADC resolution \e[93m12\033[1;m bits " write_val f002 else echo -e "\e[93m10\033[1;m bit mode, set ADC resolution \e[93m10\033[1;m bits " write_val f000 fi # adc recommended 28=44 # register 103, ADC gain echo "set gain" write_val e72c ## register 102, PGA, 3 is max value, echo "set PGA" write_val e603 # register 84, set to 4 echo "set reg 84" write_val d404 # register 85, set to 1 echo "set reg 85" write_val d501 # recommended is d840 # register 88, set to 64 dec echo "set reg 88" write_val d840 # recommended is db40 # register 91, set to 64 echo "set reg 91" write_val db40 # register 94, set to 101 echo "set reg 94" write_val de65 # register 95, set to 106 echo "set reg 95" write_val df6a # VRAMP 6c is 108 # register 98, 109 default, now: 108 echo "set VRAMP" write_val e26c # VRAMP 6c is 108 # register 99, same value as 98 echo "set VRAMP 2" write_val e36c ### NUMBER OF OUTPUT if [ "$MODE12b" ]; then echo -e "se reg 72 - \e[93m4\033[1;m data lines" write_val c802 else echo -e "set reg 72 - \e[93m16\033[1;m data lines" write_val c800 fi # register 40, image flipping, 0-no flip, 1-X, 2-Y, 3-both X and Y echo "set reg 40" write_val a800 echo "End CMOSIS Configuration .." } function set_number_lines () { number_lines=$1 echo -e "Write number of lines: \e[93m$number_lines\033[1;m" number_lines=$(printf "%04x\n" $number_lines) val=81${number_lines:2:4} write_val $val val=82${number_lines:0:2} write_val $val } function set_skip () { skip=$1 echo -e "Write skip: \e[93m$skip\033[1;m" skip=$(printf "%04x\n" $skip) val=a3${skip:2:4} write_val $val val=a4${skip:0:2} write_val $val val=a5${skip:2:4} write_val $val val=a6${skip:0:2} write_val $val } function set_start_address () { number_lines=$1 echo -e "Write start line: \e[93m$number_lines\033[1;m" number_lines=$(printf "%04x\n" $number_lines) val=83${number_lines:2:4} write_val $val val=84${number_lines:0:2} write_val $val } function print_help () { echo -e "" echo "Usage: reset.sh [--dma] [--logic] [--cmosis [--12b]] [--all [--12b]] [--4MP | --num-rows=2047] [--exp-time=100] [--skip=0] [--start=0]" echo -e "order of options is not important" echo -e "" echo -e "\e[33m --help: \033[1;m print this message and exit" echo -e "\e[33m --dma: \033[1;m reset only dma" echo -e "\e[33m --logic: \033[1;m reset only logic" echo -e "\e[33m --cmosis: \033[1;m reset cmosis, and set default cmosis values" echo -e "\e[33m --all: \033[1;m reset logic and cmosis, and set default cmosis values" echo -e "\e[33m --4MP: \033[1;m set 2047 rows, default 1088 rows" echo -e "\e[33m --12b: \033[1;m use 12bits, default 10 bits, only use with --cmosis or --all flag" echo -e "\e[33m--num-rows: \033[1;m set number of rows, default 1088" echo -e "\e[33m--exp-time: \033[1;m set exposure time in us, default 100" echo -e "\e[33m --skip: \033[1;m set skip, default 0" echo -e "\e[33m --start: \033[1;m set start line, default 0" echo -e "\nExample:" echo -e "reset.sh --cmosis ; --> Reset CMOSIS in 10bit mode" echo -e "reset.sh --cmosis --12b --4MP; --> Reset CMOSIS in 12bit mode, 2047 rows" echo -e "\nWrong:" echo -e "reset.sh --12b " echo -e "reset.sh --4MP --num-rows=1000 " echo -e "\nDiscouraged:" echo -e "reset.sh --all --dma --logic --cmosis " } input=$@ for i in "$@"; do case $i in --all) RESET_ALL=YES shift ;; --cmosis) RESET_CMOSIS=YES shift ;; --help) SHOW_USAGE=YES shift ;; --dma) RESET_DMA=YES shift ;; --logic) RESET_LOGIC=YES shift ;; --12b) MODE12b=YES shift ;; --4MP) SET_4MP=YES NUM_ROWS=2047 shift ;; --num-rows=*) NUM_ROWS="${i#*=}" SET_ROWS=YES shift ;; --exp-time=*) EXP_TIME="${i#*=}" SET_EXP_TIME=YES shift ;; --start-row=*) START_ROW="${i#*=}" SET_START=YES shift ;; --skip=*) SKIP_ROWS="${i#*=}" SET_SKIP=YES shift ;; *) WRONG=YES shift ;; esac done # check wrong or empty inputs ####################### if [ -z "$input" ]; then echo "Usage: reset.sh [--dma] [--logic] [--cmosis [--12b]] [--all [--12b]] [--4MP | --num-rows=2047] [--exp-time=100] [--skip=0] [--start=0]" exit 0 fi if [ "$SHOW_USAGE" ]; then print_help exit 0 fi if [ "$SET_4MP" ] && [ "$SET_ROWS" ]; then WRONG=YES fi if [ -z "$RESET_CMOSIS" ] && [ -z "$RESET_ALL" ] && [ "$MODE12b" ]; then WRONG=YES fi if [ "$RESET_ALL" ] && [ -z "$WRONG" ]; then pci -w 9020 e reset_all reset_dma configure_cmosis set_number_lines $NUM_ROWS set_exp_time $EXP_TIME set_skip 0 #set max number of frames in ddr if [ "$MODE12b" ]; then pci -w 0x91a0 e else pci -w 0x91a0 38 fi check_status exit 0 fi if [ "$RESET_CMOSIS" ] && [ -z "$WRONG" ]; then pci -w 9020 e reset_cmosis configure_cmosis set_number_lines $NUM_ROWS set_exp_time $EXP_TIME set_skip 0 #set max number of frames in ddr if [ "$MODE12b" ]; then pci -w 0x91a0 e else pci -w 0x91a0 38 fi check_status exit 0 fi if [ "$RESET_DMA" ] && [ -z "$WRONG" ]; then reset_dma fi if [ "$RESET_LOGIC" ] && [ -z "$WRONG" ]; then reset_logic check_status fi if [ -z "$WRONG" ]; then if [ "$SET_4MP" ]; then set_number_lines $NUM_ROWS fi if [ "$SET_ROWS" ]; then set_number_lines $NUM_ROWS fi if [ "$SET_SKIP" ]; then set_skip $SKIP_ROWS fi if [ "$SET_START" ]; then set_start_address $START_ROW fi if [ "$SET_EXP_TIME" ]; then set_exp_time $EXP_TIME fi fi if [ "$WRONG" ]; then echo -e "" echo -e "\e[101m !!!WRONG ARGUMENT!!!, check reset.sh --help \033[1;m" echo -e "" fi