嵌入式Linux|驱动实验
实验教程
santirenpc
这个作者很懒,什么都没留下…
展开
-
设备驱动开发实验教程(1)_驱动开发基础
原文链接:https://blog.csdn.net/wangran1996/article/details/69791334————————————————交叉编译 进行嵌入式开发前必须搭建一套完整的开发环境,在开发内核时,目标机运行所需的bootloader以及操作系统核心还没有建立。目标机的硬件一般有很大的局限性,如不具备一定的处理能力和存储空间,即单独在目标板无法...转载 2019-08-19 11:35:23 · 415 阅读 · 0 评论 -
设备驱动开发实验教程(2)_Linux 体系结构
如下图所示,Linux 体系结构,从大的方面可以分为用户空间(User Space)和内核空间(Kernel Space)。 用户空间中包含了 C 库,用户的应用程序。在某些体系结构图中还包含了 shell,当然 shell脚本也是 Linux 体系中不可缺少的一部分。 内核空间包括硬件平台、平台依赖代码、内核、系统调用接口。 在任何一个现代...原创 2019-08-09 09:34:06 · 180 阅读 · 0 评论 -
设备驱动开发实验教程(3)_在Ubuntu 18.04环境下编写一个简单的内核模块
内核模块定义 模块是具有独立功能的程序,可以单独编译,但是不能单独运行。模块在运行时,会被链接到内核,作为内核的一部分在内核空间运行。模块通常由一组函数和数据结构组成,用来实现一种文件系统、驱动程序或其他内核上层的功能。内核模块基本原理 Linux 内核模块(LKM)是一些在启动的操作系统内核需要时可以载入内核执行的代码块,不需要时由操作系统卸载。...原创 2019-08-13 09:24:36 · 1201 阅读 · 0 评论 -
设备驱动开发实验教程(4)_注册设备到平台总线
早先的Linux会使用单独的文件注册设备,现在大多是使用引入的虚拟平台,使用虚拟平台来注册设备会容易很多。 如果大家在网上看到大段的注册设备的代码,可简单了解一下,知道有这么个东西就成,不用去深究。不要去学习“屠龙技”,现在基本都是直接在平台文件中注册设备。 如下图所示,使用命令“vim arch/arm/mach-exynos/mach-i...原创 2019-09-03 22:08:38 · 267 阅读 · 0 评论 -
设备驱动开发实验教程(5)_注册驱动到平台总线
本文在已向平台总线注册设备“hello_ctl”的基础上展开,注册设备到平台总线的流程可参见上一篇(嵌入式Linux系统:驱动编程_注册设备到平台总线 )。 在 Linux2.6 之后,Linux 设备驱动分为三个实体:总线、设备、驱动,平台总线将设备和驱动匹配。在系统注册任意一个驱动的时候,都会寻找对应的设备;当系统注册设备的时候,系统也会寻找对应的驱动进行匹配。...原创 2019-09-06 14:13:28 · 311 阅读 · 0 评论 -
设备驱动开发实验教程(6)_生成杂项设备节点
上层应用通过设备节点访问对应的设备。 部分驱动要和上层通信,都需要生成设备节点,上层应用通过一套标准的接口函数调用设备节点就可以控制底层以及和底层通信。本文就给大家介绍最简单易用的杂项设备节点如何生成。 在虚拟机的 Ubuntu 系统上,如下图所示,使用命令“cat /proc/misc”,可以查看到 PC机 Ubuntu 系统的杂项设备。...原创 2019-09-06 17:59:49 · 367 阅读 · 0 评论 -
设备驱动开发实验教程(7)_LED驱动
LED驱动写好并注册到系统后,上层应用通过设备节点“/dev/hello_ctl”操作LED可以像访问普通文件一样直接使用open、close、ioctl函数实现。 如下图所示,应用比较简单,调用延时函数,首先将 Led 点亮三秒,然后再灭掉三秒,再点亮。驱动程序编写1、定义hello_open、hello_ioctl、hello_release...原创 2019-09-07 21:56:47 · 375 阅读 · 0 评论 -
设备驱动开发实验教程(8)_驱动模块传参数
加载模块的时候可以通过 insmod 命令传参数,掌握了这个知识点之后调试起来会方便很多(类似的,在应用程序中,可以通过 main 函数向其中传参数)。 在头文件“include/linux/moduleparam.h”中包含了向模块传参数的函数。这个功能是集成的,在任何 linux 系统之中都可以使用。1、添加头文件;2、调用函数 module...原创 2019-09-07 22:35:25 · 376 阅读 · 0 评论 -
设备驱动开发实验教程(9)_注册字符类设备号
前面学习的杂项设备,主设备号已经固定为 10,这里介绍申请标准的字符类设备号,包括主设备号以及次设备号。 字符类设备号分为静态申请和动态申请,静态申请就是主设备号是程序员手动分配,动态申请是系统给分配。 字符设备函数在文件“include/linux/fs.h”中。 内核提供了三个函数来注册一组字符设备编号,这三个函数分别是:...原创 2019-09-08 00:03:39 · 253 阅读 · 0 评论 -
设备驱动开发实验教程(10)_注册字符设备驱动并生成设备节点
注册字符设备驱动并生成设备节点的步骤:1、注册字符类设备号(注册字符类设备号见博文:嵌入式Linux系统:驱动编程_注册字符类设备号 ); 加载模块时若通过“numdev_major”、“numdev_minor”传入参数则静态注册字符类设备号;否则动态注册字符类设备号(驱动模块传参数见博文:嵌入式Linux系统:驱动编程_驱动模块传参数 )。if(numde...原创 2019-09-09 22:53:20 · 273 阅读 · 0 评论 -
设备驱动开发实验教程(11)_并发控制之整形原子操作、位原子操作
理论: 1.并发 并发的概念是:多个执行单元同时、并行被执行。Linux系统是多任务的,很多任务会同时执行。假如有三个执行单元ABC,共享了内存资源。执行单元A对Buffer写1000个“a”;执行单元B对Buffer写1000个“b”;执行单元C从buffer中读取数据。如果按照A写→C读→B写→C读,当然没有问题。但是如果A写→B写→C读,执行单元C就出问题了。当然比这个...原创 2019-10-13 21:20:24 · 220 阅读 · 0 评论 -
设备驱动开发实验教程(12)_RS485总线驱动
RS-485采用平衡发送和差分接收,因此具有抑制共模干扰的能力。RS232传输的距离在15米以下,RS485传输距离是几十米到1000米以上。 嵌入式系统上一般使用串口转485,本文以如下原理图为例,讲解RS485总线驱动。 485驱动=串口驱动+GPIO的字符驱动,串口驱动一般都用系统提供的,不需要自己写,需要自己写的只有GPIO字符驱动,并在...原创 2019-10-28 21:22:51 · 1523 阅读 · 0 评论 -
设备驱动开发实验教程(13)_Linux的I2C驱动框架分析
I2C总线仅仅使用SCL、SDA这两根信号线就实现了设备之间的数据交互,极大地简化了硬件资源和PCB板布线空间的占用。因此,I2C总线被非常广泛地应用在EEPROM、实时钟、小型LCD等设备与CPU的接口中。 Linux系统定义了I2C驱动体系结构,在Linux系统中,I2C驱动由3部分组成,即I2C核心、I2C总线驱动和I2C设备驱动。这3部分相互协作,形成了非...原创 2019-10-31 14:50:45 · 274 阅读 · 0 评论 -
参考范例:使用原子变量的字符设备globalfifo(编译进Ubuntu18.04内核,带读写并发控制,只能被一个进程打开)
验证如下:查看生成的设备类: ls /sys/class查看生成的设备: ls /dev源代码及Makefile文件globalfifo_atomic.c/*包含初始化宏定义的头文件,代码中的module_init和module_exit在此文件中*/#include <linux/init.h>/*包含初始化加载模块...原创 2019-12-30 15:57:54 · 243 阅读 · 0 评论 -
error:expected declaration specifiers or '...' before '&' token的解决
最近,在给字符设备驱动globalmem增加代码,实现其只能被一个进程打开的功能时,遇到了一个错误error:expected declaration specifiers or '...' before '&' token,周末折腾了两天都没有思路。周一的时候总算解决了。现总结如下:1、原globalmem设备驱动已编译调试通过。2、为实现只能被一个进程打开...原创 2019-12-30 11:27:30 · 25067 阅读 · 1 评论