我目前在使用dvsdk-demos_4_02_00_01做DM368的视频应用开发,发现了linux-2.6.32.17-psp03.01.01.39内核里面的一个错误,我已经修改好了,提醒大家注意。
发现这个错误的过程是,我们做了一个小程序来测试fbdev的虚屏滚动效果,发现水平滚动的时候,总是提示参数错误,不成功。
测试程序的代码是参考下面的函数来写的,
static Int setDisplayBuffer(Display_Handle hDisplay, Int displayIdx)
{
struct fb_var_screeninfo varInfo;
if (ioctl(hDisplay->fd, FBIOGET_VSCREENINFO, &varInfo) == -1) {
Dmai_err1("Failed FBIOGET_VSCREENINFO (%s)\n", strerror(errno));
return Dmai_EFAIL;
}
varInfo.yoffset = varInfo.yres * displayIdx;
if (ioctl(hDisplay->fd, FBIOPAN_DISPLAY, &varInfo) == -1) {
Dmai_err1("Failed FBIOPAN_DISPLAY (%s)\n", strerror(errno));
return Dmai_EFAIL;
}
return Dmai_EOK;
}
我们在测试代码里面,增加了 varInfo.xoffset + = 1; 结果运行不成功,然后我跟踪到内核的实现函数davincifb_pan_display,看到代码注释说明xoffset必须是xpanstep的整倍数,可是他的代码确不是这个意思,我猜想可能是代码笔误,就去掉了多余的取反运算,重新编译kernel并下载到flash后,重新启动,修改测试代码varInfo.xoffset + = 16;因为xpanstep等于16,运行结果就正确了,可以水平滚动了。
同样的笔误,在下面的函数里面也有。
davincifb_check_var
/* xoffset must be a multiple of xpanstep */
// Peter Li
if (var->xoffset & (fix.xpanstep - 1))
return -EINVAL;