下面是JPEG驱动中的一部分,在网上找的,在友善的内核文件中就没有这个s3c-jpeg.c和s3c-jpeg.h文件,估计又是在那个prebuild.fo里面
static int s3c_jpeg_ioctl(struct inode *inode, struct file *file, unsigned
int cmd, unsigned long arg)
{
static S3C6400_JPG_CTX *JPGRegCtx;
JPG_DEC_PROC_PARAM DecReturn;
JPG_ENC_PROC_PARAM EncParam;
BOOL result = TRUE;
DWORD ret;
JPGRegCtx = (S3C6400_JPG_CTX *)file->private_data;
if(!JPGRegCtx){
LOG_MSG(LOG_ERROR, "s3c_jpeg_ioctl", "DD::JPG Invalid Input Handle\r\n");
return FALSE;
}
ret = LockJPGMutex();
if(!ret){
LOG_MSG(LOG_ERROR, "s3c_jpeg_ioctl", "DD::JPG Mutex Lock Fail\r\n");
return FALSE;
}
switch (cmd)
{
case IOCTL_JPG_DECODE:
LOG_MSG(LOG_TRACE, "s3c_jpeg_ioctl", "IOCTL_JPEG_DECODE\n");
Copy_From_User(&DecReturn, (JPG_DEC_PROC_PARAM *)arg, sizeof(JPG_DEC_PROC_PARAM));
result = decodeJPG(JPGRegCtx, &DecReturn);
LOG_MSG(LOG_TRACE, "s3c_jpeg_ioctl", "width : %d hegiht : %d size : %d\n",
DecReturn.width, DecReturn.height, DecReturn.dataSize);
Copy_To_User((void *)arg, (void *)&DecReturn, sizeof(JPG_DEC_PROC_PARAM));
break;
case IOCTL_JPG_ENCODE:
LOG_MSG(LOG_TRACE, "s3c_jpeg_ioctl", "IOCTL_JPEG_ENCODE\n");
Copy_From_User(&EncParam, (JPG_ENC_PROC_PARAM *)arg, sizeof(JPG_ENC_PROC_PARAM));
LOG_MSG(LOG_TRACE, "s3c_jpeg_ioctl", "width : %d hegiht : %d\n",
EncParam.width, EncParam.height);
result = encodeJPG(JPGRegCtx, &EncParam);
LOG_MSG(LOG_TRACE, "s3c_jpeg_ioctl", "encoded file size : %d\n", EncParam.fileSize);
Copy_To_User((void *)arg, (void *)&EncParam, sizeof(JPG_ENC_PROC_PARAM));
break;
case IOCTL_JPG_GET_STRBUF:
LOG_MSG(LOG_TRACE, "s3c_jpeg_ioctl", "IOCTL_JPG_GET_STRBUF\n");
UnlockJPGMutex();
return arg;
case IOCTL_JPG_GET_THUMB_STRBUF:
LOG_MSG(LOG_TRACE, "s3c_jpeg_ioctl", "IOCTL_JPG_GET_THUMB_STRBUF\n");
UnlockJPGMutex();
return arg + JPG_STREAM_BUF_SIZE;
case IOCTL_JPG_GET_FRMBUF:
LOG_MSG(LOG_TRACE, "s3c_jpeg_ioctl", "IOCTL_JPG_GET_FRMBUF\n");
UnlockJPGMutex();
return arg + JPG_STREAM_BUF_SIZE + JPG_STREAM_THUMB_BUF_SIZE;
case IOCTL_JPG_GET_THUMB_FRMBUF:
LOG_MSG(LOG_TRACE, "s3c_jpeg_ioctl", "IOCTL_JPG_GET_THUMB_FRMBUF\n");
UnlockJPGMutex();
return arg + JPG_STREAM_BUF_SIZE + JPG_STREAM_THUMB_BUF_SIZE + JPG_FRAME_BUF_SIZE;
case IOCTL_JPG_GET_PHY_FRMBUF:
LOG_MSG(LOG_TRACE, "s3c_jpeg_ioctl", "IOCTL_JPG_GET_PHY_FRMBUF\n");
UnlockJPGMutex();
return JPG_DATA_BASE_ADDR + JPG_STREAM_BUF_SIZE + JPG_STREAM_THUMB_BUF_SIZE;
case IOCTL_JPG_GET_PHY_THUMB_FRMBUF:
LOG_MSG(LOG_TRACE, "s3c_jpeg_ioctl", "IOCTL_JPG_GET_PHY_THUMB_FRMBUF\n");
UnlockJPGMutex();
return JPG_DATA_BASE_ADDR + JPG_STREAM_BUF_SIZE + JPG_STREAM_THUMB_BUF_SIZE + JPG_FRAME_BUF_SIZE;
default :
LOG_MSG(LOG_ERROR, "s3c_jpeg_ioctl", "DD::JPG Invalid ioctl : 0x%X\r\n", cmd);
}
UnlockJPGMutex();
return result;
}
default :
LOG_MSG(LOG_ERROR, "s3c_jpeg_ioctl", "DD::JPG Invalid ioctl : 0x%X\r\n", cmd);
最后执行了上面这一句,打印出:
[JPEG_DRV: ERROR] s3c_jpeg_ioctl: DD::JPG Invalid ioctl : 0x5cmd值是5在s3c-jpeg.h(网上找的)里面有:
#ifndef __JPEG_DRIVER_H__
#define __JPEG_DRIVER_H__
#define MAX_INSTANCE_NUM 1
#define MAX_PROCESSING_THRESHOLD 1000 // 1Sec
#define IOCTL_JPG_DECODE 0x00000002
#define IOCTL_JPG_ENCODE 0x00000003
#define IOCTL_JPG_GET_STRBUF 0x00000004
#define IOCTL_JPG_GET_FRMBUF 0x00000005#define IOCTL_JPG_GET_THUMB_STRBUF 0x0000000A
#define IOCTL_JPG_GET_THUMB_FRMBUF 0x0000000B
#define IOCTL_JPG_GET_PHY_FRMBUF 0x0000000C
#define IOCTL_JPG_GET_PHY_THUMB_FRMBUF 0x0000000D
#define JPG_CLOCK_DIVIDER_RATIO_QUARTER 4
#endif /*__JPEG_DRIVER_H__*/
可能是驱动里面定义的这些宏的数值不对,或者是cmd的值不对
cmd的值是jpeg这些接口函数赋值的,也不用程序员进行赋值
所以现在就怀疑是这些宏的数值不对,现在这怎么解决啊,改也没法改。。。。
[ 此帖被leavor在2013-01-05 11:01重新编辑 ]