reset.sh 10.0 KB

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