linux3.10.x的input输入子系统流程分析<一>

本文详细介绍了Linux 3.10.x内核中input输入子系统的流程,特别是字符设备的两种注册方法。重点讨论了在分析input子系统时采用的方法二,即通过`input_register_handler`进行设备注册。文章从应用程序的`read`调用开始,逐步解析从`seq_file.c`到`input.c`的调用链路,涉及`seq_putc`、`copy_to_user`等关键函数,并列举了`input_register_handler`在不同驱动文件中的应用,如`drivers/input/evdev.c`等。
摘要由CSDN通过智能技术生成

字符设备注册方法一:

  1. 确定主设备号major
  2. 构造file_operations   
                .open
                .read
                .write
  3. 注册字符设备 register_chrdev()
  4. 入口函数
  5. 出口函数

字符设备注册方法二:

  1、确定主设备号major
  2、构造file_operations   
            .open
            .read
            .warite
  3、注册字符设备 register_chrdev_region();
                cdev_init();
                dev_add();
  4、出口函数
  5、入口函数

在分析内核input的子系统的时候,我们发现采用的是方法二,

APP:
read -> …->file->f_op ->read.
如下分析的是从app的read开始调用流程是
seq_file.c:

app read ->seq_read->seq_putc (通过copy_to_user()函数实现user与内核通信)

input.c:

file_operations input_handlers_fileops(user与内核的调用接口) > input_proc_devices_open > seq_operations input_devices_seq_ops > input_devices_seq_show() > seq_putc() >input_proc_init >

seq_file.c

ssize_t seq_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)
 {
                struct seq_file *m = file->private_data;
            mutex_lock(&m->lock);
            /* if not empty - flush it first */
            if (m->count) {
                n = min(m->count, size);
                err = copy_to_user(buf, m->buf + m->from, n);
                m->count -= n;
                m->from += n;
                size -= n;
                buf += n;
                copied += n;
                if (!m->count)
                    m->index++;
                if (!size)
                    goto Done;
            }
}


int seq_putc(struct seq_file *m, char c)
{
        if (m->count < m->size) {
            m->buf[m->count++] = c;
            return 0;
        }
        return -1;
}

input.c


static<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值