20191029_jeffrey - silenceuncrio/diary GitHub Wiki
0915
緊急 task
M360P - Avoid partition is empty from production line
先 build 一版最新的 M360P[release/v1.05]
雖然我應該在 uboot 解決這件事
但如果在下禮拜三之前來的及的話
12 GRE
這個 task 要作在以下兩個 generic 的 profile 上面
- 1_APN2
- 3_WIFI
1305
先盤一下 M360P 目前的開機訊息
我可以很大程度的利用 console 來 output 我需要的信息
因為 M360P 成品是不提供 console 的
也就是說目前 console 的 output 使用者完全看不到
1340
System Boot system code via Flash at dual image a.
3: System Boot system code via Flash at dual image a.
Is the device production done: No
..Erasing NAND Flash...
ranand_erase: start:80000, len:20000
.Writing to NAND Flash...
done
[do_bootm:644]argc: 2, addr: 0xBC140000
## Booting image at bc140000 ...
[do_bootm:685]addr:0xBC140000 >= CFG_FLASH_BASE:0xBC000000 ?
[do_bootm:687]ranand_read; from: 0x00140000
[do_bootm:694]hdr->ih_magic: 0x56190527
Image Name: OpenWrt Linux-3.10.14
Image Type: MIPS Linux Kernel Image (lzma compressed)
Data Size: 1883079 Bytes = 1.8 MB
Load Address: 80001000
Entry Point: 80001000
[do_bootm:738]addr:0xBC140000 >= CFG_FLASH_BASE:0xBC000000 ?
............................. Verifying Checksum ... OK
System Boot system code via Flash at dual image b.
3: System Boot system code via Flash at dual image b.
Is the device production done: Yes
..Erasing NAND Flash...
ranand_erase: start:80000, len:20000
.Writing to NAND Flash...
done
[do_bootm:644]argc: 2, addr: 0xBE140000
## Booting image at be140000 ...
[do_bootm:685]addr:0xBE140000 >= CFG_FLASH_BASE:0xBC000000 ?
[do_bootm:687]ranand_read; from: 0x02140000
[do_bootm:694]hdr->ih_magic: 0x56190527
Image Name: OpenWrt Linux-3.10.14
Image Type: MIPS Linux Kernel Image (lzma compressed)
Data Size: 1883079 Bytes = 1.8 MB
Load Address: 80001000
Entry Point: 80001000
[do_bootm:738]addr:0xBE140000 >= CFG_FLASH_BASE:0xBC000000 ?
............................. Verifying Checksum ... OK
1400
在 System Boot system code via Flash at dual image a.
的情況下
利用 linux shell - mtd erase reserve
把 partition b 區清掉
再利用 fw_setenv no_good .xx
讓下次開機從 partition b 開機
會發現 console 停在以下的地方
3: System Boot system code via Flash at dual image b.
Is the device production done: Yes
..Erasing NAND Flash...
ranand_erase: start:80000, len:20000
.Writing to NAND Flash...
done
[do_bootm:644]argc: 2, addr: 0xBE140000
## Booting image at be140000 ...
[do_bootm:685]addr:0xBE140000 >= CFG_FLASH_BASE:0xBC000000 ?
[do_bootm:687]ranand_read; from: 0x02140000
[do_bootm:694]hdr->ih_magic: 0xFFFFFFFF
Bad Magic Number,FFFFFFFF
我可以利用這一點來抓出 partition a 和 partition b 是否為 empty
另外還可以參考 uboot-m360\lib_mips\board.c
- int copy_image(int dir, unsigned long image_size)
/*
* dir=1: Image1 to Image2
* dir=2: Image2 to Image1
*/
int copy_image(int dir, unsigned long image_size)
{
int ret = 0;
#ifdef CFG_ENV_IS_IN_FLASH
unsigned long e_end, len;
#endif
if (dir == 1) {
#if defined (CFG_ENV_IS_IN_NAND)
printf("\nCopy Image:\nImage1(0x%X) to Image2(0x%X), size=0x%X\n",
CFG_KERN_ADDR - CFG_FLASH_BASE,
CFG_KERN2_ADDR - CFG_FLASH_BASE, image_size);
ranand_read((char *)CFG_SPINAND_LOAD_ADDR, CFG_KERN_ADDR-CFG_FLASH_BASE, image_size);
ret = ranand_erase_write((char *)CFG_SPINAND_LOAD_ADDR, CFG_KERN2_ADDR-CFG_FLASH_BASE, image_size);
#elif defined (CFG_ENV_IS_IN_SPI)
printf("\nCopy Image:\nImage1(0x%X) to Image2(0x%X), size=0x%X\n",
CFG_KERN_ADDR - CFG_FLASH_BASE,
CFG_KERN2_ADDR - CFG_FLASH_BASE, image_size);
raspi_read((char *)CFG_SPINAND_LOAD_ADDR, CFG_KERN_ADDR-CFG_FLASH_BASE, image_size);
ret = raspi_erase_write((char *)CFG_SPINAND_LOAD_ADDR, CFG_KERN2_ADDR-CFG_FLASH_BASE, image_size);
#else //CFG_ENV_IS_IN_FLASH
printf("\nCopy Image:\nImage1(0x%X) to Image2(0x%X), size=0x%X\n", CFG_KERN_ADDR, CFG_KERN2_ADDR, image_size);
e_end = CFG_KERN2_ADDR + image_size - 1;
if (get_addr_boundary(&e_end) != 0)
return -1;
printf("Erase from 0x%X to 0x%X\n", CFG_KERN2_ADDR, e_end);
flash_sect_erase(CFG_KERN2_ADDR, e_end);
memcpy(CFG_LOAD_ADDR, (void *)CFG_KERN_ADDR, image_size);
ret = flash_write((uchar *)CFG_LOAD_ADDR, (ulong)CFG_KERN2_ADDR, image_size);
#endif
}
else if (dir == 2) {
#if defined (CFG_ENV_IS_IN_NAND)
printf("\nCopy Image:\nImage2(0x%X) to Image1(0x%X), size=0x%X\n",
CFG_KERN2_ADDR - CFG_FLASH_BASE,
CFG_KERN_ADDR - CFG_FLASH_BASE, image_size);
ranand_read((char *)CFG_SPINAND_LOAD_ADDR, CFG_KERN2_ADDR-CFG_FLASH_BASE, image_size);
ret = ranand_erase_write((char *)CFG_SPINAND_LOAD_ADDR, CFG_KERN_ADDR-CFG_FLASH_BASE, image_size);
#elif defined (CFG_ENV_IS_IN_SPI)
printf("\nCopy Image:\nImage2(0x%X) to Image1(0x%X), size=0x%X\n",
CFG_KERN2_ADDR - CFG_FLASH_BASE,
CFG_KERN_ADDR - CFG_FLASH_BASE, image_size);
raspi_read((char *)CFG_SPINAND_LOAD_ADDR, CFG_KERN2_ADDR-CFG_FLASH_BASE, image_size);
ret = raspi_erase_write((char *)CFG_SPINAND_LOAD_ADDR, CFG_KERN_ADDR-CFG_FLASH_BASE, image_size);
#else //CFG_ENV_IS_IN_FLASH
printf("\nCopy Image:\nImage2(0x%X) to Image1(0x%X), size=0x%X\n", CFG_KERN2_ADDR, CFG_KERN_ADDR, image_size);
#if defined (ON_BOARD_16M_FLASH_COMPONENT) && (defined (RT2880_ASIC_BOARD) || defined (RT2880_FPGA_BOARD) || defined (RT3052_MP1))
len = 0x400000 - (CFG_BOOTLOADER_SIZE + CFG_CONFIG_SIZE + CFG_FACTORY_SIZE);
if (image_size <= len) {
e_end = CFG_KERN_ADDR + image_size - 1;
if (get_addr_boundary(&e_end) != 0)
return -1;
printf("Erase from 0x%X To 0x%X\n", CFG_KERN_ADDR, e_end);
flash_sect_erase(CFG_KERN_ADDR, e_end);
memcpy(CFG_LOAD_ADDR, (void *)CFG_KERN2_ADDR, image_size);
ret = flash_write((uchar *)CFG_LOAD_ADDR, (ulong)CFG_KERN_ADDR, image_size);
}
else {
e_end = CFG_KERN_ADDR + len - 1;
if (get_addr_boundary(&e_end - 1) != 0)
return -1;
printf("Erase from 0x%X To 0x%X\n", CFG_KERN_ADDR, e_end);
flash_sect_erase(CFG_KERN_ADDR, e_end);
e_end = PHYS_FLASH_2 + (image_size - len) - 1;
if (get_addr_boundary(&e_end) != 0)
return -1;
printf("From 0x%X To 0x%X\n", PHYS_FLASH_2, e_end);
flash_sect_erase(PHYS_FLASH_2, e_end);
memcpy(CFG_LOAD_ADDR, (void *)CFG_KERN2_ADDR, image_size);
ret = flash_write((uchar *)CFG_LOAD_ADDR, (ulong)CFG_KERN_ADDR, len);
ret = flash_write((uchar *)(CFG_LOAD_ADDR + len), (ulong)PHYS_FLASH_2, image_size - len);
}
#else
e_end = CFG_KERN_ADDR + image_size - 1;
if (get_addr_boundary(&e_end) != 0)
return -1;
printf("Erase from 0x%X to 0x%X\n", CFG_KERN_ADDR, e_end);
flash_sect_erase(CFG_KERN_ADDR, e_end);
memcpy(CFG_LOAD_ADDR, (void *)CFG_KERN2_ADDR, image_size);
ret = flash_write((uchar *)CFG_LOAD_ADDR, (ulong)CFG_KERN_ADDR, image_size);
#endif
#endif
if (ret == 0) {
setenv("Image1Stable", "0");
setenv("Image1Try", "0");
saveenv();
}
}
else
ret = -1;
return ret;
}
1735
目前已經實作出一份堪用的 uboot
明天再多做幾次測試後再 commit
記得整理一下 wiki 禮拜五可以分享