input core input.c (1)

news/2024/7/7 21:58:32

drivers/input/input.c

就是所谓的input的核心程序。

分析这个文件,先从input_init开始。

   1:  static int __init input_init(void)
   2:  {
   3:  err = class_register(&input_class);
   4:  err = input_proc_init();
   5:  err = register_chrdev(INPUT_MAJOR, "input", &input_fops);
   6:  }

__init 把它放到了init.text段,初始化的时候会调用。函数去掉检查的情况,也就这么几行。class_register注册了一个device model里的class类型。具体会在__class_register里面调到

   1:  /*对class的私有数据进行了初始化工作*/
   2:  /*cp是一个class_private类型,class的私有类型*/    
   3:  cp = kzalloc(sizeof(*cp), GFP_KERNEL);
   4:  /*初始化了klist的get/put函数,实际调用了get_device和put_device*/
   5:  klist_init(&cp->class_devices, klist_class_dev_get, klist_class_dev_put);
   6:  INIT_LIST_HEAD(&cp->class_interfaces);
   7:  kset_init(&cp->class_dirs);
   8:  __mutex_init(&cp->class_mutex, "struct class mutex", key);
   9:  error = kobject_set_name(&cp->class_subsys.kobj, "%s", cls->name);
  10:      
  11:  /* set the default /sys/dev directory for devices of this class */
  12:  if (!cls->dev_kobj)
  13:      cls->dev_kobj = sysfs_dev_char_kobj;
  14:  /*注册kset,里面要先初始化kset,在这里获取kobject,就建立了目录了*/
  15:  error = kset_register(&cp->class_subsys);
  16:  /*这里建立attribute文件,遍历它的attribute,熟悉device model的话就知道attribute其实就对应着文件*/
  17:  error = add_class_attrs(class_get(cls));
  18:   
再回来到input_init中,下一个input_proc_init,这个函数主要建立input字系统在proc文件系统中的目录,文件,注册相应的fops.

这个很简单:

   1:  /*在proc下建立了input的目录*/    
   2:  proc_bus_input_dir = proc_mkdir("bus/input", NULL);
   3:  /*在bus/input下建立两个文件devices和handlers,并注册了它们的fops,这两个fops是在input.c中定义的,fops的函数也是在input.c中定义.*/
   4:  entry = proc_create("devices", 0, proc_bus_input_dir,
   5:              &input_devices_fileops);
   6:  entry = proc_create("handlers", 0, proc_bus_input_dir,
   7:              &input_handlers_fileops);
   8:      

下面一个register_chardev注册了一个主设备号为INPUT_MAJOR,次设备号从0-256,文件操作符为input_fops的字符设备.

看完了input_init,再看看input.c中,后半部分就是fops的函数,前面是一些接口函数,中间是

handle和handler函数.

待续

转载于:https://www.cnblogs.com/linuxkernel/archive/2011/04/07/2008810.html


http://lihuaxi.xjx100.cn/news/251427.html

相关文章

GZip压缩与解压缩

GZIP的压缩与解压缩代码&#xff1a; public static class CompressionHelper{/// <summary> /// Compress the byte[] /// </summary> /// <param name"input"></param> /// <returns></returns> public static byte[] Compres…

linux shell显示下载进度,shell脚本测试下载速度

在linux下用shell来测试下载速度&#xff0c;很实用的shell代码。代码&#xff1a;复制代码 代码示例:#!/bin/bash#date:20140210# edit: www.jquerycn.cn#used for test server download speedr_host"188.18.28.19"r_dir"/home/test0208/tmp"r_file"…

TSQL语句中的Like用法

SQL Server&#xff1a;SQL Like 的特殊用法 %&#xff1a;匹配零个及多个任意字符&#xff1b; _&#xff1a;与任意单字符匹配&#xff1b; []&#xff1a;匹配一个范围&#xff1b; [^]&#xff1a;排除一个范围 SymbolMeaninglike 5[%]5%like [_]n_nlike [a-cdf]a, b, c, d…

【组队学习】【32期】scikit-learn教程

scikit-learn教程 航路开辟者&#xff1a;江季领航员&#xff1a;李牧轩航海士&#xff1a;武帅、陈宇 基本信息 开源内容&#xff1a;&#xff1a;https://github.com/datawhalechina/machine-learning-toy-code/tree/main/ml-with-sklearn内容属性&#xff1a;公测课程内容…

LAMP兄弟连PHP课程学习笔记 第二天 PHP中使用变量

2019独角兽企业重金招聘Python工程师标准>>> 一、变量的介绍 变量&#xff1a;是指临时储存值的容器&#xff0c;这个值可以是数字或者文本或者其他组合。可以在程序使用的过程中更改。 二、变量的声明 1、如果用到的数据需要多次被调用时就声明为变量&#xff0c;P…

HSV 通道分离

// 转换成hsv cv::Mat img_h, img_s, img_v, imghsv;std::vector<cv::Mat> hsv_vec;cv::cvtColor(srcImage, imghsv, CV_BGR2HSV);cv::imshow("hsv", imghsv);cv::waitKey(0);// 分割hsv通道cv::split(imghsv, hsv_vec);img_h hsv_vec[0];img_s hsv_vec[1];i…

在c语言中逗号的作用,关于c语言中的逗号运算符???

等下。。答错了。。还需要理解一下神马是逗号表达式。。我前面说的和uuyyhhjj与delta_charlie的意思一样&#xff0c;但其实我们都搞错了。你可以自己把我们的例子都运行一下&#xff0c;看看是不是这样。下面我感觉应该是我正确的理解。逗号表达式是所有运算符中优先级最低的&…