报价
HOME
报价
正文内容
nand emmc 启动电阻 「正点原子Linux连载」第九章IMX6U启动方式详解
发布时间 : 2025-02-23
作者 : 小编
访问数量 : 23
扫码分享至微信

「正点原子Linux连载」第九章IMX6U启动方式详解

1)实验平台:正点原子Linux开发板

2)摘自《正点原子 I.MX6U嵌入式Linux驱动开发指南

关注官方微信号公众号,获取更多资料:正点原子

第九章I.MX6U启动方式详解

I.MX6U支持多种启动方式以及启动设备,比如可以从SD/EMMC、NAND Flash、QSPI Flash等启动。用户可以根据实际情况,选择合适的启动设备。不同的启动方式其启动方式和启动要求也不一样,比如上一章中的从SD卡启动就需要在bin文件前面添加一个数据头,其它的启动设备也是需要这个数据头的。本章我们就来学习一下I.MX6U的启动方式,以及不同设备启动的要求。

9.1启动方式选择

BOOT的处理过程是发生在I.MX6U芯片上电以后,芯片会根据BOOT_MODE[1:0]的设置来选择BOOT方式。BOOT_MODE[1:0]的值是可以改变的,有两种方式,一种是改写eFUSE(熔丝),一种是修改相应的GPIO高低电平。第一种修改eFUSE的方式只能修改一次,后面就不能在修改了,所以我们不使用。我们使用的是通过修改BOOT_MODE[1:0]对应的GPIO高低电平来选择启动方式,所有的开发板都使用的这种方式,I.MX6U有一个BOOT_MODE1引脚和BOOT_MODE0引脚,这两个引脚对应这BOOT_MODE[1:0]。I.MX6U-ALPHA开发板的这两个引脚原理图如图9.1.1所示:

图9.1.1 BOOT_MODE原理图

其中BOOT_MODE1和BOOT_MODE0在芯片内部是有100KΩ下拉电阻的,所以默认是0。BOOT_MODE1和BOOT_MODE0这两个引脚我们也接到了底板的拨码开关上,这样我们就可以通过拨码开关来控制BOOT_MODE1和BOOT_MODE0的高低电平。以BOOT_MODE1为例,当我们把BOOT_CFG的第一个开关拨到“ON”的时候,就相当于BOOT_MODE1引脚通过R88这个10K电阻接到了3.3V电源,芯片内部的BOOT_MODE1又是100K下拉电阻接地,因此此时BOOT_MODE1的电压就是100/(10+100)*3.3V= 3V,这是个高电平,BOOT_CFG这个拨码开关的不管哪个位拨到“ON”就是高电平,拨到“OFF”就是低电平。

而I.MX6U有四个BOOT模式,这四个BOOT模式由BOOT_MODE[1:0]来控制,也就是BOOT_MODE1和BOOT_MODE0这两IO,BOOT模式配置如表9.1.1所示:

表9.1.1 BOOT类型

在表9.1.1中,我们用到的只有第二和第三种BOOT方式。

9.1.1串行下载

当BOOT_MODE1为0,BOOT_MODE0为1的时候此模式使能,串行下载的意思就是可以通过USB或者UART将代码下载到板子上的外置存储设备中,我们可以使用OTG1这个USB口向开发板上的SD/EMMC、NAND等存储设备下载代码。我们需要将BOOT_MODE1拨到“OFF”,将BOOT_MODE0拨到“ON”。这个下载是需要用到NXP提供的一个软件,一般用来最终量产的时候将代码烧写到外置存储设备中的,我们后面讲解如何使用。

9.1.2 内部BOOT模式

当BOOT_MODE1为1,BOOT_MODE0为0的时候此模式使能,在此模式下,芯片会执行内部的bootROM代码,这段boot ROM代码会进行硬件初始化(一部分外设),然后从boot设备(就是存放代码的设备、比如SD/EMMC、NAND)中将代码拷贝出来复制到指定的RAM中,一般是DDR。

9.2 BOOT ROM初始化内容

当我们设置BOOT模式为“内部BOOT模式”以后,I.MX6U内部的boot ROM代码就会执行,这个boot ROM代码都会做什么处理呢?首先肯定是初始化时钟,boot ROM设置的系统时钟如图9.2.1所示:

图9.2.1boot ROM系统时钟设置

在图9.2.1中BT_FREQ模式为0,可以看到,boot ROM会将I.MX6U的内核时钟设置为396MHz,也就是主频为396Mhz。System PLL=528Mhz,USB PLL=480MHz,AHB=132MHz,IPG=66MHz。关于I.MX6U的系统时钟,我们后面会详细讲解。

内部boot ROM为了加快执行速度会打开MMU和Cache,下载镜像的时候L1ICache会打开,验证镜像的时候L1DCache、L2 Cache和MMU都会打开。一旦镜像验证完成,boot ROM就会关闭L1 DCache、L2 Cache和MMU。

中断向量偏移会被设置到boot ROM的起始位置,当boot ROM启动了用户代码以后就可以重新设置中断向量偏移了。一般是重新设置到我们用户代码的开始地方,关于中断的内容后面会详细讲解。

9.3启动设备

当BOOT_MODE设置为内部BOOT模式以后,可以从一下设备中启动:

、接到EIM接口的CS0上的16位NOR Flash。

、接到EIM接口的CS0上的OneNAND Flash。

、接到GPMI接口上的MLC/SLC NAND Flash,NAND Flash页大小支持2KByte、4KByte和8KByte,8位宽。

、Quad SPI Flash。

、接到USDHC接口上的SD/MMC/eSD/SDXC/eMMC等设备。

、SPI接口的EEPROM。

这些启动设备如何选择呢?I.MX6U同样提供了eFUSE和GPIO配置两种,eFUSE就不讲解了。我们重点看如何通过GPIO来选择启动设备,因为所有的I.MX6U开发板都是通过GPIO来配置启动设备的。正如启动模式由BOOT_MODE[1:0]来选择一样,启动设备是通过BOOT_CFG1[7:0]、BOOT_CFG2[7:0]和BOOT_CFG4[7:0]这24个配置IO,这24个配置IO刚好对应着LCD的24根数据线LCD_DATA0~LCDDATA23,当启动完成以后这24个IO就可以作为LCD的数据线使用。这24根线和BOOT_MODE1、BOOT_MODE0共同组成了I.MX6U的启动选择引脚,如图9.3.1所示:

图9.3.1启动引脚

通过图9.3.1中的26个启动IO即可实现I.MX6U从不同的设备启动,BOOT_MODE1和BOOT_MODE0已经讲过了。看到这24个IO是不是头大?调整这24个IO的高低电平得多复杂啊?其实不然,虽然有24个IO,但是实际需要调整的只有那几个IO,其它的IO全部下拉接地即可,也就是设置为0。打开I.MX6U-ALPHA开发板的核心板原理图,这24个IO的默认设置如图9.3.1所示:

图9.3.1 BOOT_CFG默认设置

可以看出在图9.3.1中大部分的IO都接地了,只有几个IO接高,尤其是BOOT_CFG4[7:0]这8个IO都10K电阻下拉接地,所以我们压根就不需要去关注BOOT_CFG4[7:0]。我们需要重点关注的就只剩下了BOOT_CFG2[7:0]和BOOT_CFG1[7:0]这16个IO。这16个配置IO含义在原理图的左侧已经贴出来了,如图9.3.2所示:

图9.3.2 BOOT_CFG引脚含义

图9.3.2看着是不是也很头大,BOOT_CFG1[7:0]和BOOT_CFG2[7:0]这16个IO还能不能在减少呢?可以!打开I.MX6U-ALPHA开发板的底板原理图,底板上启动设备选择拨码开关原理图如图9.3.3所示:

图9.3.3 BOOT选择拨码开关

在图9.3.3中,除了BOOT_MODE1和BOOT_MODE0必须引出来,LCD_DATA3~LCDDATA7、LCD_DATA11这6个IO也被引出来了,可以通过拨码开关来设置其对应的高低电平,拨码开关拨到“ON”就是1,拨到“OFF”就是0。其中LCD_DATA11就是BOOT_CFG2[3],LCD_DATA3~LCD_DATA7就是BOOT_CFG1[3]~BOOT_CFG1[7],这6个IO的配置含义如表9.3.1所示:

表9.3.1 BOOT IO含义

根据表9.3.1中的BOOT IO含义,I.MX6U-ALPHA开发板从SD卡、EMMC、NAND启动的时候拨码开关各个位设置方式如表9.3.2所示:

表9.3.2 I.MX6U-ALPHA开发板启动设置

我们在“第八章汇编LED灯试验”中,最终的可执行文件led.bin烧写到了SD卡里面,然后开发板从SD卡启动,其拨码开关就是根据表9.3.2来设置的,通过上面的讲解就知道为什么拨码开关要这么设置了。

9.4镜像烧写

注意!本小节会分析bin文件添加的头部信息,但是在笔者写本教程的时候关于I.MX系列SOC头部信息的资料很少,基本只能参考NXP官方资料,而官方资料有些地方讲解的又不是很详细。所以本节有部分内容是笔者根据NXP官方u-boo.imx文件的头部信息反推出来的,因此难免有错误的地方,还望大家谅解!如有发现错误之处,欢迎大家在www.openedv.com论坛上留言。

前面我们设置好BOOT以后就能从指定的设备启动了,但是你的设备里面得有代码啊,在第八章中我们使用imxdownload这个软件将led.bin烧写到了SD卡中。imxdownload会在led.bin前面添加一些头信息,重新生成一个叫做load.imx的文件,最终实际烧写的是laod.imx。那么肯定就有人问:imxdownload究竟做了什么?load.imx和led.bin究竟是什么关系?本节我们就来详细的讲解一下imxdownload是如何将led.bin打包成load.imx的。

学习STM32的时候我们可以直接将编译生成的.bin文件烧写到STM32内部flash里面,但是I.MX6U不能直接烧写编译生成的.bin文件,我们需要在.bin文件前面添加一些头信息构成满足I.MX6U需求的最终可烧写文件,I.MX6U的最终可烧写文件组成如下:

、Image vectortable,简称IVT,IVT里面包含了一系列的地址信息,这些地址信息在ROM中按照固定的地址存放着。

、Bootdata,启动数据,包含了镜像要拷贝到哪个地址,拷贝的大小是多少等等。

、Deviceconfigurationdata,简称DCD,设备配置信息,重点是DDR3的初始化配置。

、用户代码可执行文件,比如led.bin。

可以看出最终烧写到I.MX6U中的程序其组成为:IVT+Bootdata+DCD+.bin。所以第八章中的imxdownload所生成的load.imx就是在led.bin前面加上IVT+Bootdata+DCD。内部Boot ROM会将load.imx拷贝到DDR中,用户代码是要一定要从0X87800000这个地方开始的,因为链接地址为0X87800000,load.imx在用户代码前面又有3KByte的IVT+Boot Data+DCD数据,下面会讲为什么是3KByte,因此load.imx在DDR中的起始地址就是0X87800000-3072=0X877FF400。 

9.4.1 IVT和Boot Data数据

load.imx最前面的就是IVT和Boot Data,IVT包含了镜像程序的入口点、指向DCD的指针和一些用作其它用途的指针。内部Boot ROM要求IVT应该放到指定的位置,不同的启动设备位置不同,而IVT在整个load.imx的最前面,其实就相当于要求load.imx在烧写的时候应该烧写到存储设备的指定位置去。整个位置都是相对于存储设备的起始地址的偏移,如图9.4.1.1所示:

图9.4.1.1 IVT偏移

以SD/EMMC为例,IVT偏移为1Kbyte,IVT+Bootdata+DCD的总大小为4KByte-1KByte=3KByte。假如SD/EMMC每个扇区为512字节,那么load.imx应该从第三个扇区开始烧写,前两个扇区要留出来。load.imx从第3KByte开始才是真正的.bin文件。那么IVT里面究竟存放着什么东西呢?IVT里面存放的内容如图9.4.1.2所示:

图9.4.1.2 IVT格式

从图9.4.1.2可以看到,第一个存放的就是header(头),header格式如图9.4.1.3所示:

图9.4.1.3 IVT header格式

在图9.4.1.3中,Tag为一个字节长度,固定为0XD1,Length是两个字节,保存着IVT长度,为大端格式,也就是高字节保存在低内存中。最后的Version是一个字节,为0X40或者0X41。

Boot Data的数据格式如图9.4.1.4所示:

图9.4.1.4 Boot Data数据格式

实际情况是不是这样的呢?我们用winhex软件打开load.imx一看便知,winhex可以直接查看一个文件的二进制格式数据,winhex软件我们已经放到了开发板光盘中,路径为:开发板光盘->3、软件->winhexv19.7.zip,大家自行安装。用winhex打开以后的load.imxd如图9.4.1.4所示:

图9.4.1.4load.imx部分内容

图9.4.1.4是我们截取的load.imx的一部分内容,从地址0X00000000~0X000025F,共608个字节的数据。我们将前44个字节的数据按照4个字节一组组合在一起就是:0X402000D1、0X87800000、0X00000000、0X877FF42C、0X877FF420、0X877FF400、0X00000000、0X00000000、0X877FF000、0X00200000、0X00000000。这44个字节的数据就是IVT和Boot Data数据,按照图9.4.1.2和图9.4.1.4所示的IVT和Boot Data所示的格式对应起来如表9.4.1.1所示:

表9.4.1.1load.imx结构分析

表9.4.1.1load.imx结构分析

在表9.4.1.1中,我们详细的列出了load.imx的IVT+Boot Data每32位数据所代表的意义。这些数据都是由imxdownload这个软件添加进去的。

9.4.2 DCD数据

复位以后,I.MX6U片内的所有寄存器都会复位为默认值,但是这些默认值往往不是我们想要的值,而且有些外设我们必须在使用之前初始化它。为此I.MX6U提出了一个DCD(Device Config Data)的概念,和IVT、Boot Data一样,DCD也是添加到load.imx里面的,紧跟在IVT和Boot Data后面,IVT里面也指定了DCD的位置。DCD其实就是I.MX6U寄存器地址和对应的配置信息集合,Boot ROM会使用这些寄存器地址和配置集合来初始化相应的寄存器,比如开启某些外设的时钟、初始化DDR等等。DCD区域不能超过1768Byte,DCD区域结构如图9.4.2.1所示:

图9.4.2.1 DCD区域结构

DCD的header和IVT的header类似,结构如图9.4.2.2所示:

图9.4.2.2 DCD的header结构

其中Tag是单字节,固定为0XD2,Length为两个字节,表示DCD区域的大小,包含header,同样是大端模式,Version是单字节,固定为0X40或者0X41。

图9.4.2.1中的CMD就是要初始化的寄存器地址和相应的寄存器值,结构如图9.4.2.3所示:

图9.4.2.3 DCD CMD命令格式

图9.4.2.3中Tag为一个字节,固定为0XCC。Length是两个字节,包含写入的命令数据长度,包含header,同样是大端模式。Parameter为一个字节,这个字节的每个位含义如图9.4.2.4所示:

图9.4.2.4 Parameter结构

图9.4.2.4中的bytes表示是目标位置宽度,单位为byte,可以选择1、2、和4字节。flags是命令控制标志位。

图9.4.2.3中的Address和Vlalue/Mask就是要初始化的寄存器地址和相应的寄存器值,注意采用的是大端模式!DCD结构就分析到这里,在分析IVT的时候我们就已经说过了,DCD数据是从图9.4.1.4的0X2C地址开始的。根据我们分析的DCD结构可以得到load.imx的DCD数据如表9.4.2.1所示:

表9.4.2.1 DCD数据结构

从图9.4.2.1中可以看出,DCD里面的初始化配置主要包括三方面:

①、设置CCGR0~CCGR6这7个外设时钟使能寄存器,默认打开所有的外设时钟。

②、配置DDR3所用的所有IO。

③、配置MMDC控制器,初始化DDR3。

I.MX6U的启动过程我们就讲解到这里,本章我们详细的讲解了I.MX6U的启动模式、启动设备类型和镜像烧写过程。总结一下,我们编译出来的.bin文件不能直接烧写到SD卡中,需要在.bin文件前面加上IVT、Boot Data和DCD这三个数据块。这三个数据块是有指定格式的,我们必须按照格式填写,然后将其放到.bin文件前面,最终合成的才是可以直接烧写到SD卡中的文件。

万事开头难 - 介绍IMX6ULL启动方式

不同开发板,启动方式不一样,今天我们来介绍imx6ull开发板的启动方式,这非常重要。若不了解清楚启动方式,后面的所有开发工作便无从谈起。

本文摘自100ask_imx6ull 开发板 配套学习手册-《嵌入式Linux应用开发完全手册_韦东山全系列视频文档全集V2.6》.pdf

1.1 IMX6ULL 启动方式

参考资料:

开发板资料网盘

路径:

06_Datasheet(数据手册)

-> Core_board->CPU->IMX6ULLRM.pdf”

中《Chapter 8: System Boot》。

1.1.1芯片手册讲解

IMX6ULL芯片内部有一个boot ROM,上电后boot ROM上的程序就会运行。它会根据BOOT_MODE[1:0]的值,以及eFUSE或GPIO的值决定后续的启动流程。

注:eFUSE即熔丝,只能烧写一次,一般正式发布产品时烧写最终值;平时调试时通过GPIO来设置开发板的启动方式。

boot ROM上的程序功能强大,可以从USB口或串口下载程序并把它烧写到Flash等设备上,也可以从SD卡或EMMC、Flash等设备上读出程序、运行程序。

问题来了:

① boot ROM是从USB口下载、运行程序,还是从SD卡等设备上读出、运行程序,这由谁决定?

由BOOT_MODE[1:0]的值来决定启动方式,它们来自于2个引脚BOOT_MODE1、BOOT_MODE0。这2个引脚在上电时是输入引脚,芯片启动后采集这2个引脚的值,存入BOOT_MODE寄存器。以后这2个引脚就可以用于其他功能,不会影响到BOOT_MODE寄存器。

BOOT_MODE[1:0]的值确定了4种启动模式,如下图:

BOOT_MODE

在100ASK_IMX6ULL中,这2个引脚对应的原理图如下:

原理图

00模式;

在我们的开发过程中很少用到,简单介绍一下:在这种模式下,GPIO的值被忽略。Boot ROM会根据eFUSE的值来选择启动设备、设置启动设备。但是,对于刚出厂的芯片eFUSE值可能是错乱的、不适合你的设备的,怎么办?eFUSE中有一个值BT_FUSE_SEL,它的出厂值是0,表示eFUSE未被烧写。

boot ROM程序发现BT_FUSE_SEL为0时,它会通过USB或串口来下载程序;发现BT_FUSE_SEL为1时,才会根据eFUSE的值选择启动设备,读出、运行该设备上的程序。

01模式

boot ROM程序通过USB或串口下载、运行程序,这个模式可以用来烧写EMMC等设备。我们的开发板出厂时,就是通过这个模式下载、烧写出厂程序的。

10模式

称之为内部模式,简单地说就是从SD卡、EMMC等设备启动程序。这就引入下面第2个问题。

② 如何选择启动设备?

00模式 下是通过eFUSE的值选择启动设备,我们不关心。

10模式 下既可以通过eFUSE的值也可以通过GPIO的值来选择启动设备,但是到底通过谁来决定?eFUSE中有一个值BT_FUSE_SEL,对,又是它。它的初始值为0,表示eFUSE未被烧写。

在10模式下,当BT_FUSE_SEL为0时就会通过GPIO来选择启动设备;当BT_FUSE_SEL为1时就会通过eFUSE来选择启动设备。

在开发阶段,我们使用GPIO来选择设备,这就引入下面第3个问题。

③ 如何通过eFUSE或GPIO选择、设置启动设备?

通过eFUSE或GPIO不仅能选择启动设备,还可以设置启动设备。为什么还需要设置?比如Nand Flash参数各有不同,有些的页大小是2048,有些是4096。这些参数不同,boot ROM程序读Nand Flash的方法就不同,我们必须把这些参数告诉boot ROM:通过eFUSE或GPIO来标明这些参数。

首先看看要设置哪些eFUSE或GPIO来选择不同的启动设备。

BOOT_CFG1设置

从上图可知,既可以使用eFUSE也可以使用GPIO来选择启动设备,换句话说GPIO可以覆盖eFUSE的值。

哪些GPIO覆盖哪些eFUSE?

这可以查看IMX6ULL芯片手册《Chapter 8: System Boot》里的《GPIO boot overrides》,我们把它摘出来放在1.1.3小节里。

选择启动设备后,还需要标明一些参数。比如选择EMMC启动时,EMMC接在哪一个接口,eSDHC1还是eSDHC2?它的速度如何?比如选择TF卡启动时,TF卡接在哪一个接口,eSDHC1还是eSDHC2?它的速度如何?

假设使用EMMC启动,或是TF卡启动,怎么设置eFUSE或GPIO?这些信息可以查询IMX6ULL芯片手册《Chapter 5: Fusemap》,摘录如下。

Fusemap

当BOOT_MODE设置为0b00时,通过eFUSE选择启动设备,通过eFUSE获得设备的参数。

当BOOT_MODE设置为0b10时,通过eFUSE或GPIO来选择启动设备,获得设备的参数;使用eFUSE还是GPIO由eFUSE中的BT_FUSE_SEL决定,它默认是0,表示使用GPIO。

以BOOT_MODE为0b10为例,解析一下上图。要设置为SD卡、TF卡启动,有2个设置方法:

a. 设置eFUSE的BOOT_CFG1[7:5]为0b010,

或 b. 查看《3.1.3 GPIO boot overrides》确定BOOT_CFG1[7:5]对应的GPIO为LCD1_DATA07~05,把这3个引脚设置为0b010。

根据SD卡、TF卡的性能,可以设置eFUSE或GPIO来表示它能否提供更高的速度:

a. 设置eFUSE的BOOT_CFG1[4:0],

或 b. 查看《3.1.3 GPIO boot overrides》确定BOOT_CFG1[4:0]对应的GPIO为LCD1_DATA04~00,设置这些引脚。

IMX6ULL有两个SD卡、TF卡接口,使用哪一个接口?请看下表:

a. 设置eFUSE的BOOT_CFG2[4:3]可以确定使用eSDHC1或eSDHC2,

或 b. 查看《3.1.3 GPIO boot overrides》确定BOOT_CFG2[4:3]对应的GPIO为LCD1_DATA12~11,设置这些引脚

BOOT_CFG

通过eFUSE或GPIO,还可以标明启动设备的更多参数,具体细节可以参考芯片手册《Chapter 5: Fusemap》,作为硬件开发人员需要去细细研究;作为软件开发人员,实际上只需要看开发板手册知道怎么设置启动开关 即可。

1.1.2 IMX6ULL启动方式选择

100ASK_IMX6ULL开发板上的红色拨码开关用来设置启动方式、选择启动设备,支持这3种方式:EMMC启动、SD卡启动、USB烧写。

板子背后画有一个表格,表示这3种方式如何设置。

表格如下:

表格

拔码开关中的SW3、SW4用来设置BOOT_MODE,ON表示0,OFF表示1。

所以当SW3、SW4设置为ON、OFF时,BOOT_MODE为0b10,将会使用SD卡、TF卡、EMMC等设备启动。

刚出厂的开发板中BT_FUSE_SEL默认为0,表示使用GPIO来设置参数。即使用LCD1_DATA07~05来选择启动设备。

100ASK_IMX6ULL开发板只支持SD/TF卡、EMMC启动,LCD1_DATA07~05为0b010时选择SD/TF卡启动,LCD1_DATA07~05为0b011时选择EMMC启动。

这两种启动设备对应的LCD1_DATA07~06的值相同,都是0b01,这在核心板上已经通过电阻设置好,我们只需要在拨码开关上设置SW1(对应LCD1_DATA05)就可以。

IMX6ULL上有2个EMMC Flash接口,也复用为2个SD/TF卡接口,通过LCD1_DATA12~11来选择接口。

0b00对应eSDHC1接口,0b01对应eSDHC2接口。LCD1_DATA12的值在核心板上已经通过电阻设置好。

LCD1_DATA11的值通过拨码开关SW2来设置:ON表示0,对应eSDHC1接口,100ASK_IMX6ULL的TF卡接口使用了eSDHC1接口;OFF表示1,对应eSDHC2接口,100ASK_IMX6ULL的EMMC接口使用了eSDHC2接口。

这3种启动方式的设置示意图如下:

要注意的是,设置为USB启动时,不能插上SD卡、TF卡 。刚出厂的板子在EMMC上烧写了系统,你可以设置为EMMC启动方式。

1.1.3 GPIO boot overrides

IMX6ULL中既可以通过eFUSE也可以通过GPIO来选择、设置启动设备,在手册里大部分场合只列出了eFUSE,对应的GPIO需要查表:IMX6ULL芯片手册《Chapter 8: System Boot》里的《GPIO boot overrides》。

我们把它摘录出来。

总结

整篇读下来,概念有点多,你可能会感觉有点抽象,其实现在不理解启动方式原理没关系,现在只要记住《3种启动方式的设置示意图》即可,清楚怎么拨码对应什么启动方式,原理留到后期再研究也行。

精品推荐

文中提到的100ask_imx6ull,是用来学习嵌入式Linux的不错选择,0利润,外设丰富,一千多页文档,一百多讲视频,开源共享。

相关问答

Android手机为什么用两到三年之后就会变卡?-ZOL问答

系统内存和硬盘调度是很重要的一个原因,这里的硬盘也称存储,如今已发展到普遍为emmc5.1,理论速度很高,但安卓为了保证存储稳定性,实际效率变低,尤其是安卓5.1集...

荣耀9发热吗?

最近一直想换手机,抢了两次努比亚Z17都没抢到货,在16号抱着试试看的态度在京东上竟然买到了荣耀9,对于京东物流必须给个赞,在17号中午手机就送到了,下面来说...

 秦刚自杀  网课爆破 
王经理: 180-0000-0000(微信同号)
10086@qq.com
北京海淀区西三旗街道国际大厦08A座
©2025  上海羊羽卓进出口贸易有限公司  版权所有.All Rights Reserved.  |  程序由Z-BlogPHP强力驱动
网站首页
电话咨询
微信号

QQ

在线咨询真诚为您提供专业解答服务

热线

188-0000-0000
专属服务热线

微信

二维码扫一扫微信交流
顶部