U-boot 基于TQ2440 开发板上的移植
- 格式:docx
- 大小:81.45 KB
- 文档页数:45
刷入uboot和大分区的方法一、概念解释1.1 uboot是什么U-boot是一种开源的引导加载程序,它通常用于嵌入式系统的启动过程中,负责引导操作系统的启动和初始化硬件设备。
在嵌入式系统中,uboot扮演着非常重要的角色,它的稳定性和可靠性直接影响整个系统的稳定性。
1.2 分区的作用分区是将存储设备按照一定的规则划分成多个逻辑部分的过程。
对于嵌入式系统而言,合理的分区管理可以提高存储设备的利用率,同时也方便系统的管理和维护。
二、刷入uboot的步骤2.1 确定目标设备我们需要明确要刷入uboot的目标设备是什么,是一个嵌入式开发板还是其他类型的设备。
不同的设备可能需要不同的uboot版本和刷入方法。
2.2 获取uboot源码接下来,我们需要从冠方或者其他可靠渠道获取uboot的源码。
一般来说,冠方的源码是最稳定和可靠的选择,我们可以从冠方的仓库或者全球信息站上下载源码。
2.3 编译uboot获取源码之后,我们需要根据目标设备的硬件配置,对源码进行编译。
在编译之前,我们需要配置好交叉编译工具链和相关的环境变量,确保编译过程顺利进行。
2.4 刷入uboot当uboot源码编译完成之后,我们需要将编译生成的二进制文件刷入目标设备的存储设备中。
这个过程可能涉及到串口或者其他调试工具的使用,需要特别注意刷入过程中的各项参数和配置。
2.5 测试uboot刷入完成后,我们需要对uboot进行测试,确保它能够正常启动,并且能够正确识别硬件设备。
三、创建大分区的步骤3.1 确定分区方案在创建大分区之前,我们需要确定硬盘或者TF卡的分区方案,包括分区的数量、大小和格式等。
3.2 使用分区工具常用的分区工具有fdisk、parted等,我们可以使用这些工具来创建和调整分区。
在使用分区工具时,需要特别注意当前存储设备上是否有重要的数据,避免误操作导致数据丢失。
3.3 格式化分区创建完分区之后,我们需要对分区进行格式化,以便后续的数据存储和管理。
BOOT LOADER(引导装载器),是用于初始化目标板硬件,给嵌入式操作系统提供板上硬件资源信息,并进一步装载、引导嵌入式操作系统运行的固件。
在嵌入式系统开发过程中,很多情况都会涉及底层BOOT LOADER的移植问题,即使在有些已有BOOT LOADER的参考开发板上也存在这种可能。
概括来说,如下情况会考虑进行BOOT LOADER的移植工作:A. 在自主设计的目标板上,用于引导嵌入式操作系统及其应用;B. 在厂家未提供BOOT LOADER源码的参考板上,遇有如下情形之一:a.在实际应用中需要添加或修改一些功能;b.为了给自行设计主板移植BOOT LOADER提供参考,先在参考板上进行移植以积累经验;另外,从嵌入式系统实际开发角度讲,嵌入式操作系统的引导、配置甚至应用程序的运行状况都和BOOT LOADER有一定的关联,可以说,掌握BOOT LOADER移植是顺利进行嵌入式系统开发的重要利器。
与常见的嵌入式操作系统板级支持包BSP相比,BOOT LOADER与底层硬件更为相关,即每个不同配置的目标板基本都有不同的BOOT LOADER。
因为BOOT LOADER往往更依据量体裁衣、定身制作的原则,以满足要求的最小化代码存放在启动ROM或FLASH中。
诚然,自行编写BOOT LOADER未尝不可,但从可利用的资源和实际项目开发考虑,采用移植已有的BOOT LOADER源码来解决这一问题更符合大多数项目开发的要求。
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嵌入式操作系统。
uboot中烧录方法
在嵌入式系统开发中,U-Boot是一个常用的引导加载程序,用
于引导嵌入式设备的操作系统。
烧录U-Boot到嵌入式设备通常涉及
以下几种方法:
1. 串口烧录,通过串口连接嵌入式设备和主机,使用串口通信
工具(如minicom、putty等)将U-Boot固件通过串口传输到设备
的存储器中。
这种方法需要设备具备串口接口,并且需要主机具备
串口通信工具和相应的串口线缆。
2. TFTP烧录,使用TFTP(Trivial File Transfer Protocol)通过网络将U-Boot固件传输到嵌入式设备的存储器中。
在设备启动时,U-Boot会尝试从网络上的TFTP服务器下载固件。
这种方法需
要设备处于能够访问网络的环境中,并且需要在网络中设置好TFTP
服务器。
3. SD卡烧录,将U-Boot固件写入SD卡,然后将SD卡插入嵌
入式设备,设备在启动时会读取SD卡中的U-Boot固件。
这种方法
需要主机具备SD卡写入工具,如dd命令或Win32 Disk Imager等。
4. JTAG烧录,使用JTAG(Joint Test Action Group)接口连接嵌入式设备和主机,通过专用的JTAG调试器将U-Boot固件烧录到设备的存储器中。
这种方法通常需要专门的硬件设备和相应的调试软件。
在选择烧录方法时,需要根据具体的嵌入式设备和开发环境来决定,确保选择的方法能够有效、安全地将U-Boot固件烧录到设备中,并且需要注意备份设备中原有的U-Boot固件以防止意外情况发生。
希望这些信息能够帮助你更好地理解在U-Boot中的烧录方法。
mini2440开发板之andriod使用手册潘应云(南京师范大学,panyingyun@,QQ:29548754,848682821)提供第一部分:内核映像及文件系统介绍 (1)第二部分:使用说明 (1)开发平台:RedHat 9.0 + mini2440开发板使用内核版本类型:linux-2.6.25-android-1.0_r1.tar.gz下载地址:/p/android/downloads/list交叉编译器:arm-2008q3-72-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2下载地址:/sgpp/lite/arm/portal/release642或者直接复制下面地址/sgpp/lite/arm/portal/package3686/public/arm-none-eabi/arm-2 008q3-66-arm-none-eabi-i686-pc-linux-gnu.tar.bz2第一部分:内核映像及文件系统介绍1、zImage:andriod内核映像文件。
支持触摸屏(目前没有校屏程序,点击不太准),支持nfs文件系统启动,支持RTC(可以正确显示google时钟),支持DM9000网卡,支持yaffs文件系统,电源管理等。
2、nfs_root_andriod.tar.gz:nfs方式启动文件系统,可以看到很绚丽的google大钟和google浏览器。
3、final_config.rar:内核配置文件(可以自己用命令mv final config .config 放到内核下进行编译)。
(为何不提供yaffs文件系统而采用NFS启动方式:主要原因是mini2440开发板提供的nand flash太小,只有64M空间,这里需要至少80M的空间)第二部分:使用说明(注意:开发环境和redhat9.0系统的安装大家可以参考mini2440开发板手册。
ZYNQFLASH+EMMC⼿动移植LINUX启动前⾔虽可使⽤Petalinux进⾏移植,简单⽅便,但为了更清楚明⽩的了解整个流程,还是尝试了⼀波⼿动移植。
参考资料流程对于⼿动移植,所需的⽂件为:BOOT.bin(FSBL+fpga_bit⽂件+u_boot.elf)、uImage、devicetree.dtb、uEnv.txt、⽂件系统⽂件放置位置说明:FLASH:BOOT.bin(FSBL+fpga_bit⽂件+u_boot.elf)EMMC:第⼀个分区放置:uImage、devicetree.dtb、uEnv.txt第⼆个分区放置:⽂件系统启动流程为:板⼦设置为QSPI启动模式,FSBL执⾏调u-boot执⾏,u-boot根据uEnv.txt调EMMC分区1中的内核执⾏,内核最后跳到分区⼆中的⽂件系统。
FSBL、bit⽂件、uImage、⽂件系统都可复⽤SD卡移植模式下的内容:参考参考资料第⼀个链接。
本⽂章主要讲述的重点在于:u-boot、设备树、uEnv.txt的更改部分板⼦主要信息说明:板⼦芯⽚:ZYNQ7035,板⼦的调试打印串⼝为PS0,板⼦上有SD卡(SD0)、EMMC(SD1),板⼦上有FLASH。
其他外设不赘述。
u-boot移植说明:NOTE:u-boot xilinx-v2018.3版本的zynq-common.h跟xilinx-v2018.1版本的不⼀样,这⾥检出v2018.1版本使⽤。
主要是CONFIG_EXTRA_ENV_SETTINGS环境变量不⼀致。
默认的如下所⽰:/* Default environment */#ifndef CONFIG_EXTRA_ENV_SETTINGS#define CONFIG_EXTRA_ENV_SETTINGS \"ethaddr=00:0a:35:00:01:22\0" \"kernel_image=uImage\0" \"kernel_load_address=0x2080000\0" \"ramdisk_image=uramdisk.image.gz\0" \"ramdisk_load_address=0x4000000\0" \"devicetree_image=devicetree.dtb\0" \"devicetree_load_address=0x2000000\0" \"bitstream_image=system.bit.bin\0" \"boot_image=BOOT.bin\0" \"loadbit_addr=0x100000\0" \"loadbootenv_addr=0x2000000\0" \"kernel_size=0x500000\0" \"devicetree_size=0x20000\0" \"ramdisk_size=0x5E0000\0" \"boot_size=0xF00000\0" \"fdt_high=0x20000000\0" \"initrd_high=0x20000000\0" \"bootenv=uEnv.txt\0" \"loadbootenv=load mmc 0 ${loadbootenv_addr} ${bootenv}\0" \"importbootenv=echo Importing environment from SD ...; " \"env import -t ${loadbootenv_addr} $filesize\0" \"sd_uEnvtxt_existence_test=test -e mmc 0 /uEnv.txt\0" \"preboot=if test $modeboot = sdboot && env run sd_uEnvtxt_existence_test; " \"then if env run loadbootenv; " \"then env run importbootenv; " \"fi; " \"fi; \0" \"mmc_loadbit=echo Loading bitstream from SD/MMC/eMMC to RAM.. && " \"mmcinfo && " \"load mmc 0 ${loadbit_addr} ${bitstream_image} && " \"fpga load 0 ${loadbit_addr} ${filesize}\0" \"norboot=echo Copying Linux from NOR flash to RAM... && " \"cp.b 0xE2100000 ${kernel_load_address} ${kernel_size} && " \"cp.b 0xE2600000 ${devicetree_load_address} ${devicetree_size} && " \"echo Copying ramdisk... && " \"cp.b 0xE2620000 ${ramdisk_load_address} ${ramdisk_size} && " \"bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \"qspiboot=echo Copying Linux from QSPI flash to RAM... && " \"sf probe 0 0 0 && " \"sf read ${kernel_load_address} 0x100000 ${kernel_size} && " \"sf read ${devicetree_load_address} 0x600000 ${devicetree_size} && " \"echo Copying ramdisk... && " \"sf read ${ramdisk_load_address} 0x620000 ${ramdisk_size} && " \"bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \"uenvboot=" \"if run loadbootenv; then " \"echo Loaded environment from ${bootenv}; " \"run importbootenv; " \"fi; " \"if test -n $uenvcmd; then " \"echo Running uenvcmd ...; " \"run uenvcmd; " \"fi\0" \"sdboot=if mmcinfo; then " \"run uenvboot; " \"echo Copying Linux from SD to RAM... && " \"load mmc 0 ${kernel_load_address} ${kernel_image} && " \"load mmc 0 ${devicetree_load_address} ${devicetree_image} && " \"load mmc 0 ${ramdisk_load_address} ${ramdisk_image} && " \"bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}; " \"fi\0" \"usbboot=if usb start; then " \"run uenvboot; " \"echo Copying Linux from USB to RAM... && " \"load usb 0 ${kernel_load_address} ${kernel_image} && " \"load usb 0 ${devicetree_load_address} ${devicetree_image} && " \"load usb 0 ${ramdisk_load_address} ${ramdisk_image} && " \"bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}; " \"fi\0" \"nandboot=echo Copying Linux from NAND flash to RAM... && " \"nand read ${kernel_load_address} 0x100000 ${kernel_size} && " \"nand read ${devicetree_load_address} 0x600000 ${devicetree_size} && " \"echo Copying ramdisk... && " \"nand read ${ramdisk_load_address} 0x620000 ${ramdisk_size} && " \"bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \"jtagboot=echo TFTPing Linux to RAM... && " \"tftpboot ${kernel_load_address} ${kernel_image} && " \"tftpboot ${devicetree_load_address} ${devicetree_image} && " \"tftpboot ${ramdisk_load_address} ${ramdisk_image} && " \"bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \"rsa_norboot=echo Copying Image from NOR flash to RAM... && " \"cp.b 0xE2100000 0x100000 ${boot_size} && " \"zynqrsa 0x100000 && " \"bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \"rsa_nandboot=echo Copying Image from NAND flash to RAM... && " \"nand read 0x100000 0x0 ${boot_size} && " \"zynqrsa 0x100000 && " \"bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \"rsa_qspiboot=echo Copying Image from QSPI flash to RAM... && " \"sf probe 0 0 0 && " \"sf read 0x100000 0x0 ${boot_size} && " \"zynqrsa 0x100000 && " \"bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \"rsa_sdboot=echo Copying Image from SD to RAM... && " \"load mmc 0 0x100000 ${boot_image} && " \"zynqrsa 0x100000 && " \"bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \"rsa_jtagboot=echo TFTPing Image to RAM... && " \"tftpboot 0x100000 ${boot_image} && " \"zynqrsa 0x100000 && " \"bootm ${kernel_load_address} ${ramdisk_load_address} ${devicetree_load_address}\0" \DFU_ALT_INFO \BOOTENV#endif可以看到其上定义了⼀堆的东西及不同的启动指令。
[转]qt-4.7交叉编译-mikit的专栏-CSDN博客[转]qt-4.7交叉编译收藏一:环境介绍虚拟机:vmware 7.0Linux 环境:ubuntu 9.04交叉编译环境:arm-linux-g++ 3.4.5硬件平台:TQ2440二:移植步骤安装交叉编译环境由于这里使用的是QT2440管盘中提供的交叉编译工具链EABI-4.3.3_EmbedSky_20100610.tar.bz2,放在/opt/目录下解压主要是在解压后可以看到其中含有两个版本,由于qt4.7.0的编译必须使用3.4.5版本所以在设置交叉编译的路径的时候使用的是在/etc/profile中加入exportPATH=/opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/bin:$PATH安装tslib1.41. 下载tslib1.4,解压2. 进入解压的目录运行执行./autogen.sh3. 执行./configure --prefix=/opt/tslib/ --host=arm-linux ac_cv_func_malloc_0_nonnull=yes ,经过一段时间的编译4. 执行make install5. 修改/opt/tslib/etc/ts.conf,把第二行的#号去掉(这样做的主要目的是为了在移植到板子上的时候,可以制定输入模块)6. 在/etc/profile中加入export PATH=/opt/tslib:$PATHPS:经过我的测试,我无法用以上的方法编译tslib1.4,我用的是另外一种方法:1、 ./autogen.sh #用于生成configure脚本2、 echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache#产生一个cache文件arm-linux.cache,欺骗configure,3、 CC=arm-linux-gcc ./configure --host=arm-linux --prefix=/opt/tslib --cache-file=arm-linux.cache4、 make5、 make install交叉成功后在目标位置产生/bin、/etc、/include、/lib 4个文件夹编译qt4.7.0-arm1. 下载qt-everwhere-opensource-4.7.0,并解压最好重命名qt-everwhere-opensource-4.7.0-qte2. 开始进行配置选项./configure -embedded arm -release -opensource -fast -no-accessibility -no-scripttools -no-mmx -no-multimedia -no-svg -no-3dnow -no-sse -no-sse2 -silent -qt-libpng -qt-libjpeg -no-libmng -no-libtiff -no-multimedia -make libs -nomake tools -nomake examples -nomake docs -nomake demo -no-nis -no-cups -no-iconv -no-dbus -no-openssl -xplatform qws/linux-arm-g++ -little-endian -qt-freetype -depths 16,18 -qt-gfx-linuxfb -no-gfx-transformed -no-gfx-multiscreen -no-gfx-vnc -no-gfx-qvfb -qt-kbd-linuxinput -no-glib -qt-mouse-tslib -I /opt/tslib/include -L /opt/tslib/lib -confirm-license "$@"3. 开始进行交叉编译gmake 此过程要经历很长的一段时间4. 在交叉编译成功后运行gmake install安装,这里会默认安装到/usr/local/Trolltech/QtEmbedded-4.7.0-arm5. 这个时候qte的编译就成功了制作根文件系统(移植到开发板)1.移植tslib,将ubuntu中的/opt/tslib 拷贝到根文件系统中的/opt/下面2.移植qte4.7.0将/usr/local/Trolltech/QtEmbedded-4.7.0-arm下面的lib文件夹拷贝到根文件中的相同目录下(必需得先创建相应的目录)注:此时可以根据需要裁剪lib 中的内容去掉不用的.so文件3. 增加新的显示中文的字体wenquanyi 放到上面的/lib/fonts目录下。
s5pv210 uboot-2012-10的移植s5pv210 uboot-2012-10移植(一) 之分析Alex Ling的linaro-2011.10 for mini210好久好久前就买了s5pv210的开发板,一直都是东搞搞西搞搞,一点收获也没有,这次下决心来移植最新的uboot到u-boot-2012.10上,并通过这个博客记录下来以防时间长给忘了,我的开发板是QT210的。
s5pv210的启动分为BL0,BL1,BL2,BL0是出厂的时候就固化在IROM里的,所以我们的uboot就要实现BL1和BL2,BL1在uboot里叫做u-boot-spl.bin,BL2就是我们很熟悉的u-boot.bin了。
在移植之前,我们先看下Alex Ling 的linaro-2011.10 for mini210的UBOOT是怎么实现的。
这里主要还是分析SPL部分,u-boot.bin是如何生成的现在资料很多,也很复杂,我这个菜鸟也是一知半解的,所以就不分析了。
1.顶层的Makefile,从中可以知道,我们要想生成u-boot-spl.bin就必须配置COFNIG_SPL,那么u-boot-spl.bin依赖什么呢,我们继续[plain]view plaincopy1.ALL-$(CONFIG_SPL) += $(obj)spl/u-boot-spl.bin2.3.all: $(ALL-y)搜索发现,是进入到uboot顶层目录的spl目录下执行Makefile的[plain]view plaincopy1.$(obj)spl/u-boot-spl.bin: depend2. $(MAKE) -C spl all2.打开spl/Makefile分析,一开始就给我们导出CONFIG_SPL_BUILD[plain]view plaincopy1.CONFIG_SPL_BUILD := y2.export CONFIG_SPL_BUILD然后分析目标,因为我们的平台是三星的,所以,会有两个目标,一个是不带头信息的u-boot-spl.bin,一个是$(obj)$(BOARD)-spl.bin。
U-boot移植5--支持DM9000开发板的原理图中得知:第二阶段从在lib_arm的board.c的start_armboot函数开始,其中有一个是跳到网卡初始化的eth_initialize函数(在net/eth.c中)(上面的宏CONFIG_NET_MULTI,等会要实现)。
1、在eth_initialize(文件中有两个,代码较长的那个)的#if defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII)miiphy_init();#endif后面添加上下面的代码if (board_eth_init(bis) < 0)cpu_eth_init(bis);并在本文件前面增加如下代码:static int __def_eth_init(bd_t *bis){return -1;}int cpu_eth_init(bd_t *bis) __attribute__((weak, alias("__def_eth_init")));2、在mao2440.c中添加上面函数的实现#include <net.h>extern int dm9000_initialize(bd_t * bd);#ifdef CONFIG_DRIVER_DM9000int board_eth_init(bd_t *bis){return dm9000_initialize(bis);}#endif3、在include/configs/mao2440.h中注释CS8900的代码,如下:(62行)#if 0#define CONFIG_DRIVER_CS8900 1/* we have a CS8900 on-board */#define CS8900_BASE 0x19000300#define CS8900_BUS16 1 /* the Linux driver does accesses as shorts */#end if并添加DM9000的宏, 由上图知DM9000在BANK4上,所以定义为0x20000300如下:#define CONFIG_DRIVER_DM9000 1#define CONFIG_DM9000_BASE 0x20000300#define DM9000_IO CONFIG_DM9000_BASE#define DM9000_DATA (CONFIG_DM9000_BASE+4)#define CONFIG_DM9000_USE_16BIT 1#define CONFIG_NET_MULTI 14、网上说要修改dm9000x.c的eth_init(bd_t * bd)的内容,此步我的板不用eth_init(bd_t * bd){.............../* Set Node address *//*for (i = 0; i < 6; i++)((u16 *) bd->bi_enetaddr)[i] = read_srom_word(i);*/char *tmp = getenv ("ethaddr");char *end;for (i=0; i<6; i++) {bd->bi_enetaddr[i] = tmp ? simple_strtoul(tmp, &end, 16) : 0;if (tmp)tmp = (*end) ? end+1 : end;}……………….#if 0i = 0;…………#endifreturn 0;}红色的字符是要做的修改:功能是屏蔽原有获取MAC地址的语句,替换成从U-Boot的参数区读取数据并存到bd->bi_enetaddr[i]中功能是屏蔽无用的语句。
u-boot-2011.03在TQ2440上的移植(1)--建立自己的demo板 收藏 参考文章 黄刚博客http://www.cublog.cn/u3/101649/showart_2276917.html tekkman博客http://www.cublog.cn/u1/34474/showart_2212066.html 1、到ftp://ftp.denx.de/pub/u-boot/下载u-boot-2010.06.tar.bz2 2、解压 tar jxvf u-boot-2010.06.tar.bz2 3、进入uboot cd u-boot-2010.06 4、删减uboot 进入/board,留下samsung,其它全部删除 进入/arch,留下arm,其它全部删除 进入/arch/arm/cpu,留下arm920t,其它全部删除 5、建立自己的DEMO板 cd /board/samsung mkdir smdk2440 cp -rf smdk2410/* smdk2440/ //将2410下所有的代码复制到2440下 cd smdk2440 //进入smdk2440目录 mv smdk2410.c smdk2440.c //将smdk2440下的smdk2410.c改名为smdk2440.c
然后在文件夹samsung里留下smdk2440,其它全部删除 cp include/configs/smdk2410.h include/configs/smdk2440.h //建立2440头文件 在include/configs下留下smdk2440.h, 其它全部删除
vi board/samsung/smdk2440/Makefile //修改smdk2440下Makefile的编译项,如下: COBJS := smdk2440.o flash.o //修改第28行因在smdk2440下我们将smdk2410.c改名为smdk2440.c 6、修改u-boot跟目录下的Makefile文件。查找到smdk2410_config的地方,在他下面按照smdk2410_config的格式建立my2440_config的编译选项,另外还要指定交叉编译器,修改159行
CROSS_COMPILE ?= arm-linux- //指定交叉编译器为arm-linux-gcc smdk2410_config : unconfig //2410编译选项格式 @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0
smdk2440_config : unconfig //修改蒂3054行,2440编译选项格式 @$(MKCONFIG) $(@:_config=) arm arm920t smdk2440 samsung s3c24x0
*说明:arm :CPU的架构(ARCH) arm920t:CPU的类型 smdk2440 :对应在board目录下建立新的开发板项目的目录 samsung:新开发板项目目录的上级目录,如直接在board下建立新的开发板项目的目录,则这里就为NULL
s3c24x0:CPU型号 *注意:编译选项格式的第二行要用Tab键开始,否则编译会出错 7、测试编译新建的smdk2440开发板项目 在uboot根目录测试 make smdk2440_config make即可在uboot根目录下生成bin文件 在uboot里,清除中间文件用命令make distclean
u-boot-2011.03在TQ2440上的移植(2)--初始化时钟 收藏 smdk2440的初始化设置 1、u-boot主要的目录结构如下 2、启动流程图下图 由上图可知
u-boot的stage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言写成; u-boot的stage2代码通常放在lib_xxxx/board.c文件中,他用C语言写成。 3、在include/configs/smdk2440.h头文件中添加CONFIG_S3C2440宏 vi include/configs/smdk2440.h 在第40行添加 #define CONFIG_S3C2440 1
4、stage1阶段的硬件设备初始化。 vi arch/arm/cpu/arm920t/start.S 去掉117,118行点亮AT91RM9200DK系列LED的代码 /* bl coloured_LED_init bl red_LED_on */
5、在u-boot中添加对S3C2440一些寄存器的支持、添加中断禁止部分和时钟设置部分。 在164行添加如下红色内容 # if defined(CONFIG_S3C2410) ldr r1, =0x3ff ldr r0, =INTSUBMSK str r1, [r0] # endif /*164行*/ # if defined(CONFIG_S3C2440)//添加s3c2440的中断禁止部分 ldr r1, =0x7fff //根据2440芯片手册,INTSUBMSK寄存器有15位可用 ldr r0, =INTSUBMSK str r1, [r0] # endif # if defined(CONFIG_S3C2440) //添加s3c2440的时钟部分 #define MPLLCON 0x4C000004 //系统主频配置寄存器基地址 #define UPLLCON 0x4C000008 //USB时钟频率配置寄存器基地址 ldr r0, =CLKDIVN //设置分频系数FCLK:HCLK:PCLK = 1:4:8 mov r1, #5 str r1, [r0]
ldr r0, =MPLLCON //设置系统主频为405MHz ldr r1, =0x7F021 //这个值参考芯片手册“PLL VALUE SELECTION TABLE”部分 str r1, [r0]
ldr r0, =UPLLCON //设置USB时钟频率为48MHz ldr r1, =0x38022 //这个值参考芯片手册“PLL VALUE SELECTION TABLE”部分 str r1, [r0] # else //其他开发板的时钟部分,这里就不用管了,我们现在是做2440的
6、S3C2440的时钟部分除了在start.S中添加外,还要分别在board/samsung/smdk2440/smdk2440.c和cpu/arm920t/s3c24x0/speed.c中修改或添加部分代码,如下: vi board/samsung/smdk2440/smdk2440.c 时钟部分修改第34行和在45行添加如下红色部分 #define FCLK_SPEED 2 //设置默认等于2,即下面红色代码部分有效 #if FCLK_SPEED==0 /* Fout = 203MHz, Fin = 12MHz for Audio */ #define M_MDIV 0xC3 #define M_PDIV 0x4 #define M_SDIV 0x1 #elif FCLK_SPEED==1 /* Fout = 202.8MHz */ #define M_MDIV 0xA1 #define M_PDIV 0x3 #define M_SDIV 0x1 #elif FCLK_SPEED==2 /* Fout = 405MHz */ #define M_MDIV 0x7F //这三个值根据S3C2440芯片手册“PLL VALUE SELECTION TABLE”部分进行设置 #define M_PDIV 0x2 #define M_SDIV 0x1 #endif
USB时钟部分修改第51行和在61行添加如下红色部分 #define USB_CLOCK 2 //设置默认等于2,即下面红色代码部分有效 #if USB_CLOCK==0 #define U_M_MDIV 0xA1 #define U_M_PDIV 0x3 #define U_M_SDIV 0x1 #elif USB_CLOCK==1 #define U_M_MDIV 0x48 #define U_M_PDIV 0x3 #define U_M_SDIV 0x2 #elif USB_CLOCK==2 /* Fout = 48MHz */ #define U_M_MDIV 0x38 //这三个值根据S3C2440芯片手册“PLL VALUE SELECTION TABLE”部分进行设置 #define U_M_PDIV 0x2 #define U_M_SDIV 0x2 #endif 7、vi arch/arm/cpu/arm920t/s3c24x0/speed.c //根据设置的分频系数FCLK:HCLK:PCLK = 1:4:8修改获取时钟频率的函数 get_PLLCLK函数修改第66行如下
static ulong get_PLLCLK(int pllreg) { S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER(); ulong r, m, p, s; if (pllreg == MPLL) r = clk_power->MPLLCON; else if (pllreg == UPLL) r = clk_power->UPLLCON;