【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第三十六章 Linux驱动初探

i.MX8MM处理器采用了先进的14LPCFinFET工艺,提供更快的速度和更高的电源效率;四核Cortex-A53,单核Cortex-M4,多达五个内核 ,主频高达1.8GHz,2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT、4G模块、CAN、RS485等接口一应俱全。H264、VP8视频硬编码,H.264、H.265、VP8、VP9视频硬解码,并提供相关历程,支持8路PDM接口、5路SAI接口、2路Speaker。系统支持Android9.0(支持获取root限)Linux4.14.78+Qt5.10.1、Yocto、Ubuntu20、Debian9系统。适用于智能充电桩,物联网,工业控制,医疗,智能交通等,可用于任何通用工业和物联网应用、

【公众号】迅为电子

【粉丝群】258811263


第三篇 嵌入式Linux驱动开发篇

第一部分 Linux驱动初探

三十六章 Linux驱动初探

本章导读

本章将介绍初步探索linux驱动开发。

36.1章节讲解了linux设备驱动开发基本概念

36.2章节讲解了linux三大设备驱动的特点

36.3章节以最简单的驱动-helloworld为例,编写入门驱动开发的第一个驱动例程。

本章内容对应视频讲解链接(在线观看):

什么是linux驱动  https://www.bilibili.com/video/BV1Vy4y1B7ta?p=3

Linux第一个驱动Helloworld  https://www.bilibili.com/video/BV1Vy4y1B7ta?p=4

36.1 linux设备驱动开发基本概念

任何一个计算机系统的运转都是系统中软硬件共同努力的结果,没有硬件的软件是空中楼阁,而没有

软件的硬件则只是一堆废铁。硬件是底层基础,是所有软件得以运行的平台,代码最终会落实为硬件上的

组合逻辑与时序逻辑;软件则实现了具体应用,它按照各种不同的业务需求而设计,并完成用户的最终诉

求。硬件较固定,软件则很灵活,可以适应各种复杂多变的应用。因此,计算机系统的软硬件相互成就了

对方。驱动程序负责硬件和应用软件之间的沟通,而驱动工程师则负责硬件工程师和应用软件工程师之间的沟通,那么从字面意思来看,设备驱动最通俗的解释就是“驱使硬件设备行动”。在学习驱动之前,我们先了解一些基础概念。

概念一 裸机编程或单片机开发

裸机编程,顾名思义,就是直接在硬件上编程写代码,或者说编写直接在硬件上运行的程序,没有操作系统的支持。一般我们把没有操作系统的编程环境,称为裸机编程环境,比如在单片机上编程。通过串口直接将程序下载到单片机芯片内部的Flash中,单片机运行时,直接调用我们编程的程序。这时,我们编写的程序一般都有一个while 1的死循环存在,这样程序才能一直保持运行。裸机编程现在主要是正对低端的嵌入式系统,如SCM(single chip machine)、各式MCU、DSP等。当然,编写PC的bootloader肯定也属于裸机编程。

单片机是一种集成电路芯片,是用大规模集成电路技术通过编程数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能,这其中还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等功能等集成到一块小芯片上。

单片机开发包括:程序设计(PC端软件编程),程序送往执行(将编程好的软件下载到单片机,需要编程器或者下载线),单片机系统的设计(硬件上设计你需要的任务的执行机构,如控制开关,温度检测,红外传输等等,都是根据你的所需,然后在选择对应的硬件器件)。

概念二 linux系统开发

基于linux操作系统来开发我们的产品叫linux系统开发。此开发的编程方式和裸机开发的编程方式是截然不同的。裸机开发的编程方式是直接运行在硬件之上,不与任何操作系统关联。操作系统的存在势必要求设备驱动附加更多的代码和功能,把单一的“驱使硬件设备行动”变成了操作系统内与硬件交互的模块,它对外呈现为操作系统的API,不再给应用软件工程师直接提供接口。由此可见,当系统中存在操作系统的时候,驱动变成了连接硬件和内核的桥梁。

linux系统开发框架如下图所示,最上层的是应用软件,下面是操作系统,再下面是驱动程序,最后是我们的硬件。如果在硬件上跑操作系统,驱动程序是位于硬件和操作系统中间的,是连接操作系统和硬件之间的桥梁。

这里拿linux操作系统给大家举个例子,linux系统可以跑到不同的硬件上面如pc机或者arm开发板上面。如果linux操作系统跑到PC机上,那么驱动就要适配PC机; 如果linux操作系统跑到arm开发板上面,那么驱动就要适配arm开发板;所以说不同的硬件架构都可以跑linux,但是它的驱动程序是不同的,那么linux操作系统源码都是一样的,唯一不一样的就是驱动程序了。也就是说同一个操作系统可以跑到不同的硬件上面,但是驱动程序是有差异的,因为驱动程序是操作系统和硬件连接的一个桥梁。

概念三 系统移植 linux驱动移植

移植是说同样的一个linux操作系统 ,我们可以跑到不同的硬件上面,我们把操作系统移植到不同的硬件上面,这个过程叫做移植。设备驱动移植步骤,如下图所示:

概念四 应用软件

在操作系统上面有应用软件,应用软件程序的执行是依赖于操作系统的,应用程序需要调用linux操作系统的库函数来实现,也就是说,应用软件的程序会调用linux操作系统的函数来完成对硬件的操作,那么应用程序是不能对硬件直接进行操作的。

概念五 linux系统架构优点

linux系统开发架构和我们裸机的架构是不同的,架构相比于裸机架构是非常复杂了,那么我们使用这个架构都有什么好处呢?

1 有了系统的架构后,开发起来就非常容易了,因为它有自己的框架,这种框架都是非常成熟的框架,我们直接按照框架开发就可以了,框架给我们提供了很多现成的功能

2 这个框架让我们的系统变得更加安全,因为我们的应用软件不能直接对硬件进行操作,它要借助操作系统来硬件进行操作。如果应用软件有好几个,假如其中的一个应用软件崩溃了,它不会影响我们整个系统的运行,不会造成系统的死机,这样就会让系统更加安全,出问题的概率变得更小了。

36.2 linux设备驱动分类及特点

计算机系统的硬件主要由CPU、存储器和外设组成。随着IC制作工艺的发展,目前,芯片的集成度越

来越高,往往在CPU内部就集成了存储器和外设适配器。譬如,相当多的ARM、PowerPC、MIPS等处理器都集成了UART、I2C控制器、SPI控制器、USB控制器、SDRAM控制器等,有的处理器还集成了GPU(图形处理器)、视频编解码器等。驱动针对的对象是存储器和外设(包括CPU内部集成的存储器和外设,而不是针对CPU内核。Linux将存储器和外设分为3个基础大类:字符设备驱动块设备驱动网络设备驱动

其中,理解和掌握字符设备驱动的概念最重要,因为在后续工作中我们遇到的大部分是字符设备。为什么会这么说呢?比如说我们选了一个cpu,不管它是哪个厂家的,比如它是三星的或者恩智浦的或者TI(德州仪器),那么他们都会给你提供一个bsp包,在这个开发包里面,像块设备驱动和网络设备驱动已经做好了,我们要做的事情是配置一下就可以用了。平常开发的时候用的最多的就是字符设备驱动,我们掌握了字符设备的开发,那么我们开发产品基本上就没有什么问题了。

字符设备指那些必须以串行顺序依次进行访问的设备,如触摸屏、磁带驱动器、鼠标等。块设备可以按任意顺序进行访问,以块为单位进行操作,如硬盘、eMMC等。字符设备和块设备的驱动设计有出很大的差异,但是对于用户而言,它们都要使用文件系统的操作接口open()、close()、read()、write()等进行访问。网络设备主要有哪些呢?从字面意思可以看出,和网络相关的都是网络设备,比如WiFi,以太网。在Linux系统中,网络设备面向数据包的接收和发送而设计,它并不倾向于对应于文件系统的节点。内核与网络设备的通信与内核和字符设备、网络设备的通信方式完全不同,网络设备主要还是使用套接字接口。

36.3 最简单的设备驱动-helloworld

程序源码在网盘资料“iTOP-i.MX8MM开发板\02-i.MX8MM开发板网盘资料汇总(不含光盘内容)\嵌入式Linux开发指南(iTOP-i.MX8MM)手册配套资料\2.驱动程序例程\01-第一个驱动helloworld”路径下。

经过前面的学习,我们了解了驱动开发的框架,本章节将带领大家实验操作,写最简单的驱动-helloworld。

Linux设备驱动会以内核模块的形式出现,因为linux内核的整体架构就非常庞大,包含的组件也非常多,如果把所有的功能都编译到linux内核中会使得内核非常臃肿,为了解决这个问题,更方便地新增和删除功能,linux提供了这样的机制,这种机制被称为模块。为了大家对模块有一个感性的认识,我们先来看一个最简单的驱动-helloworld。

驱动分为四个部分:

  • 头文件
  • 驱动模块的入口函数和出口函数
  • 声明信息
  • 功能实现

 我们在windows上面新建一个helloworld.c文件,这里使用sourceinsight来编辑文件,大家也可以用其他编译器来编写程序。

第一步 包含头文件

#include <linux/init.h>   //包含宏定义的头文件

#include <linux/module.h> //包含初始化加载模块的头文件

第二步 驱动模块的入口函数和出口函数

module_init();

module_exit();

第三步 声明模块拥有开源许可证

MODULE_LICENSE("GPL");

第四步 功能实现:内核模块加载的时候打印hello world! ,内核模块卸载的时候打印gooodbye!

注意:内核打印函数不能用printf,因为内核没有办法使用C语言库。

static int hello_init(void){printk("hello world! \n");return 0;
} 
static void hello_exit(void){printk("gooodbye! \n");
}

完整的一个最简单的Linux内核模块,如下图所示:

此时,我们需要有一个感性认识,代码中的某些陌生元素都是linux内核为了字符设备定义的,以实现驱动与内核接口而定义的。Linux对各类设备的驱动都定义了类似的数据结构和函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/47962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿尔泰科技工业电脑IPC-8363工控机

概述&#xff1a; IPC-8363是一款支持 LGA 1200 Intel 10th/11th Generation Core™ i9/i7/i5/i3, Celeron and Pentium processor 的工业电脑。配置2组独立 SO-DIMM DDR4 2666/2933MHz内存&#xff0c;最大可扩展至128GB。 主要技术指标&#xff1a; 产品图示&#xff1a; 系…

Codeforces Round 672 (Div. 2) C1. Pokémon Army (easy version) (DP)

不知道能不能用贪心&#xff0c;反正我是没看出来&#xff0c;所以用DP求解。 首先分析一下题意&#xff0c;我们要在一段序列中取出一段子序列&#xff0c;然后让这段子序列按顺序逐个先加后减最终得到的结果最大。 如果要用DP&#xff0c;那么我们首先就要思考怎么表示状态…

Apache SeaTunnel——OLAP 引擎的数据动脉

导读本文将分享如何利用 Apache SeaTunnel 将各个业务系统的数据同步到 OLAP 引擎。 主要内容包括以下六大部分&#xff1a; 1. Apache SeaTunnel 项目介绍 2. Apache SeaTunnel 核心功能 3.SeaTunnel 在 OLAP 场景下的应用 4. 社区近期计划 5. WhaleTunnel 产品特性 6. …

idea怎么配置gradle多个版本

1.背景 gradle版本很多,而且很多时候版本是不兼容的,我们希望拉取下来的代码就包含已经配置好的版本,而不是去配置本机的gradle版本..... 意思就是要实现项目A可以用6.X版本 项目B可以使用7.X版本 项目C可以用9.X版本..... 2.配置方式 步骤一:项目根路径下保留一个文件夹…

MySQL事务管理详解:特性、问题与解决方案

什么是事务&#xff1f; 事务是一个不可分割的数据库操作序列&#xff0c;也是数据库并发控制的基本单位&#xff0c;其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作&#xff0c;要么都执行&#xff0c;要么都不执行。 事务的四大特…

Docker搭建Harbor

1.什么是Harbor Harbor 是 vMware 公司开源的企业级 Docker 〖egistry 项日&#xff0c;其日标是帮助用户迅速搭建一个企业级的 Docker Registry 服务。Harbor以 Docker 公司开源的 Registry 为基础&#xff0c;提供了图形管理UI 、基于角色的访问控制(Role Based Accesscontr…

活动回顾 | AutoMQ 联合 GreptimeDB 共同探讨新能源汽车数据基础设施

7 月 13 日&#xff0c;AutoMQ 携手 GreptimeDB“新能源汽车数据基础设施” 主题 meetup 在上海圆满落幕。本次论坛多角度探讨如何通过创新的数据管理和存储架构&#xff0c;提升汽车系统的性能、安全性和可靠性&#xff0c;从而驱动行业的持续发展和创新&#xff0c;涵盖 Auto…

PHP萌宠之家微信小程序系统源码

&#x1f43e;萌宠之家微信小程序&#x1f43e; —— 铲屎官们的温馨小窝✨ &#x1f3e0;【一键开启萌宠乐园】&#x1f3e0; 亲们&#xff0c;是不是每次刷手机都忍不住想看看那些软萌可爱的毛孩子&#xff1f;现在&#xff0c;有了“萌宠之家”微信小程序&#xff0c;你的…

LeetCode 3112.访问消失节点的最少时间:单源最短路的Dijkstra算法

【LetMeFly】3112.访问消失节点的最少时间&#xff1a;单源最短路的Dijkstra算法 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-time-to-visit-disappearing-nodes/ 给你一个二维数组 edges 表示一个 n 个点的无向图&#xff0c;其中 edges[i] [ui, vi, l…

【深度学习】【Lora训练4】StabelDiffusion,人物lora训练

启动&#xff1a; docker run -it --gpus all --net host -v /ssd/xiedong/xiezhenceshi/lora_train:/ssd/xiedong/xiezhenceshi/lora_train kevinchina/deeplearning:pytorch2.3.0-cuda12.1-cudnn8-devel-xformers-lora-train bashrootgpu16:/workspace/lora-scripts# python…

6. JavaSE ——【深入理解Java中的按位运算符】

&#x1f4bb; 开场白 欢迎来到我的技术博客&#xff01;在这里&#xff0c;我们将一起探索编程的奥秘&#xff0c;分享代码的智慧&#xff0c;让技术改变生活。让我们开始这段精彩的旅程吧&#xff01;&#x1f680;&#x1f4bb;&#x1f310; &#x1f4d6;个人主页&#xf…

untiy 竖排文字

使用的tmp文本&#xff0c;启用富文本&#xff0c;默认就是启用的 然后在要竖排的文本前边拼接 效果如下 如果用代码拼接 text.text "<rotate90>""内容";

深入Redis集群部署:从安装配置到测试验证的完整指南

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️创作…

Linux应用——网络基础

一、网络结构模型 1.1C/S结构 C/S结构——服务器与客户机&#xff1b; CS结构通常采用两层结构&#xff0c;服务器负责数据的管理&#xff0c;客户机负责完成与用户的交互任务。客户机是因特网上访问别人信息的机器&#xff0c;服务器则是提供信息供人访问的计算机。 例如&…

C++仓库管理系统

功能 代码在效果图后面 1.添加物品 2.删除物品 3.更新物品数量 4.查询物品 5.列出所有物品 6.保存并退出 注意事项&#xff1a;退出要输入“6”退出才能保存数据&#xff0c;不要直接按X关掉窗口&#xff08;不会保存数据&#xff09;。 效果图 源代码 编…

安全防御2

实验要求&#xff1a; 实验过程&#xff1a; 7&#xff0c;办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换)&#xff1a; 新建电信区&#xff1a; 新建移动区&#xff1a; 将对应接口划归到各自区域&#xff1a; 新建…

JVM--自动内存管理--JAVA内存区域

1. 运行时数据区域 灰色的线程共享&#xff0c;白色的线程独享 白色的独享就是根据个体"同生共死" 程序计数器&#xff1a; 是唯一一个没有OOM(内存溢出)的地方 是线程独享的 作用&#xff1a; 是一块较小的内存空间,是当前线程所执行的字节吗的行号指示器 由于…

云监控(华为) | 实训学习day2(10)

spring boot基于框架的实现 简单应用 - 用户数据显示 开发步骤 第一步&#xff1a;文件-----》新建---项目 第二步:弹出的对话框中,左侧选择maven,右侧不选任何内容. 第三步&#xff0c;选择maven后&#xff0c;下一步 第4步 &#xff1a;出现对话框中填写项目名称 第5步&…

全面了解不同GPU算力型号的价格!

这两年人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xff09;、深度学习和高性能计算&#xff08;HPC&#xff09;领域的快速发展&#xff0c;GPU算力已成为不可或缺的资源。企业、研究机构乃至个人开发者越来越依赖于GPU加速计算来处理大规模数据集和复杂模…

如何将大模型应用到自己的业务中?7种大模型应用方式和代表论文总结

如何将大模型应用落地到自己的业务或工作中&#xff1f;这篇文章整理了7种目前业内最常用的大模型应用方法&#xff0c;以及各个方法的代表论文。通过对各种应用大模型方法的特点对比&#xff0c;找到最适合自己场景的应用方法。 1 Pretrain-Finetune 直接针对下游任务进行全…