自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(100)
  • 收藏
  • 关注

原创 Linux 块设备驱动实验

块设备是针对存储设备的,比如 SD 卡、EMMC、NAND Flash、Nor Flash、SPI Flash、机 械硬盘、固态硬盘等。因此块设备驱动其实就是这些存储设备驱动,块设备驱动相比字符设备 驱动的主要区别如下:①、块设备只能以块为单位进行读写访问,块是 linux 虚拟文件系统(VFS)基本的数据传输 单位。字符设备是以字节为单位进行数据传输的,不需要缓冲。

2025-11-29 22:44:07 592 1

原创 Linux 多点电容触摸屏实验

也就是 ABS_MT_TRACKING_ID ,这一行就是 input_mt_report_slot_state 函数上报。这 个 驱 动 文 件 , 路 径为drivers/input/touchscreen/ili210x.c,找到。和 ABS_MT_POSITION_Y,可以通过在这两个事件上报触摸点,如果设备支持的话,还可以使用。如果追踪到的触摸点数量多于当前上报的数量,驱动程序使用 BTN_TOOL_TAP。触摸屏的使用场合越来越多,从手机、平板到蜂巢取货的屏幕等,到处充斥着触摸屏。

2025-11-20 22:46:46 710

原创 Linux RS232/485/GPS 驱动实验

虽然串口驱动不需要我们去写,但是串口驱动框架我们还是需要了解的,uart_driver。设置完以后按下回车键确认,确认完以后就可以设置其他的配置项。串口驱动没有什么主机端和设备端之分,就只有一个串口驱动,而且这个驱动也。UART 驱动框架大概就是这些,接下来我们理论联系实际,看一下。当系统启动以后串口驱动和设备匹配成功,相应的串口就会被驱动起来,生成。官方已经编写好了,我们真正要做的就是在设备树中添加所要使用的串口节点信。”命令安装,安装的意思就是将编译出来的结果拷贝到--pfefix。

2025-11-18 23:33:39 638

原创 Linux SPI 驱动实验

spi_message 准备好以后就可以进行数据传输了,数据传输分为同步传输和异步传输,同步。pinctrl 子节点,这个没什么好说的,唯独要注意的就是检查相应的。队列中,这里我们要用 到 spi_message_add_tail。在本章实验中,我们采用同步传输方式来完成 SPI。控制器部分的驱动都是一样,我们的重点就落在了种类繁多的 SPI。spi_imx_buf_tx_u8 函数是通过。bsp_spi.h 这两个文件,这两个文件是 I.MX6U。这个函数为例,看看,一个自己的数据发送是怎么完成的,在。

2025-11-16 23:40:38 596

原创 Linux I2C 驱动实验

就像你的部门老大是你的领导,你是他的下属,但是放到整个公司,你的部门老大却也 是老板的下属。i2c_add_numbered_adapter 或 i2c_add_adapter。这两个函数的区别在于 i2c_add_adapter。厂商已经替我们编写好了,我们需要做的就是编写具体的设备驱动,i2c_imx_probe 函数内容如下所示。重点来看一下 i2c_imx_xfer。可以看出,I2C_BOARD_INFO。当设备和驱动匹配以后 i2c_driver。i2c_add_driver 就是对。

2025-11-10 12:49:34 748

原创 Linux RTC 驱动实验

计数值,因为要读取两个寄存器, 因此可能存在读取第二个寄存器的时候时间数据更新了,导致时间不匹配,因此这里连续读两次,如果两次的时间值相等那么就表示时间数据有效。时间值的过程,至于其他的底层操作函数大家自行分析即可,都是大同小异的,这里就不再分析了。函数对其他的命令处理都是类似的,比 如 RTC_ALM_READ。RTC 是用来计时的,因此最基本的就是查看时间,,大家的启动信息可能会和图中的不同,但是内容基本上都是一样的。函数就会执行, rtc_dev_ioctl 最终会通过操作。设备写入新的时间 值等。

2025-11-08 22:02:30 645

原创 Linux LCD 驱动实验

上述提示语句说的是:按下回车键使能当前终端,我们在第五十八章已经将 I.MX6U-ALPHA 开发板上的。需要申请的,不是你想用就能用的。每一个属性的含义后面的注释已经写的很详细了,大家自己去看就行了,这些时序参数就。板的背光引脚一样,因此背光的设备树节点是不需要修改的,但是考虑到其他同学可能使用别。至此,我们就拥有了两套终端,一个是基于串口的 SecureCRT。节点追加的内容,我们依次来看一下代码中的这些属性都是些什么含义。设备作为自己的终端,然后接上键盘就可以直接在开发板上敲命令了,将。

2025-11-06 21:50:37 897

原创 Linux INPUT 子系统实验

input 就是输入的意思,因此input子系统就是管理输入的子系统,和pinctrlgpio子系统一样,都是Linux内核针对某一类设备而创建的框架。比如按键输入、键盘、鼠标、触摸屏等等这些都属于输入设备,不同的输入设备所代表的含义不同,按键和键盘就是代表按键信息,鼠标和触摸屏代表坐标信息,因此在应用层的处理就不同,对于驱动编写者而言不需要去关心应用层的事情,我们只需要按照要求上报这些输入事件即可。为此input子系统分为input驱动层、input核心层、

2025-11-02 22:00:19 698

原创 Linux MISC 驱动实验

所有的 MISC 设备驱动的主设备号都为 10,不同的设备使用不同的从设备号。随着 Linux 字符设备驱动的不断增加,设备号变得越来越紧张,尤其是主设备号,MISC 设备驱动就用于解 决此问题。MISC 设备会自动创建 cdev,不需要像我们以前那样手动创建,因此采用 MISC 设 备驱动可以简化字符设备驱动的编写。

2025-10-14 21:26:47 954

原创 Linux 自带的 LED 灯驱动实验

LED 灯驱动文件为/drivers/leds/leds-gpio.c,大家可以打开/drivers/leds/Makefile 这个文件, 找到如下所示内容:第 24 行,如果定义了 CONFIG_LEDS_GPIO 的话就会编译 leds-gpio.c 这个文件,在上一小 节我们选择将 LED 驱动编译进 Linux 内核,在.config 文件中就会有“CONFIG_LEDS_GPIO=y” 这一行,因此 leds-gpio.c 驱动文件就会被编译。

2025-10-13 15:54:42 637

原创 设备树下的platform驱动编写

platform驱动框架分为总线、设备和驱动,其中总线不需要我们这些驱动程序员去管理,这个是Linux内核提供的,我们在编写驱动的时候只要关注于设备和驱动的具体实现即可。在没有设备树的Linux内核下,我们需要分别编写并注册platform_device和platform_driver,分别代表设备和驱动。在使用设备树的时候,设备的描述被放到了设备树中,因此platform_device就不需要我们去编写了,我们只需要实现platform_driver即可。

2025-10-11 17:21:41 883

原创 platform设备驱动实验

前面我们讲了设备驱动的分离,并且引出了总线(bus)、驱动(driver)和设备(device)模型,比如I2C、SPI、USB等总线。但是在SOC中有些外设是没有总线这个概念的,但是又要使用总线、驱动和设备模型该怎么办呢?为了解决此问题,Linux提出了platform这个虚拟总线,相应的就有platform_driver和platform_device。

2025-09-28 23:21:34 950

原创 异步通知实验

我们首先来回顾一下“中断”,中断是处理器提供的一种异步机制,我们配置好中断以后就可以让处理器去处理其他的事情了,当中断发生以后会触发我们事先设置好的中断服务函数,在中断服务函数中做具体的处理。比如我们在裸机篇里面编写的GPIO按键中断实验,我们通过按键去开关蜂鸣器,采用中断以后处理器就不需要时刻的去查看按键有没有被按下,因为按键按下以后会自动触发中断。同样的,Linux应用程序可以通过阻塞或者非阻塞这两种方式来访问驱动设备,通过阻塞方式访问的话应用程序会处于休眠态,等待驱动设备可以使用,非阻。

2025-09-20 21:26:36 752

原创 Linux阻塞和非阻塞IO实验

这里的“IO”并不是我们学习STM32或者其他单片机的时候所说的“GPIO”(也就是引脚)。这里的IO指的是Input/Output,也就是输入/输出,是应用程序对驱动设备的输入/输出操作。当应用程序对设备驱动进行操作的时候,如果不能获取到设备资源,那么阻塞式IO就会将应用程序对应的线程挂起,直到设备资源可以获取为止。对于非阻塞IO,应用程序对应的线程不会挂起,它要么一直轮询等待,直到设备资源可以使用,要么就直接放弃。

2025-09-19 22:54:18 719

原创 中断系统介绍

arm对异常中断处理过程:①初始化:a.设置中断源,让它可以产生中断b.设置中断控制器可以屏蔽某个中断,优先级c.设置CPU总开关使能中断②执行其他程序:正常程序③产生中断:比如按下按键--->中断控制器--->CPU④CPU每执行完一条指令都会检查有无中断异常产生⑤CPU发现有中断异常产生,开始处理。对于不同的异常,跳去不同的地址执行程序。这地址上,只是一条跳转指令,跳去执行某个函数地址,这个就是异常向量。③④⑤都是硬件做的。⑥。

2025-09-10 23:20:56 1117

原创 Linux中断实验

先来回顾一下裸机实验里面中断的处理方法:①、使能中断,初始化相应的寄存器。②、注册中断服务函数,也就是向irqTable数组的指定标号处写入中断服务函数②、中断发生以后进入IRQ中断服务函数,在IRQ中断服务函数在数组irqTable里面查找具体的中断处理函数,找到以后执行相应的中断处理函数。在 Linux 内核中也提供了大量的中断相关的 API函数,我们来看一下这些跟中断有关的。

2025-09-02 22:11:17 714

原创 Linux 内核定时器实验

学习过UCOS或FreeRTOS的同学应该知道,UCOS或FreeRTOS是需要一个硬件定时器提供系统时钟,一般使用Systick作为系统时钟源。同理,Linux要运行,也是需要一个系统时钟的,至于这个系统时钟是由哪个定时器提供的,笔者没有去研究过Linux内核,但是在Cortex-A7内核中有个通用定时器,在《Cortex-A7 Technical ReferenceManua.pdf》的“9:Generic Timer”

2025-09-02 21:36:12 982

原创 Linux按键输入实验

在前几章我们都是使用的GPIO输出功能,还没有用过GPIO输入功能,本章我们就来学习一下如果在Linux下编写GPIO输入驱动程序。I.MX6U-ALPHA开发板上有一个按键,我们就使用此按键来完成GPIO输入驱动程序,同时利用第四十七章讲的原子操作来对按键值进行保护。

2025-09-01 22:25:46 1086

原创 Linux并发与竞争实验

在上一章中我们学习了Linux下的并发与竞争,并且学习了四种常用的处理并发和竞争的机制:原子操作、自旋锁、信号量和互斥体。本章我们就通过四个实验来学习如何在驱动中使用这四种机制。

2025-09-01 22:00:50 755

原创 Linux并发与竞争

Linux系统是个多任务操作系统,会存在多个任务同时访问同一片内存区域,这些任务可能会相互覆盖这段内存中的数据,造成内存数据混乱。针对这个问题必须要做处理,严重的话可能会导致系统崩溃。现在的Linux系统并发产生的原因很复杂,总结一下有下面几个主要原因:①、多线程并发访问,Linux是多任务(线程)的系统,所以多线程访问是最基本的原因。②、抢占式并发访问,从2.6版本内核开始,Linux内核支持抢占,也就是说调度程序可以在任意时刻抢占正在运行的线程,从而运行其他的线程。

2025-08-28 23:05:26 1010

原创 Linux 蜂鸣器实验

上一章实验中我们借助 pinctrl 和 gpio 子系统编写了 LED 灯驱动, I.MX6U-ALPHA 开发板上还有一个蜂鸣器,从软件的角度考虑,蜂鸣器驱动和 LED 灯驱动其实是一摸一样的,都是控制 IO 输出高低电平。本章我们就来学习编写蜂鸣器的 Linux 驱动,也算是对上一章讲解的 pinctrl和 gpio 子系统的巩固。

2025-08-27 18:49:29 923

原创 GPIO子系统自主实现(简单版)

芯片内部有很多引脚,这些引脚可以接到GPIO模块,也可以接到I2C等模块。通过Pinctrl子系统来选择引脚的功能(mux function)、配置引脚:当一个引脚被复用为GPIO功能时,我们可以去设置它的方向、设置/读取它的值。GPIO名为"General Purpose Input/Output",通用目的输入/输出,就是常用的引脚。GPIO可能是芯片自带的,也可能通过I2C、SPI接口扩展:GPIO有一些通用功能、通用属性。

2025-08-25 22:01:21 1350

原创 Pin-Ctrl自主实现版本(简易版)

Pinctrl:Pin Controller,顾名思义,就是用来控制引脚的:引脚枚举与命名(Enumerating and naming)引脚复用(Multiplexing):比如用作GPIO、I2C或其他功能引脚配置(Configuration):比如上拉、下来、open drain、驱动强度等Pinctrl驱动由芯片厂家的BSP工程师提供,一般的驱动工程师只需要在设备树里:指明使用那些引脚复用为哪些功能配置为哪些状态在一般的设备驱动程序里,甚至可以没有pinctrl的代码。

2025-08-24 21:53:47 686

原创 pinctrl和gpio子系统实验

Linux驱动讲究驱动分离与分层,pinctrl和gpio子系统就是驱动分离与分层思想下的产物,驱动分离与分层其实就是按照面向对象编程的设计思想而设计的设备驱动框架,关于驱动的分离与分层我们后面会讲。本来pinctrl和gpio子系统应该放到驱动分离与分层章节后面讲解,但是不管什么外设驱动,GPIO驱动基本都是必须的,而pinctrl和gpio子系统又是GPIO驱动必须使用的,所以就将pintrcl和gpio子系统这一章节提前了。

2025-08-20 22:54:28 664

原创 设备树下的LED驱动实验

上一章我们详细的讲解了设备树语法以及在驱动开发中常用的OF函数,本章我们就开始第一个基于设备树的Linux驱动实验。本章在LED实验的基础上完成,只是将其驱动开发改为设备树形式而已。

2025-08-19 23:06:24 909

原创 Linux设备树简介

设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设备树的文件叫做DTS(DeviceTree Source),这个DTS文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU数量、 内存基地址、IIC接口上接了哪些设备、SPI接口上接了哪些设备等等。如图:树的主干就是系统总线,IIC控制器、GPIO控制器、SPI控制器等都是接到系统主线上的分支。

2025-08-18 23:48:38 1020

原创 新字符设备驱动实验

1.经过前两章实验的实战操作,我们已经掌握了 Linux字符设备驱动开发的基本步骤,字符设备驱动开发重点是使用函数注册字符设备,当不再使用设备的时候就使用函数注销字符设备,驱动模块加载成功以后还需要手动使用mknod命令创建设备节点。和这两个函数是老版本驱动使用的函数,现在新的字符设备驱动已经不再使用这两个函数,而是使用Linux内核推荐的新字符设备驱动API函数。本节我们就来学习一下如何编写新字符设备驱动,并且在驱动模块加载的时候自动创建设备节点文件。1.

2025-08-16 20:39:46 515

原创 嵌入式 Linux LED 驱动开发实验

比 如 I.MX6ULL 的 GPIO1_IO03 引 脚 的 复 用 寄 存 器 IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 的地址为。Linux 下的任何外设驱动,最终都是要配置相应的硬件寄存器。址上去,虚拟地址范围比物理地址范围大的问题处理器自会处理,这里我们不要去深究,因为。2.内存保护,设置存储器的访问权限,设置虚拟存储空间的缓冲特性。读取写内存地址,返回值就是读取到的数据。口进行配置,与裸机实验不同的是,在。的 内存就是物理内存,经过 MMU。,也就是内存管理单元。

2025-08-16 20:17:27 987

原创 Linux字符设备驱动开发

本文章的所有驱动开发使用的uboot为上一小节编译生成的uboot,使用的linux内核为正点原子编译好的内核,使用的根文件系统为正点原子搭建的。设备树和镜用TFTP的方式加载(上一小节已做详细说明),根文件系统用NFS挂载方式,在uboot下设置环境变量。(注意第一个ip为服务器的IP,后面是板卡的IP,顺序不要反,之前鄙人在此弄了好几天都没找到解决办法)由于字符驱动比较简单,在此不做过多的概念描述,直接上代码。

2025-08-11 21:55:39 843

原创 uboot使用指南

本节是 uboot的使用,所以就直接使用正点原子已经移植好的uboot,这个已经放到了开发板光盘中了,路径为:开发板光盘->1、程序源码->3、正点原子Uboot和Linux出厂源码。

2025-08-10 13:43:02 1039

原创 hell world实验

的各种可配置块,其中灰色部分是固定的,绿色部分是可配置的,按工程实际需求配置。可以直接单击各种可配置块(以绿色突出显示)进入相应的配置页面进行配置,也可以选择左侧的页导航面板进行系统配置。用于设置生成过程中要使用的处理器的线程数,进行多线程处理,保持默认或设置为个人电脑处理器最大可使用线程数都可以,一般选择最大可使用线程数的一般。实际上这两个函数在该工程中并没有启动任何作用,因为这两个函数是针对于特定平台如Microblaze 的,对于我们使用的。这是创建工程的最后一步,显示工程摘要信息,如。

2025-01-15 17:04:44 1035

原创 独立看门狗

看门狗初始化

2025-01-15 15:45:12 140

原创 rtc实时时钟

实时时钟供电的方式该GD32无日历寄存器,只有计数器。下图的M4有日历,为影子寄存器。

2025-01-13 21:12:59 205

原创 电感基础知识

电感的工作原理电感的分类电感的读取电感通低频阻高频电感的作用

2025-01-12 21:24:54 168

原创 FPGA实战篇(UART通信实验)

另外还应该有一个对数据进行环回控制的模块,它负责把从串口接收模块接收到的数据送给串口发送模块,以实现串口数据的环回。其中,起始位标志着一帧数据的开始,停止位标志着一帧数据的结束,数据位是一帧数据中的有效数据。个停止位拉低,是为了确保发送模块发送数据的时间略小于接收模块接收数据的时间,否则当连续传输大量数据时,发送数据的时间会不断累积,最终导致在做串口环回实验时丢失数据。尽管串口发送数据只是接收数据的反过程,理论上在传输的时间上是一致的,考虑到我们模块里计算波特率会有较小的偏差,并且串口对端的通信设备(

2024-12-29 20:43:39 1157

原创 ARM单片机定时器

定时器分类定时器资源。基于GD32F103

2024-12-29 20:27:37 251

原创 电容的基础知识

2024-12-29 19:44:29 131

原创 单片机逻辑调度框架

2024-12-28 20:00:54 129

原创 电阻的基础知识

电阻的分类色环电阻读取

2024-12-26 21:56:53 151

原创 空闲中断配合DMA

1.传统串口接收数据:来一个字节接受一个。 2.一次中断将一包数据存到缓冲区 3.DMA原理

2024-12-22 22:20:20 306

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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