Linux驱动开发
文章平均质量分 88
.
Super.Bear
https://github.com/Paraniod1
展开
-
Linux之I2C驱动
在 Linux 内核中 I2C 的体系结构分为 3 个部分:①: I2C 核心提供了I2C 总线驱动和设备驱动的注册、 注销方法②: I2C 总线驱动是对I2C 硬件体系结构中适配器端的实现, 适配器可由CPU 控制, 甚至可以直接集成在 CPU 内部。I2C 总线驱动就是 SOC 的,也叫做。③: I2C 设备驱动是对,设备一般挂接在受 CPU 控制的 I2C 适配器上, 通过 I2C 适配器与 CPU 交换数据。原创 2022-09-28 23:05:18 · 4931 阅读 · 1 评论 -
Linuz之LCD驱动
CPU指定显示控制器工作,则显示控制器根据CPU的控制到指定的地方去取数据和指令, 目前的数据一般是从显存里取,如果显存里存不下,则从内存里取, 内存也放不下,则从硬盘里取,当然也不是内存放不下,而是为了节省内存的话,可以放在硬盘里,然后通过指令控制显示控制器去取。帧缓存 Frame Buffer,里面存储的东西是一帧一帧的, 显卡会不停的刷新Frame Buffer, 这每一帧如果不捕获的话, 则会被丢弃,也就是说是实时的。/dev/fb0 是 LCD 对应的设备文件, /dev/fb0 是个字符设备。原创 2022-09-28 10:25:19 · 1420 阅读 · 0 评论 -
Linux之内核Platform KEY
Linux 内核自带了 KEY 驱动,如果要使用内核自带的 KEY 驱动的话需要配置 Linux 内核。原创 2022-09-27 21:03:17 · 1237 阅读 · 0 评论 -
Linux之Input子系统
Input 子系统是管理输入的子系统, 和 pinctrl 和 gpio 子系统一样, 都是 Linux 内核针对某一类设备而创建的框架。input 子系统处理输入事务, 任何输入设备的驱动程序都可以通过 input 输入子系统提供的接口注册到内核, 利用子系统提供的功能来与用户空间交互。输入设备总类繁杂, 包括按键, 键盘, 触摸屏, 鼠标, 摇杆等, 它们本身是字符设备, 不过内核为了能将这些设备的共性抽象出来, 简化驱动的开发, 建立了一个 Input 子系统。原创 2022-09-27 19:52:19 · 6075 阅读 · 0 评论 -
Linux之MISC驱动框架
minor 表示子设备号, MISC 设备的主设备号为 10,需要用户指定子设备号, Linux 系统已经预定义了一些 MISC 设备的子设备号,这些预定义的子设备号定义在include/linux/miscdevice.h 文件中。, 当板子上的某个设备没有办法分类时, 可以用 misc 设备驱动。杂项设备是字符设备的一种, 杂项设备可以自动生成设备节点。linux 驱动倾向于分层设计, 所以每个具体的设备都可以找到它归属的类型, 从而可以套到它相应的架构里面去, 只需要实现它最底层的那部分。原创 2022-09-26 20:08:34 · 558 阅读 · 0 评论 -
Linux之内核Platform LED
在Linux内核中已经集成了LED驱动设备。Linux 内核的 LED 灯驱动采用 platform 框架,因此只需要按照要求在设备树文件中添加相应的 LED 节点即可。原创 2022-09-25 20:58:27 · 906 阅读 · 0 评论 -
Linux之Platform设备驱动
上述代码假定为了实现 funca(), 对于同类设备而言, 操作流程一致, 都要经过通用代码 A、 底层 ops1、通用代码 B、 底层 ops2、 通用代码 C、 底层 ops3这几步, 分层设计明显带来的好处是, 对于通用代码 A、B、 C, 具体的底层驱动不需要再实现, 而仅仅只关心其底层的操作ops1、 ops2、 ops3。当内核中有驱动注册时, 总线就会在右侧的设备中查找, 是否有匹配的设备, 同样的, 当有设备注册到内核中时, 也会在总线左侧查找是否有匹配的驱动。原创 2022-09-25 11:42:13 · 2676 阅读 · 0 评论 -
Linux之异步通知机制
是处理器提供的一种,配置好中断后就可以让处理器去处理其他的事情,当中断发生以后会执行中断服务函数,在中断服务函数中做具体的处理。Linux 应用程序可以通过阻塞或者非阻塞两种方式来访问驱动设备,通过阻塞方式访问,应用程序会处于休眠态,等待驱动设备可以使用。非阻塞方式会通过 poll 函数来不断的轮询,查看驱动设备文件是否可以使用。这两种方式都需要应用程序主动去查询设备的使用情况。如果能提供一种中断机制,原创 2022-09-24 20:19:43 · 1498 阅读 · 0 评论 -
Linux之阻塞与非阻塞IO
阻塞和非阻塞IO 是 Linux 驱动开发里面很常见的两种设备访问模式, 在编写驱动的时候一定要考虑到阻塞和非阻塞。注意:这里的 IO 指的是 Input/Output(输入/输出):是应用程序对驱动设备的输入/输出操作。原创 2022-09-24 13:30:09 · 2656 阅读 · 0 评论 -
Linux之中断机制
中断是指 CPU 在执行程序的过程中, 出现了某些突发事件急待处理, CPU 必须暂停当前程序的执行,转去处理突发事件, 处理完毕后又返回原程序被中断的位置继续执行。由于中断的存在极大的提高了 CPU的运行效率, 但是设备的中断会打断内核进程中的正常调度和运行, 系统对更高吞吐率的追求势必要求中断服务程序尽量短小精悍。原创 2022-09-23 11:19:38 · 2121 阅读 · 0 评论 -
Linux之设备控制接口(ioctl)
ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。对I/O通道进行管理,就是对设备的一些特性进行控制。虽然在文件操作结构体struct file_operations中有很多对应的设备操作函数,但是有些命令是实在找不到对应的操作函数,拓展一些file_operations给出的接口中没有的自定义功能,则需要使用到ioctl()函数。如CD-ROM的驱动,想要一个弹出光驱的操作,这种操作并不是所有的字符设备都需要的,所以文件操作结构体也不会有对应的函数操作。原创 2022-09-22 18:16:25 · 3494 阅读 · 1 评论 -
Linux之内核定时器
当 jiffies 变量的值超过它的最大存放范围后就会发生溢出, 对于 32 位无符号长整型, 最大取值为 2^32-1,在溢出前, 定时器节拍计数最大为 4294967295, 如果节拍数达到了最大值后还要继续增加的话, 它的值会。jiffies 变量总是无符号长整型(unsigned long), 因此, 在 32 位体系结构上是 32 位, 在时钟频率为 100的情况下, 497 天后会溢出, 如果频率是 1000, 49.7 天后会溢出。相对于事件驱动, 内核中有大量的函数都是基于时间驱动的。原创 2022-09-21 17:53:45 · 2009 阅读 · 0 评论 -
Linux之并发竞争管理
Linux 系统是个多任务操作系统,会存在多个任务同时访问同一片内存区域,这些任务可能会相互覆盖这段内存中的数据,造成内存数据混乱。我们需要对共享数据进行相应的保护处理。产生并发的主要原因有:①多线程并发访问, Linux 是多任务(线程)的系统,多线程访问是最基本的原因②抢占式并发访问,Linux 内核支持抢占,调度程序可以在任意时刻抢占正在运行的线程,从而运行其他的线程。③中断程序并发访问,硬件中断的权利可以是很大的。④SMP(多核)核间并发访问,多核 CPU 存在核间并发访问。原创 2022-09-06 09:34:07 · 753 阅读 · 0 评论 -
Pinctrl 子系统和 GPIO 子系统简介
在学习了设备树之后, 如果还按照裸板开发的方式配置寄存器来控制 IO 的方式太过于原始, Linux 内核提供了 pinctrl 子系统和 gpio 子系统用于 GPIO 驱动。pinctrl 子系统主要工作内容如下:①获取设备树中 pin 信息,管理系统中所有的可以控制的 pin, 在系统初始化的时候, 枚举所有可以控制的 pin, 并标识这些 pin②根据获取到的 pin 信息来设置 pin 的复用功能,原创 2022-09-05 14:15:29 · 2256 阅读 · 0 评论 -
Linux之字符设备驱动框架
Linux驱动属于内核的一部分,学习驱动开发时将驱动设计为内核模块,内核模块是一种可以在系统运行时加载和卸载的机制。内核编程的注意事项1.不能使用C标准库和C标准头文件2.使用GNU C3.没有内存保护机制4.不能处理浮点运算5.注意并发互斥和可移植性问题1.内核模块Linux 驱动有两种运行方式,第一种是将驱动编译进 Linux 内核中,当 Linux 内核启动的时就会自动运行驱动程序。第二种是将驱动编译成模块(Linux 下模块扩展名为.ko),在Linux 内核启动以后。原创 2022-09-02 19:08:10 · 4785 阅读 · 7 评论 -
Linux DTS(Device Tree Source)
一、设备树DTS即Device Tree Source 设备树源码, Device Tree是一种描述硬件的数据结构,它起源于 OpenFirmware (OF)。设备树(Device Tree)是描述计算机的特定硬件设备信息的数据结构,以便于操作系统的内核可以管理和使用这些硬件,包括CPU或CPU,内存,总线和其他一些外设。设备树是通过OpenFirmware (OF)项目从基于SPARC的工作站和服务器派生而来的。当前的Devicetree一般针对嵌入式系统,但仍然与某些服务器级系统一起使用。一原创 2022-03-29 21:45:58 · 8400 阅读 · 1 评论 -
Linux驱动开发基础(二)
一、地址映射1.MMU原理MMU(Memory Manage Unit):内存管理单元。MMU主要功能:①完成虚拟空间到物理空间的映射②内存保护,设置存储器的访问权限,设置虚拟存储空间的缓冲特性虚拟空间到物理空间的映射即地址映射。对于 32 位的处理器来说,虚拟地址(VA,Virtual Address)范围是 2^32=4GB;阿尔法开发板上有512MB 的 DDR3,即物理内存。物理内存512MB经过 MMU 可以将其映射到整个 4GB 的虚拟空间。Linux内核启动原创 2022-03-26 18:23:58 · 1610 阅读 · 3 评论 -
Linux驱动开发基础
一、内核态和用户态内核态与用户态是操作系统的两种运行级别,cpu提供Ring0-Ring3三种级别的运行模式。Ring0级别最高,Ring3最低。CPU是在两种不同的模式下运行的:Kernel Mode(内核态),在内核模式下(执行内核空间的代码),具有ring0保护级别,代码具有对硬件的所有控制权限。可以执行所有CPU指令,可以访问任意地址的内存。内核模式是为操作系统最底层,最可信的函数服务的。在内核模式下的任何异常都是灾难性的,将会导致整台机器停机。User Mode(用户态),在用户模式下原创 2022-03-10 23:11:35 · 20528 阅读 · 2 评论 -
Linux系统搭建
1.uboot移植原厂的uboot,在根目录下建立一个mx6ull_alientek_emmc.sh的shell脚本,用于编译uboot:#!/bin/bashmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distcleanmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_alientek_emmc_defconfigmake V=1 ARCH=arm CROSS_COMPIL.原创 2022-03-06 15:23:04 · 880 阅读 · 0 评论 -
VsCode文件屏蔽
在分析uboot源码时,许多文件都不需要,要将该文件的目录屏蔽并且设置搜索范围在工程目录下,建立.vscode文件夹,在.vscode 文件夹中新建settings.json的文件,然后在 settings.json 中输入如下内容:{ "search.exclude":{ "**/node_modules": true, "**/bower_components": true }, "files.exclude":{原创 2022-02-09 19:20:49 · 3116 阅读 · 0 评论 -
U-Boot指令
目录1.信息查询命令2.环境变量操作命令3.内存操作命令①md 命令②nm命令④mw命令⑤cp命令⑥cmp命令4.网络操作命令①ping②dhcp③nfs④tftp5.EMMC操作命令①mmc info②mmc rescan③mmc list④mmc dev⑤mmc part⑥mmc read⑦mmc write⑧mmc erase擦除 MMC 设备的指定块6.FAT 格式文件系统操作命令①fatinfo...原创 2022-02-09 14:46:56 · 4132 阅读 · 0 评论 -
U-BOOT编译
首先在 Linux 中安装 ncurses 库, 否则编译会报错,安装命令如下:sudo apt-get install libncurses5-dev然后将uboot-imx-2016.03-2.1.0-ge468cdc-v1.5.tar.bz2拷贝在Linux下uboot/alientek_uboot文件夹下。使用如下命令对其进行解压缩:tar -vxjf uboot-imx-2016.03-2.1.0-g8b546e4.tar.bz2对于512MB(DDR3)+8GB(EMMC)原创 2022-02-08 21:42:39 · 1802 阅读 · 1 评论 -
U-Boot移植
一、U-BootLinux 系统要启动就必须需要一个 bootloader 程序,芯片上电以后先运行一段bootloader程序。bootloader程序会先初始化DDR等外设,然后将Linux内核从flash(NAND,NOR FLASH, SD, eMMC 等)拷贝到 DDR 中,最后启动 Linux 内核。所以,bootloader的作用:启动Linux内核。现在有很多现成的 bootloader 软件可以使用,比如 U-Boot、 vivi、 RedBoot ,其中以 U-Boot 使用原创 2022-02-08 18:44:31 · 2123 阅读 · 0 评论 -
阿尔法UART
一、串口基础原理串口全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传输,通信线路简单。使用两条线即可实现双向通信,一条用于发送,一条用于接收。串口通信距离远,但是速度相对会低,串口是一种很常用的工业接口。 I.MX6U 自带的 UART 外设就是串口的一种,UART 全称是 Universal Asynchronous Receiver/Trasmitter,也就是异步串行收发器。USART 的全 称 是 UniversalSynchronous/Asynchronous原创 2022-02-07 16:39:45 · 3383 阅读 · 0 评论 -
RAM,ROM,SRAM,SDRAM,DDR内存
嵌入式开发者必备的各种存储器的知识!原创 2022-02-07 16:20:23 · 5395 阅读 · 1 评论 -
GPT定时器
一、GPT原理GPT(General Purpose Timer) :GPT 定时器是一个32位向上定时器(从 0X00000000 开始向上递增计数), GPT 定时器可以跟一个值进行比较,当计数器值和这个值相等的话就发生比较事件,产生比较中断。GPT 定时器有一个 12 位的分频器,可以对 GPT 定时器的时钟源进行分频,GPT定时器结构(1)GPT 定时器的时钟源,可以选择ipg_clk_24M、 GPT_CLK(外部时钟)、ipg_clk、ipg_clk_32k 和 ipg_cl.原创 2022-02-06 19:50:44 · 2359 阅读 · 0 评论 -
EPIT定时器
一、EPIT原理EPIT(Enhanced Periodic Interrupt Timer): 增强的周期中断定时器,它主要是完成周期性中断定时的,EPIT 是一个 32 位定时器,在处理器几乎不用介入的情况下提供精准的定时中断,软件使能以后 EPIT 就会开始运行。时钟源可选的 32 位向下计数器,12 位的分频值,当计数值和比较值相等的时候产生中断EPIT定时器结构:(1)多路选择器,用来选择 EPIT 定时器的时钟源, EPIT 共有 3 个时钟源可选择,ipg_clk、 ipg_clk原创 2022-02-06 18:33:51 · 1226 阅读 · 0 评论 -
从零实现Cortex-A7中断系统
Cortex-A7中断系统的实现,从零手把手教你实现中断。原创 2022-02-05 23:15:40 · 959 阅读 · 0 评论 -
Cortex-A7中断系统
Cortex -A7中断系统的介绍,与STM32的中断系统有什么区别和相同原创 2022-02-05 18:49:26 · 2308 阅读 · 0 评论 -
阿尔法系统时钟和外设时钟
深入了解阿尔法开发板系统时钟树,以及外设时钟的各种配置。原创 2022-02-04 16:13:49 · 2293 阅读 · 2 评论 -
阿尔法蜂鸣器实验
1.实验原理常用的蜂鸣器有两种:有源蜂鸣器和无源蜂鸣器,这里的有“源”不是电源,而是震荡源,有源蜂鸣器内部带有震荡源,所以有源蜂鸣器只要通电就会叫。无源蜂鸣器内部不带震荡源,直接用直流电是驱动不起来的,需要 2K-5K 的方波去驱动阿尔法开发板上的蜂鸣器属于有源蜂鸣器,所以只要连接一个供电电路即可。供电电路可以由一个 IO来控制其通断,一般使用三极管来搭建这个电路。因为蜂鸣器工作的电流比较大,直接将蜂鸣器接到 I.MX6U 的 GPIO 上有可能会烧毁 IO,所以需要通过一个三极管来间接的控制蜂鸣器原创 2022-02-03 20:28:42 · 3236 阅读 · 0 评论 -
Linux开发下常用命令
文章目录前言????终端指令1.FTP传输指令2.查看主机IP3.软件安装与卸载4.压缩与解压缩5.可执行权限设置6.查看磁盘7.复制程序下载总结前言经过几天在Linux下开发,记录一下我经常用到的但是又记不住的常用命令,包含Makefile的语法提示:以下是本篇文章正文内容????终端指令1.FTP传输指令开启Linux下FTP服务sudo /etc/init.d/vsftpd restart2.查看主机IPifconfig -a3.软件安装与卸载apt(Adva原创 2021-11-28 22:43:22 · 811 阅读 · 0 评论 -
阿尔法点亮LED灯(五)BSP工程管理
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、工程优化二、路径添加三、Makefile编写四、链接脚本和下载总结前言这里主要是对前面的工程进行优化,将各个不同的文件进行分类,学习如何整理工程、就和学习STM32一样创建工程的各个文件夹分类,实现工程文件 的分类化和模块化,便于管理深入学习Makefile,学习Makefile的高级技巧,学习编写通用Makefile提示:以下是本篇文章正文内容,下面案例可供参考一、工程优化将不同功能的源码文件放到不同原创 2021-11-28 18:14:15 · 602 阅读 · 0 评论 -
阿尔法点亮LED灯(四) SDK包
文章目录前言一、SDK包简介二、SDK文件使用1.文件移植2.宏定义数据类型3.编写主程序总结前言提示:以下是本篇文章正文内容一、SDK包简介上一节中,外设要用的寄存器都是我们自己定义,其实,在SDK包里已经编写好了外设寄存器的定义,我们可以直接移植用。NXP 针对 I.MX6ULL 编写了一个 SDK 包,SDK 包就类似于 STM32 的 STD 库或者HAL 库,SDK 包提供了 Windows 和 Linux 两种版本,分别针对主机系统是 Windows 和Linux我们只需要.原创 2021-11-27 23:27:11 · 594 阅读 · 0 评论 -
阿尔法点亮LED灯(三) STM32模式
文章目录前言一、原理分析二、MX6U寄存器定义1.外设结构体2.结构体基地址3.结构体访问指针三、编译下载总结前言提示:以下是本篇文章正文内容一、原理分析前面用C语言编写 LED 灯驱动的时候,每个寄存器的地址都需要写宏定义,这样做实在是太麻烦了,在STM32中,比如访问GPIOB 的寄存器 ODR :GPIOB->ODR我们也可以参照32的形式将某个外设的所有寄存器写入到一个结构体里面,定义一个结构体指针指向外设的寄存器基地址,这样就可以通过这个结构体指针来访问这个外设的所有..原创 2021-11-27 22:31:33 · 684 阅读 · 0 评论 -
阿尔法点亮LD灯(二) C语言
文章目录前言一、C语言环境搭建1.设置处理器模式2.设置SP指针3.跳转main二、C语言编写1.寄存器设置2.主程序编写三、编译下载1.编写Makefile2.链接脚本3.程序下载总结前言提示:以下是本篇文章正文内容一、C语言环境搭建阿尔法开发板没有像STM32那样有着已经写好的底层(C语言环境搭建,寄存器初始化…), 我们一般在开始部分用汇编来初始化一下 C 语言环境,比如初始化 DDR、设置堆栈指针 SP ,然后就可以进入C语言运行环境,进入main()函数,执行工作。1.设置..原创 2021-11-25 22:55:16 · 1103 阅读 · 0 评论 -
ARM汇编基础
文章目录前言一、GNU 汇编语法二、内核寄存器组1.通用寄存器2.程序状态寄存器三、ARM指令1.数据传输指令2.访问指令总结前言这里只是简单介绍一下arm汇编的指令,等有时间在深入了解,后面的开发必须要用的提示:以下是本篇文章正文内容一、GNU 汇编语法ARM汇编指令,编译是使用GCC交叉编译器,所以ARM汇编指令要符合GUN汇编语法语法格式:label: instruction @ comment(1)label :标号,表示地址位置,可以通过标号得到这条指令的地..原创 2021-11-20 22:58:56 · 949 阅读 · 0 评论 -
阿尔法(MX6U)启动方式
文章目录前言一、启动方式1.串行下载2.内部 BOOT 模式(1)BOOT ROM 初始化内容(2)启动设备选择二、镜像烧写总结前言I.MX6U 支持多种启动方式以及启动设备,可以从 SD/EMMC、 NAND Flash、 QSPI Flash等启动,不同的启动方式其启动方式和启动要求也不一样,从 SD 卡启动就需要在 bin 文件前面添加一个数据头,其它的启动设备也是需要这个数据头一、启动方式BOOT 的处理过程是发生在 I.MX6U 芯片上电后,芯片会根据BOOT_MODE[1:..原创 2021-11-19 23:30:31 · 4647 阅读 · 0 评论 -
阿尔法点亮LED灯(一)汇编语言
文章目录前言一、GPIO介绍1.MX6U IO 复用2.MX6U IO 配置3.GPIO 配置4.GPIO 时钟使能5.==GPIO的使用步骤==二、程序编写1.使能 GPIO1 时钟2.设置 GPIO1_IO03 的复用功能3.配置 GPIO1_IO03属性4.设置GPIO1_IO03为输出5.控制 GPIO 的输出电平三、编写Makefile1.arm-linux-gnueabihf-gcc 编译文件2.arm-linux-gnueabihf-ld链接文件3.arm-linux-gnueabihf-..原创 2021-11-19 21:17:47 · 2042 阅读 · 0 评论 -
初入Linux总结
文章目录前言一、不用顺便往磁盘里些数据二、原VI不可以删除三、FTP连接出错总结前言记录一下用阿尔法点灯过程中犯的错误提示:以下是本篇文章正文内容一、不用顺便往磁盘里些数据由于阿尔法是将文件下载的SD卡,使用外部存储启动。但是由于自己的虚拟机是好久以前的匹置的,好像硬件USB那里没有配置,读卡器插在电脑上一直是Win使用,我就把虚拟机的磁盘下载了点灯的程序,然后虚拟机就启动失败。然后在网上百度了N种方式,最后还是没有还原,只能重新再搭建一个新的虚拟机若是原来的虚拟机一些硬件没有配置可以在虚原创 2021-11-18 23:13:53 · 881 阅读 · 0 评论