uboot的配置问题对\include\configs\[boardname].h的修改
2010年07月09日
原帖地址http://www.foxice.net/techinfo_ubootvxworks3.asp
现在得仔细看看\include\configs\目录下的user8240.h,它使用宏定义控制板上硬件的初始化,从某种意义上来说,是电路板硬件特性的代表文件。其他电路板也类似,控制文件为\include\configs\[boardname].h。你应该已经浏览过user8240.h 了,下面给出了它的内容和注释,为了简略起见,省去了源代码中除了版权声明的原有注释。针对于电路板的修改都只是用注释的方法给出建议,而没有直接修改源代码。如果碰到不明白的宏定义,记得在u-boot 目录下搜索一遍。
/* (C) Copyright 2001-2005
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
* See file CREDITS for list of people who contributed to this
* project.
* This program is free software; you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Foundation;
* either version 2 of the License, or (at your option) any later version.
*/
#ifndef __CONFIG_H
#define __CONFIG_H /*控制本文件不会被重复引用*/
#define CONFIG_MPC824X 1 /*使用8240/8245 CPU*/
#define CONFIG_MPC8240 1 /*使用8240 CPU*/
#define CONFIG_USER8240 1 /*电路板标志,如果需要修改与sandpoint 板不同的地方,都建议用此宏定义控制*/
/*控制是否是从内存启动,事实上,当我们从flash 获取u-boot 时,确实是在从内存启动,但由于已经初始化了内存控制的寄存器,因此并不是纯粹意义上的从内存启动。为了后来修改成烧入ROM 的方便,仍然定义为不是从内存启动,需要修改的内容将在后面说明*/
#if 0
#define USE_DINK32 1 /*从内存启动,不修改MCCR1 的MEMGO 位*/
#else
#undef USE_DINK32 /*从非易失存储硬件启动,修改MCCR1 的MEMGO 位*/
#endif
/*sandpoint 使用NS16552 作为串口芯片,该芯片集成了两个串口控制,选择第一个作为控制台串口,通讯的波特率设为9600,在Windows 的超级中端中也必须设定为此值,才能正确显示串口的打印信息,建议设置为与VxWorks 的bootrom 相同的波特率*/
#define CONFIG_CONS_INDEX 1
#define CONFIG_BAUDRATE 9600
#define CONFIG_BOOTDELAY 5 /*u-boot 自动启动时的等待时间,单位为秒*/
/*打印u-boot image 的制作时间,例如U-Boot 1.1.4 (Mar 13 2006 - 16:49:46) ,必须同时在CONFIG_COMMANDS 中包含CFG_CMD_DAT E 选项才有效*/
#define CONFIG_TIMESTAMP
/* 进入等待选择是否自动启动过程前的打印信息, 其中net_nfs 是CONFIG_EXTRA_ENV_SETTINGS 中的定义*/
#define CONFIG_PREBOOT "echo;" \
"echo Type \"run net_nfs\" to mount root filesystem over NFS;" \ "echo"
/*启动参数之一,此外还有CONFIG_IPADDR(网口IP)等参数,具体的设置请参见 \common\environment.c,也可以在CONFIG_EXTRA_ENV_SETTINGS 中直接设置,例如, 如果要设定本地网口IP 为192.0.0.1,则从下面方法种选择一种:
1. #undef CONFIG_ADDR
#define CONFIG_ADDR 192.0.0.1
2. 在CONFIG_EXTRA_ENV_SETTINGS 中添加下面一行,注意引号内的内容不要有空格,且因为有后续行必须加上"\",最后一行必须是""
"ipaddr=192.0.0.1" \
*/
#undef CONFIG_BOOTARGS
#define CONFIG_EXTRA_ENV_SETTINGS \
"netdev=eth0\0" \
"nfsargs=setenv bootargs root=/dev/nfs rw " \
"nfsroot=${serverip}:${rootpath}\0" \
"ramargs=setenv bootargs root=/dev/ram rw\0" \
"addip=setenv bootargs ${bootargs} " \
"ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}" \
":${hostname}:${netdev}:off panic=1\0" \
"net_self=tftp ${kernel_addr} ${bootfile};" \
"tftp ${ramdisk_addr} ${ramdisk};" \
"run ramargs addip;" \
"bootm ${kernel_addr} ${ramdisk_addr}\0" \
"net_nfs=tftp ${kernel_addr} ${bootfile};" \
"run nfsargs addip;bootm\0" \
"rootpath=/opt/eldk/ppc_82xx\0" \
"bootfile=/tftpboot/SP8240/uImage\0" \
"ramdisk=/tftpboot/SP8240/uRamdisk\0" \
"kernel_addr=200000\0" \
"ramdisk_addr=400000\0" \
""
#define CONFIG_BOOTCOMMAND "run flash_self" /*从flash 启动*/
/*对于我的电路板,不需要这么多复杂的启动参数,只需要支持从网络获取VxWorks 并启动,可以如下定义,其中的0x00100000 为VxWorks 的启动地址,即config.h 和makefile中的RAM_LOW_ADRS:
#ifdef CONFIG_USER8240
#undef CONFIG_EXTRA_ENV_SETTINGS
#undef CONFIG_BOOTCOMMAND
#undef CONFIG_PREBOOT
#define CONFIG_EXTRA_ENV_SETTINGS \
"netdev=eth0\0" \
"serverip=192.0.0.2\0" \
"ipaddr=192.0.0.1\0" \
"ethaddr=AnyNumYouWant\0" \
"tftpboot=tftp 0x00100000 vxWorks.bin;" \
"go 0x00100000;\0" \
""
#define CONFIG_BOOTCOMMAND "run tftpboot"
#define CONFIG_PREBOOT "echo;" \
"echo Type \"run tftpboot\" to mount root .bin file over net;" \
"echo you should open a tftp server and set home directory correctly;" \
"echo"
#endif
*/
/*CONFIG_COMMANDS 配置了启动时配置的参数,每个CFG_CMD_XXX 对应了一种,其中CONFIG_CMD_DFL 的定义参见\include\cmd_confdefs.h,如果需要去掉某一种配置,则在CONFIG_COMMANDS 中加入& ~CFG_CMD_XXX,去除掉不需要的配置可以减小u-boot.bin 文件的大小*/
#define CONFIG_COMMANDS (CONFIG_CMD_DFL | \
CFG_CMD_DHCP | \
CFG_CMD_ELF | \
CFG_CMD_I2C | \
CFG_CMD_SDRAM | \
CFG_CMD_EEPROM | \
CFG_CMD_NFS | \
CFG_CMD_PCI | \
CFG_CMD_SNTP )
/*对于我的电路板,不需要这么多定义,且某些软硬件不支持,如EEPROM 不可写,FLASH地址不连续等,可以修改定义如下
#ifdef CONFIG_USER8240
#define CONFIG_COMMANDS (CONFIG_CMD_DFL | \
CFG_CMD_PCI & \
~CFG_CMD_FLASH)
#endif
*/
/*下面的头文件声明必须放在CONFIG_COMMANDS (如果有的话)的后面*/
#include
/*内存工作频率,单位MHz,不过在u-boot 的文件中发现此宏仅仅是在此作了一个定义,而没有被使用*/
#define CONFIG_DRAM_SPEED 100
#define CFG_LONGHELP 1 /*支持详细帮助,#undef 掉可以节省内存*/
#define CFG_PROMPT "=> " /*控制台提示符,类似于linux 的$*/
#define CFG_CBSIZE 256 /*控制台I/O Buffer 大小*/
#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /*打印的单句最大长度*/
#define CFG_MAXARGS 16 /*命令的参数个数最大值*/
#define CFG_BARGSIZE CFG_CBSIZE /*启动参数的最大长度*/
/*默认跳转启动地址,对于启动VxWorks 来说,即为config.h 中的RAM_LOW_ADDR*/
#define CFG_LOAD_ADDR 0x00100000
#define CFG_HZ 1000 /*1s = 1000ms*/
#define CONFIG_PCI /*支持PCI 配置*/
#undef CONFIG_PCI_PNP /*如果定义,则选择自动配置PCI,否则按照user8240.c 中的pci_sandpoint_config_table 配置表配置PCI*/
#define CONFIG_NET_MULTI /*支持多网口,如果只有一个网口可以undef 掉*/
#define CONFIG_EEPRO100 /*网口芯片为82557(82559)*/
#define CFG_RX_ETH_BUFFER 8 /*使用eepro100 上的8 个rx buffer*/
/*PCI 网口芯片的基地址,被用于PCI 非自动配置,如果只使用一个PCI 网口,则只需要定 义前两个宏*/
#define PCI_ENET0_IOADDR 0x80000000
#define PCI_ENET0_MEMADDR 0x80000000
#define PCI_ENET1_IOADDR 0x81000000
#define PCI_ENET1_MEMADDR 0x81000000
/*内存参数,由初始化程序使用,注意CFG_SDRAM_BASE 必须等于0*/
#define CFG_SDRAM_BASE 0x00000000 /*内存的起始地址*/
#define CFG_MAX_RAM_SIZE 0x10000000 /*内存的最大值,不能超过硬件内存的大小*/
#define CFG_RESET_ADDRESS 0xFFF00100 /*复位后跳转的地址,硬件决定,不能修改*/
#if defined (USE_DINK32) /*从内存启动*/
#define CFG_MONITOR_LEN 0x00030000 /*启动映像文件长度,必须大于u-boot.bin*/
#define CFG_MONITOR_BASE 0x00090000 /*启动地址,即u-boot.bin 在内存中的位置*/
#define CFG_RAMBOOT 1 /*从内存启动的标志*/
#define CFG_INIT_RAM_ADDR (CFG_MONITOR_BASE + CFG_MONITOR_LEN) /* 堆栈地址*/
#define CFG_INIT_RAM_END 0x10000 /*初始化需要的数据结构存放在内存中的结束地址*/
#define CFG_GBL_DATA_SIZE 256 /*初始化需要的数据结构长度*/
#define CFG_GBL_DATA_OFFSET (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE)
#define CFG_INIT_SP_OFFSET CFG_GBL_DATA_OFFSET /*堆栈指针,堆栈向下生长,事实上对于sandpoint 板来说,这个宏定义没有意义,因为它只在BMW 板标志CONFIG_BMW 被定义时才会被使用,sandpoint 板使用CFG_INIT_RAM_ADDR 作为初始化过程中的堆栈 地址*/
#else /*不是从内存启动*/
#undef CFG_RAMBOOT
#define CFG_MONITOR_LEN 0x00030000
#define CFG_MONITOR_BASE TEXT_BASE
#define CFG_GBL_DATA_SIZE 128
#define CFG_INIT_RAM_ADDR 0x40000000
#define CFG_INIT_RAM_END 0x1000
#define CFG_GBL_DATA_OFFSET (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE)
#endif
/*flash 基地址,对于我的电路板,启动设备为EEPROM 而不是FLASH,定义为0xFF00000*/
#define CFG_FLASH_BASE 0xFFF00000
#if 0
#define CFG_FLASH_SIZE (512 * 1024) /*配置较小的Flash 空间*/
#else
#define CFG_FLASH_SIZE (1024 * 1024) /*配置为较大的1M Flash 空间*/
#endif
#define CFG_ENV_IS_IN_FLASH 1 /*启动的环境变量存放在Flash 中*/
/*由于我的电路板Flash 地址不连续,不能使用标准程序,而EEPROM 也不能写,因此定义不存储环境变量,如下:
#ifdef CONFIG_USER8240
#undef CFG_ENV_IS_IN_FLASH
#undef CFG_ENV_IS_IN_EEPROM
#define CFG_ENV_IS_NOWHERE
#endif
*/
#define CFG_ENV_OFFSET 0x00004000 /*环境变量存储的偏移量*/
#define CFG_ENV_SIZE 0x00002000 /*环境变量总长度 */
#define CFG_MALLOC_LEN (512 内存空间大小*/
/*内存测试的起始结束地址,参见\common\cmd_mem.c 程序*/
#define CFG_MEMTEST_START 0x00000000
#define CFG_MEMTEST_END 0x04000000
/*EUMB地址,关于EUMB的详细功能,请参考MPC8240 Integrated Processor User's Manual*/
#define CFG_EUMB_ADDR 0xFC000000
/*ISA 总线地址*/
#define CFG_ISA_MEM 0xFD000000
#define CFG_ISA_IO 0xFE000000
/*flash 的地址控制,我的电路板上Flash 不能使用标准驱动,因此没有使用这些值*/
#define CFG_FLASH_RANGE_BASE 0xFF000000 /*MPC8240 的Flash\ROM 基地址*/
#define CFG_FLASH_RANGE_SIZE 0x01000000 /*Flash\ROM 空间大小*/
#define FLASH_BASE0_PRELIM 0xFFF00000 /*sandpoint 板载flash 起始地址*/
#define FLASH_BASE1_PRELIM 0xFF000000 /*PMC 扣板上的flash 起始地址*/
/*I2C 配置,我的电路板没有使用I2C,没有研究这些参数*/
#define CONFIG_HARD_I2C 1 /* To enable I2C support*/
#undef CONFIG_SOFT_I2C /* I2C bit-banged*/
#define CFG_I2C_SPEED 400000 /* I2C speed and slave address*/
#define CFG_I2C_SLAVE 0x7F
#ifdef CONFIG_SOFT_I2C
#error "Soft I2C is not configured properly. Please review!"
#define I2C_PORT 3 /* Port A=0, B=1, C=2, D=3 */
#define I2C_ACTIVE (iop->pdir |= 0x00010000)
#define I2C_TRISTATE (iop->pdir &= ~0x00010000)
#define I2C_READ ((iop->pdat & 0x00010000) != 0)
#define I2C_SDA(bit) if(bit) iop->pdat |= 0x00010000; \
else iop->pdat &= ~0x00010000
#define I2C_SCL(bit) if(bit) iop->pdat |= 0x00020000; \
else iop->pdat &= ~0x00020000
#define I2C_DELAY udelay(5) /* 1/4 I2C clock duration */
#endif /* CONFIG_SOFT_I2C */
#define CFG_I2C_EEPROM_ADDR 0x57 /* EEPROM IS24C02*/
#define CFG_I2C_EEPROM_ADDR_LEN 1 /* Bytes of address */
#define CFG_EEPROM_PAGE_WRITE_BITS 3 /* write page size*/
#define CFG_EEPROM_PAGE_WRITE_DELAY_MS 10 /* takes up to 10 msec*/
/*不配置I2C,定义如下:
#ifdef CONFIG_USER8240
#undef CONFIG_HARD_I2C
#endif
*/
#define CFG_BAUDRATE_TABLE {9600, 19200, 38400, 57600, 115200} /*波特率*/
/*flash 的地址控制,我的电路板上Flash 不能使用标准驱动,因此没有使用这些值*/
#define CFG_FLASH_BANKS {FLASH_BASE0_PRELIM, FLASH_BASE1_PRELIM }
/*华邦83c553 IDE 控制器配置,我的电路板没有使用,没有研究这些参数*/
#define CFG_WINBOND_83C553 1 /*has a winbond bridge*/
#define CFG_USE_WINBOND_IDE 0 /*use winbond 83c553 internal IDE ctrlr */
#define CFG_WINBOND_ISA_CFG_ADDR 0x80005800 /*pci-isa bridge config addr*/
#define CFG_WINBOND_IDE_CFG_ADDR 0x80005900 /*ide config addr*/
#define CFG_IDE_MAXBUS 2 /* max. 2 IDE busses*/
#define CFG_IDE_MAXDEVICE (CFG_IDE_MAXBUS*2) /* max. 2 drives per IDE bus */
/*不配置华邦83c553,定义如下:
#ifdef CONFIG_USER8240
#undef CFG_WINBOND_83C553
#endif
*/
/* NS87308 配置,支持软驱,我的电路板没有使用,没有研究这些参数*/
#define CFG_NS87308 /* Nat Semi super-io controller on ISA bus */
#define CFG_NS87308_BADDR_10 1
#define CFG_NS87308_DEVS ( CFG_NS87308_UART1 | \
CFG_NS87308_UART2 | \
CFG_NS87308_POWRMAN | \
CFG_NS87308_RTC_APC )
#undef CFG_NS87308_PS2MOD
#define CFG_NS87308_CS0_BASE 0x0076
#define CFG_NS87308_CS0_CONF 0x30
#define CFG_NS87308_CS1_BASE 0x0075
#define CFG_NS87308_CS1_CONF 0x30
#define CFG_NS87308_CS2_BASE 0x0074
#define CFG_NS87308_CS2_CONF 0x30
/*不配置NS87308,定义如下:
#ifdef CONFIG_USER8240
#undef CFG_NS87308
#endif
*/
/* NS16550/2 串口配置*/
#define CFG_NS16550 /*配置NS16550*/
#define CFG_NS16550_SERIAL /*将NS16550 作为串口驱动芯片*/
#define CFG_NS16550_REG_SIZE 1 /* NS16550 的寄存器间隔*/
#define CFG_NS16550_CLK 1843200 /*NS16550 外接参考时钟频率,单位Hz*/
/*串口基地址,分别对应NS16552 的两路串口,请参考文件\driver\serial.c*/
#define CFG_NS16550_COM1 (CFG_ISA_IO + CFG_NS87308_UART1_BASE)
#define CFG_NS16550_COM2 (CFG_ISA_IO + CFG_NS87308_UART2_BASE)
/*以下为一些底层设置(例如地址映射,寄存器初始值等),请参考MPC8240 Integrated
Processor User's Manual、 Programming Environments Manual for 32-Bit Implementations of the
PowerPC? Architecture和EREF: A Programmer'sReference Manual for Freescale Book EProcessors等文档以及内存芯片的datasheet,对这些值的配置不当将直接导致u-boot的无法运行。不过先别担心,由于我们有VxWorks的Bootrom做了底层初始化,因此可以先绕过他们当中的大部分。对他们的配置值也可以参考VxWorks的BSP*/
#define CONFIG_SYS_CLK_FREQ 33000000 /*系统时钟,即输入给CPU 的晶振频率*/
#define CONFIG_PLL_PCI_TO_MEM_MULTIPLIER 1 /*PCI 到内存接口的倍频*/
/*下面的是MCCR1~4 的定义,参考MPC8240 User Mannual*/
#define CFG_ROMNAL 7 /*rom/flash next access time*/
#define CFG_ROMFAL 11 /*rom/flash access time*/
#define CFG_REFINT 430 /* number of clock cycles between CBR refresh cycles */
/*SDRAM 的参数 */
#define CFG_BSTOPRE 121 /* Burst To Precharge, sets open page interval */
#define CFG_REFREC 8 /* Refresh to activate interval */
#define CFG_RDLAT 4 /* data latency from read command*/
#define CFG_PRETOACT 3 /* Precharge to activate interval*/
#define CFG_ACTTOPRE 5 /* Activate to Precharge interval*/
#define CFG_ACTORW 3 /* Activate to R/W*/
#define CFG_SDMODE_CAS_LAT 3 /* SDMODE CAS latency*/
#define CFG_SDMODE_WRAP 0 /* SDMODE wrap type*/
#define CFG_SDMODE_BURSTLEN 2 /* SDMODE Burst length 2=4, 3=8*/
#define CFG_REGISTERD_TYPE_BUFFER 1
/*内存bank 的设置,由于sandpoint 和我的电路板都是用了MAP B的内存映射方式,内存只能使用0x40000000 以下的地址,因此最高2 位必须为0,低20 位在填写寄存器时将被自动设置为0x00000(起始地址)和0xfffff(结束地址),只有bank0 被使能,映射了电路板上的全部内存,其余bank 均不使能*/
#define CFG_BANK0_START 0x00000000 /*内存映射*/
#define CFG_BANK0_END (CFG_MAX_RAM_SIZE - 1)
#define CFG_BANK0_ENABLE 1 /*此bank 使能 */
#define CFG_BANK1_START 0x3ff00000
#define CFG_BANK1_END 0x3fffffff
#define CFG_BANK1_ENABLE 0 /*此bank 不使能*/
#define CFG_BANK2_START 0x3ff00000
#define CFG_BANK2_END 0x3fffffff
#define CFG_BANK2_ENABLE 0
#define CFG_BANK3_START 0x3ff00000
#define CFG_BANK3_END 0x3fffffff
#define CFG_BANK3_ENABLE 0
#define CFG_BANK4_START 0x00000000
#define CFG_BANK4_END 0x00000000
#define CFG_BANK4_ENABLE 0
#define CFG_BANK5_START 0x00000000
#define CFG_BANK5_END 0x00000000
#define CFG_BANK5_ENABLE 0
#define CFG_BANK6_START 0x00000000
#define CFG_BANK6_END 0x00000000
#define CFG_BANK6_ENABLE 0
#define CFG_BANK7_START 0x00000000
#define CFG_BANK7_END 0x00000000
#define CFG_BANK7_ENABLE 0
/*使能的bank,其中MSB 代表bank7,LSB 代表bank0,事实上,CFG_BANK_ENABLE被用于board\sandpoint\early_init.S , 而上面的CFG_BANKX_ENABLE 被用于 \cpu\mpc824x\cpu_init.c。两者必须一致*/
#define CFG_BANK_ENABLE 0x01
/*配置输出时钟的驱动能力,参考MPC8240 User Manual*/
#define CFG_ODCR 0xff
/*配置page 的保存时间,参考MPC8240 User Manual*/
#define CFG_PGMAX 0x32
/*IBAT0~4 和DBAT0~4 的配置,其中IBAT0 用作内存,IBAT1 用作系统堆栈,IBAT2 用作PCI 空间,IBAT3 用作Flash/ROM 等空间*/
#define CFG_IBAT0L (CFG_SDRAM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE)
#define CFG_IBAT0U (CFG_SDRAM_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
#if defined(USE_DINK32)
#define CFG_IBAT1L (0x40000000 | BATL_PP_00 )
#define CFG_IBAT1U (0x40000000 | BATU_BL_128K )
#else
#define CFG_IBAT1L (CFG_INIT_RAM_ADDR | BATL_PP_10 | BATL_MEMCOHERENCE)
#define CFG_IBAT1U (CFG_INIT_RAM_ADDR | BATU_BL_128K | BATU_VS | BATU_VP)
#endif
#define CFG_IBAT2L (0x80000000 | BATL_PP_10 | BATL_CACHEINHIBIT)
#define CFG_IBAT2U (0x80000000 | BATU_BL_256M | BATU_VS | BATU_VP)
#define CFG_IBAT3L (0xF0000000 | BATL_PP_10 | BATL_CACHEINHIBIT)
#define CFG_IBAT3U (0xF0000000 | BATU_BL_256M | BATU_VS | BATU_VP)
#define CFG_DBAT0L CFG_IBAT0L
#define CFG_DBAT0U CFG_IBAT0U
#define CFG_DBAT1L CFG_IBAT1L
#define CFG_DBAT1U CFG_IBAT1U
#define CFG_DBAT2L CFG_IBAT2L
#define CFG_DBAT2U CFG_IBAT2U
#define CFG_DBAT3L CFG_IBAT3L
#define CFG_DBAT3U CFG_IBAT3U
/*此宏只针对加载linux 的情况,所有linux 需要的参数都必须放在内存最开始的8M 空间内, 因为linux 核初始化过程中只映射这么大的空间*/
#define CFG_BOOTMAPSZ (8 内存映射空间*/
/*flash 组织,我的电路板没有使用,没有研究这些参数*/
#define CFG_MAX_FLASH_BANKS 2 /* max number of memory banks */
#define CFG_MAX_FLASH_SECT 20 /* max number of sectors on one chip */
#define CFG_FLASH_ERASE_TOUT 120000 /* Timeout for Flash Erase (in ms)*/
#define CFG_FLASH_WRITE_TOUT 500 /* Timeout for Flash Write (in ms)*/
/*cache 配置*/
#define CFG_CACHELINE_SIZE 32 /* MPC8240cache line 大小*/
/*log base 2 of the above value,此宏定义MPC8240 没有使用*/
#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
#define CFG_CACHELINE_SHIFT 5
#endif
/*启动标志定义*/
#define BOOTFLAG_COLD 0x01 /*普通的硬件上电或复位启动*/
#define BOOTFLAG_WARM 0x02 /*软件的软重启动*/
/*控制内存操作字,实际上只针对fad 板,对于sandpoint 板无意义,参见\board\fads\fads.c*/
#define CONFIG_DRAM_50MHZ 1
#define CONFIG_SDRAM_50MHZ /*控制内存操作字,实际上对于MPC8240 无意义,
参见\board\fads\fads.c/
/*此宏只对MPC8xx 核有意义,对于sandpoint 板无意义,参见\include\mpc8xx_irq.h*/
#undef NR_8259_INTS
#define NR_8259_INTS 1
/*硬盘转速,由于没有使用硬盘,此参数无意义*/
#define CONFIG_DISK_SPINUP_TIME 1000000
#endif /* __CONFIG_H */
4.4 u-boot 入口程序\cpu\mpc824x\start.S
start.S 是u-boot 的入口程序,程序从_start:开始运行,如果4.2 的内容已经运行成功, 那么就一步步地向下挪动点灯代码,确定程序正常运行即可,一般来说,如果碰到程序使用了宏定义的地方,需要注意一下宏定义的值,其中很多是CPU 内部寄存器的初始化值,这些寄存器值应当参考CPU 的用户手册和原VxWorks 的BSP 修改,其余的宏定义和代码一般不需要改动。
程序的几个特殊节点为:
cpu_init_f
board_init_f
relocate_code
in_ram
board_init_r
? cpu_init_f
源代码位置:\cpu\mpc824x\cpu_init.c
运行位置: (从flash 启动)内存/(从ROM 启动)ROM
描述: 初始化cpu 的底层寄存器,这也是u-boot 中第一个运行C 语言程序,虽然大量使用将汇编定义为宏的方法进行寄存器操作,且不能使用除了register 类型之外的局部变量,但是这里确实可以使用标准C, 一个最好的例子就是可以方便地使用 *(char*)0xffe00055 = 0x00;进行点灯。由于此函数中涉及到了内存地址映射,具体方法是先
设置内存不可操作,即MCCR1 的MEM_GO 位为0),然后依次初始化MCCR2~MCCR4,最后再设置MCCR1 的MEM_GO 位为1。在此期间,内存是不可操作的,而我们的u-boot映像是放在内存中的,这意味着程序跑到这里就运行不下去了。因此,直接在start.S 中将跳转的汇编语句(bl cpu_init_f)注释掉。不用担心这些寄存器初始化的问题,因为引导u-boot 的bootrom 已经先行做完了这些工作。
? board_init_f
源代码位置:\lib_ppc\board.c
运行位置: (从flash 启动)内存/(从ROM 启动)ROM
描述:初始化串口和内存,尽早初始串口可以使程序错误容易被定位。需要注意的是:全局变量在这里是只读的,堆栈空间也很小,不超过几个KB。在这个程序里可以调用带局部变量的函数了,因此可以使用下面的语句实现更加复杂的点灯。
#define LED_ADDR ((char*)(0xffe00055))
#define LED_OP_ON 0
#define LED_OP_OFF 1
#define LED_OP_FLASH 2
void opLed(char mode)
{
int ledi;
switch(mode)
{
case LED_OP_ON:
*(char*)LED_ADDR = 0x00;
break;
case LED_OP_OFF:
*(char*)LED_ADDR = 0xff;
break;
case LED_OP_FLASH:
*(char*)LED_ADDR = 0x00;
for(ledi=0;ledi内存的测试。
board_init_f 接下来完成一些需要全局使用参数的参数,跳转到relocate_code。
? relocate_code
源代码位置:\cpu\mpc824x\start.S
运行位置: (从flash 启动)内存/(从ROM 启动)ROM
描述: 此段代码应该是把从TEXT_BASE 开始的内容拷贝到从某地址开始的内存,然后跳转到内存中相应的in_ram 位置继续执行。
? in_ram
源代码位置:\cpu\mpc824x\start.S
运行位置: 内存
描述: 第一个真正意义上运行在内存中的程序,如果在此点灯能够被看到,剩下需要修改的基本上就可以脱离汇编了,此段代码清BSS,最后跳转board_init_r。
? board_init_r
源代码位置:\lib_ppc\board.c
运行位置: 内存
描述: 第一个拥有正常C 环境的程序,可以大规模使用堆栈。程序使用宏定义控制是否初始化硬件。对我们来说,关键步骤有:
2010年07月09日
原帖地址http://www.foxice.net/techinfo_ubootvxworks3.asp
现在得仔细看看\include\configs\目录下的user8240.h,它使用宏定义控制板上硬件的初始化,从某种意义上来说,是电路板硬件特性的代表文件。其他电路板也类似,控制文件为\include\configs\[boardname].h。你应该已经浏览过user8240.h 了,下面给出了它的内容和注释,为了简略起见,省去了源代码中除了版权声明的原有注释。针对于电路板的修改都只是用注释的方法给出建议,而没有直接修改源代码。如果碰到不明白的宏定义,记得在u-boot 目录下搜索一遍。
/* (C) Copyright 2001-2005
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
* See file CREDITS for list of people who contributed to this
* project.
* This program is free software; you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Foundation;
* either version 2 of the License, or (at your option) any later version.
*/
#ifndef __CONFIG_H
#define __CONFIG_H /*控制本文件不会被重复引用*/
#define CONFIG_MPC824X 1 /*使用8240/8245 CPU*/
#define CONFIG_MPC8240 1 /*使用8240 CPU*/
#define CONFIG_USER8240 1 /*电路板标志,如果需要修改与sandpoint 板不同的地方,都建议用此宏定义控制*/
/*控制是否是从内存启动,事实上,当我们从flash 获取u-boot 时,确实是在从内存启动,但由于已经初始化了内存控制的寄存器,因此并不是纯粹意义上的从内存启动。为了后来修改成烧入ROM 的方便,仍然定义为不是从内存启动,需要修改的内容将在后面说明*/
#if 0
#define USE_DINK32 1 /*从内存启动,不修改MCCR1 的MEMGO 位*/
#else
#undef USE_DINK32 /*从非易失存储硬件启动,修改MCCR1 的MEMGO 位*/
#endif
/*sandpoint 使用NS16552 作为串口芯片,该芯片集成了两个串口控制,选择第一个作为控制台串口,通讯的波特率设为9600,在Windows 的超级中端中也必须设定为此值,才能正确显示串口的打印信息,建议设置为与VxWorks 的bootrom 相同的波特率*/
#define CONFIG_CONS_INDEX 1
#define CONFIG_BAUDRATE 9600
#define CONFIG_BOOTDELAY 5 /*u-boot 自动启动时的等待时间,单位为秒*/
/*打印u-boot image 的制作时间,例如U-Boot 1.1.4 (Mar 13 2006 - 16:49:46) ,必须同时在CONFIG_COMMANDS 中包含CFG_CMD_DAT E 选项才有效*/
#define CONFIG_TIMESTAMP
/* 进入等待选择是否自动启动过程前的打印信息, 其中net_nfs 是CONFIG_EXTRA_ENV_SETTINGS 中的定义*/
#define CONFIG_PREBOOT "echo;" \
"echo Type \"run net_nfs\" to mount root filesystem over NFS;" \ "echo"
/*启动参数之一,此外还有CONFIG_IPADDR(网口IP)等参数,具体的设置请参见 \common\environment.c,也可以在CONFIG_EXTRA_ENV_SETTINGS 中直接设置,例如, 如果要设定本地网口IP 为192.0.0.1,则从下面方法种选择一种:
1. #undef CONFIG_ADDR
#define CONFIG_ADDR 192.0.0.1
2. 在CONFIG_EXTRA_ENV_SETTINGS 中添加下面一行,注意引号内的内容不要有空格,且因为有后续行必须加上"\",最后一行必须是""
"ipaddr=192.0.0.1" \
*/
#undef CONFIG_BOOTARGS
#define CONFIG_EXTRA_ENV_SETTINGS \
"netdev=eth0\0" \
"nfsargs=setenv bootargs root=/dev/nfs rw " \
"nfsroot=${serverip}:${rootpath}\0" \
"ramargs=setenv bootargs root=/dev/ram rw\0" \
"addip=setenv bootargs ${bootargs} " \
"ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}" \
":${hostname}:${netdev}:off panic=1\0" \
"net_self=tftp ${kernel_addr} ${bootfile};" \
"tftp ${ramdisk_addr} ${ramdisk};" \
"run ramargs addip;" \
"bootm ${kernel_addr} ${ramdisk_addr}\0" \
"net_nfs=tftp ${kernel_addr} ${bootfile};" \
"run nfsargs addip;bootm\0" \
"rootpath=/opt/eldk/ppc_82xx\0" \
"bootfile=/tftpboot/SP8240/uImage\0" \
"ramdisk=/tftpboot/SP8240/uRamdisk\0" \
"kernel_addr=200000\0" \
"ramdisk_addr=400000\0" \
""
#define CONFIG_BOOTCOMMAND "run flash_self" /*从flash 启动*/
/*对于我的电路板,不需要这么多复杂的启动参数,只需要支持从网络获取VxWorks 并启动,可以如下定义,其中的0x00100000 为VxWorks 的启动地址,即config.h 和makefile中的RAM_LOW_ADRS:
#ifdef CONFIG_USER8240
#undef CONFIG_EXTRA_ENV_SETTINGS
#undef CONFIG_BOOTCOMMAND
#undef CONFIG_PREBOOT
#define CONFIG_EXTRA_ENV_SETTINGS \
"netdev=eth0\0" \
"serverip=192.0.0.2\0" \
"ipaddr=192.0.0.1\0" \
"ethaddr=AnyNumYouWant\0" \
"tftpboot=tftp 0x00100000 vxWorks.bin;" \
"go 0x00100000;\0" \
""
#define CONFIG_BOOTCOMMAND "run tftpboot"
#define CONFIG_PREBOOT "echo;" \
"echo Type \"run tftpboot\" to mount root .bin file over net;" \
"echo you should open a tftp server and set home directory correctly;" \
"echo"
#endif
*/
/*CONFIG_COMMANDS 配置了启动时配置的参数,每个CFG_CMD_XXX 对应了一种,其中CONFIG_CMD_DFL 的定义参见\include\cmd_confdefs.h,如果需要去掉某一种配置,则在CONFIG_COMMANDS 中加入& ~CFG_CMD_XXX,去除掉不需要的配置可以减小u-boot.bin 文件的大小*/
#define CONFIG_COMMANDS (CONFIG_CMD_DFL | \
CFG_CMD_DHCP | \
CFG_CMD_ELF | \
CFG_CMD_I2C | \
CFG_CMD_SDRAM | \
CFG_CMD_EEPROM | \
CFG_CMD_NFS | \
CFG_CMD_PCI | \
CFG_CMD_SNTP )
/*对于我的电路板,不需要这么多定义,且某些软硬件不支持,如EEPROM 不可写,FLASH地址不连续等,可以修改定义如下
#ifdef CONFIG_USER8240
#define CONFIG_COMMANDS (CONFIG_CMD_DFL | \
CFG_CMD_PCI & \
~CFG_CMD_FLASH)
#endif
*/
/*下面的头文件声明必须放在CONFIG_COMMANDS (如果有的话)的后面*/
#include
/*内存工作频率,单位MHz,不过在u-boot 的文件中发现此宏仅仅是在此作了一个定义,而没有被使用*/
#define CONFIG_DRAM_SPEED 100
#define CFG_LONGHELP 1 /*支持详细帮助,#undef 掉可以节省内存*/
#define CFG_PROMPT "=> " /*控制台提示符,类似于linux 的$*/
#define CFG_CBSIZE 256 /*控制台I/O Buffer 大小*/
#define CFG_PBSIZE (CFG_CBSIZE+sizeof(CFG_PROMPT)+16) /*打印的单句最大长度*/
#define CFG_MAXARGS 16 /*命令的参数个数最大值*/
#define CFG_BARGSIZE CFG_CBSIZE /*启动参数的最大长度*/
/*默认跳转启动地址,对于启动VxWorks 来说,即为config.h 中的RAM_LOW_ADDR*/
#define CFG_LOAD_ADDR 0x00100000
#define CFG_HZ 1000 /*1s = 1000ms*/
#define CONFIG_PCI /*支持PCI 配置*/
#undef CONFIG_PCI_PNP /*如果定义,则选择自动配置PCI,否则按照user8240.c 中的pci_sandpoint_config_table 配置表配置PCI*/
#define CONFIG_NET_MULTI /*支持多网口,如果只有一个网口可以undef 掉*/
#define CONFIG_EEPRO100 /*网口芯片为82557(82559)*/
#define CFG_RX_ETH_BUFFER 8 /*使用eepro100 上的8 个rx buffer*/
/*PCI 网口芯片的基地址,被用于PCI 非自动配置,如果只使用一个PCI 网口,则只需要定 义前两个宏*/
#define PCI_ENET0_IOADDR 0x80000000
#define PCI_ENET0_MEMADDR 0x80000000
#define PCI_ENET1_IOADDR 0x81000000
#define PCI_ENET1_MEMADDR 0x81000000
/*内存参数,由初始化程序使用,注意CFG_SDRAM_BASE 必须等于0*/
#define CFG_SDRAM_BASE 0x00000000 /*内存的起始地址*/
#define CFG_MAX_RAM_SIZE 0x10000000 /*内存的最大值,不能超过硬件内存的大小*/
#define CFG_RESET_ADDRESS 0xFFF00100 /*复位后跳转的地址,硬件决定,不能修改*/
#if defined (USE_DINK32) /*从内存启动*/
#define CFG_MONITOR_LEN 0x00030000 /*启动映像文件长度,必须大于u-boot.bin*/
#define CFG_MONITOR_BASE 0x00090000 /*启动地址,即u-boot.bin 在内存中的位置*/
#define CFG_RAMBOOT 1 /*从内存启动的标志*/
#define CFG_INIT_RAM_ADDR (CFG_MONITOR_BASE + CFG_MONITOR_LEN) /* 堆栈地址*/
#define CFG_INIT_RAM_END 0x10000 /*初始化需要的数据结构存放在内存中的结束地址*/
#define CFG_GBL_DATA_SIZE 256 /*初始化需要的数据结构长度*/
#define CFG_GBL_DATA_OFFSET (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE)
#define CFG_INIT_SP_OFFSET CFG_GBL_DATA_OFFSET /*堆栈指针,堆栈向下生长,事实上对于sandpoint 板来说,这个宏定义没有意义,因为它只在BMW 板标志CONFIG_BMW 被定义时才会被使用,sandpoint 板使用CFG_INIT_RAM_ADDR 作为初始化过程中的堆栈 地址*/
#else /*不是从内存启动*/
#undef CFG_RAMBOOT
#define CFG_MONITOR_LEN 0x00030000
#define CFG_MONITOR_BASE TEXT_BASE
#define CFG_GBL_DATA_SIZE 128
#define CFG_INIT_RAM_ADDR 0x40000000
#define CFG_INIT_RAM_END 0x1000
#define CFG_GBL_DATA_OFFSET (CFG_INIT_RAM_END - CFG_GBL_DATA_SIZE)
#endif
/*flash 基地址,对于我的电路板,启动设备为EEPROM 而不是FLASH,定义为0xFF00000*/
#define CFG_FLASH_BASE 0xFFF00000
#if 0
#define CFG_FLASH_SIZE (512 * 1024) /*配置较小的Flash 空间*/
#else
#define CFG_FLASH_SIZE (1024 * 1024) /*配置为较大的1M Flash 空间*/
#endif
#define CFG_ENV_IS_IN_FLASH 1 /*启动的环境变量存放在Flash 中*/
/*由于我的电路板Flash 地址不连续,不能使用标准程序,而EEPROM 也不能写,因此定义不存储环境变量,如下:
#ifdef CONFIG_USER8240
#undef CFG_ENV_IS_IN_FLASH
#undef CFG_ENV_IS_IN_EEPROM
#define CFG_ENV_IS_NOWHERE
#endif
*/
#define CFG_ENV_OFFSET 0x00004000 /*环境变量存储的偏移量*/
#define CFG_ENV_SIZE 0x00002000 /*环境变量总长度 */
#define CFG_MALLOC_LEN (512 内存空间大小*/
/*内存测试的起始结束地址,参见\common\cmd_mem.c 程序*/
#define CFG_MEMTEST_START 0x00000000
#define CFG_MEMTEST_END 0x04000000
/*EUMB地址,关于EUMB的详细功能,请参考MPC8240 Integrated Processor User's Manual*/
#define CFG_EUMB_ADDR 0xFC000000
/*ISA 总线地址*/
#define CFG_ISA_MEM 0xFD000000
#define CFG_ISA_IO 0xFE000000
/*flash 的地址控制,我的电路板上Flash 不能使用标准驱动,因此没有使用这些值*/
#define CFG_FLASH_RANGE_BASE 0xFF000000 /*MPC8240 的Flash\ROM 基地址*/
#define CFG_FLASH_RANGE_SIZE 0x01000000 /*Flash\ROM 空间大小*/
#define FLASH_BASE0_PRELIM 0xFFF00000 /*sandpoint 板载flash 起始地址*/
#define FLASH_BASE1_PRELIM 0xFF000000 /*PMC 扣板上的flash 起始地址*/
/*I2C 配置,我的电路板没有使用I2C,没有研究这些参数*/
#define CONFIG_HARD_I2C 1 /* To enable I2C support*/
#undef CONFIG_SOFT_I2C /* I2C bit-banged*/
#define CFG_I2C_SPEED 400000 /* I2C speed and slave address*/
#define CFG_I2C_SLAVE 0x7F
#ifdef CONFIG_SOFT_I2C
#error "Soft I2C is not configured properly. Please review!"
#define I2C_PORT 3 /* Port A=0, B=1, C=2, D=3 */
#define I2C_ACTIVE (iop->pdir |= 0x00010000)
#define I2C_TRISTATE (iop->pdir &= ~0x00010000)
#define I2C_READ ((iop->pdat & 0x00010000) != 0)
#define I2C_SDA(bit) if(bit) iop->pdat |= 0x00010000; \
else iop->pdat &= ~0x00010000
#define I2C_SCL(bit) if(bit) iop->pdat |= 0x00020000; \
else iop->pdat &= ~0x00020000
#define I2C_DELAY udelay(5) /* 1/4 I2C clock duration */
#endif /* CONFIG_SOFT_I2C */
#define CFG_I2C_EEPROM_ADDR 0x57 /* EEPROM IS24C02*/
#define CFG_I2C_EEPROM_ADDR_LEN 1 /* Bytes of address */
#define CFG_EEPROM_PAGE_WRITE_BITS 3 /* write page size*/
#define CFG_EEPROM_PAGE_WRITE_DELAY_MS 10 /* takes up to 10 msec*/
/*不配置I2C,定义如下:
#ifdef CONFIG_USER8240
#undef CONFIG_HARD_I2C
#endif
*/
#define CFG_BAUDRATE_TABLE {9600, 19200, 38400, 57600, 115200} /*波特率*/
/*flash 的地址控制,我的电路板上Flash 不能使用标准驱动,因此没有使用这些值*/
#define CFG_FLASH_BANKS {FLASH_BASE0_PRELIM, FLASH_BASE1_PRELIM }
/*华邦83c553 IDE 控制器配置,我的电路板没有使用,没有研究这些参数*/
#define CFG_WINBOND_83C553 1 /*has a winbond bridge*/
#define CFG_USE_WINBOND_IDE 0 /*use winbond 83c553 internal IDE ctrlr */
#define CFG_WINBOND_ISA_CFG_ADDR 0x80005800 /*pci-isa bridge config addr*/
#define CFG_WINBOND_IDE_CFG_ADDR 0x80005900 /*ide config addr*/
#define CFG_IDE_MAXBUS 2 /* max. 2 IDE busses*/
#define CFG_IDE_MAXDEVICE (CFG_IDE_MAXBUS*2) /* max. 2 drives per IDE bus */
/*不配置华邦83c553,定义如下:
#ifdef CONFIG_USER8240
#undef CFG_WINBOND_83C553
#endif
*/
/* NS87308 配置,支持软驱,我的电路板没有使用,没有研究这些参数*/
#define CFG_NS87308 /* Nat Semi super-io controller on ISA bus */
#define CFG_NS87308_BADDR_10 1
#define CFG_NS87308_DEVS ( CFG_NS87308_UART1 | \
CFG_NS87308_UART2 | \
CFG_NS87308_POWRMAN | \
CFG_NS87308_RTC_APC )
#undef CFG_NS87308_PS2MOD
#define CFG_NS87308_CS0_BASE 0x0076
#define CFG_NS87308_CS0_CONF 0x30
#define CFG_NS87308_CS1_BASE 0x0075
#define CFG_NS87308_CS1_CONF 0x30
#define CFG_NS87308_CS2_BASE 0x0074
#define CFG_NS87308_CS2_CONF 0x30
/*不配置NS87308,定义如下:
#ifdef CONFIG_USER8240
#undef CFG_NS87308
#endif
*/
/* NS16550/2 串口配置*/
#define CFG_NS16550 /*配置NS16550*/
#define CFG_NS16550_SERIAL /*将NS16550 作为串口驱动芯片*/
#define CFG_NS16550_REG_SIZE 1 /* NS16550 的寄存器间隔*/
#define CFG_NS16550_CLK 1843200 /*NS16550 外接参考时钟频率,单位Hz*/
/*串口基地址,分别对应NS16552 的两路串口,请参考文件\driver\serial.c*/
#define CFG_NS16550_COM1 (CFG_ISA_IO + CFG_NS87308_UART1_BASE)
#define CFG_NS16550_COM2 (CFG_ISA_IO + CFG_NS87308_UART2_BASE)
/*以下为一些底层设置(例如地址映射,寄存器初始值等),请参考MPC8240 Integrated
Processor User's Manual、 Programming Environments Manual for 32-Bit Implementations of the
PowerPC? Architecture和EREF: A Programmer'sReference Manual for Freescale Book EProcessors等文档以及内存芯片的datasheet,对这些值的配置不当将直接导致u-boot的无法运行。不过先别担心,由于我们有VxWorks的Bootrom做了底层初始化,因此可以先绕过他们当中的大部分。对他们的配置值也可以参考VxWorks的BSP*/
#define CONFIG_SYS_CLK_FREQ 33000000 /*系统时钟,即输入给CPU 的晶振频率*/
#define CONFIG_PLL_PCI_TO_MEM_MULTIPLIER 1 /*PCI 到内存接口的倍频*/
/*下面的是MCCR1~4 的定义,参考MPC8240 User Mannual*/
#define CFG_ROMNAL 7 /*rom/flash next access time*/
#define CFG_ROMFAL 11 /*rom/flash access time*/
#define CFG_REFINT 430 /* number of clock cycles between CBR refresh cycles */
/*SDRAM 的参数 */
#define CFG_BSTOPRE 121 /* Burst To Precharge, sets open page interval */
#define CFG_REFREC 8 /* Refresh to activate interval */
#define CFG_RDLAT 4 /* data latency from read command*/
#define CFG_PRETOACT 3 /* Precharge to activate interval*/
#define CFG_ACTTOPRE 5 /* Activate to Precharge interval*/
#define CFG_ACTORW 3 /* Activate to R/W*/
#define CFG_SDMODE_CAS_LAT 3 /* SDMODE CAS latency*/
#define CFG_SDMODE_WRAP 0 /* SDMODE wrap type*/
#define CFG_SDMODE_BURSTLEN 2 /* SDMODE Burst length 2=4, 3=8*/
#define CFG_REGISTERD_TYPE_BUFFER 1
/*内存bank 的设置,由于sandpoint 和我的电路板都是用了MAP B的内存映射方式,内存只能使用0x40000000 以下的地址,因此最高2 位必须为0,低20 位在填写寄存器时将被自动设置为0x00000(起始地址)和0xfffff(结束地址),只有bank0 被使能,映射了电路板上的全部内存,其余bank 均不使能*/
#define CFG_BANK0_START 0x00000000 /*内存映射*/
#define CFG_BANK0_END (CFG_MAX_RAM_SIZE - 1)
#define CFG_BANK0_ENABLE 1 /*此bank 使能 */
#define CFG_BANK1_START 0x3ff00000
#define CFG_BANK1_END 0x3fffffff
#define CFG_BANK1_ENABLE 0 /*此bank 不使能*/
#define CFG_BANK2_START 0x3ff00000
#define CFG_BANK2_END 0x3fffffff
#define CFG_BANK2_ENABLE 0
#define CFG_BANK3_START 0x3ff00000
#define CFG_BANK3_END 0x3fffffff
#define CFG_BANK3_ENABLE 0
#define CFG_BANK4_START 0x00000000
#define CFG_BANK4_END 0x00000000
#define CFG_BANK4_ENABLE 0
#define CFG_BANK5_START 0x00000000
#define CFG_BANK5_END 0x00000000
#define CFG_BANK5_ENABLE 0
#define CFG_BANK6_START 0x00000000
#define CFG_BANK6_END 0x00000000
#define CFG_BANK6_ENABLE 0
#define CFG_BANK7_START 0x00000000
#define CFG_BANK7_END 0x00000000
#define CFG_BANK7_ENABLE 0
/*使能的bank,其中MSB 代表bank7,LSB 代表bank0,事实上,CFG_BANK_ENABLE被用于board\sandpoint\early_init.S , 而上面的CFG_BANKX_ENABLE 被用于 \cpu\mpc824x\cpu_init.c。两者必须一致*/
#define CFG_BANK_ENABLE 0x01
/*配置输出时钟的驱动能力,参考MPC8240 User Manual*/
#define CFG_ODCR 0xff
/*配置page 的保存时间,参考MPC8240 User Manual*/
#define CFG_PGMAX 0x32
/*IBAT0~4 和DBAT0~4 的配置,其中IBAT0 用作内存,IBAT1 用作系统堆栈,IBAT2 用作PCI 空间,IBAT3 用作Flash/ROM 等空间*/
#define CFG_IBAT0L (CFG_SDRAM_BASE | BATL_PP_10 | BATL_MEMCOHERENCE)
#define CFG_IBAT0U (CFG_SDRAM_BASE | BATU_BL_256M | BATU_VS | BATU_VP)
#if defined(USE_DINK32)
#define CFG_IBAT1L (0x40000000 | BATL_PP_00 )
#define CFG_IBAT1U (0x40000000 | BATU_BL_128K )
#else
#define CFG_IBAT1L (CFG_INIT_RAM_ADDR | BATL_PP_10 | BATL_MEMCOHERENCE)
#define CFG_IBAT1U (CFG_INIT_RAM_ADDR | BATU_BL_128K | BATU_VS | BATU_VP)
#endif
#define CFG_IBAT2L (0x80000000 | BATL_PP_10 | BATL_CACHEINHIBIT)
#define CFG_IBAT2U (0x80000000 | BATU_BL_256M | BATU_VS | BATU_VP)
#define CFG_IBAT3L (0xF0000000 | BATL_PP_10 | BATL_CACHEINHIBIT)
#define CFG_IBAT3U (0xF0000000 | BATU_BL_256M | BATU_VS | BATU_VP)
#define CFG_DBAT0L CFG_IBAT0L
#define CFG_DBAT0U CFG_IBAT0U
#define CFG_DBAT1L CFG_IBAT1L
#define CFG_DBAT1U CFG_IBAT1U
#define CFG_DBAT2L CFG_IBAT2L
#define CFG_DBAT2U CFG_IBAT2U
#define CFG_DBAT3L CFG_IBAT3L
#define CFG_DBAT3U CFG_IBAT3U
/*此宏只针对加载linux 的情况,所有linux 需要的参数都必须放在内存最开始的8M 空间内, 因为linux 核初始化过程中只映射这么大的空间*/
#define CFG_BOOTMAPSZ (8 内存映射空间*/
/*flash 组织,我的电路板没有使用,没有研究这些参数*/
#define CFG_MAX_FLASH_BANKS 2 /* max number of memory banks */
#define CFG_MAX_FLASH_SECT 20 /* max number of sectors on one chip */
#define CFG_FLASH_ERASE_TOUT 120000 /* Timeout for Flash Erase (in ms)*/
#define CFG_FLASH_WRITE_TOUT 500 /* Timeout for Flash Write (in ms)*/
/*cache 配置*/
#define CFG_CACHELINE_SIZE 32 /* MPC8240cache line 大小*/
/*log base 2 of the above value,此宏定义MPC8240 没有使用*/
#if (CONFIG_COMMANDS & CFG_CMD_KGDB)
#define CFG_CACHELINE_SHIFT 5
#endif
/*启动标志定义*/
#define BOOTFLAG_COLD 0x01 /*普通的硬件上电或复位启动*/
#define BOOTFLAG_WARM 0x02 /*软件的软重启动*/
/*控制内存操作字,实际上只针对fad 板,对于sandpoint 板无意义,参见\board\fads\fads.c*/
#define CONFIG_DRAM_50MHZ 1
#define CONFIG_SDRAM_50MHZ /*控制内存操作字,实际上对于MPC8240 无意义,
参见\board\fads\fads.c/
/*此宏只对MPC8xx 核有意义,对于sandpoint 板无意义,参见\include\mpc8xx_irq.h*/
#undef NR_8259_INTS
#define NR_8259_INTS 1
/*硬盘转速,由于没有使用硬盘,此参数无意义*/
#define CONFIG_DISK_SPINUP_TIME 1000000
#endif /* __CONFIG_H */
4.4 u-boot 入口程序\cpu\mpc824x\start.S
start.S 是u-boot 的入口程序,程序从_start:开始运行,如果4.2 的内容已经运行成功, 那么就一步步地向下挪动点灯代码,确定程序正常运行即可,一般来说,如果碰到程序使用了宏定义的地方,需要注意一下宏定义的值,其中很多是CPU 内部寄存器的初始化值,这些寄存器值应当参考CPU 的用户手册和原VxWorks 的BSP 修改,其余的宏定义和代码一般不需要改动。
程序的几个特殊节点为:
cpu_init_f
board_init_f
relocate_code
in_ram
board_init_r
? cpu_init_f
源代码位置:\cpu\mpc824x\cpu_init.c
运行位置: (从flash 启动)内存/(从ROM 启动)ROM
描述: 初始化cpu 的底层寄存器,这也是u-boot 中第一个运行C 语言程序,虽然大量使用将汇编定义为宏的方法进行寄存器操作,且不能使用除了register 类型之外的局部变量,但是这里确实可以使用标准C, 一个最好的例子就是可以方便地使用 *(char*)0xffe00055 = 0x00;进行点灯。由于此函数中涉及到了内存地址映射,具体方法是先
设置内存不可操作,即MCCR1 的MEM_GO 位为0),然后依次初始化MCCR2~MCCR4,最后再设置MCCR1 的MEM_GO 位为1。在此期间,内存是不可操作的,而我们的u-boot映像是放在内存中的,这意味着程序跑到这里就运行不下去了。因此,直接在start.S 中将跳转的汇编语句(bl cpu_init_f)注释掉。不用担心这些寄存器初始化的问题,因为引导u-boot 的bootrom 已经先行做完了这些工作。
? board_init_f
源代码位置:\lib_ppc\board.c
运行位置: (从flash 启动)内存/(从ROM 启动)ROM
描述:初始化串口和内存,尽早初始串口可以使程序错误容易被定位。需要注意的是:全局变量在这里是只读的,堆栈空间也很小,不超过几个KB。在这个程序里可以调用带局部变量的函数了,因此可以使用下面的语句实现更加复杂的点灯。
#define LED_ADDR ((char*)(0xffe00055))
#define LED_OP_ON 0
#define LED_OP_OFF 1
#define LED_OP_FLASH 2
void opLed(char mode)
{
int ledi;
switch(mode)
{
case LED_OP_ON:
*(char*)LED_ADDR = 0x00;
break;
case LED_OP_OFF:
*(char*)LED_ADDR = 0xff;
break;
case LED_OP_FLASH:
*(char*)LED_ADDR = 0x00;
for(ledi=0;ledi内存的测试。
board_init_f 接下来完成一些需要全局使用参数的参数,跳转到relocate_code。
? relocate_code
源代码位置:\cpu\mpc824x\start.S
运行位置: (从flash 启动)内存/(从ROM 启动)ROM
描述: 此段代码应该是把从TEXT_BASE 开始的内容拷贝到从某地址开始的内存,然后跳转到内存中相应的in_ram 位置继续执行。
? in_ram
源代码位置:\cpu\mpc824x\start.S
运行位置: 内存
描述: 第一个真正意义上运行在内存中的程序,如果在此点灯能够被看到,剩下需要修改的基本上就可以脱离汇编了,此段代码清BSS,最后跳转board_init_r。
? board_init_r
源代码位置:\lib_ppc\board.c
运行位置: 内存
描述: 第一个拥有正常C 环境的程序,可以大规模使用堆栈。程序使用宏定义控制是否初始化硬件。对我们来说,关键步骤有: