前言:此文章根据朱有鹏相关课程整理
1.开发板刷系统
1.串口输出的意义(做系统控制台)
串口是一种硬件通信口,很多年前的时候串口是CPU之间进行通信的主要接口。但是现在因为串口通信的速度很低,所以现在串口主要是用来做程序输出监控、调试。
桌面电脑可以打开一个虚拟控制台,嵌入式系统一般是用串口来做控制台的。在电脑上打开一个串口监视,这样开发板上的串口输出内容就可以在电脑上看到。还可以通过监视终端向开发板输入一些控制命令由开发板执行。常用的串口监视软件有:超级终端、SecureCRT、minicom
2.安装USB转串口线的驱动
现在笔记本没有串口了,所以这种串口连接线用不了。办法是使用USB转串口线,这种线传入电脑后需要安装驱动,安装驱动后在电脑上会形成一个串口(叫usb转串口),这样就相当于你电脑有了一个串口,可以通过这个串口来监视开发板的串口输出。
安装的驱动在:绿联USB转串口驱动>PL2303prolific>PL2303prolific
步骤:
1.计算机->右键,管理->设备管理器->通用串行总线控制器->USB-to-serial contural
2.安装绿联USB转串口驱动->重启设备管理器并拔插usb线->端口出现USB-to-serial contural(COM3)如果要更改COM号则右击选择属性->端口设置->高级
注意1:windows对USB设备的管理是和USB口有关的,你每次把usb转串口线插到1个口中,这样得到的COM口号码是不变的,方便我们后期使用。如果每次胡乱更换插口,可能得到的COM口会变。
注意2:COM口号码是可以改的,还可以强制占用显示“已使用”的COM号,一般改成COM4以内的就可以了。
在设备管理器中通用串行总线控制器,端口(COM和LPT)可看到。
3.使用SecureCRT
打开SecureCRT.exe后,建立一个Serial连接,开始监视串口。设置参考视频中,注意流控一定要去掉。在securest中光标呈闪烁状态,就说明已经连接上
开发板这边串口一定要接串口2(官方出厂默认的烧录镜像都是使用串口2的),然后开机,就可以看到串口信息了。
连接x210要输入登陆信息,登陆名:root,密码:123456
2.开发板刷系统2
1.SD刷机:
步骤:
1.破坏iNand中的bootloader以从SD2启动(我们只是将inand的第一个扇区擦除了,而inand中前面存的是uboot,后面存android之类的kernel,所以我们将uboot的一部分擦除了,所以SD卡只需将uboot烧录一下就行)
将以下代码写入secureCRT中(源码在D:\BaiduNetdiskDownload\九鼎X210开发版光盘资料\X210V3S_A\User Manual>x210开发板SD卡烧写教程)
第一句:busybox dd if=/dev/zero of=/dev/block/mmcblk0 bs=512 seek=1 count=1 conv=sync
在uboot底下如何擦除uboot:movi write u-boot 0x30000000
(在输入命令时我所在的用户是[root@x210v3]#,而老师的用户是/#,我所在用户的文件位置和老师的不同,所以修改命令如下:busybox dd if=/dev/zero of=/dev/mmcblk0 bs=512 seek=1 count=1 conv=sync)
解释:dd命令在Linux中是用来烧写磁盘的,if=input file输入设备,of=output file输出设备,输入是全0,输出是inand,写的块是512字节,就是一个扇区,seek=1:第一个扇区。count=1:长度是一个扇区。此命令成功后在CRT中会显示:1+0 records in 1+0 records out。
意思是把板载的iNand的第一个扇区用全0来填充,其实就是擦除它,这样我们板载的iNand的bootloader的开始第一个扇区就被破坏将来启动时iROM还是会先从iNand中读取前16kb,然后计算校验核,这样导致启动失败,会从SD2去执行2nd启动。(注意:破坏板载iNand的bootloader后,不插外部SD卡,启动时串口得到SD checksum Error)
第二句:sync
(sync命令是在关闭Linux系统时使用的。
为了提高磁盘的读写效率,linux会把频繁读写的磁盘文件在内存中做缓存。
但是这会造成数据不同步,sync 就是为了数据同步。
用户需要注意的是,不能用简单的关闭电源的方法关闭系统,因为Linux像其他Unix系统一样,在内存中缓存了许多数据,在关闭系统时需要进行内存数据与硬盘数版据的同步校验,保证硬盘数据在关闭系统时是最新的,只有这样才能确保数据不会丢失。一般正常的关闭系统的过程是自动进行这些工作的,在系统运行过程中也会定时做这些工作,不需要用户干预。sync命令是强制把内存中的数据写回硬盘,以免数据的丢失。用户可以在需要的时候使用此命令)
当我把板内的boot loader破坏后,再重新启动,启动失败,会从SD2去执行2nd启动,没有插SD卡则SD checksum Error,启动失败,game over,当我们插入SD卡,并且SD卡中有相关启动程序时,则可以正常启动。我们的任务是将SD卡中的启动程序重新烧回到开发板中,让开发板和以前一样,在没有SD卡的情况下一样可以正常启动。
2.制作启动SD卡(烧录uboot到SD卡)
有两种烧写方法:一种在Windows中用刷卡工具(D:\BaiduNetdiskDownload\九鼎X210开发版光盘资料\X210V3S_A\tools > x210_Fusing_Tool.exe)制作启动SD卡;另一种是在Linux中用dd命令。
制作SD:以管理员身份运行打开刷卡工具,打开镜像文件(D:\BaiduNetdiskDownload\九鼎X210开发版光盘资料\X210V3S_B\android4.0.4\image\inand >uboot.bin),点击start完成烧写。 制作完SD后将SD卡插入开发板,然后开机就可进入uboot界面。在uboot开机自动启动倒数3秒之内迅速按回车健,打断自动启动(否则会自动启动iNand中的andriod)。
3.Fastboot介绍:
1.fastboot是uboot中用来快速下载镜像的一个命令,同时还是一个windows上的软件。Fastboot下载时注意:1是使用USB线进行数据传输,所以fast boot执行之前要先连接开发板和主机之间的usb线。2需要安装(D:\BaiduNetdiskDownload\九鼎X210开发版光盘资料\X210V3S_A\tools\USB驱动\x210_android_driver)
2.Fast boot驱动(x210 Android驱动)的安装
启动fast boot:打开开发板,在三秒内按下回车进入uboot环境,在secureCRT的uboot环境下输入fastboot,出现一共7个分区,之后我们将在其中三个分区烧写一些镜像文件,烧录Android和Linux。在计算机管理—>设备管理器会出现一个未知的设备(带黄色感叹号的设备)右键更新驱动程序,点击浏览,选择x210_android_driver,win10禁用数字签名(百度)或者直接进入测试模式,安装完成。
3.装上fastboot软件在d盘,此软件需要在Windows的命令行中使用,开始栏中cmd打开命令行控制,d:打开d盘,dir命令看d盘的所有文件夹,cd fastboot进入fastboot文件夹,dir打开此文件夹。
4.Fastboot常用命令:(在cmd下的命令)
fastboot devices: 命令用来查看当前连接的设备(开发板看到的是:SMDK110-01)
fastboot flash xxx 烧录:将要烧录的文件保存至fast boot文件夹下,比如要烧录android4.0.4在fastboot文件夹底下新建文件夹,将文件放入此文件夹以防fastboot目录下文件太多而乱。放好文件后就可以在cmd下操作。当在cmd下操作后,通过usb线传到开发板,进行烧录,此时串口也会有变化,串口监视开发板的动态,显示已经烧录完毕。在烧录好后,重启开发板。
fastboot应该可以看到7个分区:是inand分区
按上面的理解则不需要烧kernel和system,因为只破坏了uboot
fastboot reboot:重启
4.烧录
1.使用fastboot烧录Android4.0.4镜像
在cmd下使用以下三个命令:
Fastboot flash 是命令。第二截是分区,第三截是文件名
fastboot flash bootloader android4.0.4/uboot.bin 烧uboot
fastboot flash kernel android4.0.4/zImage-android 烧linux kernel
fastboot flash system android4.0.4/x210.img 烧android rom
(uboot的参数设置:set bootcmd ‘movi read kernel 30008000;bootm 30008000’(默认就是这个,不用设置也行))
2.烧linux+QT
fastboot flash bootloader linuxQT/uboot.bin 烧uboot
fastboot flash kernel linuxQT/zImage-qt 烧linux kernel
fastboot flash system linuxQT/rootfs_qt4.ext3 烧rootfs
参数设置:(烧好后发现不用设置,因为刷了专为Linux+QT定制的uboot,这个uboot中估计已经预置好了所有的启动参数 )
3.烧android2.3
fastboot flash bootloader android2.3/uboot.bin 烧uboot
fastboot flash kernel android2.3/zImage 烧linux kernel
fastboot flash system android2.3/x210.img 烧rootfs
注意:android2.3中使用了串口0,所以启动后要把串口插到串口0中,不然串口没有任何启动信息。
我遇到的问题不能写fast boot,出现Error:No MBR is found at SD/MMC
Hint: use fdisk command to make partitions.这是因为SD卡没有分区,分区命令:fdisk -c 0。
3.底板核心板原理图
写代码时需要查阅和参考的资料有:核心板原理图、底板原理图、相应硬件的数据手册、S5PV210数据手册。
原理图,PCB图,丝印图是什么东西:丝印图是整个电路板的实体的位置图纸,与软降和功能无关,和生产制造有关,和软件工程师无关。原理图对嵌入式软件工程师的意义:同样的效果会有不同的硬件接法。底层软件工程师需要查阅,确定软件正确的和硬件通信。(pdf可通过查找找到相同的内容,从而找到接在一起的线)
嵌入式软件开发人员对硬件掌握程度的要求:软件工程师分应用开发和底层开发。对于应用开发工程师(直接基于操作系统来开发程序,调用操作系统的api和库函数等写代码)和硬件无关。对底层软件工程师(驱动开发,单片机,移植操作系统的)需要看懂原理图和数据手册。
4.Usb启动配合dnw刷机
1.背景知识介绍
必须将OM5打到VCC,才能从USB启动。
S5PV210的启动过程:开机时先执行内部的iROM中的BL0,然后BL0做了一系列的初始化后,再读取外部OMpin的设置来确定用户选择了从哪里启动。当检测到我们设置的是USB启动时,S5PV210就会从USB OTG接口试图连接主机进行下载启动。
2.dnw工具介绍
dnw是一个软件,是三星公司编写的,这个软件的功能是通过USB线连接开发板和电脑主机,然后从主机下载文件
镜像到开发板中去烧录系统。
注意1.dnw是需要装usb驱动的,驱动在“X210光盘资料\A盘\tools\USB驱动”目录
2.dnw使用时通过usb线下载,所以一定要插USB线。
3.dnw下载时需要设置dnw下载内存地址。在dnw软件的菜单“Configuration”中设置
Download Address为0xd0020010,确认即可。
3.dnw驱动安装
X210开发板使用了软开关,但是我们这里还没到操作系统没去处理开关,所以在整个裸机实验中必须按下POWER键才能保持开机
dnw驱动装好的标志是:开发板开机从usb启动后,设备管理器中显示已经安装的设备,并且关键是dnw工具中USB:OK
4.裸机程序下载地址设置
从usb启动做裸机实验时,因为不需要16字节的校验头,所以直接下载到0xd0020010
5.usb启动裸机实验总结
usb启动方式主要是用来调试程序的,其实分析S5PV210即可知道,我们这里是把裸机程序当作BL1来使用了。
扩充知识:Win7 X64版本驱动安装非常麻烦,因为微软启用了USB设备驱动签名政策。
在安好dnw后,就可以下载后烧录系统了:
按住开机键,下载x210_usb.bin(初始化DRAM),下载地址为d0020010
继续下载uboot.bin,下载地址为23e00000(这个是DRAM内存地址,所以必须先初始化DRAM)
这时串口有信息出来,回车进入命令行,这时可以松开开机键了。
dnw下载裸机的led.bin,进度条一直卡住,LED也不闪烁,怎么回事?
答:都是dnw驱动的问题,一般在Win8尤其Win10 64位系统中常见,解决时可以尝试以下几种方法:第一,禁用数字签名。方法可自行百度。第二,运行dnw.exe时不要直接双击,而是右键管理员权限运行。第三,USB线插到电脑的USB2.0接口,不要插在USB3.0接口。第四,重启下电脑和开发板试试。第五,实在不行换个其他电脑试试
在secuteCRT先写fdisk -c 0进行分区
再fastboot,之后就可以和之前的步骤一样,在cmd里进行烧录
(如果刷错了(inand版的uboot刷成了nand版的)在uboot中执行Movi write u-boot 0x30000000)
5.Linux下刷机
1.linux下用dd命令刷uboot
1.sd卡连接入linux中(设备只能存在于一个系统中)
菜单->虚拟机->可移动设备->选择插入的sd卡设备。
在linux中ls /dev/sd可以看到sda是虚拟机的硬盘和分区,sdb是SD卡
Sd卡在虚拟机中不可见解决办法:
1.首先查看工具栏->VM->Settings->Hardware.看看Device栏中有没有USB Controller,若没有ADD添加一个。若有再点击它,查看右边是否全部勾选
2.重新启动系统后如果虚拟机提示:Host USB device connections disabled。具体提示如下: The connection to the VMware USB Arbitration Service was unsuccessful. Please check the status of this service in the Microsoft Management Console.原因是在宿主机上没有开启VMware USB Arbitration Service。
解决办法:在Win7操作系统中,右键计算机,点击管理->服务和应用程序->服务,找到VMware USB Arbitration Service
3.买一个usb读卡器
写命令:ls /dev/sd,可看到linux下的磁盘,也可看到sd卡在linux中的编号,一般是/dcv/sdb,此编号在下文需要用到。
2.制作SD启动卡
将需要的文件(uboot_sd_fusing:里面包含uboot.bin和nand fusing.sh脚本文件,烧录的关键就是执行脚本文件)放到linux与windows共享文件夹中,打开此文件夹,运行文件执行./nand_fusing.sh /dev/sdb。(将共享文件夹中的文件烧录到sd卡中)(后面的dev/sdb来自sd卡在linux中的编号)
做完后虚拟机>可移动设备,拔出插入的sd卡设备。
3.使用SD卡启动:插入开发板,之后操作和上文一样
2.Linux下用dnw刷机
1.将dnw-linux文件夹放到共享文件夹中。(放到D:\linux\windows_share\s5pv210\tar下).打开Ubuntu,进入文件位置,解压文件(tar -jxvf dnw-linux-x210.tar.bz2)解压的文件名中就有Linux下的dnw(命令行形式)和dnw驱动。
2.编译和安装:在虚拟机下进入到文件夹下(windows_share/s5pv210/tar/dnw-linux#)执行命令:make和make install,安装完成。
3.开发板连接到linux下:开发板设置USB启动,开机,这时 Windows显示发现新硬件。虚拟机菜单:虚拟机>可移动设备>Samsung S5PC110 SEC Test B/D,点击连接,运行ls /dev/secbulk0,设备节点自动出现。(此时VMware老是卡住,未解决,此方法作废,vmware卡死,找不到原因)
将要烧录的两个文件放到解压好的dnw文件夹下
4.使用dnw下载uboot.bin (1)dnw -a 0xd0020010 x210_usb.bin
(2)dnw -a 0x23e00000 uboot.bin(uboot下载后板子就开始启动了,此时要三秒内在secure CRT中按下回车进入uboot状态)
5.uboot启动后的刷机注意事项
(1)正确的uboot启动后一定要先fdisk -c 0分区,然后fastboot
(2)uboot的参数中bootcmd和bootargs一定要准确:
在secureCRT中执行以下两条:set bootcmd ‘movi read kernel 30008000;bootm 30008000’
Set bootargs console =ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc
SD和USB烧写系统的过程详解:
SD/MMC通道4个,SD/MMC0->板载MMC也就是INand,SD/MMC2:SD卡
SD烧写只是烧了uboot,到SD卡中,然后开发板先默认从inand启动,失败,转从SD卡启动,SD只有uboot,没有kernel,所以启动是靠SD中的uboot和inand的kernel。要是想烧写uboot到inand,就先从SD卡启动,不让其自动启动操作系统(三秒内回车),然后在uboot下利用uboot的fastboot命令将windows文件夹中的uboot烧写到inand中。因为uboot和kernel是躺在inand中的,我们破坏inand的第一个扇区其实是将uboot破坏了,kernel并没有被破坏,我猜测直接烧uboot,kernel不用烧就可以启动。我猜测fastboot是烧写到inand中,而并不是像USB烧写(我的理解没有错,但是此烧写最好改成下载,因为在uboot在DDR中时,然后就可以用内存中的uboot中的fast boot来刷机,我们也可以直接启动OS完成启动,当然这样就没有完成烧写,在掉电后内存中的 uboot丢失,下次启动仍然会失败)到内存中,fastboot打印出7个分区:查看是不是inand分区
启动后uboot和kernel在DRAM中(冯诺依曼结构)
USB烧写(下载更准确)需要先下载x210_usb.bin,初始化DDR,有点像boot loader的BL1的部分功能(可能还初始化usb相关的驱动,不清楚),然后下载uboot.bin到地址23e00000,这是内存地址
USB烧录总结:将初始化DRAM的程序(x210_usb.bin)烧到IRAM->初始化好后将uboot.bin烧到DDR中运行,这时内存中就有一份uboot了->之后uboot中的fastboot进行kernel烧写
三星推荐的启动过程和uboot启动过程:
- 三星推荐的启动过程:BL0内置在IROM->BL1从外部块设备到IRAM->BL2从外部到IRAM->BL2将OS移到DDR,完成启动(整个boot loader<=96k)
- uboot启动过程:BL0->uboot被分成BL1和uboot(整个uboot)->BL1去iRAM初始化DDR->整个uboot去DDR中运行->如果3秒不回车,则将OS搬到DDR,启动完成
三星:初始化DDR在BL2中完成
uboot:初始化DDR在BL1完成,所以BL1中必须有初始化DDR的有关代码
SD和USB烧写逻辑程序:
USB裸机程序都是下载到D0020010中,之前一直没注意,掉电就没了
SD运行裸机程序我认为可以多次,因为程序在SD卡中存着
SD下载裸机程序需要16字节的校验头,而且大小不能超过16k,usb下载不需要,大小限制还不清楚,好像是不能超过iram的大小,我猜测超过之后需要长跳转在ddr中运行,(但是裸机程序不提供初始化DDR,所以我们要先下载能初始化ddr的代码到iram中,x210_usb.bin,然后将裸机程序下载到DDR中运行((我们将下载地址和链接地址设置成一样,应该就不需要进行重定位了,)注意位置有关码链接地址需要改变))在DDR初始化好之后,可以直接将代码重定位到DDR中,长跳转到DDR中执行,因为在memory map中,内存和IRAM都是统一编址的,不需要其他操作,直接访问地址即可。
也可以不重定位,不将代码分成两部分(一部分在iram,一部分在dram),而是将代码都放在dram,这样就不需要重定位了,只需要将下载地址和链接地址设置成一样。
之前的烧录从来没有对IROM操作过,我猜测不能对其操作,只可读不可写,因为IROM程序掉电不丢失,开放给用户使用可能会将关键部分擦除。