转自:http://bbs.21ic.com/icview-741800-1-1.html
先来看一个例子
代码1
-
CSL_FINST(osdRegs->VIDWINMD, OSD_VIDWINMD_VFF0, FRAMEMODE);
-
在cslr.h中,CSL_FINST定义为
代码2
-
/* the Field INSert (Token) macro */
-
#define CSL_FINST(reg, PER_REG_FIELD, TOKEN) \
-
CSL_FINS((reg), PER_REG_FIELD, CSL_##PER_REG_FIELD##_##TOKEN)
将代码1展开来
代码3
-
CSL_FINS((osdRegs->VIDWINMD),OSD_VIDWINMD_VFF0, CSL_OSD_VIDWINMD_VFF0_FRAMEMODE);
-
CSL_FINS的定义为
代码4
-
/* the Field INSert macro */
-
#define CSL_FINS(reg, PER_REG_FIELD, val) \
-
((reg) = ((reg) & ~CSL_##PER_REG_FIELD##_MASK) \
-
| CSL_FMK(PER_REG_FIELD, val))
-
将代码3继续展开
代码5
-
(((osdRegs->VIDWINMD))= (((osdRegs->VIDWINMD))&~CSL_OSD_VIDWINMD_VFF0_MASK) \
-
|CSL_FMK(OSD_VIDWINMD_VFF0, CSL_OSD_VIDWINMD_VFF0_FRAMEMODE));
看CSL_FMK的定义
代码6
-
/* the Field MaKe macro */
-
#define CSL_FMK(PER_REG_FIELD, val) \
-
(((val) << CSL_##PER_REG_FIELD##_SHIFT) & CSL_##PER_REG_FIELD##_MASK)
将代码5展开,得最终表达式
代码7
-
(((osdRegs->VIDWINMD))= (((osdRegs->VIDWINMD))&~CSL_OSD_VIDWINMD_VFF0_MASK) \
-
|(((CSL_OSD_VIDWINMD_VFF0_FRAMEMODE)<<CSL_OSD_VIDWINMD_VFF0_SHIFT)&CSL_OSD_VIDWINMD_VFF0_MASK);
在cslr_osd.h中
代码8
-
#define CSL_OSD_VIDWINMD_VFF0_MASK (0x00000002u)
-
#define CSL_OSD_VIDWINMD_VFF0_FRAMEMODE (0x00000001u)
-
#define CSL_OSD_VIDWINMD_VFF0_SHIFT (0x00000001u)
将代码7简化
代码9
-
VIDWINMD= (VIDWINMD&~2)|((1<<1)&2);
-
因此,代码1的作用是将寄存器VIDWINMD的位域VFF0设置为FRAMEMODE。
三个参数分别为寄存器变量,寄存器位域,赋予位域的值。