reset.sh 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. #!/bin/bash
  2. PCI=$(which pci)
  3. NUM_ROWS=1088
  4. EXP_TIME=100 #us
  5. SLEEP_VAL=0.03
  6. if [ -z "$PCI" ]; then
  7. echo "pcitool not found."
  8. exit 1
  9. fi
  10. function reset_dma () {
  11. pci --stop-dma dma0r
  12. sleep .1
  13. pci --start-dma dma0r
  14. sleep .1
  15. # check that all of the buffers are on the x1000 addresses
  16. # only 4096B buffers should be 4K alligned
  17. local VAR=`cat /sys/class/fpga/fpga0/kbuffers | awk '{print $1 $2 $3}'`
  18. VAR=`printf "%s\n" $VAR | grep 4096 | grep -v 000`
  19. local i=0
  20. while [ -n "$VAR" ]; do
  21. echo $VAR
  22. i=$(echo $i + 1 | bc)
  23. num=`cat /sys/class/fpga/fpga0/kbuf* | grep bus | cut -c 16- | grep -v 000 | grep -c [1-9]`
  24. echo "Buffer addresses not aligned; Redo:" $i " times," $num "buffers unaligned"
  25. pci --stop-dma dma0r
  26. sleep .1
  27. pci --start-dma dma0r
  28. sleep .05
  29. VAR=`cat /sys/class/fpga/fpga0/kbuf* | grep bus | cut -c 16- | grep -v 000`
  30. if [ "$i" -gt 10 ]; then
  31. echo "ERROR!!! Addresses still not aligned, stopping!"
  32. break
  33. fi
  34. done
  35. if [ -z "$VAR" ]; then
  36. echo -e "\e[32mBuf addr aligned\033[1;m"
  37. else
  38. echo -e "\e[31mBuf addr UNALIGNED!!!\033[1;m"
  39. fi
  40. sleep 0.1
  41. echo "Enable DMA"
  42. pci -w 0x4 0x1
  43. sleep 0.1
  44. echo "set 4k AXI packet size"
  45. pci -w 0x9100 0x20001000
  46. sleep .01
  47. }
  48. function reset_logic () {
  49. pci -w 0x9040 80000005
  50. sleep .1
  51. pci -w 0x9040 80000001
  52. sleep .1
  53. }
  54. function reset_cmosis () {
  55. pci -w 0x9040 80000000
  56. sleep .3
  57. pci -w 0x9040 80000001
  58. sleep .3
  59. }
  60. function reset_all () {
  61. pci -w 0x9040 80000004
  62. sleep .2
  63. pci -w 0x9040 80000000
  64. sleep .3
  65. pci -w 0x9040 80000001
  66. sleep .3
  67. }
  68. function check_status () {
  69. status=`pci -r 0x9050 -s 4 | awk '{print $2$3$4}'`
  70. if [ "$status" != "8449ffff0000300100000000" ]; then
  71. echo -e "\e[31m---------------------->>>> ERROR! in the camera status ...\033[1;m"
  72. echo $status
  73. error=1
  74. fi
  75. if [ "$error" = "1" ]; then
  76. echo -e "\e[31mError in the reset and initialization\033[1;m"
  77. else
  78. echo -e "\e[32mCamera READY ..................... OK\033[1;m"
  79. fi
  80. }
  81. function read_9010 () {
  82. local val=$1
  83. value=`pci -r 0x9010 -s 1 | grep 9010 | awk '{print $2}' | cut -c 4-8`
  84. if [ "$value" != "b$val" ]; then
  85. echo -e "\e[31m----------------->>>> ERROR! read value: $value, written value: $val\033[1;m"
  86. error=1
  87. fi
  88. sleep $SLEEP_VAL
  89. }
  90. function write_val () {
  91. local val=$1
  92. pci -w 0x9000 $val
  93. sleep $SLEEP_VAL
  94. read_9010 $val
  95. }
  96. function set_exp_time () {
  97. exp_time=$1 # in us
  98. echo -e "Write exp time...... \e[93m$exp_time\033[1;m us"
  99. value=`pci -r 9030 | awk '{print $2}' | cut -c 7-7`
  100. if [ "$value" == "0" ]; then
  101. clk_per=0.025 # in us
  102. else
  103. clk_per=0.02083 # in us
  104. fi
  105. #read reg73
  106. val=4900
  107. pci -w 9000 $val
  108. sleep .01
  109. reg73=`pci -r 9010 | awk '{print $2}' | cut -c 7-8`
  110. reg73=$((16#$reg73))
  111. exp_time=$(echo "scale=2;$exp_time/(129*$clk_per)-0.43*$reg73"| bc)
  112. #round
  113. exp_time=$(echo "$exp_time" | awk '{printf("%d\n",$1 + 0.5)}')
  114. #need 6 chars to write in 3 CMOSIS regs
  115. exp_time=$(printf "%06x\n" $exp_time)
  116. val=aa${exp_time:4:2}
  117. write_val $val
  118. val=ab${exp_time:2:2}
  119. write_val $val
  120. val=ac${exp_time:0:2}
  121. write_val $val
  122. }
  123. function configure_cmosis () {
  124. echo "Start CMOSIS Configuration .."
  125. #first reg read
  126. val=0100
  127. pci -w 9000 $val
  128. sleep .01
  129. local TST=`pci -r 9010`
  130. sleep .01
  131. # register 82, ch_en[17:16], set to 7
  132. write_val d207
  133. # PLL SET
  134. # register 117 -set to 1
  135. echo "set 117"
  136. write_val f501
  137. # register 115, set to 1
  138. echo "set 115"
  139. write_val f301
  140. # register 111, bit mode, 1-10bits per pixel 0-12bits-per pixel
  141. write_val ef00
  142. # ADC_resolution @ 10/12 bits
  143. ## register 112, ADC resolution, 0-10bit per pixel, 1-11bit per pixel, 2-12bit per pixel
  144. if [ "$MODE12b" ]; then
  145. echo -e "\e[93m12\033[1;m bit mode, set ADC resolution \e[93m12\033[1;m bits "
  146. write_val f002
  147. else
  148. echo -e "\e[93m10\033[1;m bit mode, set ADC resolution \e[93m10\033[1;m bits "
  149. write_val f000
  150. fi
  151. # adc recommended 28=44
  152. # register 103, ADC gain
  153. echo "set gain"
  154. write_val e72c
  155. ## register 102, PGA, 3 is max value,
  156. echo "set PGA"
  157. write_val e603
  158. # register 84, set to 4
  159. echo "set reg 84"
  160. write_val d404
  161. # register 85, set to 1
  162. echo "set reg 85"
  163. write_val d501
  164. # recommended is d840
  165. # register 88, set to 64 dec
  166. echo "set reg 88"
  167. write_val d840
  168. # recommended is db40
  169. # register 91, set to 64
  170. echo "set reg 91"
  171. write_val db40
  172. # register 94, set to 101
  173. echo "set reg 94"
  174. write_val de65
  175. # register 95, set to 106
  176. echo "set reg 95"
  177. write_val df6a
  178. # VRAMP 6c is 108
  179. # register 98, 109 default, now: 108
  180. echo "set VRAMP"
  181. write_val e26c
  182. # VRAMP 6c is 108
  183. # register 99, same value as 98
  184. echo "set VRAMP 2"
  185. write_val e36c
  186. ### NUMBER OF OUTPUT
  187. if [ "$MODE12b" ]; then
  188. echo -e "se reg 72 - \e[93m4\033[1;m data lines"
  189. write_val c802
  190. else
  191. echo -e "set reg 72 - \e[93m16\033[1;m data lines"
  192. write_val c800
  193. fi
  194. # register 40, image flipping, 0-no flip, 1-X, 2-Y, 3-both X and Y
  195. echo "set reg 40"
  196. write_val a800
  197. echo "End CMOSIS Configuration .."
  198. }
  199. function set_number_lines () {
  200. number_lines=$1
  201. echo -e "Write number of lines: \e[93m$number_lines\033[1;m"
  202. number_lines=$(printf "%04x\n" $number_lines)
  203. val=81${number_lines:2:4}
  204. write_val $val
  205. val=82${number_lines:0:2}
  206. write_val $val
  207. }
  208. function print_help () {
  209. echo -e ""
  210. echo "Usage: reset.sh [--dma] [--logic] [--cmosis [--12b]] [--all [--12b]] [--4MP | --num-rows=2047] [--exp-time=100]"
  211. echo -e "order of options is not important"
  212. echo -e ""
  213. echo -e "\e[33m --help: \033[1;m print this message and exit"
  214. echo -e "\e[33m --dma: \033[1;m reset only dma"
  215. echo -e "\e[33m --logic: \033[1;m reset only logic"
  216. echo -e "\e[33m --cmosis: \033[1;m reset cmosis, and set default cmosis values"
  217. echo -e "\e[33m --all: \033[1;m reset logic and cmosis, and set default cmosis values"
  218. echo -e "\e[33m --4MP: \033[1;m set 2047 rows, default 1088 rows"
  219. echo -e "\e[33m --12b: \033[1;m use 12bits, default 10 bits, only use with --cmosis or --all flag"
  220. echo -e "\e[33m--num-rows: \033[1;m set number of rows, default 1088"
  221. echo -e "\e[33m--exp-time: \033[1;m set exposure time in us, default 100"
  222. echo -e "\nExample:"
  223. echo -e "reset.sh --cmosis ; --> Reset CMOSIS in 10bit mode"
  224. echo -e "reset.sh --cmosis --12b --4MP; --> Reset CMOSIS in 12bit mode, 2047 rows"
  225. echo -e "\nWrong:"
  226. echo -e "reset.sh --12b "
  227. echo -e "reset.sh --4MP --num-rows=1000 "
  228. echo -e "\nDiscouraged:"
  229. echo -e "reset.sh --all --dma --logic --cmosis "
  230. }
  231. input=$@
  232. for i in "$@"; do
  233. case $i in
  234. --all)
  235. RESET_ALL=YES
  236. shift
  237. ;;
  238. --cmosis)
  239. RESET_CMOSIS=YES
  240. shift
  241. ;;
  242. --help)
  243. SHOW_USAGE=YES
  244. shift
  245. ;;
  246. --dma)
  247. RESET_DMA=YES
  248. shift
  249. ;;
  250. --logic)
  251. RESET_LOGIC=YES
  252. shift
  253. ;;
  254. --12b)
  255. MODE12b=YES
  256. shift
  257. ;;
  258. --4MP)
  259. SET_4MP=YES
  260. NUM_ROWS=2047
  261. shift
  262. ;;
  263. --num-rows=*)
  264. NUM_ROWS="${i#*=}"
  265. SET_ROWS=YES
  266. shift
  267. ;;
  268. --exp-time=*)
  269. EXP_TIME="${i#*=}"
  270. SET_EXP_TIME=YES
  271. shift
  272. ;;
  273. *)
  274. WRONG=YES
  275. shift
  276. ;;
  277. esac
  278. done
  279. # check wrong or empty inputs #######################
  280. if [ -z "$input" ]; then
  281. echo "Usage: reset.sh [--dma] [--logic] [--cmosis [--12b]] [--all [--12b]] [--4MP | --num-rows=2047] [--exp-time=100]"
  282. exit 0
  283. fi
  284. if [ "$SHOW_USAGE" ]; then
  285. print_help
  286. exit 0
  287. fi
  288. if [ "$SET_4MP" ] && [ "$SET_ROWS" ]; then
  289. WRONG=YES
  290. fi
  291. if [ -z "$RESET_CMOSIS" ]; then
  292. if [ -z "$RESET_ALL" ]; then
  293. if [ "$MODE12b" ]; then
  294. WRONG=YES
  295. elif [ "$SET_4MP" ] && [ "$SET_ROWS" ]; then
  296. WRONG=YES
  297. elif [ "$SET_4MP" ]; then
  298. set_number_lines $NUM_ROWS
  299. elif [ "$SET_ROWS" ]; then
  300. set_number_lines $NUM_ROWS
  301. elif [ "$SET_EXP_TIME" ]; then
  302. set_exp_time $EXP_TIME
  303. fi
  304. fi
  305. fi
  306. if [ "$WRONG" ]; then
  307. echo -e ""
  308. echo -e "\e[101m !!!WRONG ARGUMENT!!!, check reset.sh --help \033[1;m"
  309. echo -e ""
  310. exit
  311. fi
  312. if [ "$RESET_DMA" ]; then
  313. reset_dma
  314. fi
  315. if [ "$RESET_LOGIC" ]; then
  316. reset_logic
  317. if [ -z "$WRONG" ]; then
  318. check_status
  319. fi
  320. fi
  321. if [ "$RESET_CMOSIS" ]; then
  322. pci -w 9020 e
  323. reset_cmosis
  324. configure_cmosis
  325. set_number_lines $NUM_ROWS
  326. set_exp_time $EXP_TIME
  327. check_status
  328. fi
  329. if [ "$RESET_ALL" ]; then
  330. pci -w 9020 e
  331. reset_all
  332. reset_dma
  333. configure_cmosis
  334. set_number_lines $NUM_ROWS
  335. set_exp_time $EXP_TIME
  336. check_status
  337. fi