load3518e shell 脚本当中的大概布局:
注意:
1、shell 当中的函数只有在调用的时候采用执行,定义的时候并不会执行,所以我们直接向下分析找到,不是函数的部分。
2、要查找一些对应的语法细节:参考学习
1、变量定义:
(1)这些变量都是有默认值的、同时我们可以通过 bash 当中传入的值,来对这些系统变量进行修改。
####################Variables Definition##########################
SNS_TYPE=ar0230 # sensor type
mem_total=64; # 64M, total mem
mem_start=0x80000000; # phy mem start
os_mem_size=32; # 32M, os mem
mmz_start=0x82000000; # mmz start addr
mmz_size=32M; # 32M, mmz size
- sensortype:(可以查看对应的 insert_sns 函数,看看 hi3518e的 sdk 支持哪几种 sensor)
- 定义 memory 的大小,因为其内置 ddr 是 64M ,OS占用 32M,海思的 MPP 平台占用 32M。
2、分析参数解析:
假如我们传入的参数如下:
./load3518e -i -sensor ar0130 -osmem 32 -total 64
更换为:
./load3518e -i -sensor ov9712 -osmem 32 -total 64
保存之后,重新启动
脚本当中的定义:
-
b_arg_os_mem:这些是一些临时的变量,用来存放传入参数的标志位。
-
for arg in $@
:这一句很重要:做了两件事:
(1)$@
:将传入的参数,一个一个拿进来,参数都是以空格为分界。(第一个为 -i、第二个为 -sensor)
(2)定义了一个 arg 的变量,将$@
拿进来的参数,赋值给了 arg。
(3)一直循环,直到参数传递完毕. -
分析执行上面的语句,这里会发生什么现象?
(1)-i:b_arg_insmod=1
(2)-sensor:b_arg_sensor=1
(3)ar0130:因为此时 b_arg_sensor=1 ,所以会进入 if 语句,b_arg_sensor=0
、SNS_TYPE=$arg
;从而修改了变量SNS_TYPE
的值,并且下一次也不会进入 if 语句。
(4)-osmem :同理,依次类推。
b_arg_os_mem=0
b_arg_total_mem=0
b_arg_sensor=0
b_arg_insmod=0
b_arg_remove=0
b_arg_online=1
b_arg_restore=0
for arg in $@
do
if [ $b_arg_total_mem -eq 1 ]; then
b_arg_total_mem=0;
mem_total=$arg;
if [ -z $mem_total ]; then
echo "[error] mem_total is null"
exit;
fi
fi
if [ $b_arg_os_mem -eq 1 ] ; then
b_arg_os_mem=0;
os_mem_size=$arg;
if [ -z $os_mem_size ]; then
echo "[error] os_mem_size is null"
exit;
fi
fi
if [ $b_arg_sensor -eq 1 ] ; then
b_arg_sensor=0
SNS_TYPE=$arg;
fi
case $arg in
"-i")
b_arg_insmod=1;
;;
"-r")
b_arg_remove=1;
;;
"-a")
b_arg_insmod=1;
b_arg_remove=1;
;;
"-h")
load_usage;
;;
"-sensor")
b_arg_sensor=1;
;;
"-osmem")
b_arg_os_mem=1;
;;
"-total")
b_arg_total_mem=1;
;;
"-restore")
b_arg_restore=1;
;;
"-offline")
b_arg_online=0;
;;
esac
done
3、分析 action
脚本当中的定义:
if [ $# -lt 1 ]; then
load_usage;
exit 0;
fi
if [ $b_arg_remove -eq 1 ]; then
remove_ko;
fi
if [ $b_arg_insmod -eq 1 ]; then
insert_ko;
fi
if [ $b_arg_restore -eq 1 ]; then
sys_restore;
fi
(1)分析第一个 if
- $# :代表传入参数的个数。
- -lt:less then检测左边的数是否小于右边的,如果是,则返回 true。
- 即,如果传入的参数小于一个,则执行 load_usage 函数,并且 exit 0; 退出脚本。
(2)分析第三个if:
- b_arg_remove=0, 所以它不会执行对应的语句
(3)分析第三个if:
- 因为我们传入了 -i 参数,所以会让 b_arg_insmod=1,所以会执行对应的挂载函数。