免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1900 | 回复: 1
打印 上一主题 下一主题

[驱动] 字符驱动read无法正常运行 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-13 10:21 |只看该作者 |倒序浏览
本帖最后由 shaohua312 于 2013-08-13 10:25 编辑

最近在写驱动,遇到个问题,请各位有空帮帮忙:
我写了一个字符驱动程序,其实就是抄宋宝华那本书的一个fifo驱动。无论我应用层fread函数要求读多少个字节,下面的驱动对应的read函数都会读取4096,也是就是说static ssize_t lshgpio_read(struct file * file, char __user * buf, size_t size, loff_t * ppos)该函数中的size永远都是4096。

举个例子  num_read = fread(Buf,1,sizeof(Buf),fp0);这里我如果定义buf为512个大小,当到内核的static ssize_t lshgpio_read(struct file * file, char __user * buf, size_t size, loff_t * ppos)时候,函数中的size是4096,在lshgpio_read我可以把真实的数据个数传到上面来,但是如果传递的数据小于512,则自动再次进入驱动的read函数,直到总共读取到512个自己为止;如果传到应用层的数据大于512个自己,则只读取512个,num_read就显示512。


很奇怪,我现在搞不清楚是linux就是这种机制还是我的程序什么地方出了问题!!!请大家帮忙,着急中!!!


static ssize_t lshgpio_read(struct file * file, char __user * buf, size_t size, loff_t * ppos)
{
        unsigned int count = size;       
        pr_info("the count value is :%d,----- %s,line:%d\n",count,  __func__, __LINE__);
        int ret = 0;
        struct gpio_timer_device *dev = file->private_data;

        DECLARE_WAITQUEUE(wait, current);
       
        down(&dev->sem);
        add_wait_queue(&dev->r_wait, &wait);
        pr_info("%s,line:%d\n", __func__, __LINE__);
        while(dev->current_len == 0) {
                if (file->f_flags &O_NONBLOCK){
                        ret = - EAGAIN;
                        goto out;
                }
                __set_current_state(TASK_INTERRUPTIBLE);
                up(&dev->sem);

                schedule();
                if(signal_pending(current)){
                        ret = - ERESTARTSYS;
                        goto out2;
                }
                down(&dev->sem);
        }
       
        if (count > dev->current_len)
                count=  dev->current_len;
        if (copy_to_user(buf, dev->mem, count)){
                ret = -EFAULT;
                goto out;
        } else {
                memcpy(dev->mem, dev->mem + count, dev->current_len - count);
                dev->current_len -= count;
                ret = count;
                pr_info("Read %d bytes--%s,line:%d\n", count ,  __func__, __LINE__);
                wake_up_interruptible(&dev->w_wait);
        }
        out:
                up(&dev->sem);
        out2:
                remove_wait_queue(&dev->r_wait, &wait);
                set_current_state(TASK_RUNNING);       
        pr_info("%s,line:%d\n", __func__, __LINE__);
        return ret;
}

附上这段程序!无论我怎么写应用层,当进入read函数后都会显示the count value is :4096

论坛徽章:
0
2 [报告]
发表于 2013-08-13 16:38 |只看该作者
是挺奇怪的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP