基础知识
ARM公司发展的里程碑:艾康电脑与苹果合作开发ARM核心,后来分裂出ARM公司。
ARM只负责设计IC,并且出卖自己的设计IP(版权)给其他半导体厂商来生产芯片。ARM之前的Intel、AMD、Motorola等公司,自己设计IC、生产芯片、销售。
ARM的合作伙伴:SAMSUNG、TI、ST、NXP、VLSI、Digital Semiconductor、 Sony、Qualcomm、HP、IBM······。中国授权厂商:华为海思、全志、瑞芯微、MTK(中国台湾)
CPU:CPU通过PCB走线连接外设。ARM公司卖的就是CPU的设计。
SOC:将CPU和部分外设集成在芯片内。未来趋势也将是更大集成度
裸机学习其实就是学习SoC的内核(CPU,表现为汇编指令集)和各种外设(如串口)
单片机、嵌入式的区别
- 单片机:多为小家电,裸机开发 51、PIC、STM32.......
- 嵌入式:智能手机、平板电脑、游戏机、路由器等,linux和android系统,涉及更多复杂外设
嵌入式的特点
- 专用、软硬件可裁剪、低功耗、高可靠性、实时性、弱交互性
交叉编译
- 由于嵌入式CPU简单,本身不能搭建开发环境,有些甚至没有操作系统。所以通常用高性能机器为低性能机器开发软件。即A机编写(源代码),B机执行。
RISC和CISC架构
- CISC:复杂指令集 intel公司仍在用
- RISC:精简指令集 ARM公司在用
程序编译及执行过程
- .c等高级语言的源代码--->.S汇编源代码---->.elf格式二进制可执行程序--objcopy--->Bin格式烧录文件--总线-->CPU读入后先解码--CPU流水线-->CPU执行指令
IO与内存统一编址方式,优势是IO当作内存来访问,编程简单;缺点是IO也需要占用一定的CPU地址空间,而CPU的地址空间是有限资源。
IO与内存独立编织方式,优势是 不占用CPU地址空间,缺点是CPU设计变复杂了。
寄存器:
- 为了更好的控制外设,我们可以通过C语言位操作来操作寄存器实现对外设的控制。
- 寄存器就像是可以被编程控制的外设的活动开关。
s5pv210的启动过程
首先s5pv210中包括了不需要初始化的外存Norflash(iROM)+静态内存SRAM (iRAM )。以及需要初始化的 大外存iNand+大动态内存DRAM。
- ①上电后,先从64KB的iROM中读取预先设置的代码BL0,这部分代码初始化了SOC 内部的东西,包括初始化时钟、看门狗,并内置了初始化SD卡和iNand,内置了读取SD卡和iNand 的代码。接着根据OMpins判断启动方式。
- ②接着,根据判断出的启动方式,使用不同的初始化代码和读取代码,从相对应的外存(iNand或者SD卡)中读取一部分启动代码BL1到SRAM (iRAM )的前16KB中运行,这部分代码负责初始化Nandflash 。
- ③紧接着把外存中BL2读取到SRAM 的后80KB中运行。这部分代码可以初始化内存DRAM 。
- ④此时,Nandflash 和DRAM 都可以使用了,可以把Nandflash 中的OS读取到DRAM 中,启动OS ,启动过程结束。
ARM 有7个基本工作模式:
- User : 非特权模式,大部分任务执行在这种模式。 //(普通模式)
- FIQ : 当一个高优先级(fast) 中断产生时将会进入这种模式 //这个以及下面4种的模式一律为特权模式
- IRQ : 当一个低优先级(normal) 中断产生时将会进入这种模式 //
- Supervisor :当复位或软中断指令执行时将会进入这种模式 //
- Abort : 当存取异常时将会进入这种模式 //
- Undef : 当执行未定义指令时会进入这种模式 //
- System : 使用和User模式相同寄存器集的特权模式 //sys模式
指令和伪指令
- (汇编)指令是CPU机器指令的助记符,经过编译后会得到一串10组成的机器码,可以由CPU读取执行。
- (汇编)伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码。
- ARM官方的ARM汇编风格:指令一般用大写、Windows中IDE开发环境(如ADS、MDK等)常用。如: LDR R0, [R1]
- GNU风格的ARM汇编:指令一般用小写字母、linux中常用。如:ldr r0, [r1]
刷机
刷机前的准备
出厂时,设备里面已经默认在inand里面安装了uboot+内核+android 也就是在默认的SD0启动中,所以在拨码开关拨到SD卡启动时可以直接启动了。
破坏掉第一启动方式,只需要毁掉启动部分的uboot的第一个扇区,这样SD0启动失败时就会转向SD2启动,因为SD2中有uboot可以启动,所以系统又可以启动了。
破坏命令:busybox dd if=/dev/zero of=/dev/block/mmcblk0 bs=512 seek=1 count=1 conv=sync
sync
下面我们希望恢复原来的SD0启动怎么办?
可以将inand中的uboot+内核+android 全部重新烧录一遍。
具体步骤如下:
- 首先制作启动卡,将uboot烧录到sd卡中
- 在SD2启动时在serial串口界面会有3秒钟的时间选择进入uboot这时候(倒计时3秒内)按一下enter键进入uboot,
- 然后在串口界面输入fastboot进入fastboot模式,这时候需要操作fastboot来将电脑里面的uboot+内核+android烧录进去,这就需要USB线来传输数据。所以接上USB线,注意安装驱动。下面要到windows下cmd进入fastboot目录操作。
- 一切就绪后,为方便管理把uboot+内核+android这三个文件的镜像放进fastboot文件夹中方便看(看到底装了哪些东西)。
- 在windows系统中打开CMD命令行窗口,进入到fastboot目录:d:(进入存放fastboot的系统盘)回车-->dir(查看有哪些文件夹)----->cd fastboot(进入fastboot文件夹)-->dir(查看当前文件夹里面的文件)-->fastboot devides(检查设备连接状态)开始烧录,在CMD模式下分别输入三行代码并按enter一个个烧录。(注意文件摆放的路径必须和下面命令的路径一模一样)
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
fastboot常用命令:
- fastboot devices 命令用来查看当前连接的设备。(我们开发板看到的是:SMDKC110-01)
- fastboot flash xxx 命令用来烧录的
- fastboot reboot 命令用来重启系统)
USB启动方式:
- 将拨码开关拨到USB那里,插上USB线,按住裸机开机键不松开,安装USB驱动,打开dnw工具,USB显示OK,选择模式为115200,COM3口,地址1:d0020010 选择烧录x210_usb.bin 选择地址为0x23e00000烧录uboot.bin,在开发板开机后进入倒计时时按下enter进入fastboot模式,下面操作和上面的SD卡烧录一样。
dnw刷机
拨码开关拨到USB启动-->烧录x210_usb.bin,地址为0xd0020010---->烧录uboot.bin,地址为0x23e00000------>(linux下输入以分区)fdisk -c 0 --->(linux下输入)fastboot---->在windows中打开cmd打开fastboot所在目录---->fastboot----->fastboot devices------>fastboot flash bootloader android4.0/uboot.bin------>fastboot flash kernel android4.0/zImage----->fastboot flash syetem android4.0/x210.img
linux dd命令烧录
SD卡连接到linux------> (/winshare/uboot_sd_fusing#) ls /dev/sd*检查接入的SD卡一般本地硬盘为sda开头------>./nand fusing.sh /dev/sdb
sudo dd iflag=dsync oflag=dsync if=210.bin of=/dev/sdb seek=1
- iflag=dsync:表示输入文件读取时不经过缓冲区,一块一块地读取(块的大小为缓冲区大小),直到读取完成。
- oflag=dsync:表示输出文件不经过缓冲区,来一块,写入一块。
- if=210.bin:表示输入文件为210.bin
- of=/dev/sdb:表示输出文件为sd卡
- seek=1:表示跳过第0块,从第1块开始写入
linux下dnw刷机
root@ubuntu:/mnt/hgfs/winshare/dnw-linux# ls
dnw.rules logo.png Makefile README src
root@ubuntu:/mnt/hgfs/winshare/dnw-linux# make
root@ubuntu:/mnt/hgfs/winshare/dnw-linux# make install
此时完成了dnw和dnw驱动的安装
在linux下链接好s5pv210------->ls /dev/secbulk0(用来检查设备的连接)
root@ubuntu:/mnt/hgfs/winshare/dnw-linux# cd src/dnw
root@ubuntu:/mnt/hgfs/winshare/dnw-linux/src/dnw# ls
dnw dnw.c Makefile uboot.bin x210_usb.bin
root@ubuntu:/mnt/hgfs/winshare/dnw-linux/src/dnw# ls /dev/secbulk0
root@ubuntu:/mnt/hgfs/winshare/dnw-linux/src/dnw# dnw -a 0xd0020010 x210_usb.bin
root@ubuntu:/mnt/hgfs/winshare/dnw-linux/src/dnw# dnw -a 0x23e00000 uboot.bin
(注:s5pv210相关的基础知识以及这个文件夹中后续跟进的笔记参考了朱有鹏嵌入式核心课程)