ARM 基础

 

这里记录的是我学习嵌入式系统的一些知识积累

这里记录的是我学习嵌入式系统的一些知识积累

ARM 基础

三星主要的ARM CPU有哪些?

ARM 型号 CPU 类型
ARM7 44B0
ARM9 2440 2410 2416
ARM11 6410
A8 S5PV210 S5PC100
A9 4412 4418

ARM的几种版本号

  1. ARM内核版本号:ARMv7
  2. ARM SoC版本号:Cortex-A8
  3. 芯片型号: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 FlashNADN 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卡启动

    • 确定开发板是从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一般不具有这样的功能。