【嵌入式Linux学习笔记】platform设备驱动和input子系统

这篇具有很好参考价值的文章主要介绍了【嵌入式Linux学习笔记】platform设备驱动和input子系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

linux,default-trigger,linux,学习,单片机,arm,arm开发

对于Linux这种庞大的操作系统,代码重用性非常重要,所以需要有相关的机制来提升效率,去除重复无意义的代码,尤其是对于驱动程序,所以就有了platform和INPUT子系统这两种工作机制。

学习视频地址:【正点原子】STM32MP157开发板

platform子系统

platform 驱动框架分为总线、设备和驱动。总线在Linux内核提供,不需要我们进行考虑,所以只需考虑设备和驱动。
因为目前的Linux内核都支持设备树了,所以platform_device设备信息都通过设备树进行描述了,因此只需要在代码中编写platform_driver驱动代码

Linux驱动的分离与分层示意图

linux,default-trigger,linux,学习,单片机,arm,arm开发

GPIO电气属性配置

采用的是设备树中的pinctrl控制器,在STM32MP1中,pinctrl配置只在platform平台上被引用。

创建设备的pinctrl节点

led_pins_a: gpioled-0 {
	pins {
		pinmux = <STM32_PINMUX('I', 0, GPIO)>;	# 设置 PI0 复用为 GPIO 功能。
		drive-push-pull;						# 设置 PI0 为推挽输出。
		bias-pull-up;							# 设置 PI0 内部上拉。
		output-high;							# 设置 PI0 默认输出高电平。
		slew-rate = <0>;						# 设置 PI0 的速度为0档,也就是最慢。
	};
};

在设备树中创建设备节点

gpioled {
	compatible = "alientek,led";
	pinctrl-names = "default";
	status = "okay";
	pinctrl-0 = <&led_pins_a>;
	led-gpio = <&gpioi 0 GPIO_ACTIVE_LOW>;
};

兼容属性

 // 定义兼容属性表
 static const struct of_device_id led_of_match[] = {
	 { .compatible = "alientek,led" }, /* 兼容属性 */
	 { /* Sentinel */ }
 };

// 声明设备匹配表
 MODULE_DEVICE_TABLE(of, led_of_match);

// 定义platform驱动
 static struct platform_driver led_platform_driver = {
	 .driver = {
		 .name = "stm32mp1-led",
		 .of_match_table = led_of_match,
	 },
	 .probe = led_probe,
	 .remove = led_remove,
};

检查引脚复用配置

STM32MP1 的一个引脚可以复用为多种功能,但是在配置设备树时,一个引脚只能复用为一个功能。

检查GPIO占用

尽管引脚配置上只复用为了一个功能,但是可能存在该引脚被多个设备使用的情况,所以需要检查设备树,确保只有一个设备在使用该GPIO引脚。

linux,default-trigger属性设置

这个属性可以将LED配置为某个特定模式。

backlight:LED 灯作为背光。
default-on:LED 灯打开。
heartbeat:LED 灯作为心跳指示灯,可以作为系统运行提示灯。
disk-activity:LED 灯作为磁盘活动指示灯。
ide-disk:LED 灯作为硬盘活动指示灯。
timer:LED 灯周期性闪烁,由定时器驱动,闪烁频率可以修改。

MISC驱动系统

定位:当某些外设无法进行分类的时候就可以使用MISC驱动。MISC驱动其实就是最简单的字符设备驱动,通常嵌套在 platform 总线驱动中,实现复杂的驱动。

设备定义

所有的MISC设备驱动的主设备号都为 10,不同的设备使用不同的从设备号。定义一个 MISC 设备(miscdevice 类型)以后需要设置 minor、name 和 fops 这三个成员变量。
linux,default-trigger,linux,学习,单片机,arm,arm开发

设备注册

int misc_register(struct miscdevice * misc)

设备注销

int misc_deregister(struct miscdevice *misc)

input子系统

系统架构
linux,default-trigger,linux,学习,单片机,arm,arm开发

input子系统的所有设备主设备号都为13,我们在使用 input 子系统处理输入设备的时候就不需要去注册字符设备,只需要向系统注册一个input_device即可。

驱动编写流程

API函数

// 申请input_dev结构体变量
struct input_dev* input_allocate_device(void)
// 释放input_dev结构体变量
void input_free_device(struct input_dev* dev)
// 注册input_dev
int input_register_device(struct input_dev* dev)
// 注销input_dev
void input_unregister_device(struct input_dev* dev)

事件类型
linux,default-trigger,linux,学习,单片机,arm,arm开发

初始化(以按键为例)

/* 申请设备内存 */
inputdev = input_allocate_device();
inputdev->name = "test_inputdev";

/* 设置事件和事件值 */
keyinputdev.inputdev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP);
input_set_capability(keyinputdev.inputdev, EV_KEY, KEY_0);

/* 注册设备 */
input_register_device(inputdev);

上报事件文章来源地址https://www.toymoban.com/news/detail-723987.html

/* 通用的事件上报函数 */
void input_event(struct input_dev *dev, unsigned int type, 
 					unsigned int code,  int value)

/* 衍生所得的上报函数 */
void input_report_rel(struct input_dev *dev, unsigned int code, int value)
void input_report_abs(struct input_dev *dev, unsigned int code, int value)
void input_report_ff_status(struct input_dev *dev, unsigned int code, int value)
void input_report_switch(struct input_dev *dev, unsigned int code, int value)
void input_mt_sync(struct input_dev *dev)

/* 事件上报完成后,需要用该函数上报一个同步事件 */
void input_sync(struct input_dev *dev)

到了这里,关于【嵌入式Linux学习笔记】platform设备驱动和input子系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 嵌入式linux驱动开发篇之设备树

    设备树(Device Tree)是一种用于描述嵌入式系统硬件组件及其连接关系的数据结构。它被广泛用于嵌入式 Linux 系统,尤其是针对使用多种不同架构和平台的嵌入式系统。它是一种与硬件描述相关的中间表示形式,将硬件信息抽象成一种可移植的格式,使得操作系统和引导加载

    2024年02月22日
    浏览(68)
  • 嵌入式Linux驱动开发 04:基于设备树的驱动开发

    前面文章 《嵌入式Linux驱动开发 03:平台(platform)总线驱动模型》 引入了资源和驱动分离的概念,这篇文章将在前面基础上更进一步,引入设备树的概念。 在平台总线驱动模型中资源和驱动已经从逻辑上和代码组织上进行了分离,但每次调整资源还是会涉及到内核,所以现

    2024年02月16日
    浏览(69)
  • 嵌入式Linux系统中的设备驱动开发:从设备树到驱动实现

    大家好,今天给大家介绍 嵌入式Linux系统中的设备驱动开发:从设备树到驱动实现 ,文章末尾附有分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全! 可进群免费领取。 在嵌入式Linux系统中,设备驱动是连接硬件设备和操作系统之间的桥梁。

    2024年02月19日
    浏览(66)
  • 嵌入式Linux驱动开发——解决/sys/bus/spi/devices下没有对应的spi设备文件

    最近在学习Linux驱动开发中SPI总线的驱动框架,但在修改完设备树添加完对应的spi设备节点后,理应在/sys/bus/spi下会有对应的spi设备,我的目录下面没有。 无spi设备 然后我查看了/proc/device-tree,发现有对应的spi设备节点,我就先没有过多理会这个问题。 /proc/device-tree下有对应

    2024年02月16日
    浏览(45)
  • 【嵌入式Linux内核驱动】04_Jetson nano GPIO应用 | 驱动开发 | 官方gpiolib、设备树与chip_driver

    0.暴露给应用层 应用 解决调试目录为空的问题 调试信息 1.最简读写文件(在/SYS下) 设备树 验证测试 编译文件 驱动 of_get_named_gpio_flags //获取设备树节点的属性 gpio_is_valid //判断是否合法 devm_gpio_request //申请使用gpio,并调用设置pinctrl device_create_file //根据设备树节点属性,创建

    2024年02月07日
    浏览(61)
  • 嵌入式Linux 开发经验:platform_driver_register 的使用方法

    嵌入式Linux 设备驱动开发时,经常遇到平台驱动 platform_driver_register 的注册,最近深入了看了驱动开发为何使用平台驱动 开发一个设备驱动时,为了实现 设备的 打开、关闭、控制等操作,可以注册为 Linux misc 设备,不过在这之前,可以先使用 platform_driver_register 注册平台驱动

    2024年01月15日
    浏览(41)
  • 【嵌入式环境下linux内核及驱动学习笔记-(10-内核内存管理)】

    对于包含MMU(内存管理单元)的处理器而言,linux系统以虚拟内存的方式为每个进程分配最大4GB的内存。这真的4GB的内存空间被分为两个部分–用户空间 与 内核空间。用户空间地地址分布为0~3GB,剩下的3 ~ 4GB 为内核空间。如下图。 用户进程通常只能访问用户空间的虚拟地址

    2024年02月11日
    浏览(56)
  • 【嵌入式环境下linux内核及驱动学习笔记-(5-驱动的并发控制机制)】

    在讨论并发前,先要了解以下几个概念:执行流,上下文,共享与临界等。 什么叫执行流: 【执行流】:有开始有结束总体顺序执行的一段代码 又称 上下文 。 上下文分类: 【任务上下文】:普通的,具有五种状态(就绪态、运行态、睡眠态、暂停态、僵死态),可被阻塞

    2023年04月21日
    浏览(49)
  • 韦东山嵌入式Liunx入门驱动开发一(Hello 驱动编程、GPIO基础知识、LED驱动、总线设备驱动模型)

    本人学习完韦老师的视频,因此来复习巩固,写以笔记记之。 韦老师的课比较难,第一遍不知道在说什么,但是坚持看完一遍,再来复习,基本上就水到渠成了。 看完视频复习的同学观看最佳! 基于 IMX6ULL-PRO 参考视频 Linux快速入门到精通视频 参考资料 :01_嵌入式Linux应用

    2024年04月25日
    浏览(80)
  • 【嵌入式学习笔记】嵌入式入门2——中断(外部中断)

    打断CPU执行正常的程序,转而处理紧急程序,然后返回原暂停的程序继续运行,就叫中断 作用1: 实时控制在确定时间内对相应事件作出响应 ——定时器中断 作用2: 故障处理检测到故障,需要第一时间处理 ——外部中断 作用3: 数据传输不确定数据何时会来 ——串口中断

    2024年02月08日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包