此代码出现在帧缓冲驱动程序中..
static inline u32 convert_bitfield(int val, struct fb_bitfield *bf)
{
unsigned int mask = (1 << bf->length) - 1;
return (val >> (16 - bf->length) & mask) << bf->offset;
}
从如下使用方式判断,
if (regno < 15) {
fb->cmap[regno] = convert_bitfield(transp, &fb->fb.var.transp) |
convert_bitfield(blue, &fb->fb.var.blue) |
convert_bitfield(green, &fb->fb.var.green) |
convert_bitfield(red, &fb->fb.var.red);
return 0;
}
我认为这个函数将值移动到16位值的位置。例如,如果16位值由5位R,6位G和5位B组成,并且如果R = 1,G = 2,B = 3,则16位值将变为0x0843。 (没有alpha位) 00001 000010 00011 = 0000 1000 0100 0011 = 0x0843。
但是上面的代码似乎并没有像预期的那样工作。由于(16-bf->长度)项,该值在被屏蔽之前被移出到零。有人请解释这是如何工作的? (找到3个帧缓冲驱动程序,所以人们似乎对它感到满意..)
提前致谢。 陈
编辑:沃尔特,这是fb_bitfied。
struct fb_bitfield {
__u32 offset; /* beginning of bitfield */
__u32 length; /* length of bitfield */
__u32 msb_right; /* != 0 : Most significant bit is */
/* right */
};
答案 0 :(得分:1)
我将尝试解释该函数的作用:
Fisrt值为transp,蓝绿色为16位且反转,例如
blue = 28 = 0b0000000000011100 is actually 0b0011100000000000
让我们假设RGB565所以蓝色长度为5:
val >> (16 - bf->length) shifts blue 11 places blue = 0b0000000000000111
然后掩码5 - 1 = 4位,
(val >> (16 - bf->length) & mask) translates to 0b0000000000000111 & 0b0000000000001111
最后它会转换为蓝色应该是R G B格式
瓦尔特