输入子系统(三)------调用关系

d rivers/input/input.c:
input_init > err = register_chrdev(INPUT_MAJOR, "input", &input_fops);

static const struct file_operations input_fops = {
.owner = THIS_MODULE,
.open = input_open_file,
};


问:怎么读按键?


input_open_file
struct input_handler *handler = input_table[iminor(inode) >> 5];
new_fops = fops_get(handler->fops)  //  =>&evdev_fops
file->f_op = new_fops;
err = new_fops->open(inode, file);


app: read > ... > file->f_op->read  


input_table数组由谁构造?


input_register_handler




注册input_handler:
input_register_handler
// 放入数组
input_table[handler->minor >> 5] = handler;

// 放入链表
list_add_tail(&handler->node, &input_handler_list);


// 对于每个input_dev,调用input_attach_handler
list_for_each_entry(dev, &input_dev_list, node)
input_attach_handler(dev, handler); // 根据input_handler的id_table判断能否支持这个input_dev






注册输入设备:
input_register_device
// 放入链表
list_add_tail(&dev->node, &input_dev_list);

// 对于每一个input_handler,都调用input_attach_handler
list_for_each_entry(handler, &input_handler_list, node)
input_attach_handler(dev, handler); // 根据input_handler的id_table判断能否支持这个input_dev




input_attach_handler
id = input_match_device(handler->id_table, dev);

error = handler->connect(handler, dev, id);




注册input_dev或input_handler时,会两两比较左边的input_dev和右边的input_handler,
根据input_handler的id_table判断这个input_handler能否支持这个input_dev,
如果能支持,则调用input_handler的connect函数建立"连接"


怎么建立连接?
1. 分配一个input_handle结构体
2. 
input_handle.dev = input_dev;  // 指向左边的input_dev
input_handle.handler = input_handler;  // 指向右边的input_handler
3. 注册:
   input_handler->h_list = &input_handle;
   inpu_dev->h_list      = &input_handle;




evdev_connect
evdev = kzalloc(sizeof(struct evdev), GFP_KERNEL); // 分配一个input_handle

// 设置
evdev->handle.dev = dev;  // 指向左边的input_dev
evdev->handle.name = evdev->name;
evdev->handle.handler = handler;  // 指向右边的input_handler
evdev->handle.private = evdev;

// 注册
error = input_register_handle(&evdev->handle);

怎么读按键?
app: read
--------------------------
   .......
    evdev_read
    // 无数据并且是非阻塞方式打开,则立刻返回
if (client->head == client->tail && evdev->exist && (file->f_flags & O_NONBLOCK))
return -EAGAIN;

// 否则休眠
retval = wait_event_interruptible(evdev->wait,
client->head != client->tail || !evdev->exist);
   


谁来唤醒?
evdev_event
wake_up_interruptible(&evdev->wait);




evdev_event被谁调用?
猜:应该是硬件相关的代码,input_dev那层调用的
在设备的中断服务程序里,确定事件是什么,然后调用相应的input_handler的event处理函数
gpio_keys_isr
// 上报事件
input_event(input, type, button->code, !!state);
input_sync(input);

input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
struct input_handle *handle;


list_for_each_entry(handle, &dev->h_list, d_node)
if (handle->open)
handle->handler->event(handle, type, code, value);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 软件管理系统概要设计-史上最标准模板.docx是一份用于软件管理系统概要设计的模板文档。该概要设计旨在帮助软件开发团队在系统设计之初,明确系统的整体结构和功能,为后续详细设计和开发提供指导。 该模板包括以下几个主要部分: 1. 引言:介绍软件管理系统的背景和目的,定义系统的范围和目标,以及概要设计的编写目的和读者。 2. 总体设计:描述软件管理系统的总体结构和模块划分。通过图示或详细说明,展示主要模块之间的关系和交互方式,以及关键模块和功能。 3. 功能需求:列出软件管理系统的主要功能和子功能,通过用例图、功能列表或其他方式,详细描述每个功能模块的功能和输入输出。 4. 数据设计:定义软件管理系统的核心数据结构和数据库设计。包括实体关系图、数据字典以及数据流程图等,以便于开发人员理解和实现。 5. 接口设计:说明软件管理系统与外部系统的接口和通信方式。包括硬件接口、软件接口、API等。确保系统能够与其他系统之间进行正确的数据交换和功能调用。 6. 安全设计:考虑软件管理系统的安全性需求,包括身份认证、权限控制、数据加密等方面的设计。 7. 性能设计:描述软件管理系统的性能需求和设计方案。包括系统响应时间、并发用户数、服务器配置等要求。 8. 验证计划:制定软件管理系统概要设计的验证计划和方法。包括需求验证、功能验证和性能验证等方面。 通过按照该模板编写软件管理系统概要设计,可以使开发团队更好地理解系统需求,明确系统设计方向,减少后期开发过程中的变更和调整,提高开发效率和质量。同时,该模板也可以作为项目文档的一部分,为项目的持续开发和维护提供参考依据。 ### 回答2: 《软件管理系统概要设计-史上最标准模板.docx》是一份软件管理系统概要设计文档的标准模板。这份模板的目的是为软件管理系统的概要设计提供基本结构和指导。 该概要设计模板包含以下主要部分:介绍、需求概述、系统架构、功能模块、数据模型、界面设计、安全性、性能、可靠性、可维护性、限制和假设、适应性和可扩展性以及参考文献。 在介绍部分,会简要介绍该软件管理系统的背景、目的和重要性,以及该概要设计的作用和目标。 需求概述部分会详细列出该软件管理系统的功能需求、性能需求以及安全性需求等。 系统架构部分会描述整个软件管理系统的整体架构,包括系统的组成部分、层次结构、模块功能和相互关系等。 功能模块部分详细描述每个功能模块的功能和接口,以及模块之间的交互方式。 数据模型部分会介绍系统所需的数据模型,包括数据结构、数据流和数据关系等。 界面设计部分会展示软件管理系统的用户界面设计,包括界面布局、交互方式和用户操作流程等。 在安全性、性能、可靠性和可维护性部分,会讨论系统在这些方面的要求和设计考虑。 限制和假设部分会列出设计中的限制和假设条件,以确保设计的可行性和实施性。 适应性和可扩展性部分会讨论该软件管理系统的适应能力和可扩展性,以满足未来的需求和变化。 最后,参考文献部分会列出该概要设计所参考的相关文献和资料。 总之,《软件管理系统概要设计-史上最标准模板.docx》对于软件管理系统的概要设计提供了一个完整的指导框架,旨在帮助设计人员更好地进行系统设计和开发。 ### 回答3: 对于“软件管理系统概要设计-史上最标准模板.docx”,我们可以提供以下回答: “软件管理系统概要设计-史上最标准模板.docx”是一个软件管理系统的概要设计模板,旨在提供一个标准化的模板,帮助软件管理系统的设计者进行概要设计。 该概要设计模板首先包含了项目的基本信息,如项目名称、项目编号、作者等。接下来,模板会对软件管理系统的目标和功能进行详细描述,明确系统所要实现的目标以及提供的功能。这部分内容可以包括系统的总体结构和模块分析,以及各个模块的功能介绍。 在详细说明系统功能后,模板还会对系统的需求进行分析和概述。这包括对用户需求和运行环境的分析,以及系统的性能要求和安全要求等方面的概述。此外,模板还可能包含对系统的设计约束和假设的描述。 最后,该概要设计模板还会对系统的概要设计方案进行描述。这部分内容包括对系统的整体架构和模块设计的概述,以及对关键技术和实现方法的介绍。此外,模板还可能包含对系统的扩展性和可维护性的考虑,以及对开发计划和测试计划的初步安排。 总的来说,“软件管理系统概要设计-史上最标准模板.docx”提供了一个组织化、标准化的模板,可以帮助软件管理系统的设计者进行概要设计。通过使用该模板,设计者可以更好地规划系统的结构和功能,并确保系统符合用户需求和设计要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值