This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

发现DVSDK里面kernel的一个错误并修正



我目前在使用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;