作者:僵小鱼 | 来源:互联网 | 2023-10-11 22:23
用shell脚本实现某个寄存器的某几位设置
坑位1:
开发板上不认(ubuntu上可以)
for (( i=0;i<6;i++ ))
do
done
换成:
for i in `seq 0 6`
do
done
坑位2:
返回值承接用#?时默认只截取低8位
setbits $1 $2 $3 $4
regv=$?
printf "regv= %#x\n" $regv
发现只剩低八位
所以,换种承接方式吧:
regv=`regread $1`
这种方式是直接将命令执行或在屏幕上输出的东西接过来,是字符串。
坑位3:
如上面,reg=`regread $1`得到的字符串若用printf "%d" 是打印不到的,直接echo才行
坑位4:
reg=setbits $1 $2 $3 $4 这种方式来承接会爆语法错误,不是C语言。
最终测试成功,如下:
#######################################################
# test the sar-adc in SOC
#######################################################
regwrite()
{
devmem $1 32 $2
}
regread()
{
devmem $1
}
##argv[1] :origin data
##argv[2] :start bit
##argv[3] :end bit
##argv[4] :result
setbits()
{
value=$1
for i in `seq $2 $3`
do
mask=$(( 0x1 <<$i ))
#printf "mask = %#x\n" $mask
value=$(( $value & ~$mask ))
#printf "clean bit %d value = %#x\n" $i $value
mask1=$(( 0x1 <<($i - $2) ))
#printf "mask1 = %#x\n" $mask1
bitv=$(( $4 & mask1 ))
#printf "bitv = %#x\n" $bitv
value=$(( $value | ($bitv <<$2) ))
#printf "set bit %d value = %#x\n" $i $value
done
printf "%#x\n" $value
return $value
}
reg_set_bits()
{
regv=`regread $1`
regv=`setbits $regv $2 $3 $4 `
regwrite $1 $regv
}
reg_set_bits $1 $2 $3 $4
shell脚本之位运算+for循环+返回值承接