157开发指南
文章平均质量分 91
北京迅为
让学习更简单,让开发更容易
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【北京迅为】《STM32MP157开发板嵌入式开发指南》-第七十八章 Qt控制硬件
比如,我们要点亮一个led灯,我们在C语言中可以使用open,read,write,ioctl函数来进行操作,但是QT上我们使用的语言是C++,那我们要怎么来操作驱动呢?然后我们开始移植代码,因为C++是面向对象的,C是面向过程的,所以在QT上,我们要用面向对象的思想来进行编程,所以我们第一步,就是要先创建一个类,把C语音控制蜂鸣器的代码封装成一个类。第一步,我们把C语言控制蜂鸣器代码的头文件,添加到我们刚才添加Beep类生成的文件beep.h里面,但是头文件我们不能直接复制过去,我们要用extern。原创 2024-11-06 17:49:41 · 1127 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》-第七十七章 交叉编译QT工程
开发板采用核心板+底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐用,可满足高速信号环境下使用。共240PIN,CPU功能全部引出:底板扩展接口丰富底板板载4G接口(选配)、千兆以太网、WIFI蓝牙模块HDMI、CAN、RS485、LVDS接口、温湿度传感器(选配)光环境传感器、六轴传感器、2路USB OTG、3路串口,CAMERA接口、ADC电位器、SPDIF、SDIO接口等。我们使用file命令查看生成的可执行文件,如下图所示,生成的time为ARM。原创 2024-11-06 17:43:03 · 382 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》-第七十六章 C++入门
在嵌入式上,我们少不了界面的开发,一种是用安卓,一种是用QT,那么安卓对CPU的性能要求比较高,不是所有的CPU都可以运行,但是QT对CPU要求不高,甚至可以在单片机上来运行,而且QT是一个非常优秀的跨平台工具,一套代码我们可以在多个平台上来运行,比如Windows,Android,Linux等,换一套编译器即可更换不同的平台。所以非常的方便和有趣。当需要调用外部函数时,发送一个信号,此时与该信号相关联的槽便会被调用,槽其实就是一个函数,槽与信号的关联要由程序员来完成,关联方法有自动关联和手动关联。原创 2024-11-05 15:25:31 · 1002 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第七十五章 编译QtE5.12文件系统
iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\03_QT5.12文件系统\01_QT、tslib和字库源码。iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\03_QT5.12文件系统\02_制作好的文件系统镜像。iTOP-STM32MP157开发板网盘资料汇总\03_文件系统源码和镜像\03_QT5.12文件系统\02_制作好的文件系统镜像。完成后,可以在“/opt”目录下可以查看到生成的“qt-5.12.10-arm”文件,如下图所示。原创 2024-11-05 10:19:49 · 803 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第七十四章 制作最小linux系统
在制作文件系统的时候,我们编写了一个inittab文件,在这个文件里面有这样的一句console::askfirst:-/bin/sh代码,在我们按下回车以后会启动/bin/sh,然后配置/etc/profile文件的配置。/bin目录下常用的命令有:cat,chgrp,chmod,cp,ls,sh,kill,mount,umount,mkdir,mknod,test等,我们在利用Busybox制作根文件系统时,在生成的bin目录下,可以看到一些可执行的文件,也就是可用的一些命令。原创 2024-11-04 15:05:04 · 1182 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第七十三章 Yocto系统开发
编译完成后所生成的镜像文件保存在tmp-glibc/deploy/images/stm32mp1目录下,为了适配我们自己的开发板,关于tf-a、uboot和kernel我们对源码进行了部分的修改,所以在该目录下,我们需要的镜像只有文件系统相关的镜像以及其对应的烧写配置文件。虽然市面上有数百种可用的嵌入式Linux发行版,但每个版本都是高度定制的,这导致了大量的重复工作,很多开发人员创建了大同小异的Linux版本,再基于其开发自己的增值特性和功能。在这里rootfs.ext4为我们要烧写文件系统的镜像。原创 2024-11-04 14:15:57 · 1347 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》-第七十二章 Debian文件系统
生成的目录符合Linux文件系统标准(FHS),即包含了/boot、/etc、/bin、/usr等等目录,但它比发行版本的Linux体积小很多,当然功能也没那么强大,因此,只能说是“基本的系统”。这里只有四种屏幕的内核镜像,原因是这四种屏幕所使用的触摸驱动相同,而剩下的4.3寸屏幕和10.1寸屏幕所用到的驱动不同,故以上任何一个内核镜像都可以适配。此时我们可以看到,根目录切换成了当前制作debian的目录,我们可以在该系统中安装我们所需要的软件,我们安装mplayer进行演示,使用命令“原创 2024-11-04 09:53:23 · 873 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》-第七十一章 制作Ubuntu文件系统
这里只有四种屏幕的内核镜像,原因是这四种屏幕所使用的触摸驱动相同,而剩下的4.3寸屏幕和10.1寸屏幕所用到的驱动不同,故以上任何一个内核镜像都可以适配。在这里rootfs.ext4为我们要烧写文件系统的镜像。所以我们在烧写镜像的时候需要修改对应的内核镜像,我们以烧写ubuntu18无桌面版本的镜像为例,镜像存放路径为“本章我们构建的是ubuntu18.04系统。”解压,得到的文件夹raw-rootfs就是开发板的Ubuntu-base文件系统,可以在此基础上修改文件系统,解压完成之后的文件如下图所示。原创 2024-11-04 09:13:54 · 901 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》-第七十章 Buildroot制作根文件系统
这里需要注意,如果是自己编译出来的qmake,需要找到自己的qmake路径,而如果使用的我们的ubuntu环境,且用了我们编译好的buildroot源码包,需要与我们的路径完全相同。需要使用 aplay等命令,请参考如下配置进行配置。如上图所示 LINUX_VERSION_CODE为267277,此值为10进制,转换为16进制为4140D,对应的linux内核版本为4.1.x,在此要把该值改为与buildroot中配置的一致,即为5.4.x,转换为16进制为50400,对应的十进制为328704。原创 2024-11-02 15:23:09 · 1051 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》-第六十九章 linux内核移植
可以看到我们的内部回环网络和wifi对应的两个网络,内部回环网络设备是默认都有的,那为什么我们没有配置wifi却有wifi的网络呢,这是因为我们所使用的蓝牙WIFI模块,也是USB设备,在上一小节之中,我们配置好了USB,WIFI在加载对应的KO文件之后也产生了对应的设备(KO文件的加载为了方便我们直接放在了开机启动项之中,大家不用理会)。将生成的设备树文件进行少些,烧写成功之后,重启开发版,得到的结果和上一小结相同,因为我们还并未对TF卡和EMMC功能进行完善,下面我们将正式开始功能的完善。原创 2024-11-01 17:04:22 · 1200 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》-第六十七章 Trusted Firmware-A 移植
从打印信息来看,我们成功进入了uboot证明我们的移植并没有出现问题,由于目前还没有配置EMMC,所以用同样的方法将镜像烧写到EMMC之中,然后将拨码开关设置为“0100”通过emmc启动会报如下的错误,在下一小节之中,我们会配置tf-a的emmc。这这里需要说明的是其中tf-a-stm32mp157a-itop-serialboot.stm32文件是使用OTG烧写所用到的文件,而tf-a-stm32mp157a-itop-trusted.stm32文件是真正要烧写到EMMC中的文件。原创 2024-10-23 17:48:55 · 1004 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第六十六章 电容屏触摸驱动实验
那么为什么要中断线程化呢?比如 devm_request_irq 和 request_irq 这两个函数,这两个函数都是申请中断的,我们使用request_irq 函数申请中断的时候,如果驱动初始化失败的话就要调用 free_irq 函数对申请成功的 irq 进行释放,卸载驱动的时候也需要我们手动调用 free_irq 来释放 irq。“devm_”函数就是为了处理这种情况而诞生的,“devm_”函数最大的作用就是:使用“devm_”前缀的函数申请到的资源可以由系统自动释放,不需要我们手动处理。原创 2024-10-23 17:13:42 · 1077 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第六十五章 Linux I2C驱动实验
当然是可以的,我们来一起看一下,这里我们以7寸LVDS屏幕上的触摸芯片FT5X06为例,迅为所有开发板都是支持迅为7寸LVDS屏幕屏的,所有都是可以进行这个实验的。因为我们以前的方法也是需要熟悉的,我们只有学会以前的方法,才能够更好的理解现在的这种设备树的方法,而且有些老的版本还是使用低版本的内核,比如说kernel3.0。因为我们现在使用的是设备树的源码,所以要在设备树文件去掉触摸的设备节点,我们在这里以7寸lvds屏幕进行演示,每个屏幕的设备树名称不同,大家根据自己的屏幕对不同的设备树进行修改。原创 2024-10-23 16:58:01 · 920 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第六十四章 Linux I2C驱动
在编写 I2C 设备的驱动时,主要就是创建 i2c_driver 结构体,并实现里面的内容。关于 Linux 下 I2C 设备驱动的编写流程就讲解到这里,重点就是 i2c_msg 的构建和i2c_transfer 函数的调用,接下来我们就编写 AP3216C 这个 I2C 设备的 Linux 驱动。在 I2C 设备驱动中首先要完成 i2c_driver 结构体的创建、初始化和注册,当设备和驱动匹配成功后,就会执行 probe 函数,probe 函数中就是执行字符设备驱动的一套流程。下面就来具体分析一下。原创 2024-10-23 14:51:01 · 1054 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》-第六十三章 输入子系统实验
在 input 设备驱动中申请、注册完成 input_dev 结构体后,还不能正常使用 input 子系统,因为 input 设备是输入一些信息,但是 Linux 内核还不清楚输入的信息表示什么意思,有什么作用,所以我们需要驱动获取到具体的输入值,或者说输入事件,然后将输入事件上报给 Linux 内核。如上图所示的打印的信息都是什么意思呢?可以看出,input_report_key 函数的本质就是 input_event 函数,当然使用哪个函数都没有问题,不同的设备使用对应的函数更加合适一点。原创 2024-10-23 14:34:01 · 959 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》-第六十二章 定时器按键消抖实验
在上图中,t1 时刻按键被按下,但是由于抖动的原因,直到 t2 时刻才稳定下来,t1 到t2 这段时间就是抖动。我们可以借助定时器来实现消抖,按键采用中断驱动方式,当按键按下以后触发按键中断,在按键中断中开启一个定时器,定时周期为 10ms,当定时时间到了以后就会触发定时器中断,最后在定时器中断处理函数中读取按键的值,如果按键值还是按下状态那就表示这是一次有效的按键。在上图中,按键没有按下的时候按键值为 1,当按键在 t1 时刻按键被按下以后按键值就变为 0,这是最理想的状态。程序源码在网盘资料“原创 2024-10-23 13:50:32 · 945 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第六十一章 Linux内核定时器
比如我们现在需要定义一个周期为 2 秒的定时器,那么这个定时器的超时时间就是 jiffies+(2*HZ),因此 expires=jiffies+(2*HZ)。因为一秒内时钟中断的次数等于 Hz,所以 jiffes 一秒内增加的值也就为 Hz,系统运行时间以秒为单位计算,就等于 jiffes/Hz。体系结构不同,HZ 的值也不同。定时器是我们最常用到的功能,一般用来完成定时功能,本章我们就来学习一下 Linux 内核提供的定时器 API 函数,通过这些定时器 API 函数我们可以完成很多要求定时的应用。原创 2024-10-23 13:32:41 · 1040 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》-第六十章 中断下文之工作队列
Linux系统在启动期间会创建内核线程,该线程创建以后就处于sleep状态,然后这个线程会一直去队列里面读,看看有没有任务,如果有就执行,如果没有就休眠。需要注意的是,如果调度完工作,并不会马上执行,只是加到了共享的工作队列里面去,等轮到他才会执行。work 表示要初始化的工作,_func 是工作对应的处理函数。尽管工作队列的实现机制非常复杂,但是我们使用工作队列其实就是在这个流水线上添加自己的物料,然后等待执行即可。每个 worker 都有一个工作队列,工作的线程处理自己工作队列中的所有工作。原创 2024-10-23 13:22:40 · 1050 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第五十九章 等待队列
举个例子,比如说我现在去食堂打饭,阿姨和我说现在没有饭,你需要等一会,等我做好了我再叫你,那么我当前不能获得资源,我被阻塞在这儿了,那么等待队列就是让我们阻塞在这儿,然后等特定的事件发生以后,再继续运行。举个例子来说,比如说阿姨和你说现在没饭,你需要在旁边等一会,等我做好了我再叫你,如果说阿姨做完了不叫你,你又睡着了,那么你今天是不是吃不上饭了,所以说在我们阻塞访问的时候不能获得资源的进程,将进入休眠状态,他将cpu的资源全部让给别的进程,必须保证有一个地方可以唤醒休眠进程,否则的话将会长睡不醒。原创 2024-10-23 10:13:28 · 1104 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第五十八章 中断下文之tasklet
tasklet 采用无差别的队列机制,有中断时才执行,免去了循环查表之苦,tasklet 机制的优点:无类型数量限制,效率高,无需循环查表,支持 SMP 机制,一种特定类型的 tasklet只能运行在一个 CPU 上,不能并行,只能串行执行。上一章节我们已经写了一个简单的按键中断,我们是使用的中断上文,我们并没有使用中断下文。如果要使用 tasklet,必须先定义一个 tasklet,然后使用 tasklet_init 函数初始化 tasklet,taskled_init 函。原创 2024-10-23 09:55:38 · 1053 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第五十七章 Linux中断实验
中断的存在可以极大的提高CPU的运行效率,但是中断会打断内核进程中的正常调度和运行,所以为保证系统实时性,中断服务程序必须足够简短,但实际应用中某些时候发生中断时必须处理大量的事物,这时候如果都在中断服务程序中完成,则会严重降低中断的实时性,基于这个原因,linux 系统提出了一个概念:把中断服务程序分为两部分:中断上文和中断下文。举例来说,我现在正在厨房做饭,突然电话响了,然后我关火去接电话,快递员打电话让我下楼去拿快递,接完电话叫我女朋友去下楼拿快递,然后我在回去开火继续做饭,这个过程就是中断上下文。原创 2024-10-22 17:59:17 · 752 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》-第五十六章 设备驱动IO控制
在前面章节中我们使用GPIO函数来操作GPIO的,在使用GPIO函数之前是使用寄存器来进行操作的,我们使用GPIO函数操作GPIO比直接使用寄存器来操作GPIO进一步升级了。我们现在有了ioctl函数,内核已经把工作的任务给我们区分了,定义命令就不再使用read和write函数了,而是使用ioctl函数,因为ioctl函数的任务就是对我们的工作参数进行设置和查询,write和read函数专注于数据传输。在驱动程序里, ioctl()函数上传送的变量 cmd是应用程序用于区别设备驱动程序请求处理内容的值。原创 2024-10-22 17:29:11 · 752 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第五十五章 Pinctrl和GPIO子系统实验
开发板采用核心板+底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐用,可满足高速信号环境下使用。本章节我们要编写pinctrl子系统和GPIO子系统,我们可以在以前代码的基础上进行编写,框架并没有变,我们也是让驱动和设备进行匹配,匹配成功之后将相关的操作,唯一变的地方是之前使用的寄存器操作我们的GPIO,现在我们换成了GPIO子系统提供的API函数来操作我们的GPIO,比原来的方法更先进了一些。至此,我们已经学会了在设备树中使用pinctrl子系统和GPIO子系统。原创 2024-10-22 17:12:18 · 898 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第五十四章 Pinctrl 子系统和 GPIO 子系统
GPIO 子系统在之前的内核中也是存在的,但是 pinctrl 子系统的加入 GPIO 子系统也是有很大的改变。之前我们控制一个GPIO可以直接来操作我们的寄存器,还有一种方法是使用SOC厂家实现的配置函数,例如三星的配置函数为s3c_gpio_cfgpin等,这样带来的问题就是各家有各家的接口函数与实现方式,不但内核的代码复用率低而且开发者很难记住这么多的函数,如果要使用多种平台的话背函数都是很麻烦的,所以在引入设备树后对GPIO子系统进行了大的改造,使用设备树来实现并提供统一的接口。原创 2024-10-19 18:00:48 · 1157 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第五十三章 设备树下的platform驱动
传统的方法就是把我们的驱动分为两个部分,第一部分是device.c,第二部分是driver.c,当device.c和driver.c匹配成功以后,进入probe函数后就可以获取硬件资源了,然后可以注册杂项设备,注册字符设备。在编写驱动以前,有一个地方需要注意一下,我们在加载driver.ko之前,一定要在开发板上已经成功地添加了test的节点,你可以在linux系统里面查看到你添加的节点,查看节点方法请参考51.1 查看设备树节点方法章节,添加自定义节点请参考51.2添加自定义节点章节。原创 2024-10-19 17:28:43 · 844 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第五十二章 设备树常用of函数
开发板采用核心板+底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐用,可满足高速信号环境下使用。设备都是以节点的形式“挂”到设备树上的,因此要想获取这个设备的其他属性信息,必须先获取到这个设备的节点。52.2章节在52.1章节的基础上设计了四个小实验,分别来获取查找的设备节点,获取属性内容,获取reg属性,获取status属性。设备树描述了设备的详细信息,这些信息包括数字类型的、字符串类型的、数组类型的,我们在编写驱动的时候。原创 2024-10-19 16:52:08 · 1127 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第五十章 Linux设备树
通过这些框架,我们可以很容易编写驱动代码,但是,当我们用这个框架非常熟练的时候,我们就会发现虽然这个方法很简单,但是非常不容易扩展,当我们有很多很多相似设备的时候,如果我们都是按照这个框架来完成,那就要写很多遍这个流程,但是多个相似设备之间真正有差异的地方只有框架的初始化硬件的部分,其他步骤的代码基本都是一样的。当我们找一个节点的时候,我们必须书写完整的节点路径,如果我们的节点名很长,那么我们在引用的时候就十分不方便,所以,设备树允许我们用下面的形式为节点标注引用(起别名)。在代码中的节点是什么样子的呢。原创 2024-10-19 15:13:55 · 1239 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第四十九章 平台总线总结回顾
通过这个框图,我们可以掌握平台总线模型和杂项设备和字符设备之间的关系,我们来看下图的左上角,平台总线模型分为两个部分,第一部分是driver部分,放的是和驱动相关的代码;平台总线模型将驱动分为driver和device,那么就可以提高驱动代码的重用性了,而且也可以大量减少重复性代码,这个也是平台总线模型的优点,并且linux系统都将驱动挂载到总线上是很方便管理的。如果你不了解平台总线模型这个概念,那么等你以后自己学习linux内核源码是看不懂的,所以我们要了解平台总线的概念。平台总线模型总结和回顾。原创 2024-10-19 14:50:33 · 348 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第四十八章 Platform 设备驱动
e -- 终于遇到八字匹配的了,那结婚呗,结完婚,男方就向女方交代,我有多少存款,我的房子在哪,钱放在哪等等( struct resource *resource),女方说好啊,于是去房子里拿钱,去给男方买菜啦,给自己买衣服、化妆品、首饰啊等等(int (*probe)(struct platform_device *) 匹配成功后驱动执行的第一个函数),当然如果男的跟小三跑了(设备卸载),女方也不会继续待下去的( int (*remove)(struct platform_device *))。原创 2024-10-19 14:45:51 · 921 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第四十七章 字符设备和杂项设备总结回顾
如下图三所示,左边是应用层,应用层执行read()write()后会触发file_operation结构体中的xxx_open(),xxx_read(),xxx_write()函数,这几个函数都是操作硬件设备的,这样就实现了应用层操作硬件设备的流程。如果让你点灯,让蜂鸣器响,你会做吗?始化、添加和删除cdev结构体,申请和释放设备号,以及填充file_operations结构体中的操作函数,实现file_operations结构体中的read()、write()和ioctl()等函数是驱动设计的主体工作。原创 2024-10-19 13:58:07 · 488 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第四十六章 自动创建设备节点
这样,加载模块的时候,用户空间中的udev会自动响应device_create,去/sysfs下寻找对应的类从而创建设备节点。Linux 驱动实验中,当我们通过 insmod 命令加载模块后,还需要通过 mknod 命令来手动创建设备节点,这样使用起来太麻烦了,并且不可能每个设备都去这样操作,Linux 系统的存在就是为了方便使用,所以我们来看一下如何实现自动创建设备节点,当加载模块时,在/dev 目录下自动创建相应的设备文件。46.3章节在46.2章节的基础上,编写创建设备的驱动程序,并编译为驱动模块。原创 2024-10-19 13:41:04 · 670 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第四十三章 驱动模块传参
共240PIN,CPU功能全部引出:底板扩展接口丰富底板板载4G接口(选配)、千兆以太网、WIFI蓝牙模块HDMI、CAN、RS485、LVDS接口、温湿度传感器(选配)光环境传感器、六轴传感器、2路USB OTG、3路串口,CAMERA接口、ADC电位器、SPDIF、SDIO接口等。如上图所示,查看到变量a的读写权限为-r,意为可读,驱动程序里面设置的变量a的权限为S_IRUSR,意为可读,所以变量a传参成功。到此,我们已经学会了在STM32MP157开发板上面给驱动模块传普通参数和数组参数了。原创 2024-10-16 09:52:56 · 872 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第四十二章 BEEP驱动实验
接下来我们要完成控制BEEP的逻辑操作,那么控制BEEP就涉及到了对寄存器的操作,但是对寄存器的操作我们是不能直接访问的,因为linux不能直接访问我们的物理地址,需要把物理地址先映射成虚拟地址,我们完成这一步转换需要用到ioremap函数。Q3是一个三极管,当引脚MCO1为 1 时,三极管的 1 端和 2 端电压差大于 0.7V,三极 管 3 端和 2 端导通,BEEP发出声音,同理,当引脚MCO1为0时,三极管截止,LED不出声。iTOP-STM32MP157开发板是底板加核心板的结构,底板原理图在“原创 2024-10-16 09:41:33 · 921 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第四十一章 物理地址与虚拟地址
共240PIN,CPU功能全部引出:底板扩展接口丰富底板板载4G接口(选配)、千兆以太网、WIFI蓝牙模块HDMI、CAN、RS485、LVDS接口、温湿度传感器(选配)光环境传感器、六轴传感器、2路USB OTG、3路串口,CAMERA接口、ADC电位器、SPDIF、SDIO接口等。用户空间的地址一般分布为0~3GB(即PAGE_OFFSET,在0x86中它等于0xC0000000),这样,剩下的3~4GB为内核空间,如下图所示。用户进程通常只能访问用户空间的虚拟地址,不能访问内核空间的虚拟地址。原创 2024-10-16 09:32:07 · 651 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第四十章 Linux用户层和内核层
设备驱动程序(device driver),简称驱动程序(driver),是一个允许高级(High level)计算机软件(computer software)与硬件(hardware)交互的程序,这种程序建立了一个硬件与硬件,或硬件与软件沟通的界面,经由主板上的总线(bus)或其它沟通子系统(subsystem)与硬件形成连接的机制,这样的机制使得硬件设备(device)上的数据交换成为可能。文件对应的操作有打开,关闭,读写,那么设备节点也可以看成一个文件,那么设备节点对应的操作有打开,关闭,读写。原创 2024-10-14 10:17:52 · 806 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第三十九章 Linux Misc驱动
misc 的意思是混合的杂项的,所以 misc 设备驱动也叫做杂项设备驱动,当我们板子上的某个设备没有办法分类时,就可以用 misc 设备驱动。设备号包含主设备号和次设备号,设备号是计算机识别设备的一种方式,主设备号相同的就被视为同一类设备,主设备号在Linux系统里面是唯一的,次设备号不一定唯一。所有的 misc 设备驱动的主设备号都为 10,不同的设备使用不同的从设备号。通过39.1章节的学习,我们已经把杂项设备的基本概念搞懂了,在本实验中,使用 misc 设备驱动的方式来编写最简单的杂项设备的驱动。原创 2024-10-14 10:02:52 · 1205 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第三十八章 驱动模块编译进内核
本章节我们来学习如何把驱动编译进内核,第38.1章已经学习了make menuconfig的图形化配置,那么有关menuconfig的几个配置文件之间的关系已经讲清楚了,本章节我们来讲解把36.3章节的helloworld驱动编译到内核,之前37.1章节是编译helloworld为模块,然后insmod加载进去模块。一般来说,其帮助信息,都包含针对该选项的很详细的解释。该宏,就是写出到配置文件中的那个宏,对于写makefile的人来说,往往也是利用此相关的宏,在makefile中,实现对应的不同的控制。原创 2024-10-14 09:32:54 · 1173 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第三十七章 Linux内核模块
其中 CROSS_COMPILE=/usr/local/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-,这里的路径,指向内核编译器的路径。模块本身不被编译入内核映像,从而控制了内核的大小。经过 37.1 章节的学习,我们已经清楚地掌握了把一个驱动编译成一个模块的完整的流程,虽然说这个 知识点非常简单,但是这个小的知识点可是有大用处的,那么这个章节将以实践课的方式给大家做一个演 示。原创 2024-10-14 09:21:39 · 749 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第三十六章 Linux驱动初探
Linux设备驱动会以内核模块的形式出现,因为linux内核的整体架构就非常庞大,包含的组件也非常多,如果把所有的功能都编译到linux内核中会使得内核非常臃肿,为了解决这个问题,更方便地新增和删除功能,linux提供了这样的机制,这种机制被称为模块。单片机开发包括:程序设计(PC端软件编程),程序送往执行(将编程好的软件下载到单片机,需要编程器或者下载线),单片机系统的设计(硬件上设计你需要的任务的执行机构,如控制开关,温度检测,红外传输等等,都是根据你的所需,然后在选择对应的硬件器件)。原创 2024-10-11 17:32:22 · 868 阅读 · 0 评论 -
【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第三十五章 嵌入式开发概述及环境构建
在使用本教程学习驱动开发的过程中,会涉及迅为的很多开发板,将更多的焦点转移到了驱动编程背后的内核原理,并试图从 Linux 内核的上百个驱动子系统中寻找出内部规律,以 培养读者举一反三的能力,让你能“一通百通”,了解写驱动的通用的方法之后,在工作中很容易在其他 板子上面使用这些知识。因为,知识的共通性实在太多。它的最大功能就是可以通过网络让不同的机器,不同的操作 系统彼此共享文件,可以通过 NFS 挂载远程主机的目录,访问该目录就和访问本地目录一样,所以也可以 简单的将它看成一个文件服务器。原创 2024-10-11 17:27:50 · 784 阅读 · 0 评论
分享