11#! /bin/sh
22# Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
3- # SPDX-License-Identifier: BSD-3-Clause#
3+ # SPDX-License-Identifier: BSD-3-Clause
44# Camera NHX validation
55
66TESTNAME=" Camera_NHX"
@@ -51,10 +51,8 @@ RUN_LOG="$LOG_DIR/${TESTNAME}_${TS}.log"
5151SUMMARY_TXT=" $OUT_DIR /${TESTNAME} _summary_${TS} .txt"
5252DMESG_DIR=" $LOG_DIR /dmesg_${TS} "
5353
54- # NHX helper output directory (IMPORTANT: lib_camera.sh expects a directory, not a file)
5554NHX_OUTDIR=" $OUT_DIR /nhx_${TS} "
5655
57- # dump list & checksum artifacts (produced by dump validation helper)
5856DUMPS_LIST=" $NHX_OUTDIR /nhx_dumps.list"
5957CHECKSUMS_TXT=" $NHX_OUTDIR /nhx_checksums.txt"
6058CHECKSUMS_PREV=" $OUT_DIR /${TESTNAME} _checksums.prev.txt"
@@ -65,13 +63,26 @@ if [ -z "$MARKER" ]; then
6563 : > " $MARKER " 2> /dev/null || true
6664fi
6765
68- cleanup () { rm -f " $MARKER " 2> /dev/null || true ; }
69- trap cleanup EXIT INT TERM
66+ CAM_SERVER_PRESENT=0
67+ CAM_SERVER_STOPPED_FOR_TEST=0
68+
69+ # shellcheck disable=SC2317
70+ cleanup () {
71+ if [ " $CAM_SERVER_STOPPED_FOR_TEST " -eq 1 ] && [ " $CAM_SERVER_PRESENT " -eq 1 ]; then
72+ systemd_service_start_safe " cam-server" > /dev/null 2>&1 || true
73+ fi
74+
75+ if [ -n " ${MARKER:- } " ]; then
76+ rm -f " $MARKER "
77+ fi
78+ }
79+
80+ trap ' cleanup' EXIT INT TERM
7081
7182# -----------------------------------------------------------------------------
72- # Deps check (functestlib.sh provides check_dependencies)
83+ # Deps check
7384# -----------------------------------------------------------------------------
74- deps_list=" date awk sed grep tee wc ls find stat rm tr head tail dmesg sort opkg fdtdump mkfifo sha256sum md5sum cksum diff cp"
85+ deps_list=" date awk sed grep tee wc ls find stat rm tr head tail dmesg sort fdtdump mkfifo sha256sum md5sum cksum diff cp"
7586if ! check_dependencies " $deps_list " ; then
7687 log_skip " $TESTNAME SKIP missing one or more dependencies: $deps_list "
7788 echo " $TESTNAME SKIP" > " $RES_FILE "
8697
8798# -----------------------------------------------------------------------------
8899# CAMX prechecks
89- # Sequence:
90- # 1) DT check
91- # 2) fdtdump camera nodes sample
92- # 3) driver load checks
93- # 4) packages present
94- # 5) sensor presence warn-only
95100# -----------------------------------------------------------------------------
96101log_info " Checking CAMX proprietary prerequisites before running NHX"
97102
98- # -----------------------------
99- # 1) DT check
100- # -----------------------------
101103log_info " DT check"
102104
103105PATTERNS=" qcom,cam qcom,camera camera_kt cam-req-mgr cam-cpas cam-jpeg cam-ife cam-icp cam-sensor camera0-thermal"
@@ -110,7 +112,6 @@ for pat in $PATTERNS; do
110112 printf ' %s\n' " $out "
111113 found_any=1
112114 else
113- # Explicit append logic (reviewer-friendly; avoids &&/|| ambiguity)
114115 if [ -n " $missing_list " ]; then
115116 missing_list=" $missing_list , $pat "
116117 else
@@ -125,12 +126,9 @@ if [ "$found_any" -ne 1 ]; then
125126 exit 0
126127fi
127128
128- # -----------------------------
129- # 2) fdtdump camera nodes sample
130- # -----------------------------
131129log_info " fdtdump camera nodes sample"
132130
133- FDT_MATCHES=" $( camx_fdtdump_has_cam_nodes 2> /dev/null || true ) "
131+ FDT_MATCHES=" $( camx_fdtdump_has_cam_nodes 2> /dev/null) "
134132rc=$?
135133if [ " $rc " -ne 0 ]; then
136134 if [ " $rc " -eq 2 ]; then
@@ -143,37 +141,31 @@ if [ "$rc" -ne 0 ]; then
143141fi
144142
145143printf ' %s\n' " $FDT_MATCHES " | while IFS= read -r l; do
146- [ -n " $l " ] && log_info " $l "
144+ if [ -n " $l " ]; then
145+ log_info " $l "
146+ fi
147147done
148148
149- # -----------------------------
150- # 3) driver load checks
151- # -----------------------------
152149log_info " driver load checks"
153150
154151CAM_MOD=" "
155152
156- if command -v lsmod > /dev/null 2>&1 ; then
157- CAM_MOD=" $( lsmod 2> /dev/null | awk ' {print $1}' \
158- | grep -E ' ^(camera_qc|camera_qcm|camera_qcs)' \
159- | head -n 1 || true) "
153+ if command -v camx_pick_camera_module > /dev/null 2>&1 ; then
154+ CAM_MOD=" $( camx_pick_camera_module 2> /dev/null || true) "
160155fi
161156
162- if [ -z " $CAM_MOD " ]; then
163- kver=" $( uname -r 2> /dev/null || true) "
164- if [ -n " $kver " ] && [ -d " /lib/modules/$kver " ]; then
165- ko=" $( find " /lib/modules/$kver " -type f \( -name ' camera_qc*.ko' -o -name ' camera_qcm*.ko' -o -name ' camera_qcs*.ko' \) \
166- 2> /dev/null | head -n 1 || true) "
167- CAM_MOD=" $( basename " ${ko:- } " .ko) "
168- fi
157+ if [ -z " $CAM_MOD " ] && command -v lsmod > /dev/null 2>&1 ; then
158+ CAM_MOD=" $( lsmod 2> /dev/null | awk ' {print $1}' | grep -E ' ^(camera_qc|camera_qcm|camera_qcs)' | head -n 1 || true) "
169159fi
170160
171161if [ -z " $CAM_MOD " ]; then
172- log_skip " $TESTNAME SKIP could not determine camera module name "
162+ log_skip " $TESTNAME SKIP could not determine board-specific camera module"
173163 echo " $TESTNAME SKIP" > " $RES_FILE "
174164 exit 0
175165fi
176166
167+ log_info " Board-specific camera module selected $CAM_MOD "
168+
177169CAM_KO=" $( find_kernel_module " $CAM_MOD " 2> /dev/null || true) "
178170if [ -z " $CAM_KO " ] || [ ! -f " $CAM_KO " ]; then
179171 log_skip " $TESTNAME SKIP camera module artifact not found ${CAM_MOD} .ko"
@@ -197,7 +189,6 @@ if [ -z "$ICP_FW" ] || [ ! -f "$ICP_FW" ]; then
197189fi
198190log_info " ICP firmware found $ICP_FW "
199191
200- # dmesg collection and error scan
201192module_regex=' CAM_(ERR|WARN|FATAL)'
202193exclude_regex=' dummy regulator|supply [^ ]+ not found|using dummy regulator'
203194
@@ -216,12 +207,10 @@ FW_DL_OK=0
216207FW_DONE_OK=0
217208
218209if [ -n " $FW_BASENAME " ] && [ -r " $DM_SNAP " ]; then
219- if grep -F " CAM_INFO: CAM-ICP: cam_a5_download_fw" " $DM_SNAP " 2> /dev/null \
220- | grep -F " $FW_BASENAME " > /dev/null 2>&1 ; then
210+ if grep -F " CAM_INFO: CAM-ICP: cam_a5_download_fw" " $DM_SNAP " 2> /dev/null | grep -F " $FW_BASENAME " > /dev/null 2>&1 ; then
221211 FW_DL_OK=1
222212 fi
223- if grep -F " CAM_INFO: CAM-ICP: cam_icp_mgr_hw_open" " $DM_SNAP " 2> /dev/null \
224- | grep -F " FW download done successfully" > /dev/null 2>&1 ; then
213+ if grep -F " CAM_INFO: CAM-ICP: cam_icp_mgr_hw_open" " $DM_SNAP " 2> /dev/null | grep -F " FW download done successfully" > /dev/null 2>&1 ; then
225214 FW_DONE_OK=1
226215 fi
227216fi
238227bind_cnt=0
239228if [ -r " $DM_SNAP " ]; then
240229 bind_cnt=" $( grep -ciE ' cam_req_mgr.*bound|bound.*cam_req_mgr' " $DM_SNAP " 2> /dev/null || echo 0) "
241- case " $bind_cnt " in ' ' |* [!0-9]* ) bind_cnt=0 ;; esac
230+ case " $bind_cnt " in
231+ ' ' |* [!0-9]* ) bind_cnt=0 ;;
232+ esac
242233fi
243234
244- if [ " $bind_cnt " -lt 5 ]; then
245- log_skip " $TESTNAME SKIP CAMX bind graph not observed"
246- echo " $TESTNAME SKIP " > " $RES_FILE "
247- exit 0
235+ if [ " $bind_cnt " -lt 1 ]; then
236+ log_warn " CAMX bind graph not observed in pre-NHX dmesg snapshot "
237+ else
238+ log_info " CAMX bind graph observed in pre-NHX dmesg snapshot count= $bind_cnt "
248239fi
249- log_info " CAMX bind graph observed"
250240
251- # -----------------------------
252- # 4) packages present
253- # -----------------------------
254241log_info " packages present"
255242
256243CAMX_PKGS=" $( camx_opkg_list_camx 2> /dev/null || true) "
262249
263250log_info " CAMX packages detected"
264251printf ' %s\n' " $CAMX_PKGS " | while IFS= read -r l; do
265- [ -n " $l " ] && log_info " $l "
252+ if [ -n " $l " ]; then
253+ log_info " $l "
254+ fi
266255done
267256
268- # -----------------------------
269- # 5) sensor presence warn-only
270- # -----------------------------
271257log_info " sensor presence warn-only NHX may still work without cam sensors"
272258
273259SENSOR_COUNT=" $( libcam_list_sensors_count 2> /dev/null || true) "
274- case " $SENSOR_COUNT " in ' ' |* [!0-9]* ) SENSOR_COUNT=0 ;; esac
260+ case " $SENSOR_COUNT " in
261+ ' ' |* [!0-9]* ) SENSOR_COUNT=0 ;;
262+ esac
275263log_info " cam list detected $SENSOR_COUNT cameras"
276264if [ " $SENSOR_COUNT " -lt 1 ]; then
277265 log_warn " No sensors reported by cam list continuing"
278266fi
279267
280- # -----------------------------------------------------------------------------
281- # Pick checksum tool (prefer helper in lib_camera.sh)
282- # -----------------------------------------------------------------------------
283268CKSUM_TOOL=" "
284269if command -v nhx_pick_cksum_tool > /dev/null 2>&1 ; then
285270 CKSUM_TOOL=" $( nhx_pick_cksum_tool) "
@@ -299,6 +284,39 @@ log_info "DUMP_DIR=$DUMP_DIR"
299284log_info " NHX_OUTDIR=$NHX_OUTDIR "
300285log_info " CKSUM_TOOL=${CKSUM_TOOL:- none} "
301286
287+ # -----------------------------------------------------------------------------
288+ # cam-server stop before NHX
289+ # -----------------------------------------------------------------------------
290+ if systemd_service_exists " cam-server" ; then
291+ CAM_SERVER_PRESENT=1
292+
293+ CAM_SERVER_TS_BEFORE_STOP=' 5 minutes ago'
294+
295+ log_info " cam-server status before stop"
296+ systemd_service_status_log " cam-server BEFORE stop (status only)" " $RUN_LOG " " cam-server" || true
297+
298+ log_info " cam-server stdout before stop"
299+ systemd_service_stdout_since " cam-server BEFORE stop (stdout recent)" \
300+ " $RUN_LOG " " $CAM_SERVER_TS_BEFORE_STOP " " cam-server.service" || true
301+
302+ log_info " Stopping cam-server before nhx.sh"
303+ if systemd_service_stop_safe " cam-server" ; then
304+ CAM_SERVER_STOPPED_FOR_TEST=1
305+ CAM_SERVER_TS_AFTER_STOP=" $( date ' +%Y-%m-%d %H:%M:%S' ) "
306+
307+ log_info " cam-server status after stop"
308+ systemd_service_status_log " cam-server AFTER stop (status only)" " $RUN_LOG " " cam-server" || true
309+
310+ log_info " cam-server stdout after stop"
311+ systemd_service_stdout_since " cam-server AFTER stop (stdout since stop marker)" \
312+ " $RUN_LOG " " $CAM_SERVER_TS_AFTER_STOP " " cam-server.service" || true
313+ else
314+ log_warn " Failed to stop cam-server before nhx.sh"
315+ fi
316+ else
317+ log_info " cam-server service not present, continuing"
318+ fi
319+
302320# -----------------------------------------------------------------------------
303321# Run NHX
304322# -----------------------------------------------------------------------------
@@ -329,21 +347,38 @@ else
329347fi
330348
331349# -----------------------------------------------------------------------------
332- # Dump validation (delegate to lib_camera.sh helper)
333- # IMPORTANT: helper expects an output DIRECTORY, not a file path.
350+ # cam-server start after NHX
351+ # -----------------------------------------------------------------------------
352+ if [ " $CAM_SERVER_STOPPED_FOR_TEST " -eq 1 ]; then
353+ log_info " Starting cam-server after nhx.sh"
354+ if systemd_service_start_safe " cam-server" ; then
355+ CAM_SERVER_STOPPED_FOR_TEST=0
356+ CAM_SERVER_TS_AFTER_START=" $( date ' +%Y-%m-%d %H:%M:%S' ) "
357+
358+ log_info " cam-server status after start"
359+ systemd_service_status_log " cam-server AFTER start (status only)" " $RUN_LOG " " cam-server" || true
360+
361+ log_info " cam-server stdout after start"
362+ systemd_service_stdout_since " cam-server AFTER start (stdout since start marker)" \
363+ " $RUN_LOG " " $CAM_SERVER_TS_AFTER_START " " cam-server.service" || true
364+ else
365+ log_warn " Failed to start cam-server after nhx.sh"
366+ fi
367+ else
368+ log_info " cam-server was not stopped for test, skipping restart"
369+ fi
370+ # -----------------------------------------------------------------------------
371+ # Dump validation
334372# -----------------------------------------------------------------------------
335373DUMP_VALIDATION_FAIL=0
336374
337- # Ensure output directory exists regardless of helper/fallback
338375mkdir -p " $NHX_OUTDIR " 2> /dev/null || true
339376
340377if command -v nhx_validate_dumps_and_checksums > /dev/null 2>&1 ; then
341- # nhx_validate_dumps_and_checksums <dump_dir> <marker_file> <out_dir> <out_checksums> <prev_checksums>
342378 if ! nhx_validate_dumps_and_checksums " $DUMP_DIR " " $MARKER " " $NHX_OUTDIR " " $CHECKSUMS_TXT " " $CHECKSUMS_PREV " ; then
343379 DUMP_VALIDATION_FAIL=1
344380 fi
345381
346- # If helper generated a different list name, keep our expected path working.
347382 if [ ! -s " $DUMPS_LIST " ]; then
348383 if [ -s " $NHX_OUTDIR /nhx_dumps.list" ]; then
349384 DUMPS_LIST=" $NHX_OUTDIR /nhx_dumps.list"
@@ -354,7 +389,6 @@ if command -v nhx_validate_dumps_and_checksums >/dev/null 2>&1; then
354389 fi
355390 fi
356391else
357- # fallback: old behavior
358392 : > " $DUMPS_LIST " 2> /dev/null || true
359393
360394 grep -F " Saving image to file:" " $RUN_LOG " \
363397 | sort -u > " $DUMPS_LIST " 2> /dev/null || true
364398
365399 DUMP_COUNT=" $( wc -l < " $DUMPS_LIST " 2> /dev/null | awk ' {print $1}' ) "
366- [ -n " $DUMP_COUNT " ] || DUMP_COUNT=0
400+ if [ -z " $DUMP_COUNT " ]; then
401+ DUMP_COUNT=0
402+ fi
367403
368404 if [ " $DUMP_COUNT " -eq 0 ]; then
369405 log_info " No dump paths found in log scanning dump dir for new files"
@@ -373,15 +409,11 @@ else
373409 fi
374410fi
375411
376- # -----------------------------------------------------------------------------
377- # Compute dump count (based on DUMPS_LIST produced by helper/fallback)
378- # -----------------------------------------------------------------------------
379412DUMP_COUNT=" $( wc -l < " $DUMPS_LIST " 2> /dev/null | awk ' {print $1}' ) "
380- [ -n " $DUMP_COUNT " ] || DUMP_COUNT=0
413+ if [ -z " $DUMP_COUNT " ]; then
414+ DUMP_COUNT=0
415+ fi
381416
382- # -----------------------------------------------------------------------------
383- # Validate dumps (summary-side size scan; checksum is already done by helper)
384- # -----------------------------------------------------------------------------
385417ZERO_OR_MISSING=0
386418TOTAL_BYTES=0
387419
@@ -410,7 +442,6 @@ if [ "$DUMP_COUNT" -gt 0 ]; then
410442 } >> " $SUMMARY_TXT "
411443
412444 while IFS= read -r f; do
413- # Clear, reviewer-friendly empty-line skip
414445 [ -z " $f " ] && continue
415446
416447 if [ ! -f " $f " ]; then
@@ -419,11 +450,10 @@ if [ "$DUMP_COUNT" -gt 0 ]; then
419450 continue
420451 fi
421452
422- SZ=" $( stat -c %s " $f " 2> /dev/null) "
423- if [ -z " $SZ " ]; then
424- SZ=" $( wc -c < " $f " 2> /dev/null | awk ' {print $1}' ) "
425- fi
426- [ -n " $SZ " ] || SZ=0
453+ SZ=" $( nhx_dump_size_bytes " $f " 2> /dev/null || printf ' %s\n' " 0" ) "
454+ case " $SZ " in
455+ ' ' |* [!0-9]* ) SZ=0 ;;
456+ esac
427457
428458 if [ " $SZ " -le 0 ]; then
429459 ZERO_OR_MISSING=$(( ZERO_OR_MISSING + 1 ))
0 commit comments