u-boot-1.1.4起動アドレスの変更
15029 ワード
以下の修正は
do_bootm_linuxは、コマンドラインパラメータを追加して起動しない場合、環境変数のデフォルトの起動アドレスを解析することでカーネルを起動できます.環境変数が存在するファイル
以下、コードにNOR Flashから起動アドレスを読み込むように変更して起動を試みる.起動アドレスの自動切り替えをサポート
関数の個別実装
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;
}