reset.sh 11 KB

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