linux驱动
文章平均质量分 67
linux驱动开发笔记
东皇※太一
放不下屠刀,戒不了烈酒
展开
-
一个常用的gpio驱动
分享一个gpio驱动,其中使用了gpio、pinctrl、irq、workqueue、input等知识,代码中有较详细的注释,不时可以来瞅一瞅!首先设备树中如下配置:&pio { touchsensor_pins_tp_int10: eint@10 { pins_cmd_dat { pins = <MT8163_PIN_32_EINT10__FUNC_GPIO32>; slew-rate = <0>; bias-disable; }; };原创 2022-05-20 13:51:16 · 1306 阅读 · 1 评论 -
Linux下开发怎样才算入门了?
记得开始学单片机的时候,也很想知道自己到底学的怎样了,到了什么水平,到处问人单片机开发怎么才算入门了,最后老师跟我说:能做一个万年历出来就算入门了于是用单片机控制显示器做一个万年历就成了我的目标,通过按键进行日期设置与时间调整,能区分闰年闰月,设置后的时间需要断电保存等。后面终于做出来了,并且显示方面我用了两种实现方式(数码管与LCD1602),当时欣喜若狂,自己心里面终于有底了,总算是入门了。这个万年历在今天看来,是挺简单的,不过在当时也确实是一个比较全面的练手项目,到现在为止我仍然认为这是单片机的原创 2021-06-15 23:06:55 · 1111 阅读 · 10 评论 -
简单又神奇的container_of
看linux内核代码很多地方都用到了container_of,乍一看它的定义,感觉有点懵,不过实际了解了却发现实现的非常简单,由这个宏引发了我几点感慨:①一行代码的威力竟有如此之大②开发内核的大佬,恐怖如斯③没事要多看看内核代码为何会有这些感慨,且听我细细道来...一行代码的威力说到一行代码的威力,且看container_of(ptr, type, member)宏的作用,定义如下:/** * container_of - cast a member of a structu原创 2021-12-23 14:35:24 · 1180 阅读 · 0 评论 -
linux驱动 — regalator使用
Regulator,即LDO(low dropout regulator),低压差 线性稳压器,简称稳压器。本篇我们只讨论regalator api的使用,regalator 常用api如下:/* regulator get and put */struct regulator *__must_check regulator_get(struct device *dev, const char *id);struct regulator *__must_check devm_regulator原创 2021-10-11 11:12:32 · 542 阅读 · 0 评论 -
linux驱动 — 常用API
①of_find_compatible_node 函数 of_find_compatible_node 函数根据 device_type 和 compatible 这两个属性查找指定的节点, 函数原型如下: struct device_node *of_find_compatible_node(struct device_node,*from, const char *type,const char *compatible) 函数参数和返回值含义如下: from:开始查找的节点,如果为.原创 2021-10-08 14:58:04 · 1501 阅读 · 0 评论 -
Linux-Kconfig总结与分析
发现一篇很优秀的博文,转载分享一下!转载:https://www.cnblogs.com/lifexy/p/10292742.html使用Kconfig时,需要注意的地方1.在Kconfig中定义的配置宏,前缀都没有"CONFIG_",只有编译内核时,自动生成autoconf.h才会出现前缀.2.如果XX_defconfig板卡配置文件中定义新的宏=y时,而在Kconfig并没有声明它,则内核编译出来的autoconf.h里也不会定义它的.3.如果XX_defconfig板卡配置文件中没有设转载 2021-08-17 19:40:34 · 1208 阅读 · 0 评论 -
linux驱动 — i2c设备总线驱动
前言linux下设备跟驱动是分开的,他们通过总线进行匹配,设备由设备树负责,在设备树中添加相应的结点,系统会自动向总线注册相应的设备,而驱动开发需要负责的主要就是驱动的编写,向总线注册驱动,如果通过of_device_id中的.compatible跟设备匹配成功进执行其中的probe函数。i2c结构体对于i2c设备我们都不陌生,i2c是一种实际存在的物理总线,不像有些字符设备,使用的是虚拟的platform总线,实际上是不存在的,是虚拟出来的总线。在linux下写i2c驱动,掌握4个结构体就够了原创 2021-08-12 16:36:08 · 835 阅读 · 0 评论 -
linux驱动 — 中断下半部之tasklet&workqueue
前言linux中断下半部是linux中断处理中非常重要的一个组成,如果没有下半部系统很多情况都不能正常工作,所以我们如果用到了中断,比如gpio中断、定时器中断等最好将大部分工作都放到下半部去处理,中断中只做标记跟激活下半部的工作,尤其是那些需要休眠的、有阻塞的、或者耗时长的处理必须放到下半部的work_queue中,别问我为什么,因为你不这么做的话系统跑到这里就挂掉了。。。Linux实现下半部的机制主要有软中断、tasklet、工作队列和线程化irq,不过基于实际开发中的常用性,本篇只介绍taskle原创 2021-05-11 17:18:07 · 385 阅读 · 0 评论 -
linux驱动 — switch_dev类设备的使用
前言在项目中碰到有人用switch_dev_register注册了switch_dev类设备,并且应用层能读到它的状态信息,感觉挺好奇,于是网上搜了些资料,自个又琢磨了一下,算是理解了,现在整理一下。switch_dev是一个开关设备类,跟其它很多类一样的,像misc类,都是对一类设备的总称,使用起来很简单,大部分工作内核已经给你干了,通过switch_dev_register函数注册switch_dev类之后,系统会自动在/sys/class下生成你定义的文件夹,可以进入/sys/class/swit原创 2021-04-25 20:39:22 · 2358 阅读 · 0 评论 -
linux驱动 — timer定时器的使用
前言定时器是我们最常用到的功能,一般用来完成定时功能,本章我们就来学习一下 Linux 内核提供的定时器 API 函数,通过这些定时器 API 函数我们可以完成很多要求定时的应用。Linux内核也提供了短延时函数,比如微秒、纳秒、毫秒延时函数,本章我们就来学习一下这些和时间有关的功能。一、普通定时器使用这种定时精度低,对实时性要求不严格的场合可以用,内核中使用 CONFIG_HZ 来设置自己的系统时钟。打开文件 include/asm-generic/param.h,有如下内容:# unde原创 2021-04-25 19:54:33 · 990 阅读 · 0 评论 -
Linux驱动 — 设备树操作常用API
Linux设备树语法详解一文中介绍了设备树的语法,这里主要介绍内核中提供的操作设备树的API,这些API通常都在"include/of.h"中声明。device_node内核中用下面的这个结构描述设备树中的一个节点,后面的API都需要一个device_node对象作为参数传入。//include/of.h 46 struct device_node { 47 const char *name; //节点名 48 const char *type; //设备类型原创 2021-04-19 17:05:56 · 239 阅读 · 0 评论 -
linux驱动 — 学习总结
前言linux驱动学习也有一段时间了,但是其中断断续续的,以前是不得要领,一直在门外徘徊,后面也是自己特别感兴趣,感觉linux这东西挺有趣、挺有技术含量,我非得去弄一下不可,有些人说弄linux就得从应用开始,我看了下应用层的代码,这不跟windows下的差不多吗,本人原本是做mcu开发的,像stm32这种,linux应用层的东西感觉用不上也没意思,我应该从驱动开始,趁着工作没那么忙,又仔细学了下,于是有了如下收获,特记录一下:学习记录1、学习了led驱动、beep驱动、按键驱动、其实这些驱动本质都原创 2021-03-19 20:21:55 · 737 阅读 · 0 评论 -
linux驱动 — 第一个实战驱动模板之Misc驱动
前言前面所讲的字符设备驱动基本是从概念与流程上进行分析的,是用来学习与理解的,在实际应用中我们可不会这么一步一步去实现,在实际中我们往往会使用那些开发快、代码又简洁的途径,linux下都已经为我们准备好了;这就比如你家离镇上有10公里,你要去镇上赶集,可以走路去,可以骑车去,也可以坐车去,完全取决于你自己,不管用什么方式你都能到达,但是在实际中我想应该更多的是坐车去,因为速度快、轻松、少吃马路上的很多灰,但是有些杠精说:我就是要走路去,走路不仅可以锻炼身体又低碳环保,当然,这也是可以的,但是如果你有急事赶原创 2021-03-15 16:47:19 · 318 阅读 · 0 评论 -
linux驱动 — 字符设备驱动模板
背景最近学习字符设备驱动,其大致的框架与流程都基本搞懂了,为了方便以后代码重用,写了一个较为完善的模板,以后如果需要写如:led、key、beep等的字符设备驱动,就不需要从O开始,可以直接用来修改调试,代码中有比较清晰的注释,以及错误处理与回收机制,并且经过了初步测试,是通过的该模板的作用:编译生成.ko文件后,通过insmod *.ko加载模块,会自动在/dev目录下生成相应的设备文件,模板中设备文件名称为firdev,同样,卸载模块时会自动将其删除,这主要是device与class这两个结构原创 2020-08-14 20:19:41 · 481 阅读 · 0 评论 -
linux驱动 — 字符设备驱动分析
前言明白了字符设备驱动基本框架与相关概念之后,我们知道一个字符设备驱动如果想要像文件一样去操作,首先肯定需要有设备号,还需要有个驱动名,然后需要填充file_operations结构体,这样才能实现对设备的具体操作,可以开始写代码了,just do it!接口介绍1、写代码之前,先介绍两个宏module_init() //这个是加载模块的时候调用的,相当于模块入口module_exit() //这个是卸载模块的时候调用的,相当于模块出口2、再介绍两个函数①.注册字符设备驱动函数用regis原创 2020-08-14 15:52:39 · 243 阅读 · 1 评论 -
linux驱动 — 字符设备解析
前言linux字符设备驱动学的是云里雾里,一团乱麻,剪不断理还乱… 放弃?不,反正闲着也是闲着,打王者还老遇到坑,免不了上火!那就一点一点来吧,弄一点是一点问题写字符设备驱动,我们首先需要知道:1、啥是设备号,用来干嘛的2、file_operations结构体的作用3、cdev是啥上面这三个应该就是字符设备驱动的关键了,把它们弄熟了才能更好的编写字符设备驱动概念理解1、啥是设备号,用来干嘛的?设备号又分为主设备号和次设备号主设备号用来区分不同硬件设备类型,如串口和USB之间的区别,原创 2020-08-13 16:04:31 · 439 阅读 · 0 评论 -
linux下系统信息查看
查看版本信息1、使用uname命令➜ ~ uname -rm4.15.0-72-generic x86_64-rm参数的意思如下:-r, --kernel-release: print the kernel release-m, --machine: print the machine hardware name2、查看/proc/version文件使用指令cat /proc/cpuinfo➜ ~ cat /proc/version Linux version 4.15.0-72-原创 2020-08-07 14:54:07 · 225 阅读 · 0 评论