- 论坛徽章:
- 0
|
本帖最后由 zheguzai 于 2012-05-04 17:46 编辑
今天遇到这个问题,简直让我很吐血,搞了好久还是不行,因为感觉这个根本就不会出问题的,可是居然出了这种问题
以前的驱动要添加接口,所以我就在原来驱动的ioctl中添加了一项,并且通过应用程序调用该ioctl,可是奇怪的事情发生了,我传递给
驱动的数据,居然不是我想要的,搞了半天都不行,期间试了两种方法,第一种:驱动中不用copy_from_user()函数来接收从应用传来的指针,可是这样也不行,第二种,就是用copy_from_user()函数来接受从应用传来的指针,可是还是不行。不说了上代码,大家帮我看看,哪里出问题了。。。。
应用层代码,调用的代码很简单就两句。。。。我从应用传过去的数据就是1和2,其他的数据都会报错的。
- int channel= 2;
- if (ioctl(inputFd, VPFE_CMD_SELECT_TVP5158_CHANNEL, &channel) == -1)
- {
- printf("VPFE_CMD_SELECT_TVP5158_CHANNEL failed\n");
- }
复制代码 驱动代码:- case VPFE_CMD_SELECT_TVP5158_CHANNEL:
- {
-
- int channel_id;
- copy_from_user(&channel_id, (int *)arg, sizeof(int));
-
- printk("channel_id = %d\n",channel_id);//本来这句打印出来应该是2的,可是它不是,是个垃圾数值,
- if (channel_id < 1 || channel_id > 2)
- {
- ret = -EINVAL;
- break;
- }
-
- tvp5158_ctrl(TVP5158_SELECT_CHANNEL, &channel_id);
- break;
- }
复制代码 驱动中刚开始用这种方式实现的。一样是不行的- case VPFE_CMD_SELECT_TVP5158_CHANNEL:
- {
-
- int *channel_id = (int *)arg;
-
- printk("channel_id = %d\n",*channel_id);//本来这句打印出来应该是2的,可是它不是,是个垃圾数值,
- if (*channel_id < 1 || *channel_id > 2)
- {
- ret = -EINVAL;
- break;
- }
-
- tvp5158_ctrl(TVP5158_SELECT_CHANNEL, channel_id);
- break;
- }
复制代码 大家帮我看看,看是哪里出错了,谢谢了 。。。。。。。。。。 |
|