uboot 2014移植手册

合集下载

uboot移植

uboot移植
stage1完成初始化硬件,为stage2准备内存空间,将 stage2复制到内存中,设置堆栈然后跳转到stage2
多阶段的 Boot Loader
Boot Loader 的 stage1 通常包括以下步骤(以执行的先后顺序): ·硬件设备初始化。 ·为加载 Boot Loader 的 stage2 准备 RAM 空间。 ·拷贝 Boot Loader 的 stage2 到 RAM 空间中。 ·设置好堆栈。 ·跳转到 stage2 的 C 入口点。 Boot Loader 的 stage2 通常包括以下步骤(以执行的先后顺序):
Bootloader的通用性质
一.Bootloader与嵌入式linux的关系
一个嵌入式系统从软件角度来看分为四个层次: 1.引导加载程序。包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader 两大部分。 2. Linux 内核。特定于嵌入式板子的定制内核以及内核的启动参数。 3. 文件系统。包括根文件系统和建立于 Flash 内存设备之上文件系统。 通常用 ram disk 来作为 root fs。
Bootloader综述 U-boot介绍 u-boot编译及配置 u-boot的启动过程及工作原理 u-boot命令使用说明 u-boot 的移植过程
Uboot渊源
Uboot是德国DENX小组的开发用于多种嵌入式 CPU的bootloader程序, UBoot不仅仅支持嵌入式 Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式 操作系统。UBoot除了支持PowerPC系列的处理器 外,还能支持MIPS、 x86、ARM、NIOS、XScale 等诸多常用系列的处理器。 从下面地址下载uboot的源代码。 /projects/uboot

uboot移植手册Ver.B[1]

uboot移植手册Ver.B[1]
wwwxcembedcomxc2440开发板uboot移植手册xc2440开发板uboot移植开发手册20111020verb小超嵌入式工作室wwwxcembedcomxcembedblogchinaunixnetwwwxcembedcomxc2440开发板uboot移植手册版本更新说明版本号修改日期修改说明20110920初稿建立20111020修改makefile中配置选项说明page8修改norflash驱动配置选项page16修改第八部分内容page38第十部分前加入说明page43wwwxcembedcomxc2440开发板uboot移植手册目录版本更新说明二增加对s3c2440平台的支持三修改norflash驱动支持16四添加nand驱动和nand启动方式19五增加串口xmodem协议30六加入网卡dm9000驱动支持33七加入mtdnand分区35八启动zimage内核的支持usb设备驱动支持39十烧写nand进度显示43十一烧写yaffs2文件系统支持wwwxcembedcomxc2440开发板uboot移植手册前言关于本手册本手册为xc2440开发板配套教程之一介绍了uboot在xc2440开发板的移植过程供用户参考
XC2440 开发板 uboot 移植手册
版本更新说明
版本号 A B
修改日期 2011-09-20 2011-10-20
修改说明
初稿建立
修改Makefile中配置选项说明 Page8
修改Norflash驱动配置选项 Page16
ቤተ መጻሕፍቲ ባይዱ
修改第八部分内容
Page38
第十部分前加入说明
Page43
室 作 工 式 入 嵌 超 小


修改 lowlevel_init.S 文件

uboot移植资料

uboot移植资料

uboot移植资料u-boot-1.3.4 移植到S3C2440 (带有某些解析)移植u-boot-1.3.4到S3C2440一.预备知识:1. 首先,U-Boot1.3.4还没有支持s3c2440,移植仍是用2410的文件稍作修改而成的。

2. 2440和2410的区别:2440和2410的区别主要是2440的主频更高,增加了摄像头接口和AC‘97音频接口;寄存器方面,除了新增模块的寄存器外,移植所要注意的是NAND FlASH控制器的寄存器有较大的变化、芯片的时钟频率控制寄存器(芯片PLL的寄存器)有一定的变化。

其他寄存器基本是兼容的。

3. 你开发板的boot方式是什么,开发板上电以后是怎么执行的。

一般来说三星的开发板有三种启动方式:nand、nor、ram。

具体用那一种方式来启动决定于CPU的0M[0:1]这两个引脚,具体请参考S3C2440的datasheetnand:对于2440来说,CPU是不给nand-flash分配地址空间的,nand-flash只相当于CPU的一个外设,S3C2440做了一个从nand-flash启动的机制。

开发板一上电,CPU就自动复制nand-flash里面的前4K-Bytes内容到S3C2440内部集成的SDRAM,然后把4K内容所在的RAM映射到S3C2440的0地址,从0地址开始执行。

这4K的内容主要负责下面这些工作:初始化中断矢量、设定CPU的工作模式为SVC32模式、屏蔽看门狗、屏蔽中断、初始化时钟、把整个u-boot重定向到外部SDRAM、跳到主要的C函数入口。

nor: 早期的时候利用nor-flash启动的方式比较多,就是把u-boot烧写到nor-flash里面,直接把nor-flash映射到S3C2440的0地址,上电从0地址开始执行。

ram: 直接把u-boot放到外部SDRAM上跑,这一般debug时候用到。

4. u-boot程序的入口地址问题要理解程序的入口地址,自然想到的是连接文件,首先看看开发板相对于某个开发板的连接文件"/board/你的开发板/u-boot.lds",看一个2410的例子:ENTRY(_start)SECTIONS{. = 0x00000000;. = ALIGN(4);.text :{cpu/arm920t/start.o (.text)*(.text)}. = ALIGN(4);.rodata : { *(.rodata) }. = ALIGN(4);.data : { *(.data) }. = ALIGN(4);.got : { *(.got) }__u_boot_cmd_start = .;.u_boot_cmd : { *(.u_boot_cmd) }__u_boot_cmd_end = .;. = ALIGN(4);__bss_start = .;.bss : { *(.bss) }_end = .;}(1) 从ENTRY(_start)可以看出u-boot的入口函数是_start,这个没错(2) 从. = 0x00000000也许可以看出_start的地址是0x00000000,事实并不是这样的,这里的0x00000000没效,在连接的时候最终会被TETX_BASE所代替的,具体请参考u-boot根目录下的config.mk.(3) 网上很多说法是_start=TEXT_BASE,我想这种说法也是正确的,但没有说具体原因。

uuboot 移植流程

uuboot 移植流程

uuboot 移植流程U-Boot 移植流程介绍U-Boot是一个开源的引导加载程序,常用于嵌入式系统中。

移植U-Boot可以将其适配到不同的硬件平台上,以满足特定需求。

本文将详细说明U-Boot移植的流程。

准备工作1.硬件选型:根据项目需求,选择适合的硬件平台。

2.获取源代码:从U-Boot官方网站或仓库下载最新版本的源代码。

3.安装交叉编译工具链:根据目标硬件平台的指令集架构,选择合适的交叉编译工具链,并进行安装。

4.了解目标硬件平台:熟悉目标硬件平台的架构、引导方式、存储器布局等相关信息。

移植流程1.配置编译环境:设置交叉编译工具链的环境变量,以确保正确编译U-Boot源代码。

2.配置U-Boot:修改U-Boot源代码中的配置文件,根据目标硬件平台的特性和需求进行相应配置。

–配置目标硬件平台的处理器类型、存储器布局等基本信息。

–配置启动方式,如通过网络(TFTP)或存储介质(SD卡、NAND Flash)等进行启动。

–配置启动流程,如引导加载程序的加载顺序、启动脚本等。

3.添加适配代码:根据目标硬件平台的需求,编写适配代码,包括引导加载程序和设备驱动等。

–引导加载程序:为目标硬件平台选择合适的程序入口点,配置启动参数,加载适配的设备驱动等。

–设备驱动:根据目标硬件平台的外设,编写相应的设备驱动代码,以支持外设的初始化和操作。

4.编译U-Boot:使用交叉编译工具链,编译修改后的U-Boot源代码。

–执行make clean清除之前的编译结果。

–执行make命令编译U-Boot源代码。

5.烧录和运行:将编译生成的U-Boot镜像烧录到目标硬件平台,并进行测试。

–根据目标硬件平台的烧录方式(串口、JTAG等),将U-Boot镜像烧录到目标设备。

–启动目标设备,观察U-Boot的启动信息是否正常输出,检查设备驱动是否正常加载。

6.调试和优化:根据实际情况,进行U-Boot的调试和性能优化。

–使用调试工具进行调试,如调试器、串口打印信息等。

移植SD卡启动盘之uboot

移植SD卡启动盘之uboot

移植SD卡启动盘之uboot要想深入学习uboot,需要自定义uboot,进行源码级的uboot移植。

本篇将对进行基于u-boot-201404版本的移植进行讲解。

一、准备源码1 在ubuntu下,新建文件目录2 将EVB-T335T光盘目录src下的linux源码和u-boot源码,复制到ubuntu下3 将EVB-T335T光盘目录toolchains下的交叉编译器,arm-2010和gcc-linaro-xx,得到到ubuntu下4 将EVB-T335T光盘目录rootfs下的根文件系统buildroot,得到到ubuntu下二、编译uboot1 配置交叉编译器(1)解压tar xfj arm-2010.09.tar.bz2(2)设置sudo vim /etc/profileexport PATH=$PATH:/home/rabbit/evb-t335/arm-2010.09/binsource /etc/profile2 解压u-boottar xfj u-boot-2014.04-rc2-00037-gbaecd31.tar.bz23 配置u-bootmake com335x_sd_256_config其中com335x代表核心板为com335x,sd代表从SD卡启动,或emmc代表从板载的emmc 启动,或nand代表为nandflash;256表示com-335是256M的DDR,如果是128M或512M,则设置为相应的值;这些信息,可以从uboot源码主目录下的boards.cfg文件中找到:如下图所示:最后执行命令,得出如下结果:4 编译u-bootmake ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-这样,就生成了我们需要的MLO和u-boot.img文件5 根据以前的方法,将MLO和u-boot.img移植到SD卡上,上电启动,输出如下信息:到此,uboot算是移植成功,接下来,进行linux内核的移植。

UBOOT移植验

UBOOT移植验

U-BOOT移植实验u-boot简介u-boot是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序, u-boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。

u-boot除了支持PowerPC系列的处理器外,还能支持MIPS、 x86、ARM、NIOS、XScale等诸多常用系列的处理器。

u-boot源码目录介绍u-boot的启动过程1 启动流程我们一般把bootloader都分为阶段1(stage1)和阶段2(stage2)两大部分,依赖于CPU体系结构的代码(如CPU初始化代码等)通常都放在阶段1中且通常用汇编语言实现,而阶段2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。

1 阶段1,汇编代码,对于s3c2410是cpu/arm920t/start.s文件。

主要流程如下:关闭看门狗禁掉所有中断设置以CPU的频率把自己拷贝到RAM配置内存区控制寄存器配置的栈空间进入C代码部分2 阶段2是C语言代码,在lib_arm/board.c中的start_armboot是C语言开始的函数,也是整个启动代码中C语言的主函数。

这个函数调用一系列的初始化函数,然后进入主UBOOT命令行,进入命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。

当用户输入启动linux的命令的时候,u-boot会将kernel 映像(zImage)和从nand flash 上读到RAM 空间中,为内核设置启动参数,调用内核,从而启动linux。

u-boot移植要点:我们可以总结出bootloader的两大功能:1 是下载功能,既通过网口、串口或者USB口下载文件到RAM中。

2 是对flash芯片的读写功能。

u-boot对S3C2410已经有了很好的支持,我们在移植过程中主要是完善u-boot对nand flash的读写功能。

U-boot-2014.07移植教程(基于s5pv210)

U-boot-2014.07移植教程(基于s5pv210)

ldr sp, =(CONFIG_SPL_STACK)
#else
ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
#endif
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
sub sp, sp, #GD_SIZE /* allocate one GD above SP */
继续走:
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_cp15
bl cpu_init_crit
#endif
bl _main cpu_init_crit 其实是调用 lowlevel_init,该函数有 2 个地方:变量
到底运行哪个呢?看对应目录下的 makefile: arch\arm\cpu\armv7 下的 makefile: ifneq ($(CONFIG_AM43XX)$(CONFIG_ AM33X X)$(CONFIG_OM AP44XX)$(CONFIG_OM AP54 XX)$(CONFIG_TEGRA)$(CONFIG_MX6)$(CONFIG_TI81XX)$(CONFIG_AT91FAMILY)$(C ONFIG_SUNXI),) ifneq ($(CONFIG_SKIP_LOWLEVEL_INIT),y) obj-y += lowlevel_init.o endif endif 明显,我们没有定义那一堆变量中的任意一个,所以这个不会被编译。 board\samsung\smdkc100 中的 makefile: obj-y += lowlevel_init.o 实际编译后确实这这个文件夹下出现了 lowlevel_init.o,就是它。 看 lowlevel_init:

u-boot移植详细文档

u-boot移植详细文档

u‐boot移植详细文档作者:Tekkaman Ninja作者博客:整理:Coolbor Xie一、Boot Loader的概念和功能1、嵌入式Linux软件结构与分布在一般情况下嵌入式Linux系统中的软件主要分为以下及部分:(1)引导加载程序:其中包括内部ROM中的固化启动代码和Boot Loader两部分。

而这个内部固化ROM是厂家在芯片生产时候固化的,作用基本上是引导Boot Loader。

有的芯片比较复杂,比如Omap3,他在flash中没有代码的时候有许多启动方式:USB、UART或以太网等等。

而S3C24x0则很简单,只有Norboot和Nandboot。

(2)Linux kernel 和drivers。

(3)文件系统。

包括根文件系统和建立于Flash内存设备之上的文件系统(EXT4、UBI、CRAMFS等等)。

它是提供管理系统的各种配置文件以及系统执行用户应用程序的良好运行环境的载体。

(4)应用程序。

用户自定义的应用程序,存放于文件系统之中。

在Flash 存储器中,他们的一般分布如下:但是以上只是大部分情况下的分布,也有一些可能根文件系统是initramfs,被一起压缩到了内核映像里,或者没有Bootloader参数区,等等。

2、在嵌入式Linux中为什么要有BootLoader在linux内核的启动运行除了内核映像必须在主存的适当位置,CPU还必须具备一定的条件:1. CPU 寄存器的设置: R0=0;R1=Machine ID(即Machine Type Number,定义在linux/arch/arm/tools/mach‐types); R2=内核启动参数在 RAM 中起始基地址;2. CPU 模式: 必须禁止中断(IRQs和FIQs); CPU 必须 SVC 模式;3. Cache 和 MMU 的设置: MMU 必须关闭;指令 Cache 可以打开也可以关闭; 数据 Cache 必须关闭;但是在CPU刚上电启动的时候,一般连内存控制器都没有配置过,根本无法在内存中运行程序,更不可能处在Linux内核的启动环境中。

uboot移植

uboot移植
-> start = 0x40000000
-> size = 0x10000000
ethaddr = 00:40:5C:26:0A:5B ---->MAC地址,MAC并不是写在网卡芯片中,而是在程序代码中的。
ip_addr = 192.168.1.224
baudrate = 115200 bps
/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-objdump -d u-boot > u-boot.dis
console=ttySAC0,115200 --->指定linux内核的控制器台。
setenv bootargs 'console=ttySAC0,115200 root=/dev/mtdblock4 rootfstype=yaffs2 init=/sbin/init'
7、reset
boot--->硬件启动及初始化 初始化linux内核的资源 设置linux的环境变量
loader--->加载linux的内核 初始化驱动程序 linux shell命令
init进程
二、什么是uboot?
uboot---->通用的bootloader
通用:1、uboot支持多种架构的CPU
2、可以启动多种操作系统:linux、wince、vxworks
3、支持多种硬件的板子

UBOOT移植操作

UBOOT移植操作

UBOOT移植操作1. 确定目标平台和硬件:首先需要了解目标平台的硬件架构、处理器类型、存储设备(如 Flash 或者 SD 卡)等重要信息。

同时需要获取目标平台的硬件参考手册或者相关文档。

2.设置交叉编译工具链:UBOOT是使用C和汇编语言编写的,因此需要使用交叉编译工具链来生成可在目标平台上运行的二进制可执行文件。

交叉编译工具链包括交叉编译器、链接器和调试器等工具,这些工具需要针对目标平台进行配置。

4. 配置 UBOOT 环境:进入 UBOOT 源代码目录,运行 `make menuconfig` 命令来配置 UBOOT 的环境。

这个命令会打开一个图形界面,可以在其中选择需要的功能、驱动程序和选项。

根据目标平台的硬件特性和需求,选择适当的选项。

5. 修改配置文件:UBOOT 需要一个配置文件(通常是`include/configs/<target.h>`),在这个文件中需要将目标平台的硬件配置信息填入。

这些信息包括芯片型号、Flash 存储器地址等。

还需要设置启动参数,如内核地址、根文件系统地址等。

6. 编译 UBOOT:运行 `make` 命令来编译 UBOOT。

根据配置和硬件平台的不同,可能需要选择不同的编译选项。

编译过程会生成一个 UBOOT 头文件(u-boot.bin)和其他必要的文件。

7.将UBOOT烧录到目标平台:使用烧录工具(如JTAG烧录器、USB烧录器或者SD卡等)将编译好的UBOOT烧录到目标平台的存储设备中。

具体的烧录方法和工具依赖于目标平台的配置。

8.测试和调试:将烧录好的UBOOT安装到目标平台后,通过串口或者网络连接到目标平台,使用终端工具进行测试和调试。

可以通过串口输出来查看启动过程中的日志和错误信息,或者使用调试工具来分析程序执行的问题。

9.优化和定制:根据需求对UBOOT进行优化和定制。

可以修改配置文件、增加功能模块或者修改代码,以达到更好的性能和适应特定需求的目的。

UBoot移植详细教程

UBoot移植详细教程

u-boot 移植步骤详解(必会)1 U-Boot简介U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。

从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。

其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。

但是U-Boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。

其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。

这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。

这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。

就目前来看,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。

其它系列的处理器和操作系统基本是在2002年11 月PPCBOOT 改名为U-Boot后逐步扩充的。

从PPCBOOT向U-Boot的顺利过渡,很大程度上归功于U-Boot的维护人德国DENX软件工程中心Wolfgang Denk[以下简称W.D]本人精湛专业水平和持着不懈的努力。

当前,U-Boot项目正在他的领军之下,众多有志于开放源码BOOT LOADER移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。

uboot内核移植和裁剪详细步骤

uboot内核移植和裁剪详细步骤

uboot内核移植和裁剪详细步骤-U-boot内核移植步骤:Linux 3.3.5系统移植1. 将arch/arm/mach-s3c6410/下的,mach-smdk6410.c cp为mach-my6410.c;2. 打开arch/arm/mach-s3c6410/下的Kconfig,仿照MACH_SMDK6410做一个菜单项:config MACH_MY6410bool "MY6410"select CPU_S3C6410select SAMSUNG_DEV_ADCselect S3C_DEV_HSMMCselect S3C_DEV_HSMMC1select S3C_DEV_I2C1select SAMSUNG_DEV_IDEselect S3C_DEV_FBselect S3C_DEV_RTCselect SAMSUNG_DEV_TSselect S3C_DEV_USB_HOSTselect S3C_DEV_USB_HSOTGselect S3C_DEV_WDTselect SAMSUNG_DEV_BACKLIGHTselect SAMSUNG_DEV_KEYPADselect SAMSUNG_DEV_PWMselect HAVE_S3C2410_WATCHDOG if WATCHDOGselect S3C64XX_SETUP_SDHCIselect S3C64XX_SETUP_I2C1select S3C64XX_SETUP_IDEselect S3C64XX_SETUP_FB_24BPPselect S3C64XX_SETUP_KEYPADhelpMachine support for the Pillar MY64103. 打开arch/arm/tools/mach-types文件,这里面存的是机器ID必须要和uboot里面的ID保持一致,将其283行复制添加在后面并修改为: smdk6410MACH_SMDK6410 SMDK6410 1626 xx6410 MACH_XX6410 XX6410 1626 这个机器ID和UBOOT里的机器ID相同时才能启动内核;1. 修改BSP文件mach-my6410.c,内容如下:将mach-mach-my6410.c文件中的所有smdk6410改成my6410(不要改大写SMDK6410的)MACHINE_START(MY6410, "MY6410")//这个要和Kconfig里的MACH-MY6410匹配 2. 在当前目录的Makefile最后一行加上 obj-$(CONFIG_MACH_MY6410) += mach-my6410.o3. 修改顶层的Makefile:ARCH ?= armCROSS_COMPILE ?= /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux- 4. 复制arch/arm/configs/下的s3c6400-defconfig文件,然后将其保存为.config,配置内核支持EABI,再选中XX6410 board这一项,保存退出;5. 执行make menuconfig对内核进行配置:执行make编译执行make zImage生成zImage将uboot根目录下的mkimage拷贝到/user/bin目录下执行make uImage生成uImage通过以上几步linux内核移植完了,剩下就移植驱动了。

U-Boot移植

U-Boot移植

U-Boot移植手册1.U-Boot配置过程分析用过U-Boot的同学都知道,我们编译 u-boot的第1步是配置选择目标开发板,如:make smdk2410_config,就是表示选择smdk2410开发板作为u-boot运行的目标平台,那么这个简单的命令到底在makefile中是如何来实现的呢,这就是我们接下来要讲的,故事就这样开始了J打开 Makefile, 查看3047行:smdk2410_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0 目标: smdk2410_config依赖: unconfig命令: @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0首先来分析依赖: unconfig (makefile 499行)unconfig:@rm -f $(obj)include/config.h $(obj)include/config.mk \$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp \$(obj)include/autoconf.mk $(obj)include/autoconf.mk.dep 从上面的代码看到,unconfig 主要是删除在配置过程中动态产生的文件.分析完 unconfig,接下来分析配置命令@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0•MKCONFIG := $(SRCTREE)/mkconfig ( makefile 111行)•$(@:_config=): Makefile中存在一种表达式 $(A:patternA=patternB)。

Uboot移植--支持yaffs2,TFTP菜单制作,支持Xmodem

Uboot移植--支持yaffs2,TFTP菜单制作,支持Xmodem

Uboot移植--支持yaffs2,TFTP菜单制作,支持XmodemUboot移植--支持yaffs2,TFTP菜单制作,支持Xmodem 一,支持下载yaffs2文件系统1、在include/configs/apple2440.h头文件中定义一个管理对Yaffs2支持的宏和开启u-boot中对Nand Flash默认分区的宏,如下:gedit include/configs/apple2440.h//定义一个管理对Yaffs2支持的宏#define CONFIG_MTD_NAND_YAFFS2 1//开启Nand Flash默认分区,注意此处的分区要和你的内核中的分区保持一致#define MTDIDS_DEFAULT "nand0=nandflash0"#define MTDPARTS_DEFAULT"mtdparts=nandflash0:256k(bootloader)," \"3m(kernel)," \"-(root)"2、在原来对Nand操作的命令集列表中添加Yaffs2对Nand 的写命令,如下:gedit common/cmd_nand.c在函数U_BOOT_CMD中添加如下://注意:这里只添加了yaffs2的写命令,因为我们只用u-boot 下载(即写)功能,所以我们没有添加yaffs2读的命令U_BOOT_CMD(nand, CONFIG_SYS_MAXARGS, 1,do_nand,"NAND sub-system","info - show available NAND devices\n""nand device [dev] - show or set current device\n""nand read - addr off|partition size\n""nand write - addr off|partition size\n"" read/write 'size' bytes starting at offset 'off'\n"" to/from memory address 'addr', skipping bad blocks.\n" //注意:这里只添加了yaffs2的写命令,因为我们只用u-boot下载(即写)功能,所以我们没有添加yaffs2读的命令#if defined(CONFIG_MTD_NAND_YAFFS2)"nand write[.yaffs2] - addr off|partition size - write`size' byte yaffs image\n"" starting at offset off' from memory address addr' (.yaffs2 for 512+16 NAND)\n"#endif"nand erase [clean] [off size] - erase 'size' bytesfrom\n"" offset 'off' (entire device if not specified)\n""nand bad - show bad blocks\n""nand dump[.oob] off - dump page\n""nand scrub - really clean NAND erasing bad blocks (UNSAFE)\n""nand markbad off [...] - mark bad block(s) at offset (UNSAFE)\n""nand biterr off - make a bit error at offset (UNSAFE)" #ifdef CONFIG_CMD_NAND_LOCK_UNLOCK"\n""nand lock [tight] [status]\n"" bring nand to lock state or display locked pages\n""nand unlock [offset] [size] - unlock section"#endif);3,接着,在该文件中对nand操作的do_nand函数中添加yaffs2对nand的操作,如下:if (strncmp(cmd, "read", 4) == 0 || strncmp(cmd, "write", 5) == 0){int read; if (argc &lt; 4)goto usage; addr =(ulong)simple_strtoul(argv[2], NULL, 16); read = strncmp(cmd, "read", 4) == 0; /* 1 = read, 0 = write */printf("\nNAND %s: ", read ? "read" : "write");if (arg_off_size(argc - 3, argv + 3, nand, &amp;off, &amp;size) != 0)return 1; s = strchr(cmd, '.');if (!s || !strcmp(s, ".jffs2") || !strcmp(s, ".e")|| !strcmp(s, ".i")){if (read)ret = nand_read_skip_bad(nand, off,&amp;size, (u_char *)addr);elseret = nand_write_skip_bad(nand, off,&amp;size, (u_char *)addr);} //添加yaffs2相关操作,注意该处又关联到nand_write_skip_bad函数#ifdefined(CONFIG_MTD_NAND_YAFFS2)else if (s != NULL &amp;&amp; (!strcmp(s,".yaffs2"))){nand-&gt;rw_oob = 1;nand-&gt;skipfirstblk = 1;ret =nand_write_skip_bad(nand,off,&amp;size,(u_char *)addr);nand-&gt;skipfirstblk = 0;nand-&gt;rw_oob = 0;}#endif else if (!strcmp(s, ".oob")){/* out-of-band data */mtd_oob_ops_t ops ={.oobbuf = (u8 *)addr,.ooblen = size,.mode = MTD_OOB_RAW}; if (read)ret = nand-&gt;read_oob(nand, off,&amp;ops);elseret = nand-&gt;write_oob(nand, off,&amp;ops);}else{printf("Unknown nand command suffix'%s'.\n", s);return 1;} printf(" %zu bytes %s: %s\n", size, read ? "read" : "written", ret ? "ERROR" : "OK");return ret == 0 ? 0 : 1;}在include/linux/mtd/mtd.h头文件的mtd_info结构体中添加上面用到rw_oob和skipfirstblk数据成员,如下:#gedit include/linux/mtd/mtd.h //在mtd_info结构体中添加#if defined(CONFIG_MTD_NAND_YAFFS2)u_char rw_oob;u_char skipfirstblk;#endif在第二步关联的nand_write_skip_bad函数中添加对Nand OOB的相关操作,如下:#gedit drivers/mtd/nand/nand_util.c //在nand_write_skip_bad函数中添加int nand_write_skip_bad(nand_info_t *nand, loff_t offset, size_t *length, u_char *buffer){int rval;size_t left_to_write = *length;size_t len_incl_bad;u_char *p_buffer = buffer; #ifdefined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system supportif(nand-&gt;rw_oob==1){size_t oobsize = nand-&gt;oobsize;size_t datasize = nand-&gt;writesize;int datapages = 0; if(((*length)%(nand-&gt;oobsize+nand-&gt;writesize)) != 0) {printf ("Attempt to write error length data!\n");return -EINVAL;} datapages = *length/(datasize+oobsize);*length = datapages*datasize;left_to_write = *length;}#endif /* Reject writes, which are not page aligned */ if ((offset &amp; (nand-&gt;writesize - 1)) != 0 ||(*length &amp; (nand-&gt;writesize - 1)) != 0) {printf ("Attempt to write non page aligned data\n");return -EINVAL;} len_incl_bad = get_len_incl_bad (nand, offset, *length); if ((offset + len_incl_bad) &gt;=nand-&gt;size) {printf ("Attempt to write outside the flash area\n");return -EINVAL;} #if !defined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system supportif (len_incl_bad == *length) {rval = nand_write (nand, offset, length, buffer);if (rval != 0)printf ("NAND write to offset %llxfailed %d\n",offset, rval); return rval;}#endif while (left_to_write &gt; 0) {size_t block_offset = offset &amp;(nand-&gt;erasesize - 1);size_t write_size; WATCHDOG_RESET (); if (nand_block_isbad (nand, offset &amp;~(nand-&gt;erasesize - 1))) {printf ("Skip bad block 0x%08llx\n",offset &amp; ~(nand-&gt;erasesize - 1));offset += nand-&gt;erasesize - block_offset;continue;} #if defined(CONFIG_MTD_NAND_YAFFS2)//add yaffs2 file system supportif(nand-&gt;skipfirstblk==1){nand-&gt;skipfirstblk=0;printf ("Skip the first good block %llx\n", offset &amp; ~(nand-&gt;erasesize - 1));offset += nand-&gt;erasesize - block_offset;continue;}#endif if (left_to_write &lt; (nand-&gt;erasesize - block_offset))write_size = left_to_write;elsewrite_size = nand-&gt;erasesize -block_offset; printf("\rWriting at 0x%llx -- ",offset); //add yaffs2 file system supportrval = nand_write (nand, offset, &amp;write_size, p_buffer);if (rval != 0) {printf ("NAND write to offset %llxfailed %d\n",offset, rval);*length -= left_to_write;return rval;} left_to_write -= write_size;printf("%d%% iscomplete.",100-(left_to_write/(*length/100)));offset += write_size; #ifdefined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system supportif(nand-&gt;rw_oob==1){p_buffer +=write_size+(write_size/nand-&gt;writesize*nand-&gt;oobsize);}else{p_buffer += write_size;}#elsep_buffer += write_size;#endif } return 0;}在上一步nand_write_skip_bad函数中我们看到又对nand_write函数进行了访问,所以这一步是到nand_write 函数中添加对yaffs2的支持,如下:#geditdrivers/mtd/nand/nand_base.c //在nand_write函数中添加static int nand_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const uint8_t *buf){struct nand_chip *chip = mtd-&gt;priv;int ret; #if defined(CONFIG_MTD_NAND_YAFFS2)//add yaffs2 file system support int oldopsmode = 0; if(mtd-&gt;rw_oob==1){int i = 0;int datapages = 0; size_t oobsize =mtd-&gt;oobsize;size_t datasize = mtd-&gt;writesize;uint8_t oobtemp[oobsize];datapages = len / (datasize); for(i = 0; i &lt; (datapages); i++){memcpy((void *)oobtemp, (void *)(buf + datasize * (i + 1)), oobsize);memmove((void *)(buf + datasize * (i + 1)), (void *)(buf + datasize * (i + 1) + oobsize), (datapages - (i + 1)) * (datasize) + (datapages - 1) * oobsize);memcpy((void *)(buf+(datapages) * (datasize + oobsize) - oobsize), (void *)(oobtemp), oobsize);}}#endif /* Do not allow reads past end of device */ if ((to + len) &gt; mtd-&gt;size)return -EINVAL;if (!len)return 0; nand_get_device(chip, mtd,FL_WRITING); chip-&gt;ops.len = len;chip-&gt;ops.datbuf = (uint8_t *)buf; #ifdefined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support if(mtd-&gt;rw_oob!=1){chip-&gt;ops.oobbuf = NULL;}else{chip-&gt;ops.oobbuf = (uint8_t *)(buf + len);chip-&gt;ops.ooblen = mtd-&gt;oobsize;oldopsmode = chip-&gt;ops.mode;chip-&gt;ops.mode = MTD_OOB_RAW;}#elsechip-&gt;ops.oobbuf = NULL;#endif ret = nand_do_write_ops(mtd, to,&amp;chip-&gt;ops); *retlen = chip-&gt;ops.retlen; nand_release_device(mtd); #ifdefined(CONFIG_MTD_NAND_YAFFS2) //add yaffs2 file system support chip-&gt;ops.mode = oldopsmode;#endif return ret;}OK,对yaffs2支持的代码已修改完毕,重新编译u-boot 并下载到nand中,启动开发板,在u-boot的命令行输入:nand help查看nand的命令,可以看到多了一个nand write[.yaffs2]的命令,这个就是用来下载yaffs2文件系统到nand中的命令了。

u_boot 移植(一)之uboot配置编译

u_boot 移植(一)之uboot配置编译

u_boot 移植(一)之uboot配置编译一 、开发环境PC OS : Ubuntu 14.04SOC : 基于ARM Cortex-a8 核的S5PC100开发板 : FSC100u_boot : u-boot-2010.03编译器 : arm-cortex_a8-linux-gnueabi-gcc version 4.4.6二、目标1.Uboot 能从FSC100的 Nand Flash 正常启动2.Uboot 支持DM9000 网卡3.Uboot 支持Nand Flash 读、写、擦除4.Uboot 支持Linux 内核引动好了,接下来就进行移植uboot到FSC100开发板吧 。

三、建立自己的平台1、 下载源码我们可以在下面这个网站上下载最新的和以前任一版本的 ubootftp://ftp.denx.de/pub/u-boot/2、 解压 uboot 源码并进入目录tar zxvf u-boot-2010.03.tar.gzcd u-boot-2010.03u-boot-2010.3 源码中已经支持了SMDKC100了(SMDKC100是三星公司基于SOC : S5PC100设计的一块开发板)。

我们的FSC100使用的SOC也是S5PC100,所以我们只需要稍加修改Uboot支持的SMDC100代码,就可以编译出支持我们的FSC100开发板的uboot了。

1.修改 u-boot 顶层目录下的 Makefile,指定交叉工具链在ifeq ($(HOSTARCH, $(ARCH))CROSS_COMPILE ?=endif下添加:ifeq (arm, $(ARCH))CROSS_COMPILE ?= arm-cortex_a8-linux-gnueabiendif2.在 u-boot 顶层目录下的 Makefile 中添加 fsc100 配置信息在smdkc100_config: unconfig@$(MKCONFIG) $(@:_config=) arm arm_cortexa8 smdkc100 samsung s5pc1xx下添加:fsc100_config: unconfig@$(MKCONFIG) $(@:_config=) arm arm_cortexa8 fsc100 samsung s5pc1xx3. 添加 fsc100 平台信息(1)进入board/samsung目录(2)拷贝smdkc100 为 fsc100(3)进入fsc100目录下修改smdkc100.c 为fsc100.c修改Makefile中的smkc100.o 为fsc100.o(4)进入include/configs目录,拷贝smdkc100.h为fsc100.hinclude/configs目录下的.h文件为对应开发板的配置文件。

uboot完全手册---14

uboot完全手册---14

uboot完全⼿册---141. u-boot介绍本次移植采⽤的是U-Boot-1.2.0版本。

3. U-Boot源码分析3.1 源码⼊⼝的解释可能⼤多数的同学上⽹查资料后都了解到,stage1阶段的启动代码,主要就在start.s⽂件⾥。

此start.s也是系统上电后执⾏的第⼀个代码。

它全部由汇编编写。

在讲述start.s之前,我们先来了解⼀下,系统怎么知道它要先去start.s⾥执⾏代码。

我们知道,每个可执⾏的映像Image,肯定会给编译器⼀个⼊⼝,⽽且是“有且只有⼀个全局的⼊⼝”。

我们可以把这个⼊⼝放在flash的0x0地址上,然后让系统去找这个0x0即可。

实际上,我们可以通过编写链接⽂件(lds)和mk⽂件来告知编译器这些情况。

Lds⽂件可以决定⼀个可执⾏代码的各个段的存储位置、⼊⼝地址等,详情请参考附录中的⽂章《u-boot lds⽂件详解》。

这⾥来说的Mk⽂件,是在board/下对应开发板⼦⽬录中的mk⽂件。

它指定了TEXT_BASE的地址。

3.2 stage1:启动分析终于开始u-boot源代码的讲述了!本⽂讲述的u-boot-1.2.0源码,是经笔者修改的代码。

不过,笔者也会将它与完整的源码包进⾏⽐较分析。

⾸先是start.s⽂件,刚才说过了,这个是系统启动后运⾏的第⼀个代码,我们详细地分析如下:3.2.1 中断向量表的设置.globl _start_start: b resetldr pc, _undefined_instructionldr pc, _software_interruptldr pc, _prefetch_abortldr pc, _data_abortldr pc, _not_usedldr pc, _irqldr pc, _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,0xdeadbeefStart.s⽂件⼀开始,就定义了_start的全局变量。

uboot 2014移植手册

uboot 2014移植手册
的符号链接文件;这个不影响编译,但是显得不协调。改进办法: unconfig:
@rm -f $(obj)include/config.h $(obj)include/config.mk \
$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp \ $(obj)include/autoconf.mk $(obj)include/autoconf.mk.dep \ $(obj)include/spl-autoconf.mk \ $(obj)include/tpl-autoconf.mk \ $(obj)arch/${ARCH}/include/asm/arch \ $(obj)arch/${ARCH}/include/asm/proc
ldr r0, =0x4c000004 ldr r1, =S3C2440_MPLL_400MHZ str r1, [r0] smdk2410.c: // writel(0xFFFFFF, &clk_power->locktime); /* configure MPLL */ // writel((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV, // &clk_power->mpllcon);
int i = 0;
/* 如果是 NOR 启动 */ if (isBootFromNorFlash()) {
while (i < len) {
dest[i] = src[i]; i++; } } else { //nand_init(); nand_read_ll((unsigned int)src, dest, len); } }

u-boot-2014-07代码流程分析

u-boot-2014-07代码流程分析

u-boot-2014-07代码流程分析以前接触到的u-boot启动⽅式只有Flash和Nand Flash这两种⽅式,最近接触是SD卡启动⽅式,SoC是S5P4418,启动⽅式也第⼀次接触到,根据S5P4418⽤户⼿册可以找到系统使⽤SD卡启动时,⽚内iROM内固化的代码会⾃动映射到0x00地址,也被称为第⼀阶段引导程序,该程序会检测启动引脚配置,然后从SD卡读取block1~block32内的程序到内置SRAM中执⾏,读取出来并执⾏的这段程序被称为第⼆阶段引导程序,由于其最⼤为16KB,⽆法存放完整的u-boot。

以上两个引导程序均由芯⽚⼚商提供,没有源码,不开源。

第⼆阶段引导程序从SD卡中加载u-boot到DRAM中执⾏,⾄此u-boot才开始登场。

SDHCBOOT --> 2nboot --> u-boot程序⼊⼝由于S5P4418采⽤的指令集为ARMv7,通常应该去该⽂件arch/arm/cpu/armv7下寻找该SoC,然⽽并没有,通过查看board.cfg可以看到它的CPU类型被定义为了slsiap,通过查看arch/arm/cpu/slsiap也确实存在s5p4418⽂件夹。

# Status, Arch, CPU:SPLCPU, SoC, VendorActive arm slsiap s5p4418 s5p4418接下来就是找到第⼀个执⾏的程序在哪⾥⽂件⾥,即找到程序⼊⼝,查看slsiap下的链接⽂件.text :{*(.__image_copy_start)SDIR/start.o (.text*)*(.text*)}⽽SDIR是什么并不知道,打开同⽂件夹下的config.mkSDIR=arch/arm/cpu$(if $(CPU),/$(CPU),)$(if $(SOC),/$(SOC),)替换变量之后SDIR=arch/arm/cpu/slsiap/s5p4418即第⼀个⽂件是arch/arm/cpu/slsiap/s5p4418/start.Sst art.S不同 CPU 的改⽂件⼤致功能都⼤同⼩异,设置中断向量表,将 CPU 设置为 SVC 模式,然后设置 CP15,设置 Cache,初始化内存,然后对代码进⾏重定位,之后开始清理 bss 段,为准备 C 语⾔运⾏环境,然后设置栈指针,执⾏ board_init_f 函数填充 global_data 结构体数据,最后执⾏ board_init_r,离开start.S不再返回。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
NFADDR = page & 0xff; for (i = 0; i < 10; i++); NFADDR = (page >> 8) & 0xff; for (i = 0; i < 10; i++); NFADDR = (page >> 16) & 0xff; for (i = 0; i < 10; i++); }
2、修改时钟
在 start.S 中增加对时钟的初始化,并在 board\samsung\smdk2440\smdk2410.c 的 int board_early_init_f(void)里取消对 时钟初始化的代码。 start.S:
ldr r0, =0x4c000014 // mov r1, #0x03; // FCLK:HCLK:PCLK=1:2:4, HDIVN=1,PDIVN=1 mov r1, #0x05; // FCLK:HCLK:PCLK=1:4:8 str r1, [r0] /* 如果 HDIVN 非 0,CPU 的总线模式应该从“fast bus mode”变为“asynchronous bus mode” */ mrc p15, 0, r1, c1, c0, 0 /* 读出控制寄存器 */ orr r1, r1, #0xc0000000 /* 设置为“asynchronous bus mode” */ mcr p15, 0, r1, c1, c0, 0 /* 写入控制寄存器 */ #define S3C2440_MPLL_400MHZ ((0x5c<<12)|(0x01<<4)|(0x01)) /* MPLLCON = S3C2440_MPLL_200MHZ */
arch/arm/cpu/built-in.o (.text*)
修改 smdk2440.h 里的 CONFIG_SYS_TEXT_BASE 的值为:
#define CONFIG_SYS_TEXT_BASE 0x33f00000
至此,uboot 应该能初始化时钟和内存。
5、修改重定位代码
a、在 addr 的最后位置,去掉
来 S3C2410 单板下的所有文件拷贝到 2440 下。 c、在 include/configs 下执行:cp smdk2410.h smdk2440.h。拷贝原来 2410
的配置文件。 d、发现顶层 makefiel 的一个小 bug:make distclean 的时候,不删除 ln -s 生成
#define TXD0READY (1<<2)
பைடு நூலகம்
void nand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len);
static int isBootFromNorFlash(void) {
volatile int *p = (volatile int *)0; int val;
/* NAND FLASH 控制器 */ #define NFCONF (*((volatile unsigned long *)0x4E000000)) #define NFCONT (*((volatile unsigned long *)0x4E000004)) #define NFCMMD (*((volatile unsigned char *)0x4E000008)) #define NFADDR (*((volatile unsigned char *)0x4E00000C)) #define NFDATA (*((volatile unsigned char *)0x4E000010)) #define NFSTAT (*((volatile unsigned char *)0x4E000020))
(*(volatile unsigned long *)0x50000000) (*(volatile unsigned long *)0x50000004) (*(volatile unsigned long *)0x50000008) (*(volatile unsigned long *)0x5000000c) (*(volatile unsigned long *)0x50000010) (*(volatile unsigned char *)0x50000020) (*(volatile unsigned char *)0x50000024) (*(volatile unsigned long *)0x50000028)
3、初始化内存
在 lowlevel_init.S 里修改 SMRDATA:对应的数值: SMRDATA:
.long 0x22011110 //BWSCON .long 0x00000700 //BANKCON0 .long 0x00000700 //BANKCON1 .long 0x00000700 //BANKCON2 .long 0x00000700 //BANKCON3 .long 0x00000740 //BANKCON4 .long 0x00000700 //BANKCON5 .long 0x00018005 //BANKCON6 .long 0x00018005 //BANKCON7 .long 0x008C04F4 // REFRESH .long 0x000000B1 //BANKSIZE
u-boot 2014.01 移植手册
移植环境: JZ2440 v2 arm-linux-gcc 4.3.2 u-boot-2014.01
参考资料: 韦东山 linux 开发视频
本 uboot 工程的补丁下载: /detail/callmefriend/7089867
void clear_bss(void) {
extern int __bss_start, __bss_end; int *p = &__bss_start;
for (; p < &__bss_end; p++) *p = 0;
}
void nand_init_ll(void) { #define TACLS 0 #define TWRPH0 1 #define TWRPH1 0
val = *p; *p = 0x12345678; if (*p == 0x12345678) {
/* 写成功, 是 nand 启动 */ *p = val; return 0; } else { /* NOR 不能像内存一样写 */ return 1; } }
/* *src=0; dest=0x33f80000;len=0x73250 **/ void copy_code_to_sdram(unsigned char *src, unsigned char *dest, unsigned int len) {
int i = 0;
/* 如果是 NOR 启动 */ if (isBootFromNorFlash()) {
while (i < len) {
dest[i] = src[i]; i++; } } else { //nand_init(); nand_read_ll((unsigned int)src, dest, len); } }
原文地址: /callmefriend/article/details/21954279
1、增加对 2440 的支持。 a、修改 boards.cfg,仿照 2410,增加 2440. b、在 board/samsung/目录下执行:cp smdk2410/ smdk2440 -rf 。将原
/* 设置时序 */ NFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4); /* 使能 NAND Flash 控制器, 初始化 ECC, 禁止片选 */ NFCONT = (1<<4)|(1<<1)|(1<<0); }
static void nand_select(void) {
// addr -= gd->mon_len;
// addr &= ~(4096 - 1);
addr = CONFIG_SYS_TEXT_BASE;
b、在 start.S 里 bl cpu_init_crit 后增加 nand 初始化和 copy 代码,并清 BSS,同
时在增加 copy nand 文件的源文件 init.c:
NFCONT &= ~(1<<1); }
static void nand_deselect_ll(void) {
NFCONT |= (1<<1);
}
static void nand_cmd(unsigned char cmd) {
volatile int i; NFCMMD = cmd; for (i = 0; i < 10; i++); }
static void nand_wait_ready_ll(void) {
while (!(NFSTAT & 1)); }
static unsigned char nand_data(void) {
return NFDATA; } /* *src=0; dest=0x33f80000;len=0x73250 */ void nand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len) {
.long 0x00000030 //MRSRB6
.long 0x00000030 //MRSRB7
4、修改链接选项
在 arch/arm/config.mk 里,取消-pie 选项
相关文档
最新文档