Linux卡片电脑
一、Hardware1.1 整体框图
Top1层
Gnd2层
Sig3层
Sig4层
Power5层
Bottom6层
3D视图
1.2 阻抗匹配
1.3 手工焊接
1.4 DDR3位宽说明K4B4G1646B 4Gbit 256M x 16bit内存芯片,A0~A14用做行地址,A0~A9用做列地址,这款芯片同时含有B0~B2用来选择bank。bank address有三个bit,所以单个16bit DDR3内部有8个bank。
表示行的有A0~A14,共15个bit,说明一个bank中有2^15个行。
表示列的有A0~A9, 共10个bit,说明一个bank中有2^10个列。
所以单块16bit DDR3可以寻址2^32^152^10=2^28=256M个地址。
我们的位宽是16bit,也即访问一个地址,内存认为是访问16bit的数据,所以单个内存颗粒的容量为512M Bytes
我们的H3用两片16bit的K4B4G1646B拼成了一个32bit位宽、总容量为1G Bytes的内存:
第一片16bit D ...
mmc子系统
Linux kernel把mmc、sd以及sdio三者的驱动代码整合在一起,俗称mmc子系统。源码位于drivers/mmc下。其下有三个子目录,分别是:card、core、host,其中,card用于构建一个块设备作为上层与mmc子系统沟通的桥梁;core抽象了mmc、sd、sdio三者的通用操作;host则是各类平台上的host驱动代码,包括如TI Omap的omap_hsmmc,三星的s3cmci等。具体的SOC,会根据实际情况再次封装(比如rockchip采用新思designwave的IP),就重新封装为struct dw_mci。DesignWare是SoC/ASIC设计者最钟爱的设计IP库和验证IP库。它包括一个独立于工艺的、经验证的、可综合的虚拟微架构的元件集合,包括逻辑、算术、存储和专用元件系列,超过140个模块。
一、mmc子系统涉及总线(SD为例)1.1 整体框架①Host驱动相应的driver和device挂载在Linux内核内置的虚拟抽象总线platform_bus_type。设备树指定compatible属性与源码匹配后调用对应的probe ...
代码重定位
1. 重定位的引入S3C2440的CPU可以直接给片外SDRAM、4K的片内SRAM、Nor Flash、发送读写命令,但是不能直接给Nand Flash发送读写命令。假如把程序烧写到Nand Flash上,即向Nand Flash烧入bin文件,CPU是无法从Nand Flash中取代码执行的。
那为什还可以使用NAND启动?
上电后,CPU检测到NAND启动,会自动把Nand Flash前4K内容复制到片内SRAM;
CPU从0地址运行SRAM;
如果程序大于4K,前4K的代码需要把整个程序读出来放到SDRAM(即代码重定位);
如果从Nor Flash启动,会出现什么问题?
将拨动开关拨到Nor Flash启动时,此时CPU认为的0地址在Nor Flash上面,片内SRAM的基地址就变成了0x40000000(Nand启动时片内SRAM的基地址是0)。
Nor Flash可以像内存一样读,但不能和内存一样写,因此需要将全局变量和静态变量重定位到片外SDRAM中。局部变量不需要重定位,因为其保存在栈中。
例如执行如下几条汇编指令:
123MOV R0, #0LDR R1, ...
uboot源码情景分析
一. UBOOT打补丁uboot的源码在官方都能下到,但是每个厂家会根据自己的实际情况对代码进行修改,那么很多时候就会把修改后的补丁文件发布出来,用户只需要将补丁文件打入到官方源码即可。
打入jz2440的补丁文件: patch -p1 < ../u-boot-1.1.6_jz2440.patch
1 补丁生成当前目录创建原文件:1.txx
123this is a testfor patch file formatso let us go!
当前目录创建修改后的文件:2.txt
1234this is a testfor linux patch file formatso let us go!learn it
当前目录创建生成补丁文件:
1diff -u 1.txt 2.txt > diff.patch
2 补丁分析生成的补丁文件内容如下:
12345678--- 1.txt 2023-02-27 04:00:38.833368403 +0000+++ 2.txt 2023-02-27 04:00:53.506331049 +0000@@ ...
同步与互斥
一、原子操作1.1 产生起源我们的程序逻辑经常遇到这样的操作序列:
读一个位于memory中的变量的值到寄存器中
修改该变量的值(也就是修改寄存器中的值)
将寄存器中的数值写回memory中的变量值
如果这些操作是一个串行化的操作(在一个thread中串行执行),那么一切是OK的,但是世界总不能如我们所愿,在现在的多CPU架构和支持抢占的内核系统中,总会出现各种奇怪的现象。比如要实现同一时刻只有一个进程打开驱动文件,可以想到用标志位来简单的互斥,但因为CPU的调度是随机的,就会有问题如下:
所以处理器在访问共享资源时,必须对临界区进行同步,即保证同一时间内,只有一个对临界区的访问者。当共享资源为一内存地址时,原子操作是对该类型共享资源同步访问的最佳方式。随着应用的日益复杂和SMP的广泛使用,处理器都开始提供硬件同步原语以支持原子地更新内存地址。
从ARMv6架构开始,ARM处理器提供了Exclusive accesses同步原语,包含两条指令:LDREX和STREX,将对一个内存地址的操作拆分成两个步骤,同CPU内置的记录exclusive accesses的exclusiv ...