u-boot-1.1.4起動アドレスの変更

15029 ワード

以下の修正はPPC8548 NOR Flashに適用されます.Linuxファイルシステムを走ってファイルu-boot-1.1.4\common\cmd_bootm.cを修正します
do_bootm_linuxは、コマンドラインパラメータを追加して起動しない場合、環境変数のデフォルトの起動アドレスを解析することでカーネルを起動できます.環境変数が存在するファイルinclude/configs/MPC8548PC.hは、コマンドラインを介してカーネル起動アドレスおよびファイルシステムアドレスを指定することもできる
以下、コードにNOR Flashから起動アドレスを読み込むように変更して起動を試みる.起動アドレスの自動切り替えをサポート
#ifdef CONFIG_PPC
#define APP1_DEV_NAME        "/dev/mtd5"
#define APP1_FLASH_ADDR      0xff000000  /*   */
#define APP1_FLASH_OFFSET    0		     /*  /dev/mtd5 */
#define APP1_FLASH_BYTES     0x00400000  /*   */
#define APP2_DEV_NAME        "/dev/mtd5"
#define APP2_FLASH_ADDR      0xff400000  /*   */
#define APP2_FLASH_OFFSET    0x00400000  /*  /dev/mtd5 */
#define APP2_FLASH_BYTES     0x00400000  /*   */
#define APP3_DEV_NAME        "/dev/mtd2"
#define APP3_FLASH_ADDR      0xff9c0000  /*   */
#define APP3_FLASH_OFFSET    0           /*  /dev/mtd2, boot  */
#define APP3_FLASH_BYTES     0x00300000  /*   */
#define APP_BOOT_ADDR_NAME   "/dev/mtd3"
#define APP_BOOT_ADDR        0xffcc0000  /*  ( ) */
#define APP_BOOT_ADDR_OFFSET 0           /*  /dev/mtd3 */
#define APP_BOOT_ADDR_BYTES  0x00020000  /*  erasesize  */
/*  , flash ,  */
	if(argc == 2)
	{
		addr = image_loadaddr_get();
		if(addr != APP1_FLASH_ADDR &&
		addr != APP2_FLASH_ADDR &&
		addr != APP3_FLASH_ADDR)
		{
			addr = APP3_FLASH_ADDR;
		}
	}
/*  , ,  */
	if (hdr->ih_magic  != IH_MAGIC) {
		puts ("Bad Magic Number
"
); SHOW_BOOT_PROGRESS (-10); image_loadaddr_set(addr); do_reset (cmdtp, flag, argc, argv); }

関数の個別実装
/* flash ,  */
static ulong 
image_loadaddr_get(void)
{
	ulong addr, count;
	ulong dest = 0;
	int size;

	addr = APP_BOOT_ADDR;
	count = 0x1;
	size = sizeof(dest);

	printf("image_loadaddr_get:\r
"
); while (count-- > 0) { if (size == 4) { dest = *((ulong *)addr); printf("0x%08x ", dest); } else if (size == 2) { dest = *((ushort *)addr); printf("0x%04x ", dest); } else { dest = *((u_char *)addr); printf("0x%02x ", dest); } addr += size; } printf("\r
"
); return dest; }
/* flash , , ,  */
static int 
image_loadaddr_set(ulong load_addr)
{
	int ret;
	ulong addr;

	/*
      	   ,
      	   2-0-1
	*/
	if(load_addr == APP1_FLASH_ADDR)
	{
		load_addr = APP2_FLASH_ADDR; 
	}
	else if(load_addr == APP2_FLASH_ADDR)
	{
		load_addr = APP3_FLASH_ADDR; 
	}
	else if(load_addr == APP3_FLASH_ADDR)
	{
		load_addr = APP1_FLASH_ADDR; 
	}
	else
	{
		printf("flash_sect_erase load_addr err 0x%08x\r
"
, load_addr); return -1; } addr = APP_BOOT_ADDR; if(flash_sect_erase (addr, addr + APP_BOOT_ADDR_BYTES - 1)) { printf("flash_sect_erase err\r
"
); return -1; } ret = flash_write((char*)&load_addr, addr, sizeof(load_addr)); if(ret != 0) { printf("flash_write err %d\r
"
, ret); return -1; } return 0; }