![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux驱动
文章平均质量分 68
Linux驱动
玫瑰花店
为之则易,不为则难!
展开
-
Linux驱动之------中断上下文
中断 中断的顶半部(中断的上文) 中断的上文就是普通的中断服务函数 中断的底半部(中断的下文) 如果中断服务函数里面需要写很多东西,甚至还需要有延迟。但是肯定不能直接写在中断服务函数中,否则就违背了中断快进快出的原则。中断的下半部就相当于另开一个线程。在另一个线程中操作,延时、阻塞…都不影响中断的快进快出原则。 中断底半部的实现方法 中断底半部的实现方法有两种: 1、小任务 2、工作队列 小任务 小任务API 核心结构体: struct tasklet_struct { struct ta原创 2021-10-18 13:33:28 · 579 阅读 · 2 评论 -
Kconfig语法详解--结合示例
Kconfig语法 bool/tristate/int/hex/string属性 bool 值为y或n tristate 值为y或m或n string 值为字符串 int 值为十进制整数 hex 值为十六进制整数 这几个属性一般必有一个。 default属性 表示缺省值,意思就是系统默认属性 help属性 这个属性是简介,没有啥实际作用,主要是写一些信息备注一类的 示例: 我在char目录的Kconfig下添加了一个新的驱动 config JASON1 tristate原创 2021-10-12 18:04:13 · 1833 阅读 · 0 评论 -
内核架构---Makefile、Kconfig、.config文件分析
前提 内核是一个大文件,里面有很多的驱动,内核中大部分都是使用DTS和driver机制:即device和driver分开写的,通过platform总线链接在一起。device这里就不过多描述,他主要就是一些设备的资源信息。 这篇文章我们主要看driver端,也就是驱动端的架构。 具体结构 这里我们先描述一些基础知识: 1、Makefile文件作用,Makefile文件就是一个编译脚本,最大的特点就是方便,一个目录下面有很多的.c文件,假如没有Makefile的话,就得一个个单独编译,多费事啊!给需要编译的原创 2021-10-12 10:50:38 · 614 阅读 · 0 评论 -
❤Linux下IIC驱动详解
参考资料:https://www.yuanzige.com/ 简介 I2C 是很常见的一种总线协议, I2C 是 NXP 公司设计的, I2C 使用两条线在主控制器和从机之间进行数 据通信。一条是 SCL(串行时钟线),另外一条是 SDA(串行数据线),这两条数据线需要接上拉电阻,总线空闲的时候 SCL 和 SDA 处于高电平。 I2C 总线标准模式下速度可以达到 100Kb/S,快速模式下可以达到 400Kb/S。 I2C 总线工作是按照一定的协议来运行的,接下来就看一下 I2C 协议。 I2C 是支持多原创 2021-09-22 18:14:33 · 1152 阅读 · 0 评论 -
platform平台设备总线二(device-tree和driver匹配)
在上一章讲了platform平台设备总线一(device和driver的匹配) 但是在现实中驱动开发,基本上设备端是不需要我们编写的,设备端的信息都存储在DTS中,这样我们的驱动端要如何匹配device-tree的信息呢?这章为你娓娓道来。 本章参考:正点原子Linux开发指南。 一、内核里面结构体使用方法: 像一般情况下我们使用结构体,如下: 内核中有这样一个结构体: struct platform_driver { int (*probe )(struct platform_device *);原创 2021-09-18 14:58:40 · 700 阅读 · 0 评论 -
platform平台设备总线一(device和driver的匹配)
一、总线的作用? 在 Linux 内核 的设备驱动模型中,关心总线、设备和驱动这 3 个实体,总线将设备和驱动绑定。 在系统每注册一个设备的时候, 会寻找与之匹配的驱动; 相反的, 在系统每注册一个驱动的时候,会寻找与之匹配的设备,而匹配由总线完成。一个现实的Linux 设备和驱动通常都需要挂接在一种总线上,对于不属于某一实际总线的设备,比如 led, lcd,rtc 等设备, 系统为了对它们进行统一管理, 虚拟出了一条总线出来,称为 platform(平台) 总线, 相应的设备称为 platform_de原创 2021-09-17 16:24:11 · 1045 阅读 · 0 评论 -
DTS设备树学习
DTS的简介可以看这个博主的博客: https://great.blog.csdn.net/article/details/89847843 设备节点 node-name@unit-address node-name:指节点的名字 unit-address:一般表示设备的地址或寄存器首地址,如果某个节点没有地址或者寄存器的话可写0 label: node-name@unit-address 引入 label 的目的就是为了方便访问节点,可以直接通过&label 来访问这个节点,比如通过 &原创 2021-09-14 17:27:07 · 317 阅读 · 0 评论 -
uboot启动流程
2.5.1程序启动过程: 1.首先u-boot上电后执行的第一个文件为arch/arm/cpu/armv7/start.S文件,start.S文件准备好第二阶段的运行环境。 2.上面start.S执行完毕最终会调用到arch/arm/lib/board.c中的board_init_r函数,函数对会对flash、net、串口等进行初始化,最终会进入死循环,如下: for (; ; ) { main_loop (); //进入等待命令解析状态,直到启动内核后,u-boot就退出了。 } 2.5.2 Boo.原创 2021-04-12 16:24:29 · 504 阅读 · 0 评论 -
linux驱动之----多节点编程实战
简介 实现功能:按键按下控制LED灯亮灭 实现思想: KEY驱动层: 使用Linux2.6方式注册,自动注册设备文件 Linux中断判断按键按下,Linux定时器实现按键消抖 等待队列实现用户端的阻塞IO提高cpu利用率。 KEY的用户层: 使用4个线程分别读取按键的状态,read无按键按下时候阻塞 使用消息队列和LED用户层通信,发送按键信息 LED驱动层: 使用杂项注册设备 LED用户层: 接收KEY用户层发送的按键信息,控制LED灯的亮灭 代码实现 KEY驱动层:key.c #include<原创 2021-03-13 18:58:39 · 309 阅读 · 2 评论 -
Linux驱动之----Linux2.6方式设备注册
Linux2.6方式设备注册API 杂项设备注册和经典设备注册方法可参考我前俩篇博客 Linux驱动之----杂项设备注册 Linux驱动之----经典方式注册 在linux2.6里面设备号的申请方式一共有2种 动态设备号申请: >头文件: > #include <linux/fs.h> > 函数原型: > int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, co原创 2021-03-08 21:44:26 · 361 阅读 · 0 评论 -
Linux驱动之----经典方式注册
经典方式注册与杂项设备注册区别 杂项方式注册生成的设备文件会自动挂载在/dev目录下面,经典方式注册的设备不会自动挂载在/dev目录下面 . 杂项设备注册的主设备号只能为10,经典方式注册主设备号可以指定或者系统自动分配一个除了(10)以外的任意一个设备号。杂项方式只暂用一个子设备号,经典方式占用当前主设备号所有的子设备号(0~254) 经典方式注册API函数 头文件: #include <linux/fs.h> 功能: 注册函数: 函数: int register_chrdev(u原创 2021-03-08 20:41:40 · 272 阅读 · 0 评论 -
Linux驱动之----杂项设备注册
驱动 驱动是什么? 通俗来说: 好比一个人,驱动就是灵魂,灵魂驱动人的操作! 单片机: 寄存器/库函数初始化和硬件功能代码 Linux: 它是一个描述设备文件的代码 设备文件 什么是设备文件: 插入一个SD卡。 dev/sdb dev/sdb1 两个分区—两个块设备文件 既然Linux认位所有的设备也是文件 那么设备既然是文件,那么请问设备文件 有没有普通文件的特性? 我们可以怎么操作? 打开 、关闭、读、写、操作 open close read write ioctl 你的LED灯/dev/下有没原创 2021-03-05 16:40:48 · 767 阅读 · 0 评论 -
Linux驱动之----内核模块化编程
模块化概念 c语言 按照功能将一个.c文件拆分为多个.c以及.h文件 stm32 对应每一个外设都有一个.c和.h文件,.c文件写模块的初始化以及功能函数,.h文件对应函数的声明,如果想使用该外设只需包含其头文件即可。 linux 内核的功能很强大,如果我们想将自己的某一个模块加载到内核那么我们可以修改内核源码重新编译烧写内核(模块功能稳定),但是这样做是不是你没写一次程序就要重新编译一次内核,是不是太麻烦了,所以我们可以选择动态编译到内核,内核编译一次就行,每次写完程序源码,内核动态调用。等所有程序都功能原创 2021-03-04 21:33:04 · 604 阅读 · 1 评论 -
Linux驱动之-----内核制作
前提 编译内核的前提是交叉编译链的安装完成。 可参考我上一篇博客。 Linux驱动之-----交叉编译链的安装 我使用的开发板是友善之臂4412,官方提供了相应的内核。 内核裁剪 解压: tar -xvf linux-3.5-20141114.tar 内核裁剪有专用的裁剪工具,不可能一堆源代码一个一个增删改查吧! 我们用到内核自带的一个工具: make meunconfig 我们要使用这个内核裁剪工具,首先需要安装两个依赖。 apt-cache search ncurses apt-get in原创 2021-03-02 17:04:36 · 371 阅读 · 0 评论 -
Linux驱动之-----交叉编译链的安装
安装 首先下载交叉编译链(arm-linux-gcc),下载这里就不多说了。网上一找一堆。 然后解压到根目录: sudo tar -xvf arm-linux-gcc-4.5.1-v6-vfp-20120301.tgz -C / 解压完成后进入根文件夹下面的opt目录。 这样说明解压成功,接下来我们要配置环境变量。 在/etc/profile中最后一行后面添加环境变量: export PATH=$PATH:/opt/FriendlyARM/toolschain/4.5.1/bin 然后保存退原创 2021-03-02 14:35:33 · 289 阅读 · 0 评论