- 博客(61)
- 收藏
- 关注
原创 Linux系统镜像构建(3):根文件系统
bin目录该目录下的命令可以被root与一般账号所使用,由于这些命令在挂接其它文件系统之前就可以使用,所以/bin目录必须和根文件系统在同一个分区中。/bin目录下常用的命令有:cat、chgrp、chmod、cp、ls、sh、kill、mount、umount、mkdir等。我们之后在利用Busybox制作根文件系统时,在生成的bin目录下,可以看到一些可执行的文件,也就是可用的一些命令。/sbin 目录。
2025-03-04 11:47:25
796
原创 Linux系统镜像构建(2):linux内核的编译与烧录
芬兰人Linus最早开发,是类Unix系统,但不是Unix,实现了Unix的API(具体实现和Unix可能不同)而Linux使用GPLv2开源协议。
2025-03-03 17:09:15
928
原创 Linux系统镜像构建(1):uboot编译烧录与移植
uboot是从FADSROM、8xxROM、PPCBOOT逐步发展演化而来的。uboot发展至今,已经可以实现非常多的功能, 在操作系统方面,它不仅支持嵌入式Linux系统的引导,还支持NetBSD,VxWorks, QNX, RTEMS, ARTOS, LynxOS, Android等嵌入式操作系统的引导。在CPU架构方面, uboot支持PowerPC、MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。
2025-01-12 15:24:57
1014
原创 Linux驱动开发(18):linux驱动并发与竞态
原子操作分为整型原子操作和位原子操作。使用方法非常类似,本小节介绍分别 介绍整型原子操作和位原子操作的函数(确切的说某些是宏定义)。测试实验仅 用整型原子操作,读者可自行使用位原子操作实现,实验源码位于“//atomic_t类型结构体} atomic_t;参数i: 设置整型原子变量的初始值atomic_t类型: 暂且称为“整型原子类型”,我们用它定义整型原子变量。//返回增加后的结果//返回减少后的结果参数v:要设置的整型原子变量的指针(地址)。i: 要进行加/减操作的大小返回值。
2025-01-04 23:08:52
1127
原创 Linux驱动开发(17):输入子系统–电阻触摸驱动实验
触摸屏系统由三个部分组成,它们分别是TSC控制器、TSC_ANA、ADC。其中,TSC控制器是整个系统的核心, 负责为 TSC_ANA 和 ADC 提供控制信号,实现电阻屏的触摸检测和触点坐标测量;TSC_ANA根据TSC控制器 提供的信号负责向电阻屏的 X+、X-、Y+、Y- 四根线提供正负电压;ADC则根据TSC控制器的坐标转换信号负责采集触点x轴和y轴的电压,并进行坐标值转换。TSC控制器、TSC_ANA、ADC三个模块协同工作,形成一个触摸屏系统。
2025-01-04 13:48:18
945
原创 Linux驱动开发(16):输入子系统–电容触摸驱动实验
有关电容触摸的基础知识内容可以参考野火STM32相关教程,这里只介绍电容触摸驱动的相关内容。本章配套源码、设备树以及更新固件位于“~/embed_linux_driver_tutorial_imx6_code/linux_driver/touch_scream_GTxxx”目录下。触摸面板通过双面胶粘在显示屏上,他们在硬件上没有关联,通常情况下我们会设置触摸面板的“分辨率”与显示屏的分辨率一致。触摸芯片自动完成触摸信息的采集和处理,我们要做的就是配置触摸芯片、读取触点坐标。
2025-01-01 20:15:35
995
1
原创 Linux驱动开发(15):Framebuffer子系统–LCD驱动实验
Framebuffer子系统为用户空间操作显示设备提供了统一的接口,屏蔽了底层硬件之间的差异,用户只需要操作一块内存缓冲区即可把需要的图像显示到LCD设备上。主要实现字符设备的创建,为不同的显示设备提供文件通用处理接口;同时创建graphics设备类,占据主设备号29。主要提供显示设备的时序、显存、像素格式等硬件信息,实现显示设备的私有文件接口,并创建显示设备文件/dev/fbx(x=0~n)暴露给用户空间。硬件设备层的代码需要驱动开发人员根据具体的显示设备提供给内核。
2024-12-15 01:09:13
769
原创 Linux驱动开发(14):PWM子系统–pwm波形输出实验
在i.mx6中pwm子系统使用的是PWM外设,共有8个。有关PWM外设的介绍可以参考imx6ull参考手册的章节, 这里不再介绍。使用了PWM子系统后和具体硬件相关的内容芯片厂商已经写好了, 我们唯一要做的就是在设备树(或者是设备树插件)中声明使用的引脚。
2024-12-13 00:43:25
875
原创 Linux驱动开发(13):输入子系统–按键输入实验
linux为了统一各个输入设备,将输入子系统分为了Drivers(驱动层)、Input Core(输入子系统核心层)、 handlers(事件处理层)三部分。Drivers主要实现对硬件设备的读写访问,设置中断,并将硬件产生的事件转为Input Core定义的规范提交给Handlers;Input Core起到承上启下的作用,为Drivers提供了规范及接口,并通知Handlers对事件进行处理;
2024-12-11 22:05:55
1002
原创 Linux驱动开发(12):中断子系统–按键中断实验
让我们先来了解一下设备树是如何描述整个中断系统信息的。由于“全局中断”的特殊性,通常情况下载关闭之前要使用local_irq_save保存当前中断状态, 开启之后使用local_irq_restore宏恢复关闭之前的状态。flags是一个unsigned long 类型的数据。了解了以上函数的作用,我们就可以编写中断的驱动程序了, 如有遗漏的内容我们将会在代码介绍中,驱动程序介绍如下。
2024-12-09 22:21:31
1199
原创 Linux驱动开发(11):SPI子系统–OLED屏和CAN实验
spi_bus_type 总线定义,会在spi总线注册时使用。.match函数指针,设定了spi设备和spi驱动的匹配规则,具体如下spi_match_device。在oled驱动中我们使用ecspi1,可以通过IMX6ul的芯片手册查到,ecspi使用到的引脚如下。在我们实验中ecspi1使用CSI_DATA04-CSI_DATA07,oled屏和ecspi引脚对应入下。SPI_OLED显示屏功能说明引脚引出位置(排针)MOSIMOSI引脚CN5排针 IO4.27 脚未使用。
2024-12-08 21:16:00
1025
原创 Linux驱动开发(10):I2C子系统–mpu6050驱动实验
本节实验使用到 EBF6ULL-PRO 开发板上的 MPU6050。MPU6050是一款运动处理传感器,它集成了3轴MEMS陀螺仪,3轴MEMS加速度计。
2024-12-01 21:54:20
1084
转载 Linux驱动开发(9):pinctrl子系统和gpio子系统--led实验
首先我们在内核源码/arch/arm/boot/dts/imx6ull.dtsi文件中查找iomuxc节点,可以看到如下定义修饰的是与平台驱动做匹配的名字,这里则是与pinctrl子系统的平台驱动做匹配。表示的是引脚配置寄存器的基地址。imx6ull.dtsi这个文件是芯片厂商官方将芯片的通用的部分单独提出来的一些设备树配置。在iomuxc节点中汇总了所需引脚的配置信息,pinctrl子系统存储使用着iomux节点信息。
2024-11-20 00:17:57
1134
原创 Linux驱动开发(7):使用设备树实现RGB 灯驱动
注册平台驱动时会用到平台设备结构体,在平台设备结构体主要作用是指定平台驱动的.probe函数、指定与平台驱动匹配的平台设备, 使用了设备树后就是指定与平台驱动匹配的设备树节点。
2024-11-16 12:47:53
1273
原创 Linux驱动开发(6):Linux设备树
设备树的作用就是描述一个硬件平台的硬件资源。这个“设备树”可以被bootloader(uboot)传递到内核, 内核可以从设备树中获取硬件信息。设备树描述硬件资源时有两个特点。第一,以“树状”结构描述硬件资源。例如本地总线为树的“主干”在设备树里面称为“根节点”, 挂载到本地总线的IIC总线、SPI总线、UART总线为树的“枝干”在设备树里称为“根节点的子节点”, IIC 总线下的IIC设备不止一个,这些“枝干”又可以再分。
2024-11-15 18:24:22
1241
转载 Linux驱动开发(5):平台设备驱动
本节实验使用到 EBF6ULL-PRO 开发板上的 RGB 彩灯我们需要将字符设备中的硬件信息提取出来,独立成一份代码,将其作为平台设备,注册到内核中。点亮LED灯,需要控制与LED灯相关的寄存器, 包括GPIO时钟寄存器,IO配置寄存器,IO数据寄存器等,这里的资源,实际上就是寄存器地址,可以使用IORESOURCE_MEM进行处理;除了这些之外,还需要提供一些寄存器的偏移量,我们可以利用平台设备的私有数据进行管理。#define CCM_CCGR1 0x020C406C //时钟控制寄存器。
2024-11-12 21:07:31
1283
原创 Linux驱动开发(4):Linux的设备模型
无无if(!return 1;return 0;第11-15行:定义了一个名为xbus的总线总线结构体中最重要的一个成员,便是match回调函数,这个函数负责总线下的设备以及驱动匹配, 没有这个函数,设备与驱动便不可以进行匹配。第1-9行:我们使用字符串比较的方式,通过对比驱动以及设备的名字来确定是否匹配,如果相同,则说明匹配成功,返回1;反之,则返回0。第1行:声明了外部的总线变量xbus。第3-6行:编写release函数,防止卸载模块时会报错。
2024-11-11 23:49:49
1205
1
原创 Linux驱动开发(2):内核模块详解
参数的类型,目前内核支持的参数类型有byte,short,ushort,int,uint,long,ulong,charp,bool,invbool。如果要将一个模块加载到内核中,insmod是最简单的办法, insmod+模块完整路径就能达到目的,前提是你的模块不依赖其他模块,还要注意需要sudo权限。以上代码中,包含了内核模块的加载、卸载函数的声明,还列举了module.h文件中的部分宏定义,这部分宏定义, 有的是可有可无的,但是MODULE_LICENSE这个是指定该内核模块的许可证,是必须要有的。
2024-10-26 21:55:26
1324
原创 Linux驱动开发(1):内核模块、设备树、设备树插件的编译加载
内核模块全称 Loadable Kernel Module(LKM), 是一种在内核运行时,加载一组目标代码来实现某个特定功能的机制。模块是具有独立功能的程序,它可以被单独编译,但不能独立运行, 在运行时它被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不一样的。模块由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序和其他内核上层功能。模块本身不被编译入内核映像,这控制了内核的大小。模块一旦被加载,它就和内核中的其它部分完全一样。
2024-10-26 10:34:16
1405
原创 解决:sudo apt install catkin的报错问题。
命令,查看python3-catkin-pkg 版本。发现最新的 1.0.0-100 与 catkin冲突,发现 0.4.24-2版本没有与catkin冲突。将已安装的python3-catkin-pkg卸载。然后重新安装python3-catkin-pkg。
2024-09-24 22:25:16
772
原创 i.MX6裸机开发(12):eLCDIF——液晶显示
显示器属于计算机的I/O设备,即输入输出设备。它是一种将特定电子信息输出到屏幕上再反射到人眼的显示工具。常见的有CRT显示器、液晶显示器、LED点阵显示器及OLED显示器。IMX6U系列芯片内部自带一个增强型液晶接口外设eLCDIF(Enhanced LCD Interface),配合使用DDR作为显存, 可直接控制液晶面板,无需额外增加液晶控制器芯片。IMX6U的eLCDIF液晶控制器最高支持1366x768分辨率的屏幕;
2024-08-29 10:38:48
834
原创 i.MX6裸机开发(11)——DDR测试
RAM是“Random Access Memory”的缩写,被译为随机存储器。所谓“随机存取”,指的是当存储器中的消息被读取或写入时,所需要的时间与这段信息所在的位置无关。这个词的由来是因为早期计算机曾使用磁鼓作为存储器,磁鼓是顺序读写设备, 而RAM可随读取其内部任意地址的数据,时间都是相同的,因此得名。实际上现在RAM已经专门用于指代作为计算机内存的易失性半导体存储器。根据RAM的存储机制,又分为动态随机存储器DRAM(Dynamic RAM)以及静态随机存储器SRAM(Static RAM)两种。
2024-08-26 19:36:06
828
原创 i.MX裸机开发(10):UART——串口通讯
串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式, 电子工程师在调试设备时也经常使用该通讯方式输出调试信息。在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;官方SDK库则是在寄存器与用户代码之间的软件层。对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。
2024-08-26 13:01:37
452
原创 i.MX6裸机开发(9):CCM时钟控制模块
i.MX 6U芯片时钟的结构以时钟树的方式进行描述。当我们设置外设时钟时大多会参考时钟树进行设置, 本章配套程序将以ARM_CLK_ROOT(CPU根时钟)为例讲解时钟的配置方法。本实验只用RGB灯显示大致显示CPU运行速度,没有用到其他外部电路。
2024-08-25 21:06:17
994
原创 i.MX6裸机开发(8):中断
GIC是Generic Interrupt Controller的缩写,直译为通用中断控制器,它由ARM公司设计,目前共有4个版本V1~V4,i.MX 6U使用的是GIC V2。GIC V2的功能框图如下所示。上图从上往下看可知GIC最多支持8个处理器(processor0~ processor7)。不同处理器的GIC功能是相同的,我们只看其中一个即可。GIC主要分为分发器(Distributor)和CPU接口(CPU interface/Virtual CPU interface)。
2024-08-25 12:39:26
771
原创 i.MX6裸机开发(7):整理工程文件
为降低难度,在之前章节我们把程序所有内容放在一个文件夹下。这样做存在两个主要问题,第一,代码存放混乱不易阅读。第二,程序可移植性差。本章将对代码进行简单的整理,让程序存放更有条理。本章主要内容:创建文件夹分类存储代码修改makefile。
2024-08-24 09:32:06
580
原创 i.MX6裸机开发(6):GPIO输入——按键查询检测
按键检测使用到GPIO外设的基本输入功能,GPIO外设相关的概念请参考第四章节汇编点亮LED灯。本章主要内容:i.MX 6U 在硬件上实现按键消抖Pro开发板按键原理图和功能分析在led_rgb_c基础上修改为button编译代码,实现按键查询控制LED。
2024-08-24 08:55:14
761
原创 i.MX6裸机开发(5):LED灯——使用IAR集成开发环境点亮
在编写应用程序的过程中,我们需要考虑更改硬件环境的情况,例如LED灯的控制引脚与当前的不一样, 我们希望程序只做最小的修改即可在新的环境上正常运行。以上代码分别把控制三盏LED灯的GPIO端口、GPIO引脚号以及IOMUXC的复用功能根据硬件连接使用宏定义封装起来了。在实际控制的时候我们就直接用这些宏,以达到应用代码跟硬件无关的效果。下面总结一下我们编写的LED灯驱动:在bsp_led.h文件中定义好具体的硬件引脚及控制亮灭的宏;
2024-08-23 23:54:44
1032
原创 i.MX6裸机开发(4):官方C库实现
本章移植的内容主要包括两部分。第一部分,移植官方寄存器定义文件。第二,移植引脚复用以及引脚属性定义文件。在官方SDK的“”目录下, 头文件“MCIMX6Y2.h”文件多达4万多行,包含了i.MX6U芯片几乎所有的寄存器定义以及中断编号的定义, 本章我们只了解GPIO寄存器的定义,如下所示。/*********************以下代码省略***************************8*/这里只列GPIO1相关寄存器的部分代码。其他寄存器定义与此类似。
2024-08-22 23:45:07
1212
3
原创 i.MX6裸机开发(3):LED灯——c语言实现
在汇编点亮LED灯章节我们在led.S文件里使用纯汇编语言操作i.MX6ULL的寄存器点亮了LED灯。主要存在两个问题,第一,汇编语言编写效率低,编写繁琐。第二,程序编写完成后需要手动输入多条编译命令, 编译过程繁琐。本章的重点是解决上面两个问题。本章主要内容:从汇编跳转到C语言使用makefile工具和链接脚本管理工程。
2024-08-18 23:05:13
771
原创 i.MX6裸机开发(2):LED灯——汇编实现
i.MX6ULL芯片的GPIO被分成5组,并且每组GPIO的数量不尽相同,例如GPIO1拥有32个引脚,GPIO2拥有22个引脚, 其他GPIO分组的数量以及每个GPIO的功能请参考《i.MX 6UltraLite Applications Processor Reference Manual》 第26章General Purpose Input/Output (GPIO)(P1133)。GPIO框图剖析通过GPIO硬件结构框图,就可以从整体上深入了解GPIO外设及它的各种应用模式。
2024-08-18 12:42:37
827
原创 i.MX6裸机开发(1):环境搭建
本书讲解的例程全部采用2.2版本SDK的库文件,以下内容请大家打开“SDK_2.2_MCIM6ULL_EBF6ULL”的SDK包配合阅读,如下所示。为提高系统的稳定性,处理器会被分成多种工作模式,不同工作模式的权限不同。Cortex-M3或者M4内核的 的芯片分为特权模式和非特权模式,特权模式下CPU完全控制芯片而非特权模式下不能操作某些特殊 的寄存器。i.MX 6U作为一款应用处理器,将CPU工作模式进一步细分,支持九种工作模式下表所示。表 处理器工作模式处理器模式编码特权等级。
2024-08-16 23:24:42
892
原创 解决问题:VMware虚拟机扩展硬盘后,空间没有扩充仍处于不足状态。
不过虽然硬盘进行了扩充,但是由于没有分区,文件系统仍然无法识别使用该空间。网上的解决方法很多,本人亲测很多都失败了,而且过程超级复杂。最后发现只需一句代码即可解决。当我们硬盘内容不足时,我们自然想到在VMware的“虚拟机设置”中扩展我们的硬盘。针对的是ext2、ext3、ext4文件系统,我们使用resize2fs命令。1.确认自己的文件系统挂载在哪个盘哪个分区上,我的为:/dev/sda3。针对的是xfs文件系统,我们使用xfs_growfs命令。2.查看/dev/sda3的文件类型,我的为ext4。
2024-08-16 00:22:34
2389
1
原创 Linux应用层开发(8):基于套接字(Socket)的进程间通信
套接字(socket)是一种通信机制,凭借这种机制,客户端服务器模型的通信方式既可以在本地设备上进行,也可以跨网络进行。套接字的创建和使用与管道是有区别的,因为套接字明确地将客户端、服务器区分开来,而且套接字机制可以实现将多个客户连接到一个服务器。Socket英文原意是“孔”或者“插座”的意思,在网络编程中,通常将其称之为“套接字”,当前网络中的主流程序设计都是使用Socket进行编程的,因为它简单易用,它还是一个标准。
2024-08-12 00:28:08
864
原创 Linux应用层开发(7):网络编程
因为网络的知识太庞大了,想要介绍清除得写好几本书,在这里就简单提及一下就好了。TCP/IP是一个协议族,包含众多的协议。但对于网络应用开发人员,可能听到更多的是其中的应用层协议,比如HTTP、FTP、MQTT等。HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,HTTP的应用最为广泛。比如大家日常使用电脑时的一个常规操作:打开电脑,打开浏览器,输入网址,最后按下回车,这一刻你就开启了HTTP通信。
2024-08-09 22:39:10
803
原创 Linux系统编程(9):POSIX互斥锁
而如果互斥锁处于闭锁状态,则根据互斥锁的类型做对应的处理,默认情况下是快速互斥锁, 获取该互斥锁的线程将无法获得互斥锁,线程将被阻塞,直到互斥锁被释放,当然,如果是同一个线程重复获取互斥锁,也会导致死锁结果。当互斥锁处于开锁状态时,线程才能够获取互斥锁,当线程持有了某个互斥锁的时候, 其他线程就无法获取这个互斥锁,需要等到持有互斥锁的线程进行释放后,其他线程才能获取成功, 线程通过互斥锁获取函数来获取互斥锁的所有权。当该线程释放互斥锁时, 该互斥锁处于开锁状态,线程失去该互斥锁的所有权。
2024-08-06 23:50:57
659
原创 linux系统编程(8):POSIX信号量
本章节将讲述另一种进程/线程间通信的机制——POSIX信号量,为了明确与systemV信号量间的区别, 若非特别说明,本章出现的信号量均为POSIX信号量。也要注意请不要把它与之前所说的信号混淆了, 信号与信号量是不同的两种机制。
2024-08-06 23:02:11
1121
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人