- 博客(157)
- 资源 (3)
- 收藏
- 关注
原创 platform驱动的probe过程
probe()函数是什么时候被调用,设备和驱动是怎么联系起来的??1 总线注册阶段:内核启动初始化时,main.c文件中platform平台初始化的路径: kernel_init() -->do_basic_setup() -->driver_init() -->platform_bus_init(...
2022-03-22 16:00:06
2254
原创 DDR调试
Bank地址与相应的行地址是同时发出的,此时这个命令称之为“行激活”(Row Active)。在此之后,将发送列地址寻址命令与具体的操作命令(是读还是写),这两个命令也是同时发出的,所以一般都会以“读/写命令”来表示列寻址。根据相关的标准,从行有效到读/写命令发出之间的间隔被定义为tRCD,即RAS to CAS Delay(RAS至CAS延迟,RAS就是行地址选通脉冲,CAS就是列地址选通脉冲),我们可以理解为行选通周期。tRCD是DDR的一个重要时序参数,广义的tRCD以时钟周期(tCK,Cloc
2022-03-22 15:56:46
1464
原创 NAND FLASH ECC校验原理与实现
由于NAND Flash的工艺不能保证NAND的Memory Array在其生命周期中保持性能的可靠,因此,在NAND的生产中及使用过程中会产生坏块。为了检测数据的可靠性,在应用NAND Flash的系统中一般都会采用一定的坏区管理策略,而管理坏区的前提是能比较可靠的进行坏区检测。 如果操作时序和电路稳定性不存在问题的话,NAND Flash出错的时候一般不会造成整个Block或是Page不能读取或是全部出错,而是整个Page(例如512Bytes)中只有一个或几个bit出错。 对数据的校...
2022-03-22 11:53:51
9343
原创 ARM 工作模式
为提高系统的稳定性,处理器会被分成多种工作模式,不同工作模式的权限不同。Cortex-M3 或 者 M4 内核的的芯片分为特权模式和非特权模式,特权模式下 CPU 完全控制芯片而非特权模式下不能操作某些特殊的寄存器。i.MX6U/ imx8 作为一款应用处理器,将 CPU 工作模式进一步细分,支 持九种工作模式下表所示。结合上表处理器的各种工作模式讲解如下:i.MX 6U 特权等级从低到高被分为 3 个等级(PL0~PL2)• User 用户模式,用户模式是相对于 Linux 系统来说的,有
2022-02-23 17:51:13
1640
原创 三极管开关作用
三极管当做开关来使用时,是利用了其要么工作在饱和区(导通),要么工作在截止区(不导通),总之就是不能工作在放大区。这个比较容易理解,如果工作在放大区,那么Vce的电压就很难确定了,这会导致当你想要高低电平的时候,结果得到一个中间态。所以,最重要的就是要保证管子的工作状态是ok的,也就是说我们要选好电路中的电阻阻值。如何选择电阻我们的电路输入一般是只有两种状态,0V或者是其它的高电平(1.8V,3.3V,5V等),截止状态一般不用怎么考虑,因为如果让三极管的Vbe=0,自然就截止了,重要的是.
2022-02-16 17:47:32
10075
1
原创 巧用GPIO口控制多个LED
3个IO口控制6个LED灯这个电路用到了单片机GPIO的三种状态: 高电平 低电平 高阻态 所谓“高阻态”,是指GPIO对外部电路表现出极大的阻抗。因阻抗很大,几乎不会吸入电流,也不会对外输出电流。各个LED灯单独亮起,分为六种情况。1、当只有LED1亮起时,单片机各GPIO的状态如下:(带箭头的红线为电流回路)2、当只有LED2亮起时,单片机各GPIO的状态如下:3、当只有LED3亮起时,单片机各GPIO的状态如下:4、当只有.
2022-02-10 11:51:47
14475
14
原创 晶振应用中常见问题及解决方法
在电子行业有这样一个形象的比喻:如果把MCU比作电路的“大脑”,那么晶振毫无疑问就是“心脏”了。同样,电路对“晶体晶振”(以下均简称:“晶振”)的要求也如一个人对心脏的要求一样,最需要的就是稳定可靠。晶振在电路中的作用就是为系统提供基本的频率信号,如果晶振不工作,MCU就会停止导致整个电路都不能工作。晶振不起振问题归纳1、 物料参数选型错误导致晶振不起振例如:某MCU需要匹配6PF的32.768KHz,结果选用12.5PF的,导致不起振。解决办法:更换符合要求的规格型号。必要时请与MCU原厂
2022-02-09 14:36:59
1805
原创 电容器3种用途
电容器大致用于以下三种用途。储能用途利用了电池功能。电源瞬断或IC驱动速度急速上升引起负载电流变大时,电源的线电压下降,可能会导致IC故障。为防止发生故障,向IC侧提供电容器在电源线正常时储蓄的电荷,暂时维持电源线电压。去耦用途利用了交流电流通特性。为提供稳定的直流电压,去除重叠于电源线的外部感应性噪声及高速电路驱动引发的高频噪声。用于一般的电源电路。耦合用途去除前段电路的直流偏置电压,只向后段电路传递交流信号电压。一般用于音频电路。...
2022-02-09 14:05:59
3753
原创 常用电路标记表示什么意思
一、名词解析(1)VCC:C=circuit 表示电路的意思, 即接入电路的电压(2)VDD:D=device 表示器件的意思, 即器件内部的工作电压;(3)VSS:S=series 表示公共连接的意思,通常指电路公共接地端电压(4)VEE:负电压供电;场效应管的源极(S)(5)VBAT:当使用电池或其他电源连接到VBAT脚上时,当VDD 断电时,可以保存备份寄存器的内容和维持RTC的功能。如果应用中没有使用外部电池,VBAT引脚应接到VDD引脚上。(6)VPP:编程/擦除电压。
2022-02-09 11:47:00
2246
原创 电路参考设计
简单的过压保护电路一般加个TVS可以实现,当外部有瞬间高能量冲击时候它能够把这股能量抑制下来,虽然功率高,上千W都可以,但是维持抑制的时间很短很短,万一器件损坏或者长时间工作电压高于正常工作电压的时候,就力不从心了。所以最好的办法是设计一个智能电路了,如下所示:Vin正常输入电压时,稳压管没有反向击穿,R3,R4电流基本为0。PNP三极管的Vbe=0,即PNP三极管不导通。PMOS管Q4的Vgs由电阻R5,R6分压决定,PMOS管导通,即电源正常工作。当Vin输入大于正常输入电压,此时Vi.
2022-02-09 11:09:30
863
原创 i2c协议详解
i2c的数据字节定义为8-bits长度,对每次传送的总字节数量没有限制,但对每一次传输必须伴有一个应答(ACK)信号, 其时钟由主设备提供,而真正的应答信号由从设备发出,在时钟为高时,通过拉低并保持SDA的值来实现。然后主设备开始传送寄存器地址(RA),接到应答后,开始传送寄存器数据, 然后仍然要有应答信号,连续写入多字节时依次类推。传输时,SCL为高电平的时候SDA表示的数据有效,即此时的SDA为高电平时表示数据“1”,为低电平时表示数据“0”。写数据方向时,SDA由主机控制,从机接收信号。
2022-01-12 17:13:20
35746
原创 BT656与BT1120的区别
BT1120与BT656的区别BT656主要是针对PAL/NTSC等标清视频。时钟频率是27MHz。注意采样频率灰度为12.5MHz,色度为6.25MHz。随着高清视频的发展的须要,又推出了BT1120标准,它与BT656是相似的,只不过期钟频率更高了,以适合高清视频的传输。601是SDTV的数据结构 656是SDTV的interface709是HDTV的数据结构 1120是HDTV的interface从数据结构上 都是Y Cb Crinterface上 其实是一样的 vclk + vid[9
2022-01-11 11:30:33
9325
原创 linux内核的初始化过程
标准 linux 内核初始化过程如下: 内核引导第一阶段:汇编语言 内核启动的第二阶段:C 语言 linux/arch/arm/kernel/head.S 文件定义了 bootloader 和 kernel 的参数传递要求: MMU = off, D-cache = off, I-cache = dont care, r0 = 0, r1 = machine nr, r2 = atags or dtb pointer. 目前的 kernel 支持旧
2021-12-28 09:24:51
384
原创 linux系统日志设置
为何我更喜欢 SystemV我更喜欢 SystemV,因为它更开放。使用 Bash 脚本来完成启动。内核启动init程序(这是一个编译后的二进制)后,init启动rc.sysinit脚本,该脚本执行许多系统初始化任务。rc.sysinit执行完后,init启动脚本,该脚本依次启动中由 SystemV 启动脚本定义的各种服务。其中X是待启动的运行级别号。除了init程序本身之外,所有这些程序都是开放且易于理解的脚本。...
2021-11-19 11:07:16
5658
原创 imx8独立编译
1.编译 uboot获取 uboot 源码 git clone https://source.codeaurora.org/external/imx/uboot-imx cd uboot-imx 2.选择编译版本git tag |grep rel_imx_4.14.git checkout rel_imx_4.14.98_2.0.0_gagit status3. 设置编译环境source /opt/fsl-imx-xwayland/5.4-zeus/.
2021-11-05 17:00:10
2259
原创 创建 yocto 编译环境
Ubuntu 18.04 编译主机需要事先执行以下命令安装编译所需包: sudo apt-get update sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath socat libsdl1.2-dev sudo apt-get install libsdl1.2-dev xterm sed cvs subversion coreutils te
2021-10-29 14:04:43
1061
原创 semaphore和mutex的区别
semaphore函数在内核文件include\linux\semaphore.h中声明,如下表:mutex函数在内核文件include\linux\mutex.h中声明,如下表:semaphore和mutex的区别semaphore中可以指定count为任意值,比如有10个厕所,所以10个人都可以使用厕所。而mutex的值只能设置为1或0,只有一个厕所。是不是把semaphore的值设置为1后,它就跟mutex一样了呢?不是的。看一下mutex的结构体定义,如下:它里面.
2021-09-27 22:52:10
863
原创 位置无关代码
ARM处理器支持位置无关的程序设计,这种程序加载到存储器的任意地址空间都可以正常运行,其设计方法在嵌入式应用系统开发中具有重要的作用。尤其在裸机状态下开发Bootloader程序及进行内核初始化设计;利用位置无关的程序设计方法还可以在具体应用中用于构建高效率动态链接库。应用程序必须经过编译、汇编和链接后才变成可执行文件,在链接时,要对所有目标文件进行重定位(relocation),建立符号引用规则,同时为变量、函数等分配运行地址。当程序执行时,系统必须把代码加载到链接时所指定的地址空间,以保证程序在执行
2021-08-19 15:05:00
1489
原创 设备树详解二
通过外部芯片片选激活模块。例如,挂载在外部总线上,需要通过片选线工作的一些模块: external-bus{ #address-cells = <2> #size-cells = <1>; ethernet@0,0 { compatible = "smc,smc91c111"; reg = <0 0 0x1000>; .
2021-08-18 14:13:10
1008
原创 异步通知 mq_notify函数
System V消息队列的问题之一是无法通知一个进程何时在某个队列中放置了一个消息。采用轮询(poling),是对CPU时间的一种浪费。Posix消息队列容许 异步事件通知,以告知何时有一个消息放置到某个空消息队列中。该通知有两种方式:当一个消息被放置某个空队列时,要么产生一个信号来通知,要么通过创建一个线程来执行一个特定程序,来完成消息到来时的该做的事情。这种通知通过调用mq_notify建立#include <mqueue.h>int mq_notify(mqd_t mq
2021-07-06 16:49:00
1365
原创 posix_msgqueue 报Error Opening MQ: : Invalid argument
经四处查找,终于发现原因:(1)attr.mq_maxmsg 不能超过文件 /proc/sys/fs/mqueue/msg_max 中的数值,我的机器上面是10。(2)attr.mq_msgsize不能超过 /proc/sys/fs/mqueue/msgsize_max 的数值。(3)消息队列名称前面必须加上斜杆。详细请参考:命令“man mq_overview”在man pages的第7章有关于消息队列的综述。有一段叫/proc interfaces的标签,说明了一些限制问题。
2021-07-06 14:56:18
413
原创 ti ds90ub954 的调试总结
ti的953与954是很好用的进行图像传输的芯片,它们可以通过外部的mode管脚进行模式配置,然后只需要简单的几个寄存器的配置就可以进行图像传输。还可以通过954的iic去配置953的寄存器,甚至通过954的iic去控制953的iic来配置与953相连的sensor的初始化。...............
2021-06-11 17:20:58
2696
2
转载 Linux终端显示当前路径
linux 左边设置后台不显示当前路径,每次查看当前路径的全路径都得通过pwd命令。解决办法:1. 进入到etc目录,修改profile文件2. 编辑文件,在文件最后一行加上:export PS1='[\u@\h $PWD]\$'3.保存之后执行命令:source /etc/profile执行后查看当前路径变化,路径前边加了 “/”然后切换目录,都会显示全路径。问题解决~...
2021-06-04 16:10:59
14423
2
原创 Linux内存初始化
有了armv8架构访问内存的理解,我们来看下linux在内存这块的初始化就更容易理解了。创建启动页表:在汇编代码阶段的head.S文件中,负责创建映射关系的函数是create_page_tables。create_page_tables函数负责identity mapping和kernel image mapping。 identity map:是指把idmap_text区域的物理地址映射到相等的虚拟地址上,这种映射完成后,其虚拟地址等于物理地址。idmap_text区域都是一些打开MMU相关
2021-05-26 14:18:53
526
原创 内存管理之CPU访问内存的过程
CPU访问内存的过程可以用图的方式来说明,简单直接:蓝色部分是cpu,灰色部分是内存,白色部分就是cpu访问内存的过程,也是地址转换的过程。在解释地址转换的本质前我们先理解下几个概念: TLB:MMU工作的过程就是查询页表的过程。如果把页表放在内存中查询的时候开销太大,因此为了提高查找效率,专门用一小片访问更快的区域存放地址转换条目。(当页表内容有变化的时候,需要清除TLB,以防止地址映射出错。) Caches:cpu和内存之间的缓存机制,用于提高访问速率,armv8架构的话上图的c
2021-05-26 14:10:43
4514
原创 利用proc和sys的接口进行linux系统调试
在调试的过程中我们通常需要去不停的修改寄存器的值来调试效果,其实linux有两个手段,分别利用的proc和sys可以帮忙我们来进行调试proc的方法不依赖与kobject,sys中show和store则依赖于kobject。 /proc是内存中有关系统进程的实时信息;/sys是有关系统内核以及驱动的实时信息;/proc下文件基本都是只读的,除了/proc/sys目录,它是可写的(查看和修改内核的运行参数)/proc下数字命令的目录就是对于PID的进程目录/proc/cmdl...
2021-05-25 11:09:44
601
原创 设备数示例图解
/ { node1 { a-string-property = "A string"; a-string-list-property = "first string", "second string"; // hex is implied in byte arrays. no '0x' prefix is required a-byte-data-property = [01 23 34 56]; child-node1...
2021-05-21 15:05:51
319
原创 The root filesystem on /dev/sdax requires a manual fsck
1. 问题描述dev/sda1: Inodes that were part of a corrupted orphan linked list found./dev/sda1: UNEXPECTED INCONSISTENCY:; RUN fsck MANUALLY (i.e., without -a or -p options)fsck exited with status code 4The root filesystem on /dev/sda1 requires a ma...
2021-05-21 14:09:55
820
原创 设备树语法详解
Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离。在设备树出现以前,所有关于设备的具体信息都要写在驱动里,一旦外围设备变化,驱动代码就要重写。引入了设备树之后,驱动代码只负责处理驱动的逻辑,而关于设备的具体信息存放到设备树文件中,这样,如果只是硬件接口信息的变化而没有驱动逻辑的变化,驱动开发者只需要修改设备树文件信息,不需要改写驱动代码。比如在ARM Linux内,一个.dts(device tree source)文件对应一个ARM的machine,一般放置在内核的"arch/
2021-05-20 16:49:49
1164
原创 linux 设备树详解
没有Device Tree的ARM linux是如何运转的?1、自己撰写一个bootloader并传递适当的参数给kernel。除了传统的command line以及tag list之类的,最重要的是申请一个machine type,当拿到属于自己项目的machine type ID的时候。2、在内核的arch/arm目录下建立mach-xxx目录,这个目录下,放入该SOC的相关代码,例如中断controller的代码,时间相关的代码,内存映射,睡眠相关的代码等等。此外,最重要的是建立一个board
2021-05-13 11:47:21
1996
原创 tda2x调试参考
#BSP overlay required for DRA752* bin/dra7-evm-infoadas.dtb => built after applying the patches* bin/zImage => built after applying the patches* bin/MLO => built with "dra7xx_evm_vi...
2021-05-11 14:26:06
409
原创 make编译语法
subsystem:cd subdir && $(MAKE)其等价于:subsystem:$(MAKE) -C subdir这句是Makefile的规则:这里的$(MAKE)就相当于make,-C 选项的作用是指将当前工作目录转移到你所指定的位置。...
2021-05-07 18:10:43
439
原创 Ubuntu下搭建TDA2x开发环境
最近进行tda2x开发板的调试,官方参考文档VisionSDK_Linux_UserGuide.pdf。Ubuntu环境下搭建TDA2x开发环境如下:1. 首先使用命令sudo apt install安装所需的支持包:sshcorkscrewgawkunamesedu-boot-toolsdos2unixdtrxgitlib32z1lib32ncurses5lib32bz2-1.0libc6:i386libc6-i386libstdc++6:i386libncurses5
2021-05-06 15:28:47
553
原创 进程间IPC通信方式比较
常见的通信方式:1. 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,需要双方通信时,需要建立起两个管道; 而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。2. 命名管道FIFO:有名管道也是半双工的通信方式,支持可靠的、单向或双向的数据通信。但是它允许无亲缘关系进程间的通信。 遵循先进先出(first in first out),对管道PIPE及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。3. 信号 ( sinal ...
2021-01-11 17:37:12
444
原创 进程调度
linux调度器https://www.cnblogs.com/20135235my/p/5398066.html 好文章首先我们在思考调度器的时候,我们要理解任何操作系统的调度器设计只追求2个目标:吞吐率大和延迟低(相应快)。因为吞吐率要大,势必要把更多的时间放在做真实的有用功,而不是把时间浪费在频繁的进程上下文切换;而延迟要低,势必要求优先级高的进程可以随时抢占进来,打断别人,强行插队。但是,抢占会引起上下文切换,上下文切换的时间本身对吞吐率来讲,是一个消耗,这个消耗可以低到2us或者更
2021-01-11 17:25:32
228
原创 内存分配管理
kmalloc 和 vmalloc 区别在于:kmalloc 分配的内存物理地址是连续的, 虚拟地址也是连续的vmalloc 分配的内存物理地址是不连续的,虚拟地址是连续的因此在使用中,用的较多的还是 kmalloc,因为kmalloc 的性能较好。因为kmalloc的物理地址和虚拟地址之间的映射比较简单,只需要将物理地址的第一页和虚拟地址的第一页关联起来即可。而vmalloc由于物理地址是不连续的,所以要将物理地址的每一页都和虚拟地址关联起来才行。kmalloc和vmalloc是分配.
2021-01-11 16:57:20
465
原创 ARM的七种工作模式详解
一、存储器格式(字对齐):Arm体系结构将存储器看做是从零地址开始的字节的线性组合。从零字节到三字节放置第一个存储的字(32位)数据,从第四个字节到第七个字节放置第二个存储的字数据,一次排列。作为32位的微处理器,arm体系结构所支持的最大寻址空间为4GB。存储器格式 1、大端格式:高字节在低地址,低字节在高地址; 2、小端格式:高字节在高地址,低字节在低地址;指令长度:Arm微处理器的指令长度是32位的,也可以为16位(thumb状态下)。Arm微处理器...
2020-11-24 17:31:52
1630
原创 SPI中的极性CPOL和相位CPHA之英文详解
SPI Transfer ModesSPI interface allows to transmit and receive data simultaneously on two lines (MOSI and MISO).Clock polarity (CPOL) and clock phase (CPHA) are the main parametersthat define a clock format to be used by the SPI bus.Dependi..
2020-11-24 14:56:25
2245
原创 Linux内核调试方法
#1 内核调试以及工具总结内核总是那么捉摸不透, 内核也会犯错, 但是调试却不能像用户空间程序那样, 为此内核开发者为我们提供了一系列的工具和系统来支持内核的调试.内核的调试, 其本质是内核空间与用户空间的数据交换, 内核开发者们提供了多样的形式来完成这一功能.工具 描述 debugfs等文件系统 提供了 procfs, sysfs, debugfs以及 relayfs 来与用户空间进行数据交互, 尤其是 debugfs, 这是内核开发者们实现的专门用来调试的文件系统接口. 其他
2020-11-20 16:47:47
270
原创 Linux之strsep函数
strsep函数用于分割字符串,函数原型如下:char *strsep(char **s, const char *ct);s为指向欲分割的字符串,ct为分隔符,函数将返回分隔符前面的字符串,s将指向分隔符之后的字符串,实例如下:#include <stdio.h>#include <string.h>int main(void){ c...
2020-11-18 10:05:40
667
奔跑吧Linux内核
2018-09-04
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅