用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 $4regv=$?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
原文地址:https://www.cnblogs.com/xxg1992/p/9090339.html
时间: 2024-10-08 08:15:46