1、platform总线结构:
device:挂接在platform总线下的设备, platform_device结构体类型
driver:挂接在platform总线下,是个与某种设备相对于的驱动, platform_driver结构体类型是个全局变量
platform_bus_type:属于虚拟设备总线,通过这个总线将设备和驱动联系起来,属于Linux中bus的一种
struct bus_type platform_bus_type = {
.name = “platform”, //设备名称
.dev_attrs = platform_dev_attrs, //设备属性、含获取sys文件名,该总线会放在/sys/bus下
.match = platform_match, //匹配设备和驱动,匹配成功就调用driver的.probe函数
.uevent = platform_uevent, //消息传递,比如热插拔操作
.suspend = platform_suspend, //电源管理的低功耗挂起
.suspend_late = platform_suspend_late,
.resume_early = platform_resume_early,
.resume = platform_resume,   //恢复
};

2、linux按键驱动,程序目录:/drivers/input/keybard/gpio_keys.c

注册和注销一个platform的driver:

设备结构体gpio_keys_device_driver定义:

3、device的driver匹配过程:

device:
platform_device_register(struct platform_device *dev)
------platform_device_add(pdev);
----------device_add(&pdev->dev);
--------------bus_probe_device(dev);
-------------------device_attach(dev);
-------------------------bus_for_each_drv(dev->bus, NULL, dev, __device_attach);
-------------------------------driver_match_device(drv, dev);成功才向下执行probe!
-------------------------------------driver_probe_device(drv, dev);
--------------------------------------------really_probe(dev, drv);
----------------------------------------------------dev->bus->probe(dev);或者drv->probe(dev);platform_device_add(pdev);

driver:
platform_driver_register(struct platform_driver * drv)
--------driver_register(&drv->driver);
------------bus_add_driver(drv);
-----------------driver_attach(drv);
------------------------bus_for_each_dev(drv->bus, NULL, drv, __driver_attach); 遍历所有节点!
-------------------------------driver_match_device(drv, dev);成功才向下执行probe!
---------------------------------------driver_probe_device(drv, dev);
------------------------------------------------really_probe(dev, drv);
---------------------------------------------------------dev->bus->probe(dev);或者drv->probe(dev);

driver_match_device() 是匹配的关键,实质是上执行:
--------return drv->bus->match ? drv->bus->match(dev, drv) : 1;
------------------.match = platform_match 最终调用bus中的platform_match函数来匹配。

bus_for_each_drv/dev() 函数中:
---------while ((dev = next_device(&i)) && !error) 遍历所有节点;
---------------error = fn(dev, data); 使用id_table匹配方式则可匹配多个设备;

4、platform的device注册过程:
初始化引脚和注册device:

相关配置的结构体:

platform_device 中的platform_data结构体定义了与硬件相关的信息:比如名称、引脚、电平、功能等;

5、device和driver匹配成功后调用probe函数进行最后的配置:
gpio_keys_probe中几个重要的步骤:

input = devm_input_alloccate_device(dev);   //分配输入设备
gpio_keys_get_devtree_pdata:获取设备树中的节点信息
input_allocate_device:为输入设备申请内存空间//配置一系列的属性
ddata->input = input;
ddata->n_buttons = pdata->nbuttons;
ddata->enable = pdata->enable;
ddata->disable = pdata->disable;
mutex_init(&ddata->disable_lock);platform_set_drvdata(pdev, ddata);
input_set_drvdata(input, ddata);input->name = pdata->name ? : pdev->name;
input->phys = "gpio-keys/input0";
input->dev.parent = &pdev->dev;
input->open = gpio_keys_open;
input->close = gpio_keys_close;input->id.bustype = BUS_HOST;
input->id.vendor = 0x0001;
input->id.product = 0x0001;
input->id.version = 0x0100;gpio_keys_setup_key:配置GPIO,设置定制器、中断、输入输出等操作
input_set_capability:设置输入设备所支持的事件类型和事件代码,也就是输入设备对哪些事件具有处理能力
sysfs_create_group:调试驱动,需要对驱动里的某些变量进行读写,或函数调用。可通过sysfs接口创建驱动对应的属性,使得可以在用户空间通过sysfs接口的show和store函数与硬件交互
input_register_device:注册device设备
gpio_keys_report_event:获取gpio状态
input_sync:同步输出
device_init_wakeup:设备唤醒

嵌入式linux之按键驱动(platform)相关推荐

  1. linux生成驱动编译的头文件,嵌入式Linux字符设备驱动——5生成字符设备节点

    嵌入式Linux字符设备驱动开发流程--以LED为例 前言 留空 头文件 #include 查看系统设备类 ls /sys/class 设备类结构体 文件(路径):include/linux/devi ...

  2. Android系统 linux内核按键驱动开发

    Android系统 linux内核按键驱动开发 前言 刚入门的小白,在csdn的帮助下完成了第一个按键驱动,特写此文记录学习并分享给有需要的人. 1.修改设备树.dts 我是用的开发板是rp-rk32 ...

  3. 嵌入式linux usb wifi驱动移植

    文档名称:嵌入式linux usb wifi驱动移植 版本历史 版本号        时间        内容 v1.0b001        2012-6-18        初始版本,介绍在嵌入式 ...

  4. linux内核按键驱动,嵌入式Linux按键驱动框架

    前言 本文将通过轮询.中断.poll机制.异步通知和同步互斥阻塞等方式编写按键驱动程序.本节的驱动框架是在<嵌入式Linux驱动框架的搭建>的基础上进行改进的,所以本文只讲解修改的部分. ...

  5. 嵌入式Linux是学驱动还是应用,嵌入式LINUX应该学什么?做驱动还是做应用

    嵌入式LINUX应该学什么?做驱动还是做应用 不少人问我,到底是学驱动还是学应用? 我只能说凭兴趣,并且驱动和应用并不是截然分开的 1. 我们说的驱动,其实并不局限于硬件的操作,还有操作系统的原理.进 ...

  6. 嵌入式Linux视频笔记----驱动开发

    https://www.bilibili.com/video/BV1pf4y1974n/?spm_id_from=333.788.videocard.1 基本看完了,基本只看视频没看详细的pdf,试验 ...

  7. 嵌入式Linux USB WIFI驱动的移植

    硬件平台:飞思卡尔MX258开发板 操作系统:Linux2.6.31 WIFI:    RT2860 USB WIFI模组 交叉编译环境:gcc version 4.1.2 调试步骤: 第一步:测试U ...

  8. 基于linux的千兆网卡驱动程序实现及数据传输效率优化,嵌入式Linux下网卡驱动的实现与数据转发性能优化分析...

    摘要: 伴随着互联网的快速发展和后PC时代的到来,嵌入式系统已逐步成为当今IT产业的焦点之一,广阔的市场前景使嵌入式系统获得了空前的发展机遇.由于Linux操作系统具有代码开放.内核可裁减.网络功能强 ...

  9. 嵌入式linux MISC设备驱动

    misc 的意思是混合.杂项的,因此 MISC 驱动也叫做杂项驱动,也就是当我们板子上的某 些外设无法进行分类的时候就可以使用 MISC 驱动.MISC 驱动其实就是最简单的字符设备驱 动,通常嵌套在 ...

最新文章

  1. 漫话:如何给女朋友解释什么是 Git 和 GitHub?
  2. bzoj 1864: [Zjoi2006]三色二叉树
  3. Python的故事_two
  4. e站host地址_Linux系统怎么使用命令行查询公网IP地址
  5. 【Qt】Qt中QJsonArray类
  6. 将一个日程分割成多个日程_在家庭日程中开展工作的6个技巧
  7. JEECG(三) JEECG minidao如何封装自己的 多表联合查询 分页查询
  8. 西门子S7-1200控制伺服/步进电机方法与接线(全)
  9. 中国行动成功学创始人李践
  10. Linux虚拟机安装VMware Tools
  11. 33.Jump Game(跳步游戏)
  12. 两个质数互质是_两个数互质是什么意思 如何判断
  13. 二甲苯酚的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  14. [可解释机器学习]Task07:LIME、shap代码实战
  15. 《设计模式入门》 19.命令模式
  16. 网页认证上网服务器无响应,portal认证失败,网络故障或者portal服务器没有响应排查方法...
  17. 适合发朋友圈的高情商文案
  18. 小程序中实现待办功能
  19. vue3中Provide/Inject的使用
  20. 2018北大暑校acm算法训练课程 海贼王之伟大航路 状压dp

热门文章

  1. 《ML Papers Explained》开源项目!
  2. obsidian安装第三方插件——无法加载插件
  3. ctfshow php特性(89——150plus)
  4. 动态规划的实际应用:图片压缩算法
  5. 原来Python还有这样的骚操作
  6. 好消息,35个国家职业技能标准来了,看看有你从事的吗?
  7. UE4中播放动画蒙太奇Montage
  8. 摄像头监控人形并实时发送提醒到邮箱
  9. 富文本编辑器summernote的基本使用
  10. 移动机器人车身网关软件设计