
重学嵌入式
文章平均质量分 84
汇编 arm 数字电路 linux
江太翁
这个作者很懒,什么都没留下…
展开
-
译文 Neon
Neon是Arm高级SIMD架构的实现。32个128位向量寄存器:每个寄存器可容纳多个数据通道(Lane)SIMD指令:支持对多个数据通道同时执行并行操作多媒体与信号处理3D图形渲染语音与图像处理其他对定点和浮点性能要求严苛的领域。翻译 2025-03-14 15:27:08 · 21 阅读 · 0 评论 -
i.MX6ULL(二十) linux platform 设备驱动
子系统负责管理所有 跟输入有关的驱动,包括键盘、鼠标、触摸等,最底层的就是设备原始驱动,负责获取输入设 备的原始值,获取到的输入事件上报给 input。我们在编写输入设备驱动的时候只需要处理好输入事件的上报即 可,至于如何处理这些上报的输入事件那是上层去考虑的,我们不用管。下的驱动往往也是分层的,分层的目 的也是为了在不同的层处理不同的内容。半导体厂家编写好了,而设备驱动一般也由设备器件的厂家编写好了,我们只需要提供设备信 息即可,内核提供的,我们在编写驱动的时候只要关注于设备和驱动的具体实现即可。原创 2023-07-27 18:34:08 · 436 阅读 · 0 评论 -
i.MX6ULL(十九) linux gpio子系统
pinctrl子系统重点是设置PIN(有的SOC叫做PAD)的复用 和电气属性,如果 pinctrl子系统将一个PIN复用为GPIO的话,那么接下来就要用到gpio子系 统了。gpio子系统顾名思义,就是用于初始化GPIO并且提供相应的API函数,比如设置GPIO为输入输出,读取GPIO的值等。gpio子系统的主要目的就是方便驱动开发者使用gpio,驱动开发者在设备树中添加gpio相关信息,然后就可以在驱动程序中使用gpio子系统提供的。原创 2023-07-26 23:31:27 · 525 阅读 · 0 评论 -
i.MX6ULL(十八) linux pinctrl 子系统
Linux驱动讲究驱动分离与分层,pinctrl和gpio子系统就是驱动分离与分层思想下的产物,驱动分离与分层其实就是按照面向对象编程的设计思想而设计的设备驱动框架,关于驱动的分离与分层我们后面会讲。本来pinctrl和gpio子系统应该放到驱动分离与分层章节后面讲解,但是不管什么外设驱动,GPIO驱动基本都是必须的,而pinctrl和gpio子系统又是GPIO驱动必须使用的,所以就将pintrcl和gpio子系统这一章节提前了。原创 2023-07-21 07:45:00 · 249 阅读 · 0 评论 -
i.MX6ULL(十七) linux LED驱动
对于MX6ULL 点灯方式较多,直接通过寄存器操作更适合低成本设备,与裸机实验不同的是,在 Linux 下编写驱动要符合 Linux 的驱动框架。但Linux 下的任何外设驱动,最终都是要配置相应的硬件寄存器,这是本质。实际开发中即使驱动层我们也不需要自定义设备树 led节点 ,芯片厂商BSP 内核设备树会按照pinctrl 及gpio系统框架规则实现所有gpio节点,对gpio操作也将遵循linux下访问gpio通用方式操作而得以简化。本章实验在四十二章实验的基础上完成,重点是将驱动改为基于设备树的。原创 2023-07-20 23:16:15 · 359 阅读 · 0 评论 -
i.MX6ULL(十六) linux 设备驱动
Linux设备驱动是指驱动Linux内核与硬件设备进行通信的软件模块。设备驱动通常分为两类:字符设备驱动和块设备驱动。设备初始化:在系统启动时,设备驱动需要初始化相应的硬件设备,设置设备的寄存器和接口等参数,以确保设备能够正常工作。设备控制:设备驱动需要提供一些接口,用于控制设备的各种操作,如打开设备、读取数据、写入数据、关闭设备等。中断处理:设备驱动需要处理硬件设备的中断请求,在中断发生时执行相应的中断处理程序,以便及时响应设备的各种事件和请求。原创 2023-07-16 13:29:22 · 487 阅读 · 0 评论 -
i.MX6ULL(十五) 根文件系统
Linux“三巨头”已经完成了2个了,就剩最后一个rootfs(根文件系统了,本章我们就来学习一下根文件系统的组成以及如何构建根文件系统。这是Linux移植的最后一步,根文件系统构建好以后就意味着我们已经拥有了一个完整的、可以运行的最小系统。以后我们就在这个最小系统上编写、测试Linux驱动,移植一些第三方组件,逐步的完善这个最小系统。最终得到一个功能完善、驱动齐全、相对完善的操作系统uboot kernel 部分特别是内核启动流程比较复杂,设计模块较多 待后续进一步了解。原创 2023-07-15 01:22:17 · 794 阅读 · 0 评论 -
i.MX6ULL(十四) 系统移植之 命令行
这是很多文档没有说明清楚的地方 uboot编译后 加载设备树的路径已经指明 规则因厂商版本可能不同, 在使用 MfgTool烧写自定义zIMage 时 需要匹配好dtb文件名。mx6ull-14x14-emmc-4.3-800x480-c.dtb 到tftp目录。编译好以后就可以烧写到板子上使用了,这里我们跟前面裸机例程一样,将。命令将其拷贝到这个指定的文件夹中即可,这样就不用需要频繁的烧写。内核启动以后是需要根文件系统的,根文件系统存在哪里是由。,设置好串口参数并打开,最后复位开发板。原创 2023-07-12 07:45:00 · 656 阅读 · 0 评论 -
i.MX6ULL(十三) linux 设备树
Linux 内核在启动的时候会解析 DTB 文件,然后在/proc/device-tree 目录下生成相应的设备树节点文件。接下来我们简单分析一下 Linux 内核是如何解析 DTB 文件的原创 2023-07-10 17:07:44 · 1348 阅读 · 0 评论 -
I.MX6ull(十一) 触摸屏
ALIENTEK 的三款 RGB LCD 屏幕都支持多点电容触摸,本章就以ATK7016这款RGB LCD屏幕为例讲解一下如 何驱动电容触摸屏,并获取对应的触摸坐标值。993年,电阻式的触摸屏被用到了苹果掌上电脑Apple Newton;后来乔布斯又用iPad重新定义了平板电脑的概念和接下来iPhone手机的面世,让以触摸技术结合各种应用软件的智能产品开始逐渐商用化 在此过程中 电容触摸屏也应运而出,电容式触摸屏 普及时间是2007年以后,各种智能手机和平板电脑都使用了触控面板,家喻户晓。原创 2023-07-10 14:49:20 · 719 阅读 · 0 评论 -
i.MX6ULL(十) LCD 驱动
LCD(Liquid Crystal Display),液晶显示器。LCD的构造是在两片平行的玻璃基板中放置液晶盒,下基板玻璃上设置TFT(薄膜晶体管),上基板玻璃上设置彩色滤光片,通过TFT上的信号与电压改变来控制液晶分子的转动方向,从而达到控制每个像素点偏振光出射与否而达到显示目的。原创 2023-07-04 23:49:30 · 2510 阅读 · 0 评论 -
TTL COM 电平
电平就是指电路中两点或几点在相同阻抗下电量的相对比值。这里的电量自然指“电压”、“电流”、“电功率”并将倍数化为对数,用“分贝”表示,记作“dB”。分别记作:10lg(P2/P1)、20lg(U2/U1)、20lg(I2/I1)上式中P、U、I分别是电功率、电压、电流。常用的电平有功率电平和电压电平两类,它们各自又可分为绝对电平和相对电平两种。而TTL电平就是指适合于ttl电路工作的电平。TTL的电源工作电压是5V,那么5V就可为高电平,0V为低电平。转载 2023-06-11 15:50:17 · 431 阅读 · 0 评论 -
i.MX6ULL(九) UART
UART 通信格式 串口全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传输,通信线路简单。使用两条线即可实现双向通信,一条用于发送,一条用于接收。串口通信距离远,但是速度相对会低,串口是一种很常用的工业接口。I.MX6U 自带的 UART 外设就是 串口的一种,UART 全称是 Universal Asynchronous Receiver/Trasmitter,也就是异步串行收发器。原创 2023-06-11 15:33:10 · 1526 阅读 · 0 评论 -
i.MX6ULL(八) GPT高精度定时器
GPT的全称是General Purpose Timer,它是一个32位的向上的定时器, GPT 定时器也可以跟一个值进行比较,当计数器值和这个值相等的话就发生比较事件,产生比较中断。GPT 定时器有一个 12 位的分频器,可以对 GPT 定时器的时钟源进行分频。分析方式同EPTI它具有以下特点:1.一个可选时钟源的32位向上计数器。2.两个输入捕获通道,可以设置触发方式。3.三个输出比较通道,可以设置输出模式。4.可以生成捕获中断、比较中断和溢出中断。原创 2023-06-11 11:54:05 · 1038 阅读 · 1 评论 -
i.MX6ULL(六) EPIT定时器
EPIT定时器是一种增强的周期中断定时器,完成周期性中断定时的功能。具有以下特点EPIT定时器是一个32位的定时器时钟源可选的向下计数器 EPIT 共有 3 个时钟源可选择,ipg_clk、ipg_clk_32k 和 ipg_clk_highfreq当计数值和比较值相等的时候产生中断12 位分频器 对应的值是 0~4095,对应1~4096 分频EPIT定时器在处理器几乎不用介入的情况下提供精准的定时中断,时序分辨率高达125fs。它可以应用于高速数据采集、超声波测距、雷达等领域。原创 2023-06-04 09:55:16 · 747 阅读 · 0 评论 -
i.MX6ULL(七) 按键抖动消除
,所以虽然 t1 开启了定时器,但是定 时器定时时间还没到呢 t2 时刻就重置了定时器,最终只有 t3 时刻开启的定时器能完整的完成 整个定时周期并触发中断,我们就可以在中断处理函数里面做按键处理了,这就是定时器实现 按键防抖的原理,Linux 里面的按键驱动用的就是这个原理!整合按键中断及EPTI定时器中断,按键中断服务函数内开启EPTI定时器中断 ,下一步,将按键中断中的延迟函数 通过EPTI定时器触发 在服务函数中检查电平输出值 ,按键按下 触发蜂鸣器 ,关闭EPTI定时器中断 按键中断标志位。原创 2023-06-04 11:20:42 · 549 阅读 · 0 评论 -
i.MX6ULL(五) 中断(按键驱动蜂鸣器)
中断向量表2 定义对应的中断函数2.1 复位函数 CP15协处理器 Cotex-A7 参考手册 107页面 关闭I,DCache和MMU SCTLR寄存器 系统控制寄存器中断向量偏移设置 将新的中断向量表首地址写入到CP15 的VBAR 寄存器 mcr p15, 0, r0, c12, c0, 0注意 读改写顺序 分支预测(Branch Prediction): 解决处理分支指令导致流水线失败的数据处理方法 。从P5时代开始的一种先进的,解决处理分支指令(if-then-else原创 2023-06-03 09:00:00 · 717 阅读 · 0 评论 -
i.MX6ULL(三) CP15协处理器
CP15协处理器包含16个32位的寄存器,其编号为0~15,其中CP15寄存器0是预留的,所以CP15实际有15个寄存器。这两个指令,MRC指令将ARM处理器的寄存器中的数据传送到协处理器寄存器中,而MCR指令将协处理器寄存器中的数据传送到ARM处理器的寄存器中。CRm: 协处理器中附加的目标寄存器或者源操作数寄存器,如果不需要附加信息就将。Rt: ARM 源寄存器,要写入到 CP15 寄存器的数据就保存在此寄存器中。CRn: CP15 协处理器的目标寄存器。原创 2023-06-02 07:00:00 · 661 阅读 · 0 评论 -
i.MX6ULL(四) linux中断
Linux中断(Interrupt)是指在计算机执行过程中,由于某些事件发生(例如硬件请求、错误、异常等),CPU暂停当前正在执行的程序,转而执行相应的处理程序的过程。中断是计算机多任务环境下的一种重要机制,它可以保证不同任务之间的公平访问 CPU 时间,以及及时响应外部事件。 中断提供了一种及时响应硬件故障和外部事件的方式,从而确保系统能够及时处理这些事件并保持正常运行。在Linux系统中,中断被广泛应用,从底层的驱动程序到高层的分布式系统,中断都扮演着重要的角色。在Linux系统中,中断的调度方式原创 2023-06-02 00:43:27 · 942 阅读 · 0 评论 -
PMOS管和NMOS管
是漏极,肯定不是栅极,因为栅极是控制极,是发号施令的一个极,因此表演的应该是源极与漏极才对。MOS管的实物管脚位置好像与电学符号的位置并不是一一对应的,原本最不起眼的演员漏极D,居然还占据了电学符号中导演的位置,而导演G却占据了最优秀演员S的位置,S则只能屈居于D的位置。6.对于PMOS管来说,电流是从源极(输入端)到漏极(输出端),从上到下,各节点电平应该是依次变小的,因此栅极G的电压必须小于源极电压;PMOS管就是positive管,是积极的管,而NMOS管是negative管,是消极的管。转载 2023-04-26 22:19:05 · 2847 阅读 · 0 评论 -
i.MX6ULL(二) Led点灯 c 版本
(无论是汇编还是C语言)都要经过编译、汇编、链接等步骤生成目标文件。无非是中间过程实现语言不同 编译过程不同链接脚本的作用就是告诉编译器怎么链接这些文件,比如那个文件放在最前面,程序的代码段、数据段、bss段分别放在什么位置等等。汇编语言可通过汇编直接访问寄存器或外设,并能保持上下文, C语言最终需要转换成汇编指令 但C语言调用过程中参数及上下文保存 一般需要借助汇指定栈管理上下文。原创 2023-04-25 22:17:53 · 673 阅读 · 0 评论 -
为何C语言的函数调用要用到堆栈,而汇编却不需要自定义栈
因为在前面的保存现场的动作中,已经保存好了对应的寄存器的值,那么此时,这些寄存器就是空闲的,可以供我们使用的了,那就可以放参数,而参数少的情况下,就足够存放参数了,比如参数有2个,那么就用r0和r1存放即可。感兴趣的自己去研究。进行跳转的话,那么之前的pc的值是存在lr中的),然后在子程序执行完毕的时候,再把堆栈中的lr的值pop出来,赋值给pc,这样就实现了子函数的正确的返回。保存寄存器的值,一般用的是push指令,将对应的某些寄存器的值,一个个放到堆栈中,把对应的值压入到堆栈里面,即所谓的。原创 2023-04-24 23:44:16 · 1139 阅读 · 0 评论 -
i.MX6ULL(一) HelloWorld Led点灯
SNVS 域的和通用的,IMX6ULL 的其它 IO 也是可以复用为 GPIO 功能1 IMX有124个IO。IO并非GPIO , GPIO只是IO的功能。IMX有5组GPIO。GPIO1组有32个IO,GPIO2有22个,GPIO3有29个,GPIO429个GPIO5有12个。2.跟STM32一样,IMX也需要开启GPIO时钟, 寄存器CCM_CCGR0~CCM_CCGR6控制着所有外设的时钟,不只有GPIO的时钟。原创 2023-04-22 21:34:42 · 1122 阅读 · 1 评论 -
ubuntu 开发板 NFS 环境搭建
NFS(Network File System) 即网络文件系统是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。开启了NFS服务后,客户端访问服务器共享的文件时如同访问本地存储器(磁盘/SD卡/NAND FLASH等)上的文件一样,对于上层应用来说没有任何差别。前提 : 开发板与电脑接入到同一个局域网中。原创 2023-04-18 10:30:00 · 520 阅读 · 0 评论 -
IMX6ULL TPLINK连接 wifi
默认系统已经安装了TPLINK驱动 并已集成进内核 否则需要 下载驱动 重新编译内核烧录。查看开发板对应的端口 COM3。连接成功 再次查看ip地址。原创 2023-04-17 22:20:32 · 278 阅读 · 0 评论 -
GCC 常用命令
GCC编译过程一个 C/C++文件要经过预处理(preprocessing)、编译(compilation)、汇编(assembly)和链接(linking)等 4 步才能变成可执行文件(1) 预处理C/C++源文件中,以“#”开头的命令被称为预处理命令,如包含命令“#include”、宏定义命令“#define”、条件编译命令“#if”、“#ifdef”等。预处理就是将要包含(include)的文件插入原文件中、将宏定义展开、原创 2023-04-17 16:11:30 · 7012 阅读 · 0 评论 -
Makefile
Makefile 设计思想!递归处理 依赖更新 规则。原创 2022-11-27 23:58:14 · 226 阅读 · 0 评论 -
Linux 常见问题
linux 常见问题归纳原创 2022-11-26 14:36:52 · 598 阅读 · 0 评论 -
imx6ull pro BSP 工具链
BSP,,指板级支持包,是构建嵌入式操作系统所需的引导程序(Bootload)、内核(Kernel)、根文件系统(Rootfs)和工具链。每种开发板的BSP都不一样,并且这些源码都非常庞大。我们把这些源码都放在git仓库里,使用repo来管理、下载。作为初学者,你甚至都还没有安装Ubuntu、还不会使用Ubuntu,所以先别去下载它们。原创 2022-11-26 13:38:28 · 1672 阅读 · 2 评论 -
norflash/nandflash 启动分析 转
S3C2440和S5PV210是很多嵌入式爱好者入门的arm处理器,网上的资料也很多。今天我们就来聊聊S3C2440和S5PV210的启动流程,上一篇博客我介绍了uboot在norflah上的启动流程(重要!这是基础)。今天,我们来聊聊uboot在nandflash上的启动流程。一. nandflash 与 norflash 同样,你现在肯定心里有疑问 何为norflash?何为nandflash? 他们之间有什么异同? norflash我上篇博客已经介绍了(再重复...转载 2022-03-18 14:03:14 · 1059 阅读 · 1 评论 -
Linux 管道通信
一 管道的概念:管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。有如下特质:1. 其本质是一个伪文件(实为内核缓冲区)2. 由两个文件描述符引用,一个表示读端,一个表示写端。3. 规定数据从管道的写端流入管道,从读端流出。管道的原理: 管道实为内核使用环形队列机制,借助内核缓冲区(4k)实现。管道 分为标准流管道,无名管道(PIPE),命名管道(FIFO)管道的局限性:① 数据自己读不能自己写。② 数据...原创 2022-03-17 16:41:37 · 2856 阅读 · 1 评论