`
szy56szy
  • 浏览: 12583 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

uboot的配置问题对\include\configs\[boardname].h的修改

 
阅读更多

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 *为malloc()函数保留的内存空间大小*/
  /*内存测试的起始结束地址,参见\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 环境的程序,可以大规模使用堆栈。程序使用宏定义控制是否初始化硬件。对我们来说,关键步骤有:
分享到:
评论

相关推荐

    uboot中start.S详解

    uboot中start.S详解 #include <config.h> #include <version.h> /* 这段代码的主要作用是初始化硬件设备、...#include <./configs/omap1510.h> #elif defined(CONFIG_OMAP730) #include <./configs/omap730.h> #endif

    LINUX系统移植及UBOOT代码分析.zip

    3.4 uboot 部分...........................................................................................................................13 3.5 内核部分.................................................

    嵌入式Linux系统移植步步通

    2.3 配置系统服务.....................................................................................................................10 2.3.1 tftp服务器的配置.............................................

    ARM-Linux系统移植

    3.4 uboot部分...........................................................................................................................13 3.5 内核部分..................................................

    uboot-src-d09434a.tar.gz

    uboot-src-d09434a.tar.gz

    mkconfig.pdf

    关于Uboot中的make smdk_config 配置分析,总结 make *_config 命令之后执行的操作: 1.在 include 路径下创建文件 config.mk; 2.在config.mk文件中写入: ARCH = armCPU = arm920tBOARD = smdk2410VENDOR = ...

    XC2440 Uboot移植开发手册Ver.D.pdf

    XC2440 Uboot移植开发手册Ver.D.pdf 小超uboot移植手册,对uboot移植有较大参考价值

    uboot_tiny4412-master.tar.gz

    uboot_tiny4412-master.tar.gz 已经移植好的uboot,适用于Tiny4412开发板。

    uboot配置过程分析

    uboot配置过程分析,基于mini6410

    海思视频监控芯片linux内核与uboot配置指导

    自己总结的海思视频监控芯片内核与uboot的关键配置。通过阅读文档方便开发者快速找到相应问题的解决办法。

    imx6ull移植uboot(三)其他修改

    一、修改uboot 启动信息中打印的信息 uboot 启动会打印有“ Board: MX6ULL 14×14 EVK”这一句,将此信息该位自己开发板名称,打开mx6ull_fire_emmc.c文件,搜索checkboard找到如下: 将”MX6ULL 14×14 EVK”该位...

    uboot代码详细分析.pdf

    分享一篇我总结的 uboot 学习笔记(转) .....................................................................................15 U-BOOT内存布局及启动过程浅析 ................................................

    海思3531的uboot移植(含DDR3参数配置修改).pdf

    海思Hi3531芯片的uboot移植,含uboot移植、DDR3参数配置、uboot镜像下载和网络测试等4部分构成,内容包括SDK中的uboot源码解压到最终下载和测试全流程,实测可用。

    uboot中start.S详解.doc

    uboot中start.S详解 uboot中start.S详解 ARM

    jlink烧写uboot配置文件

    jlink烧写uboot配置文件,这样就不用手工一个一个输入了

    Uboot启动流程.PDF

    Uboot启动流程.PDFUboot启动流程.Uboot启动流程.PDFPDFUboot启动流程.PDFUboot启动流程.PDF

    三星U-Boot源码包 android_uboot_smdkv210.tar.bz2

    三星U-Boot源码包 android_uboot_smdkv210.tar.bz2

    uboot_smdkv210.public.tar.gz

    学习210类开发板,必备的uboot,该uboot来自三星稍作修改既可适用国内各种210开发板

    uboot1.1.5_AT1.2.tar.gz

    uboot1.1.5_AT1.2.tar.gz,很不错到资源

    uboot源代码分析及移植.doc

    uboot源代码分析及移植.doc uboot源代码分析及移植.doc

Global site tag (gtag.js) - Google Analytics