uboot 启动参数
Uboot下Flash烧写步骤
烧写映像文件到NAND Flash
1)地址空间说明
| 16M | 32M |
|---------------|----------------------------------|---------
tftp 82000000 uboot_release_1M.bin
sf probe 0
sf erase 0 100000
sf write 82000000 0 100000
reset
3)烧写内核和文件系统
save
5) 烧写Flash文件
sf probe 0
mw.b 82000000 ff 1000000
tftp 82000000 flash.img
sf erase 0 1000000
sf write 82000000 0 1000000
nand erase 1000000 2000000
nand write.yaffs 82000000 1000000 974580 #注意:974580为rootf文件实际大小(16进制)
4)设置启动参数
setenv bootargs 'mem=64M console=ttyAMA0,115200 root=/dev/mtdblock2 rootfstype=yaffs2 mtdparts=hinand:16M(boot),32M(rootfs),32M(test)'
烧写映像文件到SPI Flash
1)地址空间说明
| ห้องสมุดไป่ตู้ 4M | 12M |
|---------------|----------------------------------|
根文件系统(rootfs)
根文件系统(rootfs)展开全文一、根文件系统的作用是linux挂载的第一个文件系统,rootfs包含shell命令、linux系统配置文件(文件系统的挂载、网络服务、用户名、主机名、用户密码、环境变量...)、linux应用程序、应用程序处理的数据、独立的驱动模块(*.ko)。
根文件系统,相当于linux内核外围的一个应用环境。
====================================== ========================================= =========================二、控制台输出:[ 4.183226] yaffs: dev is 32505860 name is "mtdblock4" rw //存放rootfs的设备名字mtdblock4 ,rw可读写[ 4.183291] yaffs: passed flags ""[ 4.337878] VFS: Mounted root (yaffs filesystem) on device 31:4. //31:4 --》主设备:次设备号[ 4.338028] Freeing init memory: 536K ---->rootfs挂载成功,释放内核中一些初始化函数所占用的内存[ 4.357023] usb 1-1: New USB device found, idVendor=1a40, idProduct=0101[ 4.357083] usb 1-1: New USB device strings: Mfr=0, Product=1, SerialNumber=0[ 4.357145] usb 1-1: Product: USB 2.0 Hub[ 4.357747] hub 1-1:1.0: USB hub found[ 4.357852] hub 1-1:1.0: 4 ports detected[ 5.886184] smdkc110-rtc smdkc110-rtc: rtc disabled, re-enabling[ 6.086924] eth0: link down[ 6.087198] ADDRCONF(NETDEV_UP): eth0: link is not ready[root@YueQian /]#[root@YueQian /]#[root@YueQian /]#[root@YueQian /]#最小的根文件系统的内容:# ls /bin home media proc sys usrdev lib mnt root tmp varetc lost+found opt sbin====================================== ========================================= =========================三、根文件系统启动过程1、uboot的启动参数:init=/linuxrcinit是linux运行时的第一个进程,该进程执行的是/linuxrc 其中linuxrc -> bin/busyboxinit=/sbin/init 其中:init -> ../bin/busybox--------------------------------------------------------------------------------------------------------2、内核启动后,首先通过vfs去挂在rootfs,然后再执行init=/linuxrc ,linuxrc是busybox这个工作生成的文件。
《uboot环境变量:详谈bootcmd和bootargs》
《uboot环境变量:详谈bootcmd和bootargs》1.uboot中的环境变量bootdelay:执⾏⾃动启动的等候秒数baudrate:串⼝控制台的波特率netmask:以太⽹接⼝的掩码ethaddr:以太⽹卡的⽹卡物理地址bootfile:缺省的下载⽂件bootargs:传递给内核的启动参数bootcmd:⾃动启动时执⾏的命令serverip:服务器端的ip地址ipaddr:本地ip 地址stdin:标准输⼊设备stdout:标准输出设备stderr:标准出错设备 以上是⼀些基本的环境变量。
uboot中⼀般会有⼀些缺省的环境变量。
在启动uboot后会将参数放在特定的FLASH区域,之后由kernel去获取解析。
还有另⼀种⽅法设置环境变量就是在uboot启动后进⼊命令⾏模式,设置环境变量,然后执⾏saveenv后,会将设置的环境变量保存到特定区域的FLASH中,由kernel去获取解析。
其中bootargs和bootcmd相对⽐较重要。
2.bootargs解析root: ⽬前很多新的开发板都是使⽤FLASH作为存储。
因为很多都直接使⽤MTD驱动程序。
MTD 驱动程序的主要优点在于 MTD 驱动程序是专门为基于闪存的设备所设计的,所以它们通常有更好的⽀持、更好的管理和基于扇区的擦除和读写操作的更好的接⼝。
Linux 下的 MTD驱动程序接⼝被划分为两类模块:⽤户模块和硬件模块。
有两个流⾏的⽤户模块可启⽤对闪存的访问: MTD_CHAR 和 MTD_BLOCK 。
MTD_CHAR 提供对闪存的原始字符访问,⽽ MTD_BLOCK 将闪存设计为可以在上⾯创建⽂件系统的常规块设备(象 IDE 磁盘)。
与MTD_CHAR 关联的设备是 /dev/mtd0、mtd1、mtd2(等等),⽽与 MTD_BLOCK 关联的设备是 /dev/mtdblock0、mtdblock1(等等)。
由于 MTD_BLOCK 设备提供象块设备那样的模拟,通常更可取的是在这个模拟基础上创建象 FTL 和 JFFS2 那样的⽂件系统。
mdio uboot 参数
mdio uboot 参数摘要:一、前言二、mdio uboot 参数简介1.mdio uboot 参数的作用2.mdio uboot 参数的配置方法三、mdio uboot 参数设置实战1.准备工作2.配置mdio uboot 参数3.编译与烧录四、总结正文:一、前言在嵌入式系统的开发过程中,uboot 是一个非常重要的环节。
uboot 是系统启动过程中的一个关键部分,负责硬件初始化、系统配置和启动。
在uboot 的配置过程中,mdio 参数的设置是一个关键环节。
本文将详细介绍mdio uboot 参数的相关知识。
二、mdio uboot 参数简介1.mdio uboot 参数的作用mdio 是multi-device io 的缩写,主要用于访问设备的数据总线。
在uboot 中,mdio 参数主要用于配置系统时钟、内存和设备访问。
通过设置mdio 参数,可以优化系统的性能和稳定性。
2.mdio uboot 参数的配置方法mdio uboot 参数的配置方法主要分为以下几个步骤:a.确定目标平台和器件型号b.查找相关文档和数据手册,了解器件的mdio 设置方法c.根据实际情况,配置相应的mdio 参数d.编译并烧录uboot三、mdio uboot 参数设置实战1.准备工作在进行mdio uboot 参数设置之前,需要确保目标平台和器件型号已经确定。
同时,需要查找相关文档和数据手册,了解器件的mdio 设置方法。
2.配置mdio uboot 参数以某款ARM 处理器为例,配置mdio uboot 参数的具体步骤如下:a.打开uboot 源码中的Makefile 文件,找到相关编译选项b.根据文档和数据手册,配置相应的编译选项c.编译并生成uboot 镜像文件3.编译与烧录将编译好的uboot 镜像文件烧录到目标平台,然后重启系统。
此时,系统将使用新的mdio 参数进行运行。
四、总结本文详细介绍了mdio uboot 参数的作用、配置方法和设置实战。
烧写ARM开发板系统教程-----uboot、内核以及文件系统
烧写ARM开发板系统教程-----uboot、内核以及⽂件系统⼀、sd启动将u-boot镜像写⼊SD卡,将SD卡通过读卡器接上电脑(或直接插⼊笔记本卡槽),通过"cat /proc/partitions"找出SD卡对应的设备,我的设备节点是/dev/sdb.(内存卡的节点)。
当有多个交叉编译器是,不⽅便设置环境变量时,可以在编译命令中指定交叉编译器,具体如下:在源码中操作以下步骤:make distcleanmake ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi- mrpropermake ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi- tiny210_configmake ARCH=arm CROSS_COMPILE=/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi- all spl编译出tiny210-uboot.bin,注意交叉编译⼯具路径执⾏下⾯的命令$sudo dd iflag=dsync oflag=dsync if=tiny210-uboot.bin of=/dev/sdb seek=1把内存卡插⼊开发板,使⽤串⼝⼯具设置环境变量:setenv gatewayip 192.168.1.1(电脑⽹关)setenv ipaddr 192.168.1.102(开发板ip,不要与虚拟机和电脑ip冲突)setenv netmask 255.255.255.0setenv serverip 192.168.1.10(虚拟机ip)saveenv⼆、nand启动烧写Uboot:通过SD卡启动的u-boot for tiny210 将u-boot镜像写⼊nandflash在虚拟机下重启tftp sudo service tftpd-hpa restart开发板终端下执⾏下⾯的命令:[FriendlyLEG-TINY210]# tftp 21000000 tiny210-uboot.bin[FriendlyLEG-TINY210]# nand erase.chip[FriendlyLEG-TINY210]# nand write 21000000 0 3c1f4 (写⼊长度)内核的烧写位置是0x600000开始的区域,⽂件系统烧写位置为0xe00000开始的区域。
UBOOT源码分析
UBOOT源码分析UBOOT是一种开放源码的引导加载程序。
作为嵌入式系统启动的第一阶段,它负责初始化硬件设备、设置系统环境变量、加载内核镜像以及跳转到内核开始执行。
Uboot的源码是开放的,让我们可以深入了解其内部工作机制和自定义一些功能。
Uboot源码的文件组织结构非常清晰,主要分为三个大类:目录、文件和配置。
其中目录包含了一系列相关的文件,文件存放具体的源码实现代码,配置文件包含了针对特定硬件平台的配置选项。
Uboot源码的核心部分是启动代码,位于arch目录下的CPU架构相关目录中。
不同的CPU架构拥有不同的启动代码实现,如arm、x86等。
这些启动代码主要包括以下几个关键功能:1. 初始化硬件设备:Uboot首先需要初始化硬件设备,例如设置时钟、中断控制器、串口等设备。
这些初始化操作是在启动代码中完成的。
通过查看该部分代码,我们可以了解硬件的初始化过程,以及如何配置相关寄存器。
2. 设置启动参数:Uboot启动参数存储在一个称为"bd_info"的数据结构中,它包含了一些关键的设备和内存信息,例如DRAM大小、Flash 大小等。
这些参数是在启动代码中设置的,以便内核启动时能够正确识别硬件情况。
3. 加载内核镜像:Uboot负责加载内核镜像到内存中,以便内核可以正确执行。
在启动代码中,会通过读取Flash设备或者网络等方式,将内核镜像加载到指定的内存地址处。
加载过程中,可能会进行一些校验和修正操作,以确保内核数据的完整性。
4. 启动内核:在内核镜像加载完成后,Uboot会设置一些寄存器的值,并执行一个汇编指令,跳转到内核开始执行。
此时,Uboot的使命即结束,控制权交由内核处理。
除了启动代码,Uboot源码中还包含了许多其他功能模块,如命令行解析器、存储设备驱动、网络协议栈等。
这些功能模块可以根据需求进行配置和编译,以满足不同平台的需求。
例如,可以通过配置文件选择启用一些功能模块,或者自定义一些新的功能。
uboot启动参数设置
nand erase 40000 1c0000 nand erase offset size
nand write 30800000 40000 1c0000 存放内存30800000位置上的uImge,烧写到nandflash的40000位置上
=========================================================================================
例如如下:
FS2410# setenv serverip 192.168.7.x (其中X是虚拟机中IP的最后的数字[用ifconfig可以获取])
farsight_N中的N用座位号来表示,比如座位4即为farsight_4 //设置uboot传给内核的参数
saveenv
自定义参数版本:
4.设置UBOOT参数
确保一下FS2410的核心班上的JP1跳线帽短接了,给板子上电,
查看板子启动信息,如果板子启动信息中,有U-Boot 1.3.1(Oct 25 2008 - 15:45:21)或者更新的版本,则直接设置下面的参数,否则根据文档烧录 u-boot131-for-farsight-shenzhen-advanced-drivers.bin(请参考文档"farsight-实验前的准备步骤-v2.3.doc")
setenv bootargs console=ttySAC0,115200 init=/linuxrc root=/dev/nfs nfsroot=192.168.7.113:/opt/filesystem ip=192.168.7.173:192.168.7.113:192.168.7.1:255.255.255.0:farsight_13:eth0:off //或者console=ttySAC0,115200 root=1f02 rootfstype=jffs2 rw init=/linuxrc mem=64M
Uboot传递参数与kernel解析参数
Uboot传递参数与kernel解析参数U-boot 会给linux Kernel 传递很多参数,例如:串口、RAM、commandline (bootargs)等。
而linux kernel 也会读取和处理这些参数。
它们两者之间通过ATAG方式来传递参数。
U-boot 把要传递给kernel 的数据保存在struct tag 数据结构中,启动内核时,把这个结构体的物理地址传给内核,然后内核通过这个地址,用parse_tags 分析出传递过来的参数。
这里以U-boot 传递RAM 参数和Linux kernel 读取RAM 参数为例进行介绍。
1、u-boot 向kernel 传递RAM 参数./common/cmd_bootm.c 文件调用./uboot/arch/arm/lib/bootm.c 文件中的do_nand_boot 函数来启动Linux kernel。
在do_nand_boot 函数中:int do_nand_boot (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])DECLARE_GLOBAL_DATA_PTRint retd_t *bd = gd->bdulong addr, data, len, initrd_start, initrd_endvoid (*theKernel)(int zero, int arch, uint params)int strlechar *commandline = getenv ("bootargs")setup_start_tag (bd); // 初始化第一个kernel tag结构体setup_serial_tag (¶ms)setup_revision_tag (¶ms)setup_memory_tags (bd)theKernel (0, bd->bi_arch_number, bd->bi_boot_params);其中:thekernel其实不是个函数,而是指向内核入口地址的指针,把它强行转化为带三个参数的函数指针,会把三个参数保存到通用寄存器中,实现了向kernel传递信息的功能参数保存到通用寄存器中,实现了向kernel传递信息的功能bd->bi_boot_params :传给Kernel 的参数=(struct tag *) 型的setup_start_tag 和setup_memory_tags 函数说明如下:static void setup_start_tag (bd_t *bd)params = (struct tag *) bd->bi_boot_param/* 初始化(struct tag *) 型的全局变量params 为bd->bi_boot_params 的地址,* 之后的setup tags 相关函数如下面的setup_memory_tag* 就把其它tag 的数据放在此地址的偏移地址上。
uboot命令使用教程(uboot参数设置)
uboot命令使⽤教程(uboot参数设置)1. Printenv 打印环境变量。
uboot> printenvbaudrate=115200ipaddr=192.168.0.111ethaddr=32:34:46:78:9A:DCserverip=192.168.0.100Environment size: 80/8188 bytes2. Setenv 设置新的变量如:uboot> setenv myboard AT91RM9200DKuboot> saveenvuboot> printenvbaudrate=115200ipaddr=192.168.0.111ethaddr=32:34:46:78:9A:DCserverip=192.168.0.100myboard=AT91RM9200DKEnvironment size: 102/8188 bytes⼜如想重置启动参数bootargs:uboot> setenv bootargs 'noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0'uboot> saveenv3. saveenv 保存变量命令将当前定义的所有的变量及其值存⼊ flash 中。
⽤来存储变量及其值的空间只有 8k 字节,应不要超过。
(如上例,每次与setenv配合使⽤)4. loadb 通过串⼝ Kermit 协议下载⼆进制数据。
5. tftp 通过⽹络下载程序,需要先设置好⽹络配置简单配置:uboot> setenv ethaddr 32:34:46:78:9A:DCuboot> setenv ipaddr 192.168.0.111uboot> setenv serverip 192.168.0.100//下载 bin ⽂件到地址 0x20000000 处。
uboot向内核模块传递参数的方法
uboot向内核模块传递参数的⽅法1 模块参数定义模块参数1、module_param(name, type, perm); 定义⼀个模块参数,name 变量名type 数据类型bool:布尔型invbool:⼀个布尔型( true 或者 false)值(相关的变量应当是 int 类型).invbool 类型颠倒了值,所以真值变成 false,反之亦然.charp :⼀个字符指针值. 内存为⽤户提供的字串分配, 指针因此设置.int:整形long:长整形short:短整形uint:⽆符号整形ulong:⽆符号长整形ushort:⽆符号短整形perm 访问权限#define S_IRWXU 00700#define S_IRUSR 00400#define S_IWUSR 00200#define S_IXUSR 00100#define S_IRWXG 00070#define S_IRGRP 00040#define S_IWGRP 00020#define S_IXGRP 00010#define S_IRWXO 00007#define S_IROTH 00004#define S_IWOTH 00002#define S_IXOTH 00001#define S_IRUGO (S_IRUSR|S_IRGRP|S_IROTH) //可以被所有⽤户访问不能改写2、module_param_array(name, type, nump, perm); 定义模块参数数组nump 数组元素的个数⽰例:static int test=0;module_param(test, int, S_IRUGO);在uboot 的启动参数中传递参数例如:setenv bootargs console=ttyS0,115200n8 root=${mmcroot} rootfstype=ext4 rootflags=data=writeback quiet testmodule.test=1testmodule模块名称(也就是.o⽂件或者.ko⽂件的名称) test 模块参数名称如果设置了上⾯的启动参数,在驱动中就可以看到test的值为1 2 直接⽤启动参数传递驱动中定义static int test=0;static int __init Get_test(char *str){test = simple_strtoul(str, NULL, 0);return1;}__setup("mode_test=", Get_test);static char *test_name;static int __init Get_testname(char *str){test_name = str;return1;}__setup("mode_testname=", Get_testname);在启动参数中setenv bootargs console=ttyS0,115200n8 root=${mmcroot} rootfstype=ext4 rootflags=data=writeback quiet test=1 test_name=name 按上⾯的设置,在驱动可以得到test的值为1,test_name为“name”。
mdio uboot 参数
mdio uboot 参数摘要:1.mdio uboot参数简介2.mdio uboot参数的作用3.如何配置mdio uboot参数4.配置mdio uboot参数的实例5.总结正文:U-Boot是一款常用的嵌入式系统启动代码,负责从存储器中读取内核并启动。
在U-Boot中,有一个名为mdio的参数,它用于配置MII(Media Independent Interface,媒体独立接口)或RMII(Reduced Media Independent Interface,简化媒体独立接口)模式。
mdio参数对于网络芯片的初始化和配置非常重要。
1.mdio uboot参数简介Mdio uboot参数主要用于配置网络芯片的接口模式,包括MII和RMII。
它涉及到PHY(Physical Layer,物理层)和MDIO(Media Dependent Interface,媒体相关接口)的初始化和配置。
在嵌入式系统中,网络芯片的配置对于网络通信至关重要。
2.mdio uboot参数的作用mdio uboot参数的主要作用是配置网络芯片的接口模式,从而实现正确的网络通信。
它可以设置PHY和MDIO的地址、数据和控制信号,以及接口的工作模式。
通过配置mdio uboot参数,可以使网络芯片在MII或RMII模式下工作,满足不同的网络应用需求。
3.如何配置mdio uboot参数配置mdio uboot参数通常需要修改U-Boot的源代码,通过烧写新的U-Boot镜像到嵌入式系统来实现。
具体步骤如下:- 获取U-Boot源代码,并在源代码中找到与mdio参数相关的内容。
- 根据需求修改mdio参数的配置,例如设置PHY地址、MDIO地址、数据和控制信号等。
- 编译并烧写新的U-Boot镜像到目标系统。
- 重启动目标系统,验证mdio参数配置是否正确。
4.配置mdio uboot参数的实例以下是一个配置mdio uboot参数的实例:```# 定义PHY地址CONFIG_PHY_ADDR=0x10# 定义MDIO地址CONFIG_MDIO_ADDR=0x10# 定义PHY寄存器地址CONFIG_PHY_REG_ADDR=0x10# 定义PHY数据线引脚CONFIG_PHY_DATA_PIN=12# 定义PHY控制线引脚CONFIG_PHY_CTRL_PIN=13# 定义MDIO数据线引脚CONFIG_MDIO_DATA_PIN=14# 定义MDIO控制线引脚CONFIG_MDIO_CTRL_PIN=15```5.总结Mdio uboot参数是嵌入式系统中非常重要的一个参数,用于配置网络芯片的接口模式。
uboot的bootcmd bootargs参数详解
setenv bootargs ‘noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5’
上面就是我们经常使用的几种bootargs的组合,老实说,bootargs非常非常的灵活,所以设置的方法有很多中形式,具体的还应该根据你的平台具体的情况来设置。
mtdparts的格式如下:
mtdparts=[;
:= :[,]
:= [@offset][][ro]
:= unique id used in mapping driver/device
:= standard linux memsize OR "-" to denote all remaining space
3). 假设文件系统是jffs2类型的,且在flash中,bootargs的设置应该如下
setenv bootargs ‘mem=32M console=ttyS0,115200 noinitrd root=/dev/mtdblock2 rw rootfstype=jffs2 init=/linuxrc’
这两种方法可以用,不过很明显第二种要详细很多,请注意第二种中which netcard 是指开发板上的网卡,而不是主机上的网卡。
说完常见的几种bootargs,那么我们来讨论平常我经常使用的几种组合:
1). 假设文件系统是ramdisk,且直接就在内存中,bootargs的设置应该如下:
setenv bootargs ‘initrd=0x32000000,0xa00000 root=/dev/ram0 console=ttySAC0 mem=64M init=/linuxrc’
mdio uboot 参数
mdio uboot 参数摘要:1.概述2.mdio uboot 参数的具体内容3.如何使用mdio uboot 参数4.mdio uboot 参数的作用和优势5.总结正文:1.概述mdio uboot 是一种在嵌入式系统中广泛使用的启动程序,它能够在系统启动时加载操作系统。
在mdio uboot 中,参数是一个重要的概念,它们能够影响系统的启动行为和性能。
本文将详细介绍mdio uboot 参数的相关内容。
2.mdio uboot 参数的具体内容mdio uboot 参数主要包括以下几个方面:- 设备类型:指定设备所使用的处理器架构,例如arm、mips 等。
- 设备号:指定设备在系统中的唯一标识,例如0、1 等。
- 启动设备:指定系统从哪个设备启动,例如uboot、mmc 等。
- 启动顺序:指定系统启动时各个设备的启动顺序。
- DTB(Device Tree Browser)配置:指定系统中设备的树状结构,包括设备节点、子节点和属性等。
3.如何使用mdio uboot 参数要在mdio uboot 中使用参数,需要按照以下步骤进行:- 首先,打开设备的启动配置文件(通常位于/etc/boot/config 或/boot/config),编辑参数。
- 保存配置文件,并重新启动设备。
- 设备将根据新的参数配置启动系统。
4.mdio uboot 参数的作用和优势mdio uboot 参数的主要作用是根据设备的具体需求调整系统的启动行为,以提高系统的性能和稳定性。
它们能够实现以下优势:- 灵活性:通过调整参数,能够实现对系统启动过程的精确控制,以满足不同场景的需求。
- 可维护性:参数的配置和使用过程较为简单,方便开发者进行维护和调试。
- 兼容性:mdio uboot 参数支持多种处理器架构和设备类型,能够适应不同设备的需求。
5.总结mdio uboot 参数是嵌入式系统中一个重要的概念,它们能够影响系统的启动行为和性能。
uboot启动流程
U-Boot工作过程U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下:(1)第一阶段的功能硬件设备初始化加载U-Boot第二阶段代码到RAM空间设置好栈跳转到第二阶段代码入口(2)第二阶段的功能初始化本阶段使用的硬件设备检测系统内存映射将内核从Flash读取到RAM中为内核设置启动参数调用内核1.1.1 U-Boot启动第一阶段代码分析第一阶段对应的文件是cpu/arm920t/和board/samsung/mini2440/。
U-Boot启动第一阶段流程如下:图 U-Boot启动第一阶段流程根据cpu/arm920t/中指定的连接方式:ENTRY(_start)SECTIONS{. = 0x00000000;. = ALIGN(4);.text :{cpu/arm920t/ (.text)board/samsung/mini2440/ (.text)board/samsung/mini2440/ (.text)*(.text)}… …}第一个链接的是cpu/arm920t/,因此的入口代码在cpu/arm920t/中,其源代码在cpu/arm920t/中。
下面我们来分析cpu/arm920t/的执行。
1. 硬件设备初始化(1)设置异常向量cpu/arm920t/开头有如下的代码:.globl _start_start: b start_code /* 复位*/ldr pc, _undefined_instruction /*未定义指令向量 */ldr pc, _software_interrupt /* 软件中断向量 */ldr pc, _prefetch_abort /* 预取指令异常向量 */ldr pc, _data_abort /* 数据操作异常向量 */ldr pc, _not_used /* 未使用 */ldr pc, _irq /* irq中断向量 */ldr pc, _fiq /* fiq中断向量 */ /* 中断向量表入口地址 */_undefined_instruction: .word undefined_instruction_software_interrupt: .word software_interrupt_prefetch_abort: .word prefetch_abort_data_abort: .word data_abort_not_used: .word not_used_irq: .word irq_fiq: .word fiq.balignl 16,0xdeadbeef以上代码设置了ARM异常向量表,各个异常向量介绍如下:表 ARM异常向量表在cpu/arm920t/中还有这些异常对应的异常处理程序。
经典=Uboot-11-如何向内核传递启动参数(具体实现)
u-boot向linux内核传递启动参数(详细)U-BOOT 在启动内核时,会向内核传递一些参数.BootLoader 可以通过两种方法传递参数给内核,一种是旧的参数结构方式(parameter_struct),主要是2.6 之前的内核使用的方式。
另外一种就是现在的2.6内核在用的参数链表(tagged list) 方式。
这些参数主要包括,系统的根设备标志,页面大小,内存的起始地址和大小,RAMDISK的起始地址和大小,压缩的RAMDISK根文件系统的起始地址和大小,当前内核命令参数等而这些参数是通过struct tag来传递的。
U-boot 把要传递给kernel 的东西保存在struct tag 数据结构中,启动kernel 时,把这个结构体的物理地址传给kernel;Linux kernel 通过这个地址分析出u-boot传递的参数。
大家都知道U-Boot启动的时候会将启动参数的地址放入R2中,然后再启动内核。
首先看两个重要的数据结构:第一个是global_data,定义在include/asm-arm/global_data.h文件中:typedef struct global_data {bd_t *bd;unsigned long flags;unsigned long baudrate;unsigned long have_console; /* serial_init() was called */unsigned long reloc_off; /* Relocation Offset */unsigned long env_addr; /* Address of Environment struct */unsigned long env_valid; /* Checksum of Environment valid? */unsigned long fb_base; /* base address of frame buffer */#ifdef CONFIG_VFDunsigned char vfd_type; /* display type */#endif#if 0unsigned long cpu_clk; /* CPU clock in Hz! */unsigned long bus_clk;unsigned long ram_size; /* RAM size */unsigned long reset_status; /* reset status register at boot */#endifvoid **jt; /* jump table */} gd_t;在同一个文件中有如下定义:#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("r8")在需要使用gd指针的时候,只需要加入DECLARE_GLOBAL_DATA_PTR这句话就可以了。
uboot启动代码详细讲解
·1 引言在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行。
一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次:1. 引导加载程序。
固化在固件(firmware)中的 boot 代码,也就是 Boot Loader,它的启动通常分为两个阶段。
2. Linux 核。
特定于嵌入式板子的定制核以及核的启动参数。
3. 文件系统。
包括根文件系统和建立于 Flash 存设备之上文件系统,root fs。
4. 用户应用程序。
特定于用户的应用程序。
有时在用户应用程序和核层之间可能还会包括一个嵌入式图形用户界面。
常用的嵌入式 GUI 有:MicroWindows 和 MiniGUI 等。
引导加载程序是系统加电后运行的第一段软件代码。
回忆一下 PC 的体系结构我们可以知道,PC 机中的引导加载程序由 BIOS(其本质就是一段固件程序)和位于硬盘 MBR 中的 OS Boot Loader(比如,LILO 和 GRUB 等)一起组成。
BIOS 在完成硬件检测和资源分配后,将硬盘 MBR 中的 Boot Loader 读到系统的 RAM 中,然后将控制权交给 OS Boot Loader。
Boot Loader 的主要运行任务就是将核映象从硬盘上读到 RAM 中,然后跳转到核的入口点去运行,也即开始启动操作系统。
而在嵌入式系统中,通常并没有像 BIOS 那样的固件程序(注,有的嵌入式 CPU 也会嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由 Boot Loader 来完成。
比如在一个基于 ARM7TDMI core 的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000 处开始执行,而在这个地址处安排的通常就是系统的 Boot Loader 程序。
·2 bootloader简介简单地说,Boot Loader (引导加载程序)就是在操作系统核运行之前运行的一段小程序,它的作用就是加载操作系统,它是系统加电后运行的第一段软件代码。
arm_linux_logo的更改以及启动信息的显示方法
1、LCD的kernel启动信息显示要想让Linux的启动信息从LCD和串口同时输出,作如下设置.修改uboot中的启动参数信息。
#define CONFIG_BOOTARGS \"console=tty0 console=ttyS0,115200 earlyprintk " \"mtdparts=atmel_nand:128k(bootstrap)ro,384k(uboot)ro," \"128k(env),128k(env_redundant),256k(spare)," \"1M(dtb),6M(kernel)ro,-(rootfs) " \"root=/dev/mtdblock7 rw rootfstype=yaffs2"#elif CONFIG_SYS_USE_MMC//前面的console=tty0是信息输出到LCD屏上, 一定要在前面!!// console=ttyS0,115200使kernel启动期间的信息息刚开始输出到串口0上,波特率为115200;// 用户空间的串口编程针对的仍是/dev/ttyS0等2、uboot、kernel LOGO图片的更改arm Linux的uboot、Kernel开机动画默认为公司图标及小企鹅图标,uboot的图标在u-boot-at91-u-boot-2015.01-at91\tools\logos下面,kernel的图标在driver/video/logo下面。
但是在实际的开发应用中,我们常常需要做的是更改系统默认的开机启动画面,更换企业的特有logo图片。
2.1 uboot LOGO图片的更改修改u-boot的开机logo其实很简单。
请见下面步骤。
1. 获取一张BMP的图片,修改之,让其色深为8位,即256色,如果用24位,则显示出问题。
2. 将制作好的BMP图片,放置到u-boot-at91-u-boot-2015.01-at91\tools\logos下面替换公司LOGO图片。
UBOOT引导Linux内核及向内核传递参数的方式
UBOOT引导Linux内核及向内核传递参数的⽅式 ⼀直以来没有想过有什么好的办法通过寄存器向内核传递参数,直到今天读UBOOT的实现⽅式。
在UBOOT中,引导内核最常⽤的⽅法是bootm命令,bootm命令可以引导“UBOOT格式”的内核。
先花点时间了解⼀下什么是“UBOOT格式”的内核吧:⽤UBOOT⾃带的mkimage命令⽣成的内核称为"UBOOT"格式的内核。
以下⾯这条命令为例: mkimage -n "Kernel 2.4.18" -A arm -O linux -T kernel -C none -a30007fc0 -e 30008000 -d 4020.bin vmlinux-2.4.18.img 其中与内核引导最密切的是-e 30008000,也就是内核的⼊⼝地址。
其它参数可以参考帮助信息。
其它UBOOT格式的内核与原来相⽐,只是进⾏(可选)了压缩,并在前⾯加了⼀个0x40⼤⼩的头。
这个头⾥放了内核的位置(0x30007fc0)和⼊⼝地址(0x30008000)和其它信息。
bootm命令执⾏时,先对头部信息等进⾏校验,然后把头信息放到⼀个结构⾥⾯。
最后根据内核类型调⽤相应的启动函数。
对于Linux⽽⾔就是do_bootm_linux,在启动函数⾥⾯,有这么⼀个操作:theKernel = (void (*)(int, int, uint))ntohl(hdr->ih_ep);,这是最关键的⼀个操作,将内核的⼊⼝地址0x30008000赋给了theKernel,在启动函数的最后,使⽤theKernel (0, bd->bi_arch_number, bd->bi_boot_params);启动内核。
根据传参规范,三个变量分别⽤r0,r1,r2传给内核,这样就巧妙地利⽤了函数指针进⾏了参数传递,实在是精妙!上⾯讲完了内核的引导及传参,需要引起注意的就是在使⽤mkimage命令⽣成内核时,-e后⾯的地址要⽐-a后⾯的地址偏移0x40,原因很简单,就不在细说了。
U-boot常用指令
U-BOOT常用命令介绍printenv 打印环境变量setenv 设置环境变量如:setenv ipaddr 172.22.60.44Setenv serverip 172.22.60.88saveenv 保存设定的环境变量我们经常要设置的环境变量有ipaddr,serverip,bootcmd,bootargs。
tftp 即将内核镜像文件从PC中下载到SDRAM的指定地址,然后通过bootm来引导内核,前提是所用PC要安装设置tftp服务。
如: tftp 30008000 zImagenand erase 擦除nand flash中数据块如:nand erase 0x40000 0x1c0000起始地址擦写大小nand write 把RAM中的数据写到Nand Flash中如:nand write 0x30008000 0x40000 0x1c0000nand read 从nand flash中读取数据到RAM如:nand read 0x30008000 0x40000 0x1c0000go 直接跳转到可执行文件的入口地址,执行可执行文件。
boot 启动uboot引导下载并烧写内核步骤:1 用网线连接开发板和PC机2 启动U-BOOT并设置环境变量setenv ipaddr 172.22.60.32 //设置开发板的IPsetenv serverip 172.22.60.99 //设置PC机的IPsetenv ethaddr 11.22.33.44.55.66 //设置开发板的物理地址saveenv //保存3 PC机端打开TFTP服务器,并且把要下载的文件拷贝到tftp服务器程序所在的目录下4 下载和烧写在u-boot下用以下命令tftp 30008000 zImagenand erase 40000 1c0000nand write 30008000 40000 1c0000……setenv bootargs noinitrd root=/dev/mtdblock2 init=/linuxrcconsole=ttySAC0,115200本参数必须与内核boot option 一致设置开机自启动内核挂载功能:setenv bootcmd nand read 30008000 40000 1c0000 \;go 30008000。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
uboot 启动参数
UBOOT是一种常用的启动程序,它能够运行在各种不同的硬件平
台上,并且可以通过修改启动参数来适配不同的硬件环境。
下面将分
步骤介绍UBOOT启动参数的相关内容。
第一步:获取UBOOT源码
首先,需要在官方网站上下载UBOOT源码。
下载完成后,需要解
压缩源码包,并通过命令行进入到UBOOT文件夹中。
第二步:配置启动参数
配置启动参数需要修改UBOOT的配置文件。
在UBOOT源码目录下,有一个名为“config”的文件夹,其中包含了多个不同的配置文件。
每个配置文件对应着一个不同的硬件平台,可以选择对应的配置文件
来进行修改。
打开对应的配置文件,找到“CONFIG_BOOTARGS”这个选项。
这
个选项控制了UBOOT的启动参数,包括了启动时使用的内核命令参数、系统启动模式、显示分辨率、硬件时钟等等内容。
根据硬件的不同,需要根据实际情况来进行修改。
如果是嵌入式
系统,需要将内核命令参数设置为启动时需要加载的模块和驱动程序;如果是开发板,需要指定启动模式为SD卡或者串口下载模式。
第三步:保存配置文件
完成启动参数的修改后,需要保存配置文件。
保存后,可以通过
编译UBOOT并将其烧录到目标硬件中。
第四步:运行UBOOT
运行UBOOT的方式与平台有关。
在某些开发板上,可以通过在串
口终端中运行“boot”命令来启动系统。
在嵌入式系统中,可以通过
修改启动顺序来选择从NOR Flash或者SD卡中加载UBOOT。
总结
通过上述步骤,可以修改UBOOT的启动参数,并实现对不同硬件
平台的适配。
通过正确配置启动参数,可以使系统运行更加稳定,并
且更加符合实际需求。
因此,UBOOT启动参数的修改是嵌入式开发中不可忽视的一部分。