这里记录的是我学习嵌入式系统的一些知识积累
ARM 基础
三星主要的ARM CPU有哪些?
ARM 型号 | CPU 类型 |
---|---|
ARM7 | 44B0 |
ARM9 | 2440 2410 2416 |
ARM11 | 6410 |
A8 | S5PV210 S5PC100 |
A9 | 4412 4418 |
ARM的几种版本号
- ARM内核版本号:ARMv7
- ARM SoC版本号:Cortex-A8
- 芯片型号:S5PV210
ARM内核版本号和SoC版本号是由ARM确定的,而SoC型号是由半导体公司确定的。
CPU 的地址总线
地址总线决定 CPU 的寻址空间,32 位地址总线可寻址 4GB 空间;
数据总线决定 CPU 与外界一次可传输的数据位数
源码到 CPU 的执行过程
graph LR
A[源代码] -- 编译器 --> B[.S汇编码]
B -- 汇编器 --> C[Elf 可执行程序]
graph LR
C[Elf 可执行程序] -- Objcopy --> D[BIN格式烧录文件]
D -- 总线 --> E[CPU读入后解码]
E -- 指令流水线 --> F[CPU 执行]
内存与 IO 的访问方式
- 内存通过CPU的地址总线来寻址定位,然后通过CPU数据总线来读写。内存与CPU的这种总线式连接方式是一种直接连接
- IO 指的是与CPU连接的各种外设,CPU访问各种外设有2种方式:
- 访问内存的方式。即把外设的寄存器当作一个内存地址来读写,这叫 IO 与内存统一编址
- 使用专用的CPU指令来访问某种特定外设,叫 IO 与内存独立编址
冯诺依曼结构与哈佛结构
-
冯诺依曼结构
程序和数据都放在内存中,且不彼此分离的结构,Intel的CPU均采用冯诺依曼结构。
-
哈佛结构
程序和数据分开独立放在不同的内存块中,彼此完全分离的结构,大部分的单片机(MCS51、ARM9等)。哈佛结构中程序(一般放在ROM、flash中)和数据(一般放在RAM中)
两类寄存器
-
通用寄存器
-
SFR (special function register,特殊功能寄存器)
存在于CPU的外设中,我们通过访问外设的SFR来编程操控这个外设
什么是 ROM、RAM
-
ROM:read only memory 只读存储器,指的 CPU 不能直接读写的存储器,需要先完成初始化
-
RAM:ramdom access memory 随机访问存储器。CPU 可以直接寻址的存储器
-
IROM:internal rom 内部ROM,指的是集成到SoC内部的ROM
-
IRAM:internal ram 内部RAM,指的是集成到SoC内部的RAM
-
DRAM:dynamic ram 动态RAM
-
SRAM
static ram 静态RAM。所谓的“静态”,是指这种存储器只要保持通电,里面储存的数据就可以恒常保持。相对之下,动态随机存取存储器(DRAM)里面所储存的数据就需要周期性地更新
SoC常用外部存储器
FLASH 结合了 ROM 和 RAM 的长处,可擦除可编程(EEPROM),还不会断电丢失数据,同时可以快速读取数据(NVRAM的优势)。
目前Flash主要有两种NOR Flash和NADN Flash
-
NOR Flash
和CPU直接总线式相连,CPU上电后可以直接读取。
-
NADN Flash
非总线式访问,以块方式读取数据(512个字节)
-
eMMC (Embedded Multi Media Card)
把高密度 NAND Flash 以及 MMC Controller 封装在一颗BGA芯片中。
-
iNAND
SanDisk公司研发的存储芯片,可以简单的看成SD卡或MMC卡芯片化。可以默认他是SD卡或者MMC卡
-
SoC常用内部存储器
ROM 和 RAM。ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写。ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是在掉电之后就丢失数据。
-
SRAM(Static RAM)
上电不需要软件初始化就能使用,这种存储器只要保持通电,里面储存的数据就可以恒常保持
-
DRAM(Dynamic RAM)
初始化才能使用,数据需要周期性刷新
- DDR RAM(Date-Rate RAM)一个时钟读写两次数据,这样就使得数据传输速度加倍了。
开发板刷系统
连接 x210 串口
Windows10的串口,在WSL中也可以直接使用,其对应关系就是 COMx
对应 WSL 的/dev/ttySx
,例如COM4
对应WSL的/dev/ttyS4
。我的 USB 转串口是在 COM3 所以在 WSL 中先安装 picocom
在连接
# 安装 picocom 串口调试工具
sudo apt install picocom
# WSL中打开串口
wilson@DrLynx:~$ sudo picocom -b 115200 /dev/ttyS3
picocom v2.2
port is : /dev/ttyS3
flowcontrol : none
baudrate is : 115200
parity is : none
databits are : 8
stopbits are : 1
escape is : C-a
local echo is : no
noinit is : no
noreset is : no
nolock is : no
send_cmd is : sz -vv
receive_cmd is : rz -vv -E
imap is :
omap is :
emap is : crcrlf,delbs,
Type [C-a] [C-h] to see available commands
连接读卡器中的 SD 卡
我的 SD 卡在 Win10 中显示的是 D:\
盘,那么:
sudo mkdir /mnt/d
# 把 Win10 的 D 盘挂载到 WSL 的 /mnt/d 目录下
sudo mount -t drvfs D: /mnt/d
# 弹出
sudo umount /mnt/d
首先破坏iNand中的bootloader以从SD2启动
busybox dd if=/dev/zero of=/dev/block/mmcblk0 bs=512 seek=1 count=1 conv=sync
sync
用 SD 卡刷系统
-
制作启动 SD 卡
- windows
A盘\tools\x210_Fusing_Tool.rar
工具
- Linux
- 用 dd 命令刷写uboot
- 把 sd 卡插在电脑上,
ls /dev/sd*
查看SD卡在linux中的设备编号 - 执行
./nand_fusing.sh /dev/sdb
- 把 sd 卡插在电脑上,
- 用 dd 命令刷写uboot
- windows
-
使用SD卡启动
- 确定开发板是从SD卡启动的
- SD卡插入SD2通道,启动uboot
- 执行
fdisk -c 0
分区
-
在 uboot 中用 fastboot 工具烧录镜像
-
PC 端要安装 fastboot 的驱动
fastboot 是 android 的工具,在 ubuntu 在可以直接安装
sudo apt-get install android-tools-adb android-tools-fastboot
-
使用fastboot烧录android4.0.4镜像
fastboot flash bootloader android4.0/uboot.bin #烧uboot fastboot flash kernel android4.0/zImage-android #烧linux kernel fastboot flash system android4.0/x210.img #烧android rom
-
烧录linux+QT
fastboot flash bootloader linuxQT/uboot_inand.bin #烧uboot fastboot flash kernel linuxQT/zImage-qt #烧linux kernel fastboot flash system linuxQT/rootfs_qt4.ext3 #烧rootfs
-
# 命令用来查看当前连接的设备。(我们开发板看到的是:SMDKC110-01) fastboot devices fastboot flash xxx # 命令用来烧录的 fastboot reboot # 命令用来重启系统
USB 刷机
-
拨码OM5拨上去;如 [OM0:OM5]=[101101]。后面两位不管
-
按住开机键,DNW配置下载地址d0020010,USB下x210_usb.bin
dnw -a 0xd0020010 x210_usb.bin
-
DNW配置下载地址23e00000,USB下载uboot.bin
dnw -a 0x23e00000 uboot.bin
-
这时串口终端有信息打印出来,回车进入命令行,这时可以松开开机键
fdisk -c 0 fastboot
-
PC 端操作
fastboot flash bootloader xxxxx fastboot flash kernel xxxxx fastboot flash system xxxxx fastboot -w
-
完了之后OM5拨回来,手动重启机器即可
DNW 是什么?
dnw 是网上高手写的一个版本烧写工具,DNW原理就是通过PC端软件把要烧写的镜像(uboot,kernel,fs)通过usb口写进usb设备的RAM中,然后USB设备再把RAM里的数据写到rom(nandflash,emmc等)中实现固化程序。
DNW 工具包括两个部分,一个是 DNW 的命令行工具或者窗口工具,用于设置参数;一个是 DNW 驱动,用于接受 DNW 命令工具的指令,把数据通过 USB 发送到 x210 的 USB 端口的 RAM 中。
dnw 用来下载 uboot.bin 到 x210 的 flash 中
dnw_linux.tgz压缩包文件结构如下
dnw_linux/
dnw_linux/secbulk/
dnw_linux/secbulk/Makefile
dnw_linux/secbulk/secbulk.c
dnw_linux/dnw/
dnw_linux/dnw/dnw.c
其中secbulk.c是PC端USB驱动, dnw.c是写入工具。
修改 secbulk.c 中的 secbulk_table,让它支持 x210 的 USB
static struct usb_device_id secbulk_table[]= {
{ USB_DEVICE(0x5345, 0x1234) }, /* FS2410 */
{ USB_DEVICE(0x04e8, 0x1234) }, /* X210 供应商ID:产品ID */
{ }
};
接下来编译
$cd secbulk
$make -C /lib/modules/`uname -r`/build M=`pwd` modules
加载编译好的驱动
$sudo insmod ./secbulk.ko
接下来编译dnw写入工具
$gcc -o dnw dnw.c
开发板连接到linux下
-
开发板设置USB启动,开机,windows设备管理器中提示发现新硬件
-
VMware菜单:虚拟机->可移动设备->Samsung S5PC110 SEC Test B/D,点击连接
-
成功连接后现象:
-
Windows下设备管理器没了;
-
ls /dev/secbulk0 设备节点自动出现
-
此时用dmesg命令可以看到secbulk驱动加载
[ 283.677772] usb 1-1: new full speed USB device using uhci_hcd and address 2 [ 284.084835] usb 1-1: configuration #1 chosen from 1 choice [ 284.140430] secbulk:secbulk probing... [ 284.140482] secbulk:bulk out endpoint found!
-
使用dnw进行下载uboot.bin
./dnw -a 0xd0020010 x210_usb.bin
./dnw -a 0x23e00000 uboot.bin
Fastboot 是什么
fastboot是uboot中用来快速下载镜像的一个命令,fastboot同时还是一个windows上的软件。fastboot 用来下载大的镜像文件到 flash 中
通常大家所讨论的Fastboot,通常都是说安卓手机的Fastboot模式。fastboot是一种比recovery更底层的刷机模式。简单来说,就是使用USB数据线,连接电脑的一种刷机模式。这种刷机方式,我们又通常称为“线刷”刷机。另外安卓手机还有一种刷机方式,叫做“卡刷”,两者区别如下。
线刷:就是清除系统和缓存之后直接插上电脑注入系统
卡刷:就是利用recovery的从SD卡中更新系统的这个功能,前提是如果你想刷recovery,你的系统必须要带FASTBOOT才能刷。
Fastboot一般由boot和loader两个模块组成,boot负责安卓设备上电后初始化一些最基本的参数,类似CPU时钟,寄存器初始化。而loader负责去引导系统,例如从Emmc上读多大空间到内存,然后CPU开始从内存某地址开始执行。
而Recovery实际上是一个mini的系统,对Fastboot中的loader而言,开机的时候loader可以去加载安卓系统和Recovery中的任何一个。
使用Fastboot一般都是线刷,也就是PC上的刷机软件通过和Fastboot通讯,将PC上的刷机包通过Fastboot的桥梁作用,写入至安卓设备的EMMC,而Recovcey升级一般都是我们说的卡刷,它负责读取SD卡中的升级包去升级,其实在这一步我们就知道Recovery是支持文件系统的,它可以去读取SD卡中的文件,而Fastboot一般不具有这样的功能。