linux--驱动开发
linux下驱动开发
lzs_blog
嵌入式
展开
-
85.Linux--设备树(下)
上一节我们已经对设备树有了一定的了解。那么我们这次通过一些实例进行一下巩固。首先我们回忆一下整个的发展过程。一.回顾设备树发展过程任何的字符设备驱动的编写,Linux已经为我们打好了框架,我们只要像做完形填空一样填写进去就可以了。(字符设备驱动框架) 通过这个框架,我们可以很容易编写我们的驱动代码,但是,当我们用这个框架非常熟练的时候,我们就会发现虽然这个方法很简单,但是非常不容易扩展,当我们有很多很多相似设备的时候,如果我们都是按照这个框架来完成,那就要写很多遍这个流程,...原创 2020-11-06 15:27:36 · 369 阅读 · 0 评论 -
84. linux--设备树(上)
我们在编译的时候,会发现要编译一下设备树文件,那么为什么要多此一举加这个文件?这个文件有什么作用呢??一.设备树的由来(驱动框架的演进)总体来讲,产品的开发越来越简单,架构越来越复杂,开发工作量减少。原始架构依然很重要,里面的知识并没有被淘汰,只是被封装和继承了。Linux 2.6版本,封装了原始架构,更加抽象,引入了设备驱动模型(sysfs)。使做产品更省事,实现了应用程序与驱动程序的分离其实从驱动程序的演进过程我们就会发现,设备树的引入是一种必然。为什么要使用..原创 2020-11-05 14:48:14 · 679 阅读 · 1 评论 -
82.Linux--IIC总线驱动框架(上)
我们的嵌入式中,外设经常通过IIC总线进行设备连接gsenor: 重力传感器,eeprom: 存储设备等,但是在linux中基于平台总线抽象出了IIC总线模型,逻辑实现上变的复杂,但是我们在使用上就变的简单了,我们需要理解linux中的IIC总线框架。一.IIC 总线驱动框架I2C驱动有4个重要的东西,I2C总线、I2C驱动、I2C设备、I2C设备器I2C总线:维护着两个链表(I2C驱动、I2C设备),管理I2C设备和I2C驱动的匹配和删除等 I2C驱动:对应的就是I2C设备的驱动程.原创 2020-11-03 15:32:07 · 373 阅读 · 0 评论 -
linux I2C总线驱动框架
本文为转载,只为方便复习,如有侵权请联系我。1、i2c子系统软件框架 应用 ------------------------------------------ i2c driver:从设备驱动层 需要和应用层进行交互 封包数据,不知道数据是如何写入到硬件 ------------------------------------------ i2c 核心层:维护i2c 总线,包括i2c driver, i2c clie转载 2020-10-28 16:05:21 · 409 阅读 · 0 评论 -
81.linux-输入子系统实现原理
我们为什么要用输入子系统?我们为什么要分析输入子系统源码??之前的学习中我们也知道了字符设备驱动的编写方法,嵌入式系统中有很多不同类型的输入系统,触摸屏,键盘等,难道我们都要按照流程编写一遍吗?当然不是我们肯定是想把可复用的部分抽象出来,只改变差异化的东西,输入子系统就帮我们做了这个工作,并提供了API,这样的好处肯定是简化我们的工作量啊,好多的代码都可以省略掉了。但是不好之处就是在不了解输入子系统框架的情况下,代码理解上有些困难,不了解它是怎么实现的。目的:a,学会如何分析内核中子系统的代码,原创 2020-10-28 15:40:16 · 315 阅读 · 0 评论 -
80.输入子系统下--驱动多个按键
一. input dev结构体在上一节中我们通过输入子系统的方式实现了按键驱动的编写。1.input dev我们在应用层中:通过ret = read(fd, &event, sizeof(struct input_event));读到统一的数据包。在驱动中:input_event(inputdev, EV_KEY, KEY_POWER, 0); input_sync(inputdev);//上报数据结束进行数据上报。驱动的初始化中: inpu...原创 2020-09-15 16:47:11 · 1111 阅读 · 2 评论 -
79.输入子系统(上)
一. 输入子系统的引入1.为什么要使用输入子系统?在之前的学习中我们学习了平台总线,在设备驱动层中,将硬件相关易变的数据与稳定算法进行分离(device(中断/地址)和driver(操作逻辑)),例如对外设串口,gpio的操作都是一样的,只是地址不一样。在这样的分离机制上,我们很容易进行平台的迁移,比如现在我们换个板卡只需要更改对应的设备树文件就可以了。但是在之前的代码编写过程中,我们也发现了假如有多个输入设备需要驱动的时候,a, gt811 注册设备号,创建设备文件,硬件初始化,...原创 2020-09-15 11:53:02 · 374 阅读 · 0 评论 -
78.高级驱动学习方法
回顾一下之前的字符设备驱动编程: 1,实现入口函数 xxx_init()和卸载函数 xxx_exit() 2,申请设备号 register_chrdev_region (与内核相关) 3,注册字符设备驱动 cdev_alloc、cdev_init、 cdev_add (与内核相关) 4,利用udev/mdev机制创建设备文件(节点) class_create, device_create (与内核相关) 5,硬件部分初始化 io资源映射 ioremap,内核提供gpio库函数原创 2020-09-14 20:47:52 · 287 阅读 · 0 评论 -
77.平台总线
上一节我们通过代码实现了设备驱动模型,这节我们所说的平台总线就属于模型中的一种,实现思路与驱动模型是一致的。在设备驱动模型的基础上添加上了一些新的内容,已及特定的功能。一. 平台总线模型: 为什么会有平台总线: 用于平台升级:三星: 2410, 2440, 6410, s5pc100 s5pv210 4412 硬件平台升级的时候,部分的模块的控制方式,基本上是类似的 ...原创 2020-09-14 15:07:51 · 238 阅读 · 0 评论 -
76.设备驱动模型
一. 设备驱动模型由来先复习下字符设备的编写步骤1,实现入口函数 xxx_init()和卸载函数 xxx_exit()2,申请设备号 register_chrdev (与内核相关)3,利用udev/mdev机制创建设备文件(节点) class_create, device_create (与内核相关)4,硬件部分初始化 io资源映射 ioremap,内核提供gpio库函数 (与硬件相关) 注册中断(与硬件相关)5,构建 file_operation结构 (与内核相关) 6,实现操...原创 2020-09-14 11:31:40 · 434 阅读 · 0 评论 -
75.中断下半部
在之前的程序中我们在中断驱动中,使用了阻塞,非阻塞,多路复用,异步信号等,中断驱动代码也正常的使用,中断部分的知识也算是完成了,但是当我们的程序正常执行过程中,我们中断到来会打断正常执行的程序,我们的中断处理任务肯定不能执行太长时间,否则就影响任务的正常执行了,但是在有的操作中,我们在中断中的执行时间就需要很长,这个时候就需要中断下半部。一.tasklet实现tasklet模型: struct tasklet_struct { struct ...原创 2020-09-13 17:34:52 · 228 阅读 · 0 评论 -
74.异步通知在驱动中的应用
异步信号通知: 当有数据到时候,驱动会发送信号(SIGIO)给应用,就可以异步去读写数据,不用主动去读写。之前的几种方式都需要应用去主动检测状态来确认是否有事件发生。一. 异步信号的应用方法 a,应用--处理信号,主要是读写数据void catch_signale(int signo) { if(signo == SIGIO) {...原创 2020-09-13 10:32:54 · 212 阅读 · 0 评论 -
73.多路复用POLL在驱动中的应用
之前在网络的进程开发中,我们有学习过多路复用,这次我们将select,poll应用到我们的按键驱动中。主要应用于单线程,单进程中同时读取多个设备或文件的情况。具体可以复习下“42.Linux网络编程--IO多路复用”章节。一 .POLL的函数实现 函数 int poll(struct pollfd *fds, nfds_t nfds, int timeout); 参数 参数1: 表示多个文件描述符集合 ..原创 2020-09-13 08:49:11 · 226 阅读 · 0 评论 -
72.linux驱动中断--非阻塞模式和阻塞模式(下)
在上一节中我们完成了按键中断的编写,进行编译,然后在终端下装载驱动,并执行应用程序,这里功能已经实现了但是有个问题,通过ps,然后top命令查看一下资源占用情况,发现key的这个程序的资源占用非常的高。其实也不难发现,我们的应用程序一直在循环的读取,当然占用高。也侧面的说明我们的程序是有问题的。那么我们怎么降低资源的占用??也很容易想到,没数据了就休眠去,让出资源。一.通过等待队列的方法实现阻塞如上图所示,没有数据的时候就进入休眠,有数据的时候在进行唤醒,继续进行调度。说到阻塞,我们原创 2020-09-12 21:07:36 · 488 阅读 · 0 评论 -
71.linux驱动--中断(中)
上一节我们只是能够正常的触发中断,但是程序并不知道我们是按下还是抬起,并且作为字符驱动也没有最基本的open read等函数,应用层是无法操作我们的按键驱动的,那么我们在上节的基础上进行完善。一. 实现字符设备驱动的框架 1,设定一个全局的设备对象(struct key_desc) key_dev = kzalloc(sizeof(struct key_desc), GFP_KERNEL);2,申请主设备号 key_dev->dev_...原创 2020-09-10 23:19:47 · 239 阅读 · 0 评论 -
70.linux驱动--中断
在之前的单片机入门的时候也是hello world,然后led,然后按键中断。下面我们要开始中中断部分的学习。,在之前的裸机开发中,我们已经了解了中断的开发步骤,在内核中使用按键触发中断,会变的更容易一些,因为内核已经帮我们完成了很多工作,我们只需要理解整个调用及修改过程。soc中有很多的中断,我们通过中断号进行区分是哪个中断,然后写对应的中断处理函数。如何获取中断号?1, 宏定义(中断相关的头文件) IRQ_EINT...原创 2020-09-10 21:30:20 · 535 阅读 · 0 评论 -
66.字符设备驱动
上一节写了一个最简单的驱动,了解了驱动编写,编译及应用的方法,那么我们linux中真正的驱动是什么样的?有哪几种驱动?一. linux驱动分类字符设备 : 以字节/字符为单位(字符流)读写的设备,数据量小,不能随机读取数据。(LCD,鼠标,LED,按键,串口等)应用层通过文件IO进行操作块设备 : 以块为单位读写的设备。(硬盘 flash SD卡)网络设备 : 用于网络通讯设备。(socket 设备)我还是更喜欢看下面的这个图,思路上更清晰。...原创 2020-09-07 21:39:42 · 473 阅读 · 1 评论 -
64.驱动开发环境搭建下
在开始驱动的开发之前,发现还是操作上有一些不方便。我们需要在linux命令行中进行操作,linux经常会休眠还要输密码还是比较麻烦的,同时windows向linux传文件也是很不方便的。此时我们通过MobaXterm软件,通过ssh的方式进行linux的控制,通过tftp进行文件的传输。一.ssh tftp服务安装通过命令发现linux@linux-virtual-machine:/mydrivers$ ssh localhostssh: connect to host localhos原创 2020-08-31 23:27:58 · 332 阅读 · 0 评论 -
65.最简单的linux驱动框架--hello word
驱动开发环境搭建好了,下面就可以开发驱动了,但是怎么开始第一个驱动呢,我们开发其他软件的时候都是习惯先编写个hello world,这个驱动我们也从这个开始最简单的驱动开始,开启驱动的大门。一.编写驱动代码 1,用什么工具去写---source insight(看代码的工具) 环境搭建\烧录镜像和工具\si_linux3.14-ori.tgz 解压到内核源码的顶层目录: ...原创 2020-08-26 23:08:12 · 475 阅读 · 0 评论 -
13.艰难学习Linux系统之驱动开发
一.linux 驱动程序分为3类:字符设备,块设备,和网络接口设备。1.字符设备是能够像字节流(比如文件)一样访问的设备,对它的读写是以字节为单位的。比如串口就是在收发数据时候一个字节一个字节进行的,我们常使用缓冲区存放数据提高效率,但是串口本身无要求。应用程序可以通过设备文件来访问字符设备。2.块设备上的数据以块的形式存放,比如nand flash上的数据以页为单位。字符设备和块...原创 2019-08-06 11:00:33 · 505 阅读 · 0 评论