之前在csdn上发了个帖子,讨论这个问题:帖子地方:
后来还是自己最终解决了:我发当时的意思给粘贴在这:
- 我的问题是我试过4k的,能传输下去了
-
但是4k以上的就传不下去,app和drv层涉及主要的结构体和函数列出如下:
-
-
app:
-
typedef struct {
-
unsigned int type;
-
unsigned int addr;
-
unsigned int len;
-
unsigned int cmd;
-
unsigned int *prv;
-
}fpga_opt_t;
-
unsigned char ramdata[4096*4];
-
memset(ramdata,0x07, 4096*4* sizeof(unsigned char));
-
wt.addr = addr;
-
wt.len = len;
-
wt.prv =(unsigned int *) ramdata;
-
retval =ioctl(scfd,3094,&wt);
-
-
-
drv:
-
static int wmsc_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg)
-
{
-
fpga_opt_t tmp;
-
fpga_opt_t *ptmp = &tmp;
-
-
switch(cmd)
-
{
-
case 3094:
-
printk("\nwmsc_write is write ram is:\n");
-
copy_from_user((unsigned char *)ptmp,(unsigned char *)arg,sizeof(fpga_opt_t));
-
-
start =4093;
-
for( i=start; i<(start +16); i++){
-
if( i%8 ==0)
-
printk("\n");
-
printk("0x%04x ",*( (unsigned char *)( ( (fpga_opt_t *)ptmp)->prv +i)) );
-
}
-
break;
-
}
-
-
上面的start参数为4093,所以打印出了如下的数据:
-
0x0007 0x0007 0x0007
-
0x0000 0x0000 0x0031 0x0031 0x000f 0x0000 0x0000 0x0000
-
0x0000 0x0000 0x0000 0x0000 0x0000
-
说明前三个是正确的,后面的都是随机的
-
-
同时,我修改start参数,当在0-4096之间的话,就可以输出0x0007,而一旦大于4096,输出基本为0.
-
-
这个证明了,ioctl只能传递4k大小的数据么?还是我程序中有问题。
-
-
-
问题解决了:
-
说一个我的方法,并且我相信大家以后也会碰到这个问题的,在ddrIII中也讲述了关于ioctl来传递数据的问题,但是没有讲述操作大量数据的方法。
-
-
实际上我上面也提到了方法,就是回复1楼得一个帖子中,再次使用copy_from_user,把用户空间的那个指针指向的区域也传下来:
-
具体程序中执行的方法,我列出来(我把我提的问题中的drv下的ioctl修改一下如下:):
-
static int wmsc_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg)
-
{
-
fpga_opt_t tmp;
-
fpga_opt_t *ptmp = &tmp;
-
char *pbuff_ram1; //预先定义一个指针
-
-
-
switch(cmd)
-
{
-
case 3094:
-
printk("\nwmsc_write is write ram is:\n");
-
copy_from_user((unsigned char *)ptmp,(unsigned char *)arg,sizeof(fpga_opt_t));
-
pbuff_ram1=(char *)kmalloc(4096 *4*sizeof(char),GFP_KERNEL);
-
-
copy_from_user((unsigned char *)pbuff_ram1,(unsigned char *)(( (fpga_opt_t *)ptmp)->prv),4096 *4);start =4093;
-
-
start =16370;
-
for( i=start; i<(start +16); i++){
-
if( i%8 ==0)
-
printk("\n");
-
printk("0x%04x ",*( (unsigned char *)( pbuff_ram1 +i)) );
-
}
-
break;
-
kfree(pbuff_ram1);
-
}
-
-
-
可以看到我把start改为16370,已经快接近16K的大小了,新的打印信息如下:
-
0x0007 0x0007 0x0007 0x0007 0x0007 0x0007
-
0x0007 0x0007 0x0007 0x0007 0x0007 0x0007 0x0007 0x0007
-
-
说明新的修改方法正确了。。。
-
希望我的这个方法可以帮到其他的人。。。
记录下来,以后学习。。。
阅读(5172) | 评论(0) | 转发(1) |