TIDM368 IPNC执行reboot后不能启动:
Sending all processes the KILL signal... Done. #这是执行reboot
Starting reboot command: reboot
Rebooting...
Restarting system.
.
DM36x initialization passed!
TI UBL Version: 1.50
Booting Catalog Boot Loader
BootMode = NAND
Starting NAND Copy... #将程序从FLASH拷贝到DDR RAM中运行。
Valid magicnum, 0xA1ACED66, found in block 0x00000008.
DONE
Jumping to entry point at 0x81080000.
DM368_IPNC_UBL_1.0.0
U-Boot 1.3.4 (Dec 16 2010 - 21:38:22) DM368-IPNC-1.0.0 #交权给uboot
I2C: ready
DRAM: 128 MB
NAND: NAND device: Manufacturer ID: 0xec, Chip ID: 0xf1 (Samsung NAND 128MiB 3,3V 8-bit)
TTTTTTTTTTTTTTTTEDMA_Read8 timeout!! #timeout发生在copy的过程中,这表明是u-boot init NAND flash有问题。
TTTTTTTTTTTTTTTTEDMA_Read8 timeout!!
TTTTTTTTTTTTTTTTEDMA_Read8 timeout!!
TTTTTTTTTTTTTTTTEDMA_Read8 timeout!!
TTTTTTTTTTTTTTTTEDMA_Read8 timeout!!
TTTTTTTTTTTTTTTTEDMA_Read8 timeout!!
TTTTTTTTTTTTTTTTEDMA_Read8 timeout!!
TTTTTTTTTTTTTTTTEDMA_Read8 timeout!!
Bad block table not found for chip 0
TTTTTTTTTTTTTTTTEDMA_Read8 timeout!!
TTTTTTTTTTTTTTTTEDMA_Read8 timeout!!
TTTTTTTTTTTTTTTTEDMA_Read8 timeout!!
TTTTTTTTTTTTTTTTEDMA_Read8 timeout!!
Bad block table found at page 65408, version 0x01
TTTTTTTTTTTTTTTTEDMA_Read8 timeout!!
TTTTTTTTTTTTTTTTEDMA_Read8 timeout!!
TTTTTTTTTTTTTTTTEDMA_Read8 timeout!!
TTTTTTTTTTTTTTTTEDMA_Read8 timeout!!
TTTTTTTTTTTTTTTTEDMA_Read8 timeout!!
Bad block table written to 0x07fe0000, version 0x01
128 MiB
TTTTTTTTTTTTTT
第一次的对策由TI的第三方Appro公司的的george给出:
他的建议是:正常的reboot程序,請參考
ipnc_app/network/boa-0.94.13/src/appro_api.c 中的 void restart_ipcam(.....){} 的寫法
關於reboot_ipnc,可以參照上述function
自行修改 ipnc_app/interface/src/reboot_ipnc.c
我把code paste here
void restart_ipcam(void)
{
char cmd[64];
int dev_fp;
void *pMem_map;
unsigned long phyAddr= 0x01C41000;
unsigned long length = 0xAE0;
unsigned int *pPSCCtrl = NULL;
unsigned int *pPTCMD = NULL;
if ((dev_fp=open("/dev/mem",O_RDWR|O_SYNC))==-1)
{
return ;
}
pMem_map=mmap((void *)phyAddr,length,PROT_READ|PROT_WRITE|PROT_EXEC,MAP_SHARED, dev_fp,phyAddr);
if (pMem_map!=(void *)phyAddr)
{
return ;
}
pPTCMD = (unsigned int *)( (char *)pMem_map+0x120);
pPSCCtrl = (unsigned int *)( (char *)pMem_map+0xA00);
//EDMA
*(pPSCCtrl+0) = 2;
*pPTCMD = 1;
usleep(5000);
//EDMA
*(pPSCCtrl+1) = 2;
*pPTCMD = 1;
usleep(5000);
//EDMA
*(pPSCCtrl+2) = 2;
*pPTCMD = 1;
usleep(5000);
//EDMA
*(pPSCCtrl+3) = 2;
*pPTCMD = 1;
usleep(5000);
//EDMA
*(pPSCCtrl+4) = 2;
*pPTCMD = 1;
usleep(5000);
//VPSS
*(pPSCCtrl+47) = 2;
*pPTCMD = 1;
usleep(5000);
//MJCP
*(pPSCCtrl+50) = 2;
*pPTCMD = 1;
usleep(5000);
//HDVICP
*(pPSCCtrl+51) = 2;
*pPTCMD = 1;
usleep(5000);
if( pMem_map )
munmap(pMem_map, length);
if( dev_fp >= 0)
close(dev_fp);
sprintf(cmd, "/sbin/shutdown -r now");
system(cmd);
return;
}
从程序来看,只是做了一个munmap的动作,似乎多此一举。而且,我实测的结果是,这样可能会导致reboot根本无法成功,就是说,reboot都无法用了。
对策二:用watchdog来复位。
实测的结果是:30次会发生约1次不成功,也就是说,仍然有机率复位不成功。