[U-Boot] 答复: ppc, flash init on mpc8247, Unknown FLASH on Bank 0

wind_embedded wind_embedded at sina.com
Wed Oct 13 10:08:18 CEST 2010


Hello wind_embedded,

wind_embedded wrote:
> Hello:
>  
>    Now I port u-boot into mpc8247, I need everyone's help, thanks!
>  
>    my board configuration is following:
>    chip select  chip        size  address
>    CS0          AM29LV040B  512K  0xfff00000
>    CS1          S29GL256P   64M   0xff800000
>    CS2          SDRAM       256M  0x00000000
>  
>    Before I use VxWorks, it works fine. When I port u-boot, my project
> based on IDS8247. I changed configuration in IDS8247.h and updated
> flash.c, after I compiled u-boot, I burned u-boot.bin into AM29LV040B.
> Console output(DEBUG is defined):
>    CPU:   MPC8247 (HiP7 Rev 14, Mask 1.0 1K50M) at 400 MHz

Which version of u-boot do you use?

>    Board: ADS 8247
>    I2C:   ready
>    DRAM:  128 MB
>    Top of RAM usable for U-Boot at: 08000000
>    Reserving 160k for U-Boot at: 07fd7000
>    Reserving 192k for malloc() at: 07fa7000
>    Reserving 76 Bytes for Board Info at: 07fa6fb4
>    Reserving 72 Bytes for Global Data at: 07fa6f6c
>    Stack Pointer at: 07fa6f48
>    New Stack Pointer is: 07fa6f48
>    Now running in RAM - U-Boot at: 07fd7000
>    FLASH: Manuf. ID @ 0xfff00000: 0x00000004
>    ## Unknown FLASH on Bank 0 - Size = 0x00000000 = 0 MB
>    flash_protect ON: from 0xFFF00000 to 0xFFF22FFF
>    flash_protect ON: from 0xFFF70000 to 0xFFF7FFFF
>    *** failed ***
>    ### ERROR ### Please RESET the board ###
>  
>    I found the manufacture ID of flash is error , it should be 0x01,
but
> it is 0x04, it is the first byte that u-boot.bin file was burned into
> AM29LV040. In my flash.c file, the code that I get manufacture ID as
> following:
>    ...
>    flash_cmd_autoselect (base);
>    mfrId= U8_READ (base);
>    flash_cmd_reset (base);

Hmm.. what code is this? It looks to me, that you don;t use
the CFI drvier! Please try this driver to access your flash.

bye,
Heiko
-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany


This code are section of flash_get_size function in flash.c. the related
functions are as following:
static ulong flash_get_size (volatile uchar * addr, flash_info_t * info)
{
    ulong   base;
	uchar value;

    base = (ulong) addr;

	flash_cmd_autoselect (base);
    asm("sync");
  	value = U8_READ (base);
	flash_cmd_reset (base);

	debug ("Manuf. ID @ 0x%08lx: 0x%02x\n", (ulong)addr, value);

	switch (value) {
	case (uchar) AMD_MANUFACT:
		info->flash_id = FLASH_MAN_AMD;
		break;
	default:
		info->flash_id = FLASH_UNKNOWN;
		info->sector_count = 0;
		info->size = 0;
		addr[0] = (uchar) 0x00FF00FF;	/* restore read mode */
		return (0);			/* no or unknown flash
*/
	}

	flash_cmd_autoselect (base);
    asm("sync");
  	value = U8_READ (base + 1);
	flash_cmd_reset (base);

	debug ("Device ID @ 0x%08lx: 0x%02x\n", (ulong)(&addr[0x1]),
value);

	switch (value) {
	case (uchar) AMD_ID_LV040B:
		info->flash_id += FLASH_AM040;
		info->sector_count = 8;
		info->size = 0x00080000;
		break;				/* => 512K     */

	default:
		info->flash_id = FLASH_UNKNOWN;
		break;
	}

	if (info->sector_count > CFG_MAX_FLASH_SECT) {
		printf ("** ERROR: sector count %d > max (%d) **\n",
				info->sector_count, CFG_MAX_FLASH_SECT);
		info->sector_count = CFG_MAX_FLASH_SECT;
	}

	return (info->size);
}

unsigned long flash_init (void)
{
	unsigned long size_b0;
	int i;
	volatile immap_t * immr = (immap_t *)CFG_IMMR;
	volatile memctl8260_t *memctl = &immr->im_memctl;

	/* Init: no FLASHes known */
	for (i = 0; i < CFG_MAX_FLASH_BANKS; ++i) {
		flash_info[i].flash_id = FLASH_UNKNOWN;
	}

	/* Static FLASH Bank configuration here - FIXME XXX */
	size_b0 = flash_get_size ((volatile uchar *) CFG_FLASH_BASE,
&flash_info[0]);

	if (flash_info[0].flash_id == FLASH_UNKNOWN) {
		printf ("## Unknown FLASH on Bank 0 - Size = 0x%08lx =
%ld MB\n",
			size_b0, size_b0 << 20);
	}

	memctl->memc_or0 = 0xfff00866;
	memctl->memc_br0 = 0xfff00801;

	flash_get_offsets (0xfff00000, &flash_info[0]);

#if CFG_MONITOR_BASE >= CFG_FLASH_BASE
	/* monitor protection ON by default */
	(void) flash_protect (FLAG_PROTECT_SET,
				CFG_MONITOR_BASE,
				CFG_MONITOR_BASE + monitor_flash_len -
1,
				&flash_info[0]);
#endif

#ifdef	CFG_ENV_IS_IN_FLASH
	/* ENV protection ON by default */
	flash_protect (FLAG_PROTECT_SET,
			CFG_ENV_ADDR,
			CFG_ENV_ADDR + CFG_ENV_SIZE - 1,
			&flash_info[0]);
#endif

	flash_info[0].size = size_b0;

	return (size_b0);
}



More information about the U-Boot mailing list