uboot 1.2.0移植
uboot移植
多阶段的 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移植记录
uboot移植记录很久没来打理我的BLOG了,一晃近半年过去了。
前段时间一直忙于几个内核驱动和工作中的一些事情,而无暇分心管理自己的Blog,这次稍微闲下来点,打算把以前写过的一些文章整理一下发出来。
希望能给网络上同样热衷于嵌入式开发的朋友们一点帮助。
同时也回顾一下自己以前做过的事,当作一个备忘录吧。
首先是uboot移植记录系列。
这系列文章适合于uboot移植的初学者,这里基于常见的开发平台S3C2410。
若需要移植uboot到一个全新开发板,则需要参考更多的资料并对uboot 有更深入的了解。
本人对此也有所钻研,也有个较牛的同事专门做这这个的,呵呵~:)若感兴趣的朋友大家可以一起探讨。
因此关于新平台uboot的移植这里就不多讲了。
uboot移植记录系列专题环境:Crosstool3.3.2+uboot1.14+ARMSYS2410开发板作者:Dongas移植uboot,通常的方法是参考uboot中已支持的板子进行修改。
在源码下执行#find.-exec grep-l2410{}\;可以查看到uboot中已支持的2410相关的板子。
里面有smdk2410,一般情况下我们移植uboot到s3c2410时都是基于这个配置进行修改。
具体修改的多少要视板子而定。
如果你的板子和smdk2410配置相同的话,甚至不需要修改直接编译针对smdk210平台的就能使用。
但这种情况并不多,大部分情况下还是需要进行些简单的修改。
uboot的整个移植过程我们可以分为三个阶段:一,移植可以从Nor flash启动的uboot这个阶段是移植一个最简单的uboot,可以烧在Nor flash内运行./u2/60011/showart.php?id=1005057二,移植支持Nand flash驱动的uboot加入Nand flash驱动的支持,可以在uboot命令行下操作Nand flash.但还未能从Nand flash启动,只能在Nor flash内运行./u2/60011/showart.php?id=1005795三,移植可以从Nand flash启动的uboot可以烧录在Nand flash,并设置从Nand flash启动运行uboot./u2/60011/showart.php?id=1006458分三个阶段进行移植,可以对整个uboot的移植过程及原理更加清晰明了,同时降低了发现问题时解决问题的困难度和解决范围.uboot移植记录之一uboot整个移植过程我们可以分为三个阶段:一,移植可以从Nor flash启动的uboot这个阶段是移植一个最简单的uboot,可以烧在Nor flash内运行.二,移植支持Nand flash驱动的uboot加入Nand flash驱动的支持,可以在uboot命令行下操作Nand flash.但还未能从Nand flash启动,只能在Nor flash内运行.三,移植可以从Nor flash启动的uboot可以烧录在Nand flash,并设置从Nand flash启动运行uboot.分三个阶段进行移植,可以对整个uboot的移植过程及原理更加清晰明了,同时降低了发现问题时解决问题的困难度和解决范围.首先介绍移植可以从Nor flash启动的uboot.这个阶段相对简单一点,是移植一个最简单的uboot,可以烧在Nor flash内运行.不需要修改太多的东西。
UBOOT移植(NANDFLASH的支持)——初步移植(二)
UBOOT移植(NANDFLASH的支持)——初步移植(二)NAND FLASH初始化入口函数(arch/arm/lib/board.c)这里需要定义CONFIG_CMD_NAND这个宏才行,在配置头文件中已经包含进去了,没问题。
nand_init()函数(drivers/mtd/nand/nand.c)这个函数里面使用两个宏参数进行控制CONFIG_SYS_MAX_NAND_DEVICE和CONFIG_SYS_NAND_SELECT_DEVICE,前者已经在配置头文件中进行了描述,后者由于对应的是有多个NAND设备存在的情况,这里就忽略了。
nand_init_chip()函数(drivers/mtd/nand/nand.c)这个函数需要配置三个宏参数,除了CONFIG_RELOC_FIXUP_WORKS其余都定义了。
没有定义的那个宏给出的描述是“Relocation to SDRAM works on all XXX boards”意思是重置到SDRAM工作在所有XXX板子上。
UBOOT中大部分ARM板子上都没有定义这个宏,SMDK2410也没有定义这个宏,这里也就选择不定义。
这个函数函数还需要三个参数,这三个参数在开头进行了定义。
nand_info_t nand_info[CONFIG_SYS_MAX_NAND_DEVICE];static struct nand_chip nand_chip[CONFIG_SYS_MAX_NAND_DEVICE];static ulong base_address[CONFIG_SYS_MAX_NAND_DEVICE] =CONFIG_SYS_NAND_BASE_LIST;宏CONFIG_SYS_NAND_BASE_LIST采用默认的配置。
#ifndef CONFIG_SYS_NAND_BASE_LIST#define CONFIG_SYS_NAND_BASE_LIST { CONFIG_SYS_NAND_BASE }#endif上述所有参数在配置头文件中都有定义。
u-boot移植
Uboot 移植5.1 交叉编译环境的搭建5.2移植过程一、在U-boot中建立自己的开发板类型,并测试编译,这个开发板取名叫aking2410,选用Uboot 1.2.0版本 (修改或命令都为加粗)。
下载并解压缩U-boot。
[root@localhost Compile]# tar -jxvf uboot 1.2.0.tar.bz2进入U-boot目录,修改Makefile[root@localhost Compile]#cd u-boot-1.2.0[root@localhost Compile]#gedit Makefile为aking2410建立编译项...smdk2410_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0 aking2410_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t aking2410 akings3c24x0...每项的意思是:arm:CPU的架构(ARCH)arm920t:ARM9系列的一个类型,其对应于cpu/arm920t子目录。
aking2410:开发板(BOARD)的型号,对应于board/aking/aking2410子目录。
aking:开发者或经销商(vender)。
s3c24x0:片上系统(SOC)。
另外加上自己的交叉编译器的路径,如下:...export ARCH CPU BOARD VENDOR SOC/*added by aking *******start*******/CROSS_COMPILE = /opt/crosstool/arm-linux/bin/arm-linux-/*added by aking********end*********/ifndef CROSS_COMPILEifeq ($(HOSTARCH),ppc)...在/board子目录下建立自己的开发板aking2410目录。
uboot的移植
移植u-boot到S3C2410准备工作:首先有一个arm的交叉编译环境,可以自己去做,我自己是用自己做的armtools,你也可以到网上去下载一个armtools。
然后到ftp.denx.de/pub/u-boot/ 上面去下载一个u-boot-1.2.0.tar.bz2的文件到本地计算机上。
一、在u-boot中建立自己的开发板类型,并测试编译。
我给他取名为binnary2410这个你可以自己起名,不过下面的要对应起来。
1、在工作目录下解压u-boot-1.2.0.tar.bz2。
[root@binnary ~]#tar –jxvf u-boot-1.2.0.tar.bz22、进入u-boot目录修改Makefile文件。
[root@binnary ~]#cd u-boot[root@binnary ~/u-boot-1.2.0]#vi Makefile为binnary2410建立编译项按照下面的这个smdk2410_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0来写这个,在第一行写就行了.binnary2410_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t binnary2410 binnary s3c24x0各项的意思如下:arm: CPU的架构(ARCH)arm920t: CPU的类型(CPU),其对应于cpu/arm920t子目录。
binnary2410: 开发板的型号(BOARD),对应于board/binnary/binnary2410目录。
binnary: 开发者/或经销商(vender)。
s3c24x0: 片上系统(SOC)。
同时在CROSS_COMPILE之前加入你做好的交叉编译环境路径。
我的是/armtools/bin/arm-linux- CROSS_COMPILE=/armtools/bin/arm-linux-3、在board文件夹下创建自己开发板的目录。
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的调试和性能优化。
–使用调试工具进行调试,如调试器、串口打印信息等。
uboot移植心得
最近跑完裸机之后,便开始跑系统,但想着裸机与系统之间隔着个Bootloader,反正以前也没怎么深入研究,便说花一到两周时间来搞搞U-BOOT。
参考了fzb和赵春江两位大牛的,也研究了2010.06版本的和2011.06版本两个经典版本,也对比了TQ(我买的板是天嵌的)自己写的U-BOOT,学到了不少,也发现了很多东西,以下便记录以下自己的心得吧,以便以后可以自己参考下。
U-BOOT的两个阶段启动过程:(2010.06经典版来说)第一阶段:start.S的路径位于arch\arm\cpu\arm920t\这段汇编代码一般被称作第一阶段初始化代码。
主要作用是初始化运行环境;初始化内存;重新放置UBOOT代码到内存中;跳入到内存中执行第二段初始化代码1、关闭开门狗,屏蔽所有中断2、设置分频比3、bl cpu_init_crit() 关MMU,初始化内存bl lowlevel_init() 配置内存,修改内存刷新率参数等4、relocate判断当前代码是在NORFLASH还是RAMcopy_loop循环将FLASH代码复制至RAM中5、stack_setup栈设置clear_bss_bss_start到_bss_end之间的数据清06、ldr pc , start_armboot 跳转到第二阶段//=====================================================================第二阶段:board.c的路径位于arch/arm/lib/board.c,这段代码为U-BOOT的第二阶段初始化代码。
主要作用是初始化两个重要数据结构,对SDRAM的内存分配设置,对各种需要用到的外设进行初始化,最后循环跳入main_loop()函数二阶段start_armboot分为board_init_f 和 board_init_r两部分先执行的board_init_f部分:1、为gd数据结构分配地址,并清零2、执行init_fnc_ptr函数指针数组中的各个初始化函数,如下board_early_init_f ,timer_init ,env_init init_baudrate serial_initconsole_init_f display_banner dram_init3、A、分配SDRAM高64KB为TLB,用于U-BOOTB、分配SDRAM下一单元为U-BOOT代码段,数据段,BSS段(这里插一句,原来BSS段是用来存放未初始化的全局变量与静态变量)C、接着开辟malloc空间,存bd , gd , 3个字大小的异常堆空间4、将relorate的地址值赋给gd结构体相应变量(2011.06版本的,用于返回start.S)后执行的board_init_r部分:1、对gd , bd 数据结构赋值初始化2、各种外设初始化:初始化NORFLASH, NANDFLASH,初始化ONENAND FLASH初始化环境变量初始化PCI设置IP地址初始化各类外设:IIC、LCD、键盘、USB初始化控制台建立IRQ中断堆栈初始化以太网初始化跳转表(定义了U-Boot中基本的常用函数库)。
linux 内核启动过程移植uboot和linux内核
移植UbootLinux整理由于按照NFS不小心,Ubuntu罢工,不得以,自己重新把移植uboot和linux工作重新做一次,权当复习.自己移植的是Uboot-1.2.0和linux-2.6.14.1 到恒丰锐科(hfrk) 2410 的板子.用busybox-1.2.0 和cramfs-1.1 制作camfs.该板子没有nor,只要64M的nand.1.==============uboot按照编译器=====================sudo tar -jxvf arm-linux-gcc-3.3.2.tar.bz2 -C ///for uboot have hard float .2.=========uboot1.2.0 移植=======================见附件ubootclay2010Feb05.patch .以下是移植说明.修改根目录的Makefile的cross compilerCROSS_COMPILE ?= /usr/local/arm/3.3.2/bin/arm-linux-修改/home/clay/u-boot-1.2.0/cpu/arm920t/config.mk 见7(13)屏蔽"-msoft-float" 不要浮点,也可以自己编译带软件浮点的编译器.make distclean//清除上一次的配置make smdk2410_config //选用2410 默认配置make //编译,在去掉浮点后,能编译通过修改/home/clay/u-boot-1.2.0/board/smdk2410/lowlevel_in it.S //2410 DDR时序配置/home/clay/u-boot-1.2.0/cpu/arm920t/start.S // 添加copy uboot到ddr的代码,注意copy 的页面数量要比编译出来的uboot.bin大/home/clay/u-boot-1.2.0/include/configs/smdk2410.h //修改nand boot的配置,nand命令,uboot启动kernel命令,传递给kernel的参数,串口波特率等等for nand cmd & load CONFIG_BOOTARGS CONFIG_BOOTCOMMAND/home/clay/u-boot-1.2.0/include/linux/mtd/nand_ids .h //添加nand_flash_ids nand flash id/home/clay/u-boot-1.2.0/lib_arm/board.c //可以添加一些打印信息,可以不添加/home/clay/u-boot-1.2.0/common/cmd_boot.c //uboot的go 没有带CUP的id参数,所以添加,见7(9)/home/clay/u-boot-1.2.0/drivers/nand/nand.c //for nand 的操作用到的具体的读写见7(12)重新编译,可以进入到uboot的命令界面3.======================ubuntu tftp =======================$ sudo apt-get install xinetd tftpd tftp失败,vsftp也不能tftp访问,见7(11)以下是成功的方法sudo apt-get install tftpd-hpa tftp-hpasudo update-rc.d -f tftpd-hpa removeclay@pan:/home$ sudo mkdir tftpclay@pan:/home$ sudo chmod 777 -R tftp/clay@pan:/home$ sudo chown -R nobody tftp/sudo apt-get install xinetdsudo gedit /etc/xinetd.d/tftp添加以下server = /usr/sbin/in.tftpd#server_args = /home/tftpdisable = noserver_args = -s /home/tftpd -p -c -U 077 -u tftpd #//表示tftp操作目录在/home/tftpd上log_on_success = PID HOST DURATIONlog_on_failure = HOST}sudo gedit /etc/inetd.conf 屏蔽以下语句#tftp dgram udp wait root /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot如果tftp不能工作,执行/etc/init.d/xinetd restart 即可到这里,在uboot 可以用tftp 的命令下载zImage等,用go可以执行4========================kernel=================== ======移植linux-2.6.14.1内核,见附件linuxclay2010feb04.patch.修改arch/arm/mach-s3c2410/devs.c //添加nand 分区structdrivers/mtd/nand/s3c2410.c //禁止nand ecc ,因为uboot和kernel的ecc不一样linux/arch/arm/mach-s3c2410/mach-smdk2410.c,smdk24 10_devices添加&s3c_device_nand,让系统开机初始化nand,能从中读取cramfs参照arch/arm/configs/s3c2410_defconfig 配置内核,也可以用make menuconfig然后在以下步骤添加-Boot options :noinitrd root=/dev/mtdblock2 init=/linuxrc devfs=mount console=ttySAC0,115200same as uboot-file system - network file system - NFS-miscellaneous filesystem-cramfsmake (zImage)//可以成功用修改后的go运行,只是找不到rootfs制作bootm引导的uImagesudo cp ../u-boot-1.2.0/tools/mkimage /usr/local/bin/gedit arch/arm/boot/Makefile------------------------------------quiet_cmd_uimage = UIMAGE $@cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A arm -O linux -T kernel \-C none -a $(ZRELADDR) -e 0x30008040 \ #//使用bootm,原因见7(6)的解释-n 'Linux-$(KERNELRELEASE)' -d $< $@-----------------------------------------------make uImage----tftp 0x30008000 uImagenand erase 0x00040000nand write 0x30008000 0x00040000 0x001c00005=================cramfs busybox==================添加zlib,因为ubuntu没带,见7(17)$tar -xvzf zlib-1.2.3.tar.gz$cd zlib-1.2.3.tar.gz$./configure$make$sudo make installcramfs-1.1/: makemakemake install 的到制作cramfs的工具的执行程序编译busybox//最好和内核用一样的编译器,见7(16)menuconfig-设置compiler /usr/local/arm/3.4.1/bin/arm-linux--install option don't use /usr& set out file path-general CONFIG_FEATURE_SUID=y ???make 后,在指定的目录的到bin sbin linuxrc,他们都是busybox的链接6====================rootfs======================在编译出来busybox 目录下clay@pan:~/rootfs$ mkdir dev etc home lib mnt proc sys tmp var usr//bin sbin no needrm linuxrc//编译出来的这文件不能执行,不合适,所以要修改,见7(17)gedit linuxrc----------------------------------------------#!/bin/shecho "mount /etc as ramfs"/bin/mount -f -t cramfs -o remount,ro /dev/bon/2 //bin/mount -t ramfs ramfs /var/bin/mkdir -p /var/tmp/bin/mkdir -p /var/run/bin/mkdir -p /var/log/bin/mkdir -p /var/lock/bin/mkdir -p /var/empty#/bin/mount -t usbdevfs none /proc/bus/usbexec /sbin/init----------------------------------------------//添加rcS 文件-gedit rcS-------------------------------------------------- ---------------------------------#!/bin/sh/bin/mount -a-------------------------------------------------- ---------------------------------chmod 775 linuxrc rcSclay@pan:~/rootfs$ mkdir -p etc/init.d/clay@pan:~/rootfs$ mv rcS etc/init.d/clay@pan:~/etc$ gedit inittab//添加inittab以下内容-------------------------------------------------# This is run first except when booting::sysinit:/etc/init.d/rcS# Start an "askfirst" shell on the console#::askfirst:-/bin/bash::askfirst:-/bin/sh# Stuff to do when restarting the init process::restart:/sbin/init# Stuff to do before rebooting::ctrlaltdel:/sbin/reboot::shutdown:/bin/umount -a -r-------------------------------------------------gedit fstab//添加以下内容-------------------------------------------------- ------------none /proc proc defaults 0 0none /dev/pts devpts mode=0622 0 0tmpfs /dev/shm tmpfs defaults 0 0-------------------------------------------------- --------clay@pan:~/rootfs$ chmod 777 inittab fstabclay@pan:~/rootfs$ mv fstab etc/clay@pan:~/rootfs$ mv inittab etc/clay@pan:~/rootfs$ cd dev/clay@pan:~/rootfs/dev$ sudo mknod console c 5 1[sudo] password for clay:clay@pan:~/rootfs/dev$ sudo mknod null c 1 3clay@pan:~$ gedit libcopy.sh//制作一个sh程序,去复制编译器中动态库, ------------------------------------# cd /usr/local/arm/3.4.1/arm-linux/lib/ //到编译内核的编译器目录里for file in libc libcrypt libdl libm libpthread libresolv libutildocp $file-*.so /home/clay/rootfs/libcp -d $file.so.[*0-9] /home/clay/rootfs/libdonecp -d ld*.so* /home/clay/rootfs/lib------------------------------------//clay@pan:~$ sudo cp libcopy.sh /usr/local/arm/3.4.1/arm-linux/lib/clay@pan:~$ cd /usr/local/arm/3.4.1/arm-linux/libclay@pan:/usr/local/arm/3.4.1/arm-linux/lib$ sudo sh libcopy.sh制作cramfsclay@pan:~$ ./mkcramfs rootfs/ rootfs.cramfs//下载tftp 0x30008000 rootfs.cramfsnand erase 0x00200000 0x02800000nand write 0x30008000 0x00200000 0x00300000完成.kernel可以引导rootfs7 =======遇见的问题和参考的网站===========//网址不不一定对,可以按照关键字去搜(1)Error: unrecognized/unsupported machine ID (r1 = 0x33f60264).// cmd_boot.c or kernel head.S add id = 0xc1(2)Warning: unable to open an initial console.Failed to execute /linuxrc. Attempting defaults...Kernel panic - not syncing: No init found. Try passing init= option to kernel.//linuxrc 不能用busybox的,需要修改(3)## Booting image at 30008000 ...Bad Magic Number// 使用bootm的启动,必须是uImage的内核(/linux/dosc1/59/linux-393120 .htm)(4)VFS: Cannot open root device "hda1" or unknown-block(2,0)Please append a correct "root=" boot optionKernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)// kernel没有找到rootfs(5)内核kernel以及根文件系统rootfs是如何映射到对应的nand flash的地址的(/course/6_system/linux/Linuxj s/20100204/194702.html)(6)U-BOOT下使用bootm引导内核方法bootm kernel(/lanmanck/archive/2009/ 06/16/4273967.aspx)比较详细解释了bootm用法,好文章(7)uboot中利用TFTP和NFS加载内核镜像和根文件系统(/u3/108239/showart_21443 75.html)介绍了tftp nfs 中配置(8)uImage的制作(/sunxuxi/blog/item/bf3bd62f1a6 f0d3b1f3089cb.html)2.6.14内核已经有操作,只需要mkimage文件放到/usr/bin,及修改arch/arm/boot/Makefile,改变引导参数,见(6)(10)常用UBoot命令(/zhandoushi1982/archive/2009/ 10/15/4677728.aspx)(11)解决uboot-1.1.6 tftp命令不能成功下载文件的问题(/u3/93291/showart_206163 0.html)解决方法及查问题过程(12)移植U-Boot.1.2.0到博创2410-S 移植U-Boot.1.2.0到友善之臂SBC2440V4uboot nand搬移uboot.bin过程(13)移植U-Boot过程中遇到的问题(/u3/97105/showart_196263 8.html)浮点,CRC问题,Bad Magic Number(14)文件系统的制作(/luofuchong/archive/2007/0 1/10/21711.aspx)大概介绍(15)构造cramfs根文件系统(基于busybox)(/post/26082/469877 )理论介绍,但没有修改linurc(16)cramfs文件系统中ARM9上的移植(三)(/lmzzyw/blog/item/e1f07ac88ae 6b1127f3e6fc4.html)包含linuxrc及复制*.so链接库的脚本(17)[2410]移植cramfs文件系统和busybox到linux2.6(/aokikyon/blog/item/55 8a4a3ec997813b71cf6c26.html)解决cramfs 一些问题(18)ARM9 2410移植之linux 2.6 内核的移植(/zjsxycli/blog/item/87fe27213f 2398449358074b.html)移植全过程,包括nand分区,网卡等等(19)cramfs+yaffs嵌入式平台的实现(/space.php?uid=111047&do=b log&id=15372)。
uboot移植(深入浅出)
移植U-Boot.1.3.1到S3C244和S3C2410首先,U-Boot1.3.1还没有支持s3c2440,移植仍是用2410的文件稍作修改而成的。
2440和2410的区别在我移植1.2.0的文章中已经写了,这里不再赘述。
对于1.3.1和1.2.0的差别,我初看了一下,(对于ARM920T内核)应该是增加了对A TMEL 公司的A T91RM9200系列处理器的支持。
至于S3C24X0系列的芯片,原理上并没有什么大的变化。
一、在U-Boot中建立自己的开发板类型,并测试编译。
我为开发板取名叫: tekkaman24400 在工作目录下解压U-Boot。
[tekkamanninja@ARM9-Host working]$ tar -xjvf u-boot-1.3.1.tar.bz21 进入U-Boot目录,修改Makefile(我在fedora 8 下,比较喜欢使用KWrite)[tekkamanninja@ARM9-Host working]$ cd u-boot-1.3.1[tekkamanninja@ARM9-Host u-boot-1.3.1]$ kwrite Makefile#为tekkaman2440建立编译项sbc2410x_config: unconfig@$(MKCONFIG) $(@:_config=) arm arm920t sbc2410x NULL s3c24x0tekkaman2440_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t tekkaman2440 tekkaman s3c24x0LSD1808_config: unconfig@$(MKCONFIG) $(@:_config=) arm arm926ejs lsd1808 NULL am1808各项的意思如下:arm: CPU的架构(ARCH)arm920t: CPU的类型(CPU),其对应于cpu/arm920t子目录。
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(超精华版)
#make gec2440_config #make 编译完成时最后两句如下:
arm-linux-objcopy -O srec u-boot u-boot.srec arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin 表示编译成功。
# if defined(CONFIG_S3C2410)
ldr r1, =0x7ff //0x3ff,根据 2410 芯片手册,INTSUBMSK 有 11 位可用,vivi 也是 0x7ff, u-boot 则是 0x3ff,不过芯片复位后所有中断都被屏蔽,故这无影响
ldr r0, =INTSUBMSK
>> 2
广州广嵌电子科技有限公司
u-boot移植要点 我们可以总结出bootloader的两大功能:
1 是下载功能,既通过网口、串口或者USB口下载文件到RAM中。 2 是对flash芯片的读写功能。 u-boot对S3C2440已经有了很好的支持,在移植过程中主要是完善u-boot对nand flash 的读写功能。 u-boot移植前的准备工作 1.下载源码 Uboot的源码可以从以下网址下载: /u-boot/u-boot-2009.11.tar.bz2?modtime=1134 752480&big_mirror=0 我们这里下载的是u-boot-2009.11.tar.bz2 工具链使用cross-4.1.2
samsung: 开发者/或经销商(vender)。
s3c24x0: 片上系统(SOC)。 板子起名叫gec2440,可以依自己的喜好修改
uboot移植
-> 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移植操作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移植详细教程
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 移植的过程(给大家作参考)要点提要:要修改的文件makefilecpu/arm920t/include/configsdriver/board/修改代码1.顶层Makefilesmdk2410_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0mini2440_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t mini2440 NULL s3c24x02.Cpu/arm920t/start.s2-1.修改编译条件使其支持s3c2440136行#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440) 2-2.添加寄存器定义149行#define CLK_CTL_BASE 0x4C000000#define MDIV_405 0x7f << 12#define PSDIV_405 0x21#define UPLL_MDIV_48 0x38 << 12#define UPLL_PSDIV_48 0x22#define MDIV_200 0xa1 << 12#define PSDIV_200 0x312-3. 修改中断禁止部分,添加s3c2440中断禁止代码164行#if defined(CONFIG_S3C2440)ldr r1, =0x7fff /*根据2440芯片手册,INTSUBMSK有15位可用*/ldr r0, =INTSUBMSKstr r1, [r0]#endif2-4.修改时钟设置(将s3c2440主频设置为405MHZ)# if defined(CONFIG_S3C2440)/* FCLK:HCLK:PCLK = 1:4:8 */ldr r0, =CLKDIVNmov r1, #5str r1, [r0]mrc p15, 0, r1, c1, c0, 0 /*read ctrl register hugerat*/orr r1, r1, #0xc0000000 /*Asynchronous hugerat*/mcr p15, 0, r1, c1, c0, 0 /*write ctrl register hugerat*//*now, CPU clock is 405.00 Mhz hugerat*/mov r1, #CLK_CTL_BASE /* hugerat*/mov r2, #UPLL_MDIV_48 /*UPLL */add r2, r2, #UPLL_PSDIV_48str r2, [r1, #0x08] /*write UPLL first,48MHz */mov r2, #MDIV_405 /* mpll_405mhz hugerat*/add r2, r2, #PSDIV_405 /* mpll_405mhz hugerat*/str r2, [r1, #0x04] /* MPLLCON hugerat */#else/* FCLK:HCLK:PCLK = 1:2:4 */ldr r0, =CLKDIVNmov r1, #3str r1, [r0]mrc p15, 0, r1, c1, c0, 0 /*read ctrl register hugerat*/orr r1, r1, #0xc0000000 /*Asynchronous hugerat*/mcr p15, 0, r1, c1, c0, 0 /*write ctrl register hugerat*//*now, CPU clock is 202.8 Mhz hugerat*/mov r1, #CLK_CTL_BASE /* hugerat*/mov r2, #MDIV_200 /* mpll_200mhz hugerat*/add r2, r2, #PSDIV_200 /* mpll_200mhz hugerat*/str r2, [r1, #0x04]# endif3. 修改cpu/arm920t/s3c24x0/interrupts.c3-1在S3C2410宏定义开关里加入对S3C2440的支持33行#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410)|| defined (CONFIG_S3C2440) || defined (CONFIG_TRAB)3-2在函数get_tbclk中,添加对mini2440支持180行defined(CONFIG_SMDK2410) || \defined(CONFIG_MINI2440) || \4.修改cpu/arm920t/s3c24x0/speed.c4-1.在宏定义中添加对S3C2440的支持33行#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410)|| defined (CONFIG_S3C2440) || defined (CONFIG_TRAB)37行#elif defined(CONFIG_S3C2410) || defined(CONFIG_S3C24404-2.修改函数get_PLLCLK由于S3c2410与s3c2440的MPLL,UPLL计算公式不同68行#if defined(CONFIG_S3C2440)if (pllreg == MPLL)return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s));else if (pllreg == UPLL)#endif4-3.修改函数get_HCLK同样s3c2410与s3c2440对分频的设置也不相同,需添加相关修改。
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移植手册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)。
u-boot-1.2.0 移植粗解 - bycore的blog
u-boot-1.2.0 移植粗解经过几周的折腾,终于搞定了u-boot-1.2.0,写这篇粗解希望能给后来的朋友一些启示和帮助。
下面就从以下几个方面粗写一些u-boot-1.2.0方面的知识:启动流程各命令简解移植步骤nor flash底层驱动的修改cs8900网络驱动与tftpLinux下tftp-server的安装与配置开饭板资源说明:处理器:S3C2410A;内存:SDRAM 64M;Flash:nor flash sst39vf1601;网卡芯片:CS8900A,映射到nGCS3。
1. u-boot启动流程关于u-boot的启动流程网上也有很多资料描述,这里再赘述一番。
S3c2410采用ARM920T核,u-boot就从\cpu\arm920t下的Start.S启动。
Start.S主要完成了以下一些工作:安装中断,设置时钟,cpu的初始化,将自身搬运到目的地(0x3ff80000处),设置堆栈,清除bss段,最后跳转到start_armboot。
在Start.S中,cpu的初始化由cpu_init_crit实现,它完成以下功能:flush v4 I/D caches, 关闭MMU stuff,关闭caches和调用lowlevel_init初始化BWSCON。
lowlevel_init在\board\yourboard中实现。
Start.S中实现代码如下:#ifndef CONFIG_SKIP_LOWLEVEL_INITbl cpu_init_crit#endif从上面可以看到cpu_init_crit是条件编译的,这主要用于调试阶段。
如果是通过其他bootloader加载u-boot并调试的话,那么,#define CONFIG_SKIP_LOWLEVEL_INIT一下是很有必要的。
假设通过vivi将u-boot.bin加载到RAM中执行,如果没有定义CONFIG_SKIP_LOWLEVEL_INIT那么在终端上我们什么也看不到。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
uboot 1.2.0移植移植环境:VMware5.5.2+redhat9开发板:SKY_2440B_V5.0或者V3.0编译器:cross3.2(下载地址ftp:///pub/armlinux/toolchain/cross3.2.tar.gz)Uboot:u-boot-1.2.0(下载地址:ftp://ftp.denx.de/pub/u-boot/)先说明一下,移植过程按照tekkaman的blog移植的。
博客地址/u1/34474/index.html。
其中uboot的移植参照/u1/34474/showart.php?id=397315做的。
所下面写的移植过程,很多都是从blog上copy过来的,有不同的地方,我会另外指出。
1.用dk登录linux主机,在dk下创建一个myboard文件夹2.解压cross3.2:解压到/usr/local/arm/文件夹下最好在/usr/local/arm/下创建一个3.2文件夹,把解压在arm文件夹下的文件(夹)全部移到3.2下,因为后面可能还会用到3.4.1的交叉编译器。
3.解压uboot:将uboot解压到myboard文件夹下tar xzvf u-boot-1.2.0.tar.bz2 –C /home/dk/myboard/4.进入uboot目录,修改Makefilecd u-boot-1.2.0vi Makefile(1)新建我的编译项在1923行,即smdk2410_config编译项之后增加我的编译项tekkaman2440_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t tekkaman2440 tekkaman s3c24x0 各项的意思如下:arm: CPU的架构(ARCH)arm920t: CPU的类型(CPU),其对应于cpu/arm920t子目录。
tekkaman2440: 开发板的型号(BOARD),对应于board/tekkaman/tekkaman2440目录。
tekkaman: 开发者/或经销商(vender)。
s3c24x0: 片上系统(SOC)。
(2)修改交叉编译器路径,我用的cross3.2是在/usr/local/arm/修改128行CROSS_COMPILE=/usr/local/arm/3.2/bin/arm-linux-5.在/board子目录中建立自己的开发板tekkaman2440目录由于我在上一步板子的开发者/或经销商(vender)中填了tekkaman ,所以开发板tekkaman2440目录一定要建在/board子目录中的tekkaman目录下,否则编译会出错。
$cd board$mkdir tekkaman tekkaman/tekkaman2440$cp -arf sbc2410x/* tekkaman/tekkaman2440/$cd tekkaman/tekkaman2440$mv sbc2410x.c tekkaman2440.c还要记得修改自己的开发板tekkaman2440目录下的Makefile文件,不然编译时会出错:$vi MakefileCOBJS := tekkaman2440.o flash.o6.在include/configs/中建立配置头文件$cp include/configs/sbc2410x.h include/configs/tekkaman2440.h7.测试编译能否成功$make tekkaman2440_configConfiguring for tekkaman2440 board...(如果出现:$ make tekkaman2440_configMakefile:1927: *** 遗漏分隔符。
停止。
请在U-boot的根目录下的Makefile的@$(MKCONFIG) $(@:_config=) arm arm920t tekkaman2440 tekkaman) 前加上“Tab”键)$make到这一步应该能编译成功,但是我的并没有编译成功,提示/common/cmd_bootm.c文件的464行的U_BOOT_CMD有错误,我是把其中的从#ifdef CONFIG_OF_FLAT_TREE到#endif都屏蔽掉,这样就可以编译过去了。
可能还会出现类似的问题,用同样的方法可以解决。
下面修改Uboot中的文件,以匹配开发板8.修改/cpu/arm920t/start.S这个函数是arm920t系列的共有启动的汇编代码,UBOOT执行的第一个程序(0)修改寄存器地址定义/* turn off the watchdog */#if defined(CONFIG_S3C2400)# define pWTCON 0x15300000# define INTMSK 0x14400008 /* Interupt-Controller base addresses */# define CLKDIVN 0x14800014 /* clock divisor register */#elif defined(CONFIG_S3C2410)|| defined(CONFIG_S3C2440)# define pWTCON 0x53000000这个定义了看门狗的寄存器地址# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */中断掩码的寄存器地址# define INTSUBMSK 0x4A00001C中断掩码的寄存器地址# define CLKDIVN 0x4C000014 /* clock divisor register */完成时钟分份的寄存器#endif(1)修改中断禁止部分#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)|| defined(CONFIG_S3C2440)ldr r0, =pWTCON把看门狗寄存器地址给了r0mov r1, #0x0 r1等于0str r1, [r0] 看门狗寄存器等于0 因为在启动时要关闭看门狗,不能让他产生中断影响启动,此时也根本不需要任何中断/** mask all IRQs by setting all bits in the INTMR - default*/mov r1, #0xffffffff 关闭所有中断ldr r0, =INTMSKstr r1, [r0]# if defined(CONFIG_S3C2410)ldr r1, =0x7ff //根据2410芯片手册,INTSUBMSK有11位可用,//vivi也是0x7ff,不知为什么U-Boot一直没改过来。
ldr r0, =INTSUBMSKstr r1, [r0]# endif# if defined(CONFIG_S3C2440)ldr r1, =0x7fff //根据2440芯片手册,INTSUBMSK有15位可用ldr r0, =INTSUBMSKstr r1, [r0]# endif(2)修改时钟设置(2440的主频可达533MHz,但是我设到533MHz时系统很不稳定,不知是不是SDRAM和总线配置的影响,所以现在先设到405MHz,以后在改进。
)ldr r0, =CLKDIVN这个值决定了FCLK HCLK PCLK的频率FCLK是供给CPU的是主频HCLK是供给AHB总线(主要用于高性能模块(如CPU、DMA和DSP等)之间的连接,作为SoC 的片上系统总线)上的外围设备PCLK是供给APB总线(APB主要用于低带宽的周边外设之间的连接,例如UART、1284等)上的外围设备UCLK是两路PLL中一路供给USB的频率ARM总线技术在这里我不多介绍了,对硬件感兴趣的同学建议多多了解,我有一回面试人家就问我这个了,405MHZ已经很高了,基本都够了,2410的200MHZ就能播放Mplayer视频,据说很流畅。
mov r1, #5 /* FCLK:HCLK:PCLK = 1:4:8 */str r1, [r0]mrc p15, 0, r1, c1, c0, 0 /*read ctrl register tekkaman*/orr r1, r1, #0xc0000000 /*Asynchronous tekkaman*/mcr p15, 0, r1, c1, c0, 0 /*write ctrl register tekkaman*/他是用到了协处理器P15,此处理器主要设置mmu,时钟模式,caches,保护模式的。
先把C0 C1的值读出到r1,设置后再写回。
FCLK:HCLK:PCLK的比例由CLKDIVN决定的,CLKDIVN寄存器的HDIVN和PDIVN决定比例的大小。
因为此时的HDIVH不为0,将快速总线模式改为异步总线模式,操作协处理器P15改变模式即可,如果HDIVH不为0,而且是快速总线模式的话,那么CPU的主频由hclk 控制,这样可以实现不改变HCLK和PCLCK的同时就能使CPU的主频减半或更多。
网上的大虾说没有以上几句主频会是12MHZ,我的观点不同。
这是数据手册原文If HDIVN is not 0 and the CPU bus mode is the fast bus mode, the CPU will operate by the HCLK.This feature can be used to change the CPU frequency as a half or more without affecting the HCLKand PCLK#if defined(CONFIG_S3C2440)/*now, CPU clock is 405.00 Mhz tekkaman*/mov r1, #CLK_CTL_BASE /* tekkaman*/这是时钟寄存器的基地址mov r2, #MDIV_405 /* mpll_405mhz tekkaman*/add r2, r2, #PSDIV_405 /* mpll_405mhz tekkaman*/str r2, [r1, #0x04] /* MPLLCON tekkaman */设置MPLLCON#endif#if defined(CONFIG_S3C2410)/*now, CPU clock is 202.8 Mhz tekkaman*/mov r1, #CLK_CTL_BASE /* tekkaman*/mov r2, #MDIV_200 /* mpll_200mhz tekkaman*/add r2, r2, #PSDIV_200 /* mpll_200mhz tekkaman*/str r2, [r1, #0x04] /* MPLLCON tekkaman */#endif#endif /* CONFIG_S3C2400 || CONFIG_S3C2410|| CONFIG_S3C2440 */红色部分是我添加的,利用vivi的代码,将其设为405.00MHz 并在前面加上:#elif defined(CONFIG_S3C2410)# define pWTCON 0x53000000# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */# define INTSUBMSK 0x4A00001C# define CLKDIVN 0x4C000014 /* clock divisor register */#define CLK_CTL_BASE 0x4C000000 /* tekkaman */#if defined(CONFIG_S3C2440)#define MDIV_405 0x7f << 12 /* tekkaman */#define PSDIV_405 0x21 /* tekkaman */#endif#if defined(CONFIG_S3C2410)#define MDIV_200 0xa1 << 12 /* tekkaman */#define PSDIV_200 0x31 /* tekkaman */#endif#endif〕(3)将从Flash启动改成从NAND Flash启动。