CSL库的一个例子分析

2019-07-18 14:07发布

本帖最后由 msblast 于 2014-5-30 21:17 编辑

先来看一个例子

代码1
  1. CSL_FINST(osdRegs->VIDWINMD, OSD_VIDWINMD_VFF0, FRAMEMODE);
复制代码是什么意思呢?

在cslr.h中,CSL_FINST定义为
代码2
  1. /* the Field INSert (Token) macro */
  2. #define CSL_FINST(reg, PER_REG_FIELD, TOKEN)                                
  3.     CSL_FINS((reg), PER_REG_FIELD, CSL_##PER_REG_FIELD##_##TOKEN)
复制代码将代码1展开来
代码3
  1. CSL_FINS((osdRegs->VIDWINMD),OSD_VIDWINMD_VFF0, CSL_OSD_VIDWINMD_VFF0_FRAMEMODE);
复制代码CSL_FINS的定义为
代码4
  1. /* the Field INSert macro */
  2. #define CSL_FINS(reg, PER_REG_FIELD, val)                                   
  3.     ((reg) = ((reg) & ~CSL_##PER_REG_FIELD##_MASK)                          
  4.     | CSL_FMK(PER_REG_FIELD, val))
复制代码将代码3继续展开
代码5
  1. (((osdRegs->VIDWINMD))= (((osdRegs->VIDWINMD))&~CSL_OSD_VIDWINMD_VFF0_MASK)
  2.         |CSL_FMK(OSD_VIDWINMD_VFF0, CSL_OSD_VIDWINMD_VFF0_FRAMEMODE));
复制代码看CSL_FMK的定义
代码6
  1. /* the Field MaKe macro */
  2. #define CSL_FMK(PER_REG_FIELD, val)                                         
  3.     (((val) << CSL_##PER_REG_FIELD##_SHIFT) & CSL_##PER_REG_FIELD##_MASK)
复制代码将代码5展开,得最终表达式
代码7
  1. (((osdRegs->VIDWINMD))= (((osdRegs->VIDWINMD))&~CSL_OSD_VIDWINMD_VFF0_MASK)
  2.         |(((CSL_OSD_VIDWINMD_VFF0_FRAMEMODE)<<CSL_OSD_VIDWINMD_VFF0_SHIFT)&CSL_OSD_VIDWINMD_VFF0_MASK);
复制代码
在cslr_osd.h中
代码8
  1. #define CSL_OSD_VIDWINMD_VFF0_MASK (0x00000002u)
  2. #define CSL_OSD_VIDWINMD_VFF0_FRAMEMODE (0x00000001u)
  3. #define CSL_OSD_VIDWINMD_VFF0_SHIFT (0x00000001u)
复制代码再来看看寄存器VIDWINMD的定义
vff0.JPG

将代码7简化
代码9
  1. VIDWINMD= (VIDWINMD&~2)|((1<<1)&2);
复制代码
因此,代码1的作用是将寄存器VIDWINMD的位域VFF0设置为FRAMEMODE。
三个参数分别为寄存器变量,寄存器位域,赋予位域的值。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。