本末实验室

物联网方向的研究学习,对学习过程的记录与总结。

嵌入式内核及驱动开发之学习笔记(十七) 设备树的定义规则和获取方法

概述 在Linux 2.6中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码,相当多数的代码只是在描述板级细节,而这些板级细节对于内核来讲,不过是垃圾,如板上的platform设备、resource、i2c_board_info、spi_board...

2018-11-29 15:57:09

阅读数 88

评论数 0

嵌入式内核及驱动开发之学习笔记(十六) IIC子系统框架使用

本章通过IIC子系统软件框架,实现驱动让应用层I2C读取从设备的功能。硬件上,通过I2C主控制器读取mpu6050陀螺仪和加速度数据信息。   简介 I2C(Inter-integrated Circuit)总线支持设备之间的短距离通信,用于处理器和一些外围设备之间的接口,它只需要两根信号...

2018-11-27 14:41:23

阅读数 93

评论数 0

节点和结点区分

结,连结 节,关节 可以这样做简单的区分 节点被认为是一个实体,有处理能力,比如说网络上的一台计算机; 结点则只是一个交叉点,像“结绳记事”,打个结,做个标记,仅此而已;   在数据结构-树形结构中叫做结点。 网络中一个中继服务器,一个终端机叫做节点。。。...

2018-11-26 22:53:51

阅读数 93

评论数 0

嵌入式内核及驱动开发之学习笔记(十五) 输入子系统获取多个设备信息

利用驱动的中断机制,可以捕获按键按下时产生的中断事件,然后将信息上报给输入子系统,由子系统将数据交给用户。将不同按键设备的信息,描述到设备树中,驱动程序遍历每一个节点即设备对象;利用中断子系统实现对多个按键产生的数据,进行上报。 重点是驱动代码的设计处理,通过设备树节点将设备信息读取到结构体数组...

2018-11-25 20:25:59

阅读数 358

评论数 0

嵌入式内核及驱动开发之学习笔记(十四) 输入子系统框架使用

简单回顾一下之前学习的驱动知识。基于之前的学习,首先实现了字符驱动框架的编写,实现模块化的驱动,简单的加载/卸载去动态执行驱动程序。对于应用层<——>驱动层,编写file_operations 使驱动对上层应用层提供接口,实现功能机制让用户可以通过阻塞、...

2018-11-24 21:48:07

阅读数 164

评论数 0

嵌入式内核及驱动开发之学习笔记(十三) 平台总线模型

linux内核支持platform平台总线,这是一种虚拟总线,满足之前讲的设备驱动模型。这里使用平台总线platform是区别于之前我们用手动创建mybus总线,同样完成设备与驱动分离的实现。 设备、驱动、总线三者关系:   由于平台总线的设计是基于设备模型的,引入平台总线,实现devi...

2018-11-21 21:03:20

阅读数 86

评论数 0

Linux终端 命令行路径缩减显示

文件路径太长,看着不方便。可以手动修改一下配置文件。     在用户家目录下 修改.bashrc文件 root@linux:~# vim .bashrc   找到 PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' 修改成...

2018-11-21 18:08:54

阅读数 110

评论数 0

嵌入式内核及驱动开发之学习笔记(十二) 设备驱动模型

按照之前的实现驱动的方法。对于同一类设备,驱动层实现的操作方法是相似的,而设备信息总是不同的,一个产品上有很多这样的同类设备,我们为每一个设备都定制一套驱动程序,代价似乎太“高昂点”;对于一个设别,如果硬件有所改动,也必然要修改取代代码。 为了提高代码的通用性,我们将驱动和设备进行分离,设备对象...

2018-11-20 19:53:28

阅读数 143

评论数 0

嵌入式内核及驱动开发之学习笔记(十一) 中断优化处理

ARM cortex-A系列的内核不支持中断嵌套。在内核中断函数中,如果中断处理时间过长,产生中断嵌套,重者系统崩溃,轻者也会影响其他事件处理。这也是中断中不能使用延时函数的原因。 但是有些高实时性设备(比如网卡),就是需要处理大量的业务。为了满足中断处理时间尽量短的原则,我们将一些简单的处理放...

2018-11-18 18:20:38

阅读数 51

评论数 0

嵌入式内核及驱动开发之学习笔记(十) 异步通信+中断实现读取数据

对于linux一切都是文件,驱动设备在应用层也是以文件的形式进行读写。之前学了阻塞、非阻塞、多路复用的方式读设备,它们都需要应用主动读取。那么应用层有没有一种方式,当底层将数据准备好了,应用程序自动处理这些数据?通过异步通信可以实现,这有写类似硬件层的中断概念 驱动层(准备好了数据) --&am...

2018-11-18 18:13:40

阅读数 103

评论数 0

嵌入式内核及驱动开发之学习笔记(九) 多路复用+中断实现读取数据

使用阻塞模型虽然可以避免等待数据过程中,CPU对进程的消耗,但是仅仅是为了等待这一个结果,就让进程进入休眠,对于还要进行其他IO操作的进程而言太“奢侈”。所以引入多路复用的概念,解决这个问题。 非阻塞:立即返回结果,如果想得到期望的结果,要不停的调用这个方法(轮询),非常耗费资源 阻塞:没有得...

2018-11-17 20:54:04

阅读数 70

评论数 0

嵌入式内核及驱动开发之学习笔记(八) 阻塞模式+中断实现读取数据

目前已经学习两种应用层IO模型的使用 非阻塞:立即返回结果,如果想得到期望的结果,要不停的调用这个方法(轮询),非常耗费资源 阻塞:没有得到真正的数据前,不返回结果。此时,进程进入阻塞(休眠)态,直到有数据唤醒进程,这个过程不耗资源。 PS:linux应用中,大部分的函数接口都是阻塞   ...

2018-11-17 20:53:57

阅读数 96

评论数 0

嵌入式内核及驱动开发之学习笔记(七) 非阻塞模式+中断实现读取数据

当中断发生时,驱动程序会跳转到中断处理的函数入口,实现了中断的捕获和处理,但这样还不够。要让用户能够获取到中断分析的结果,我们将创建一个描述中断事件的结构体对象。硬件产生中断后,驱动代码将对中断事件的分析结果保存在结构体变量中,用户需要的时候,直接通过接口函数获取这个结构体的数据。 内核层: ...

2018-11-16 19:04:05

阅读数 229

评论数 0

嵌入式内核及驱动开发之学习笔记(六) 驱动层中断实现

由于中断信号的突发性,CPU要捕获中断信号,有两种方式。一是不断轮询是否有中断发生,这样有点傻;二是通过中断机制,过程如下: 中断源 ---> 中断信号  --->  中断控制器 --->  CPU  中断源有很多,CPU拿到中...

2018-11-16 19:03:53

阅读数 154

评论数 0

2018/11/15小结

发现自己在最近,遇到程序不愿意动手。以前总是以为看懂意思 知道其中内部的原理就行了,到了真正做程序的时候也不会让你去实现其中的细节。 就在今天,我调一个简单的程序‘折腾’一个多小时无果之后。。现在忽然觉得以前的想法是不对的,至少是片面的。。 平时不重视实践,关键时刻就从外部找解决,现在已经养成...

2018-11-15 22:36:16

阅读数 52

评论数 0

嵌入式内核及驱动开发之学习笔记(五) 编写字符驱动步骤总结

1,实现模块加载和卸载入口函数         module_init(chr_dev_init);         module_exit(chr_dev_exit); 2,在模块加载入口函数中     a, 申请主设备号  (内核中用于区分和管理不同字符设备)              re...

2018-11-14 20:34:51

阅读数 113

评论数 0

嵌入式内核及驱动开发之学习笔记(四) 规范化代码

前面笔者已实现了用户程序控制led灯闪烁的驱动代码,但是由于代码不规范,显得乱七八糟的,因此需要规范化。如果比较大一点的工程没有规范的话,也不利于后期的跟新与维护。分析先前的程序不规范点有二: 定义的变量多而且散乱 程序没有错误处理机制 C语言虽然是面向过程的语言,但是可以利用结构体来实现面向...

2018-11-14 20:32:28

阅读数 76

评论数 0

嵌入式内核及驱动开发之学习笔记(三) 点灯实验

完成应用程序通过驱动控制硬件的实现。实验建立在之前的框架上,我们先实现用户层与内核层之间的数据交互,驱动程序拿到用户传来的指令后,就可以执行点灯的动作了。   应用程序与驱动数据交互 对于驱动程序而言,使用copy_to_user 和 copy_from_user函数与应用程序进行数据交互。...

2018-11-14 20:31:00

阅读数 187

评论数 0

嵌入式内核及驱动开发之学习笔记(二) 实现应用控制驱动

Linux系统根据驱动程序实现的模型框架将设备驱动分成字符设备驱动、块设备驱动、网络设备驱动三大类。这里简单理解一下概念 字符设备:设备按字节流处理数据,通常用的串口设备、键盘设备都是这种。 块设备:设备按块单位对数据处理,通常是存储设备。 网络设备:顾名思义,建立在socket接口上的设备...

2018-11-13 21:24:44

阅读数 233

评论数 0

嵌入式内核及驱动开发之学习笔记(一) 认识与使用驱动模块

应用层的进程是通过内核层驱动来访问硬件的,Linux内核源码在每次编译之后生成一个总的镜像,将镜像加载内存中运行并使用(内核在系统运行时会移植占用内核空间)。驱动属于内核源码的一部分,如果每次修改驱动都要重新编译加载内核的话,这态麻烦了,所以我们通过模块,使驱动可以独立于内核镜像之外,并能动态的加...

2018-11-12 19:56:53

阅读数 382

评论数 0

提示
确定要删除当前文章?
取消 删除
关闭
关闭