usb linux bootloader,BIOS,Bootloader和U-boot的区别

转载自http://blog.csdn.net/conowen/article/details/7253620

bios

BIOS是英文"Basic Input Output System"的缩略语,直译过来后中文名称就是"基本输入输出系统"。其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启动程序。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。

BootLoader

BootLoader是一段小程序,可以把它想象成PC机linux上的GRUB/LILO引导程序,只不过在嵌入式linux中,没有BIOS,而是直接从flash中运行,来装载内核。它可以初始化硬件设备,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统做好准备。

一个嵌入式系统从软件角度来看分为三个层次:

1.引导加载程序

包括固化在固化中的boot程序(可选),和BootLoader两大部分

2.linux内核

特定于嵌入式平台的定制内核

3.文件系统

包括了系统命令和应用程序

--------------------------------------------------------------------------------

BootLoader-->Boot Parameters-->Kernel-->Root Filesystem

--------------------------------------------------------------------------------

为什么需要进行bootloader移植?

答:1.因为每种不同的CPU体系结构都有不同的BootLoader

2.BootLoader依赖于具体的嵌入式板级设备的配置

--------------------------------------------------------------------------------

BootLoader启动过程可分为单阶段和多阶段(stage1、stage2),其中stage1完成初始化硬件,如CPU寄存器、内存控制器,为stage2准备内存空间。一般stage1是可以直接在nor flash中运行的,并将stage2复制到内存RAM中,设置堆栈,然后跳转到stage2(从这也可以看出stage2是在RAM中运行的,与stage1不同)

BootLoader的stage1通常包括以下步骤:

1.硬件设备初始化  如CPU寄存器、内存控制器

2.为加载BootLoader的stage2准备RAM空间

3.拷贝BootLoader的stage2到RAM空间中

4.设置好堆栈    为什么?为了跳转到stage2的入口,因为stage2大多数是用C语言写的

5.跳转到stage2的C入口点

BootLoader的stage2通常包括以下步骤:

1.初始化本阶段要使用到的硬件设备    各种设备,如网卡

2.将内核映像和根文件系统映像从flash上读到RAM中去

3.调用内核

--------------------------------------------------------------------------------

uboot

Uboot用于多种嵌入式CPU的BootLoader程序

支持多种嵌入式操作系统的引导

UBOOT目录结构

1.Borad        与开发板有关的文件。第一个开发板都以一个子目录出现在当前目录中

2.Common    实现Uboot支持的命令

3.Cpu        与特定CPU架构相关的代码,支持的CPU对应一个子目录(注意CPU与开发板的区别)

3.Disk        对磁盘的支持

4.Doc        文档目录

5.Drivers    Uboot支持的设备驱动程序  如各种网卡、串品、USB、支持CFI的Flash

6.Fs         文件系统的支持

7.Iclude    Uboot使用的头文件。该目录下configs目录有与开发板相关的配置头文件        该目录下的asm目录有与CPU体系结构相关的头文件

8.Net        与网络协议相关的代码    各路协议的实现

9.Tools        生成Uboot的工具,如:mkimage,crc等等

Uboot编译分为两步

1.执行每种board相关的配置    如:make amdk_2420

2.编译生成uboot.bin文件        如:make CROSS_COMPILE=arm-linux-(指定正确路径)

--------------------------------------------------------------------------------

UBOOT基于单板机提供了丰富的命令集操作

UBOOT命令

printenv查看环境变量(相当全局变量?)

setenv 添加、修改、删除环境变量

1.setenv name value

set environment variable 'name' to 'value...'

2.setenv name

delete environment variable 'name'

saveenv保存环境变量

将当前定义的所有变量及其值存入flash中

--------------------------------------------------------------------------------

---------------------文件下载------------------------------------

tftp 通过网络下载文件     使用前,配置好网络

配置网络:1.setenv ethaddr 12:34:56:78:8A:BC

2.setenv ipaddr 192.168.1.1

3.setenv serverip 192.168.1.254  (tftp服务器的地址)

连接下载:tftp 32000000 uImage

把server(IP=环境变量中设置的serverip)服务目录下的uImage通过tftp读入到0x32000000处

md 显示内存区的内容

md[.b,.w,.l]address    如:md.w 1000000

mm[.b,.w,.l]address    如:mm.w 100000

mm 修改内存,地址自动递增    提供了一种互动修改存储器内容的方法,如果没有输入任何值,按回车内容保持不变,输入空格然后按下回车,结束输入

flinfo    查看Flash扇区信息

--------------------------------------------------------------------------------

protect Flash写保护  打开或关闭扇区写保护

用法:

protect off all        关闭所有扇区的写保护

protect on all         打开所有扇区的写保护

protect off start end     关闭从start到end扇区的写保护-----》protect off 0 1ffff(前一扇区减去1?)

protect on start end     打开从start到end扇区的写保护

--------------------------------------------------------------------------------

erase 擦除flash扇区

用法: erase start end    如: erase 30000 1efff

在使用cp命令向Nor型Flash写入数据之前必须先使用erase命令擦除flash

cp 数据拷贝

cp [.b,.w,.l]saddress daddress len

cp提供了一种内存与内存,内存与Flash之间数据拷贝的方法

如:cp.b 31000000 50000 d0000 即是将内存地址0x31000000处的数据(长度为0xd0000)拷贝到地址0x50000处(Flash中)

--------------------------------------------------------------------------------

执行程序

go 执行内存中的二进制代码,一个简单的跳转到指定地址

go addr[arg...]

start application at address 'addr',

passing 'arg' as arguments

bootm 执行内存中的二进制代码

bootm [addr[arg...]]       要求二进制代码有固定格式的文件头

boot application image stored in memory passing arguments 'arg...';

when booting a Linux kernel,'arg' can be the address of an initrd image

bdinfo    显示开发板信息  (可用于启动linux内核)

bdinfo命令将在终端显示诸如内存地址和大小、时钟频率、MAC地址等信息

这些信息在传递给LIUNX内核一些参数时可能会用到

设置自动启动

setenv bootcmd tftp 31000000 uImage \;bootm 31000000

saveenv

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
有没有想过,像使用U盘一样升级STM32固件,非常简单,非常方便 1: 插入电脑USB接口 2: 把升级固件拖到设备盘符 3: 升级完成 抛弃繁琐的USB DFU,抛弃落后的串口升级,让我们来谈谈U盘升级STM32 1. 为什么设计这个BOOT LOADER 在电子产品开发过程中,为了满足市场需要,经常是先开发出一个简单可用的版本,然后逐步迭代升级,修复bug,并增强系统功能 一个稳定,简单,安全的升级方式,就变得非常重要 对于嵌入式系统来说,常见的升级方式为 串口升级(私有协议或者X-Modem) USB升级(DFU) U盘升级(OTG) 网络升级 无线升级(OTA) 从技术来说,这几种升级方式大同小异,原理类似:都是一个Loader代理接收数据通道的数据,然后解密,烧录到FLASH中;但用户体验完全不同,拿串口升级来说,首先用户需要一个串口软件,然后对于没有硬件串口的PC来说,就需要一个USB转串口设备,对于不同PC平台,串口软件就不一样,这需要学习成本,过程繁琐;所以在一些需要用户自行升级远程设备的情况下,即便是通过电话指导,80%的用户仍然不知道怎么升级,导致失败 USB的DFU升级,也是类似的问题,它设计的初衷就是面向专业用户的,而不是小白!所以需要安装DFU软件,按照手册来一步步升级 OTA升级和网络升级,体验好些,可用做到无感升级,但不适合所有场景 而U盘升级,用户学习成本最低,U盘大家都知道,然后拷贝一个Bin文件进去,插入设备,重启设备,就完成升级了,非常简单。类似的变种,比如手机升级,是最先进的,直接将手机模拟成U盘,然后用户拷贝数据到手机,重启就好了,非常简单 在嵌入式系统中,还没这么方便的升级手段,虽然ARM的Mbed有一种类似的固件更新功能,但它是专门为调试器设计的,不能内嵌到用户MCU中 所以,我将手机升级的方案引入到嵌入式系统中,从而为大家提供一个实现稳定,安全,零学习成本的升级方案 经过一段时间的学习研究,有了这个USB MSD Bootloader 2. 功能特点 只占用15K FLASH空间 简单易用,直接拖拽文件进行固件升级,无需任何专业知识 采用USB大容量设备类,不用安装任何驱动 支持各种系统(Windows/Linux/Mac/Android) 不用开发任何上位机,提高产品效率 支持各种加密算法(AES256等),轻松安全升级 自动识别Bin,Hex,自定义加密固件(后缀为sec)文件 支持MD5文件校验机制,保证固件升级的完整性 显示设备升级状态信息 支持长文件名升级 多种措施保证系统健壮性,保证Bootloader不会被误擦除,保证APP合法性 支持用户自定义加密算法和完整校验算法,极致安全 3. 系统原理 系统开机上电后,Bootloader接管系统,初始化USB硬件,等待USB连接 Bootloader在启动后1秒内,检测USB是否连接PC:如果连接PC,则进入固件升级模式,执行第3步;超时则跳转第8步,尝试执行用户APP Bootloader模拟成MSD设备,构建FAT16虚拟文件系统,U盘名为”Bootloader”,容量为100M,但具体实际可用空间,根据用户MCU来确定,建议不要复制除APP之外的无关文件 当用户复制文件到U盘时,Bootloader会判断文件后缀和判断文件size,如果size大于实际的MCU可用FLASH或者文件后缀不合法,则进入错误状态,更新状态文件,重新枚举USB 文件后缀和size通过检测后,Bootloader会截获PC发送文件数据流,并写入MCU 对应的Flash中 如果写入过程中出错,则终止操作,擦除APP内容,进入错误状态,更新状态文件,重新枚举USB 成功写入后,Bootloader更新状态文件,重新枚举USB,显示升级完成;但不会运行APP,只有拔掉USB后,再次重启,才会进入第8步,尝试运行APP Bootloader检查APP固件的栈和入口函数合法性,只有通过检测后,才开始执行APP。检测判断条件是栈指针必须在RAM地址空间内,入口函数地址必须处于THUMB模式,并LSB为1 停止USB设备,关掉所有的中断,执行APP,APP开始接管系统 4. 支持芯片 STM32F101/3/5/7 重点来了,点击下面链接,下载固件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值