此代码显示在帧缓冲驱动程序中。
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-> length)项,该值在被屏蔽之前移出为零。 有人请解释这是如何工作的? (找到了3个framebuffer驱动程序,所以人们对此很满意。)
提前致谢。 陈
编辑:沃尔特,这是fb_bitfied。
struct fb_bitfield {
__u32 offset; /* beginning of bitfield */
__u32 length; /* length of bitfield */
__u32 msb_right; /* != 0 : Most significant bit is */
/* right */
};