?? main.c.bak
字號:
/***************************************************************/
/*PROJECT : AT91SAM926X nor flash programer */
/*company : HongKong Baite(Group) Electronic Co.,Ltd */
/* AUTHOR : 張驛風 */
/* DATE: 2007年6月6日 */
/***************************************************************/
/*
Ver1.00 20070607 can init smc success.
Ver1.01 20070607 can read flash .
Ver1.01 20070607 can write flash bank 2 , can erase bank 2.
Ver1.02 20070608 port to ads1.2 ok. set ro_base as:0x200000 , rw_base as: 0x300000
*/
#include "project.h"
#include "flash.h"
#include "type.h"
#define AT91C_RTT_PRESCAL_1_SECOND 0x8000
/* prototypes */
//*--------------------------------------------------------------------------------------
//* Function Name : AT91F_Init_RTT
//* Object : Initialize RTT
//*--------------------------------------------------------------------------------------*/
void AT91F_Init_RTT(void){
AT91C_BASE_RTTC->RTTC_RTMR = (AT91C_RTT_PRESCAL_1_SECOND & AT91C_RTTC_RTPRES );
}
//*----------------------------------------------------------------------------
//* \fn AT91F_DBGU_Printk
//* \brief This function is used to send a string through the DBGU channel
//* (Very low level debugging)
//*----------------------------------------------------------------------------
void AT91F_DBGU_Printk( char *buffer) // \arg pointer to a string ending by \0
{
while(*buffer != '\0') {
while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_DBGU));
AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_DBGU, *buffer++);
}
}
//*----------------------------------------------------------------------------
//* \fn AT91F_DBGU_Init
//* \brief NandFlash init
//*----------------------------------------------------------------------------
void AT91F_DBGU_Init (void)
{
// Configure DBGU
AT91F_US_ResetRx((AT91PS_USART)AT91C_BASE_DBGU);
AT91F_US_Configure(
(AT91PS_USART)AT91C_BASE_DBGU, // DBGU base address
AT91B_MASTER_CLOCK, // 100 MHz
AT91C_US_ASYNC_MODE, // mode Register to be programmed
AT91B_DBGU_BAUD_RATE, // baudrate to be programmed
0 // timeguard to be programmed
);
// Open PIO for DBGU
AT91F_DBGU_CfgPIO();
// Enable Transmitter
AT91F_US_EnableTx((AT91PS_USART)AT91C_BASE_DBGU);
AT91F_US_EnableRx((AT91PS_USART)AT91C_BASE_DBGU);
}
//*--------------------------------------------------------------------------------------
//* Function Name : AT91F_InitSdram
//* Object : Initialize the SDRAM
//* Input Parameters :
//* Output Parameters :
//*--------------------------------------------------------------------------------------
void AT91F_InitSDRAM32 (void)
{
unsigned int i;
AT91PS_SDRAMC psdrc = AT91C_BASE_SDRAMC;
AT91F_EBI_EnableSDRAMC(AT91C_BASE_CCFG);
// Configure PIOs
AT91F_PIO_CfgPeriph(
AT91C_BASE_PIOC, // PIO controller base address
((unsigned int) AT91C_PC21_D21 ) |
((unsigned int) AT91C_PC18_D18 ) |
((unsigned int) AT91C_PC30_D30 ) |
((unsigned int) AT91C_PC26_D26 ) |
((unsigned int) AT91C_PC20_D20 ) |
((unsigned int) AT91C_PC22_D22 ) |
((unsigned int) AT91C_PC19_D19 ) |
((unsigned int) AT91C_PC25_D25 ) |
((unsigned int) AT91C_PC28_D28 ) |
((unsigned int) AT91C_PC23_D23 ) |
((unsigned int) AT91C_PC16_D16 ) |
((unsigned int) AT91C_PC31_D31 ) |
((unsigned int) AT91C_PC27_D27 ) |
((unsigned int) AT91C_PC29_D29 ) |
((unsigned int) AT91C_PC24_D24 ) |
((unsigned int) AT91C_PC17_D17 ), // Peripheral A
0); // Peripheral B
/*CFG 100 */
psdrc->SDRAMC_CR = AT91C_SDRAMC_NC_9 |
AT91C_SDRAMC_NR_13 |
AT91C_SDRAMC_CAS_3 |
AT91C_SDRAMC_NB_4_BANKS |
AT91C_SDRAMC_DBW_32_BITS |
AT91C_SDRAMC_TWR_2 |
AT91C_SDRAMC_TRC_7 |
AT91C_SDRAMC_TRP_2 |
AT91C_SDRAMC_TRCD_2 |
AT91C_SDRAMC_TRAS_5 |
AT91C_SDRAMC_TXSR_8 ;
for (i =0; i< 1000;i++);
psdrc->SDRAMC_MR = 0x00000002; // Set PRCHG AL
*AT91B_SDRAM_BASE = 0x00000000; // Perform PRCHG
for (i =0; i< 10000;i++);
psdrc->SDRAMC_MR = AT91C_SDRAMC_MODE_RFSH_CMD; // Set 1st CBR
*(AT91B_SDRAM_BASE+4) = 0x00000001; // Perform CBR
psdrc->SDRAMC_MR = 0x00000004; // Set 2 CBR
*(AT91B_SDRAM_BASE+8) = 0x00000002; // Perform CBR
psdrc->SDRAMC_MR = AT91C_SDRAMC_MODE_RFSH_CMD; // Set 3 CBR
*(AT91B_SDRAM_BASE+0xc) = 0x00000003; // Perform CBR
psdrc->SDRAMC_MR = AT91C_SDRAMC_MODE_RFSH_CMD; // Set 4 CBR
*(AT91B_SDRAM_BASE+0x10) = 0x00000004; // Perform CBR
psdrc->SDRAMC_MR = AT91C_SDRAMC_MODE_RFSH_CMD; // Set 5 CBR
*(AT91B_SDRAM_BASE+0x14) = 0x00000005; // Perform CBR
psdrc->SDRAMC_MR = AT91C_SDRAMC_MODE_RFSH_CMD; // Set 6 CBR
*(AT91B_SDRAM_BASE+0x18) = 0x00000006; // Perform CBR
psdrc->SDRAMC_MR = AT91C_SDRAMC_MODE_RFSH_CMD; // Set 7 CBR
*(AT91B_SDRAM_BASE+0x1c) = 0x00000007; // Perform CBR
psdrc->SDRAMC_MR = AT91C_SDRAMC_MODE_RFSH_CMD; // Set 8 CBR
*(AT91B_SDRAM_BASE+0x20) = 0x00000008; // Perform CBR
psdrc->SDRAMC_MR = AT91C_SDRAMC_MODE_LMR_CMD; // Set LMR operation
*(AT91B_SDRAM_BASE+0x24) = 0xcafedede; // Perform LMR burst=1, lat=2
psdrc->SDRAMC_TR = (AT91B_MASTER_CLOCK * 7)/1000000; // Set Refresh Timer 390 for 25MHz (TR= 15.6 * F )
// (F : system clock freq. MHz
psdrc->SDRAMC_MR = AT91C_SDRAMC_MODE_NORMAL_CMD; // Set Normal mode
*AT91B_SDRAM_BASE = 0x00000000; // Perform Normal mode
}
void initflash(void){
AT91PS_SMC psmc = AT91C_BASE_SMC;
psmc->SMC_SETUP0 = 0x21212121;
psmc->SMC_PULSE0 = 0x0A0A0A0A;
psmc->SMC_CYCLE0 = 0x00B400B4;
psmc->SMC_CTRL0 = 0x00001000; //4MB
}
char *Date = __DATE__;
char *Time = __TIME__;
char *Ver = "Ver1.0.2";
#define putchar(x) {\
while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_DBGU));\
AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_DBGU, x);\
};
void sendhex (int hex) {
while( !AT91F_US_TxReady( (AT91PS_USART) AT91C_BASE_DBGU) );
if (hex > 9){
AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_DBGU,'A' + (hex - 10));
}else {
AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_DBGU,'0' + hex);
}
}
/***********************************************************************/
/*名稱:sendhexstr */
/*功能:發送hex字符串 */
/*入口參數:no */
/*出口參數:1 正確提供,2 ID不正確 0失敗 */
/***********************************************************************/
void sendhexstr16(unsigned int Temp){
putchar('0');
putchar('x');
sendhex((Temp>>12)&0x0f);
sendhex((Temp>>8)&0x0f);
sendhex((Temp>>4)&0x0f);
sendhex(Temp&0x0f);
}
void sendhexstr8(unsigned char Temp){
//putchar('0');
//putchar('x');
sendhex((Temp>>4)&0x0f);
sendhex((Temp)&0x0f);
}
#define printf(x) AT91F_DBGU_Printk(x);
//*----------------------------------------------------------------------------
//* Function Name : main
//* Object : Main function
//* Input Parameters : none
//* Output Parameters : True
//*----------------------------------------------------------------------------*/
void initflash(void);
extern void delay(void);
void initbuf(void){
unsigned char *p;
int i,j;
p = (unsigned char *)AT91B_SDRAM_BASE;
for(i=0,j=0;i<(4*1024*1024);i+=1){
*p = j;
p += 1;
j += 1;
}
}
#define IMAGE_SIZE 4*1024
#define IMAGE_BASE 0x20800000
#define NOR_FLASH_BASE 0x10000000
#define NOR_FLASH_RW_ADDR 0x10000000
#define BOOT_FLASH_BASE 0x10000000 //boot strap base address
#define BOOT_IMG_SIZE 0x1000 //4KB
#define UBOOT_FLASH_BASE 0x10002000 //
#define UBOOT_IMG_SIZE 0x36000 //200KB
int main(void){
initflash();
AT91F_DBGU_Init();
AT91F_InitSDRAM32();
printf("---------------------------------------------------");
AT91F_DBGU_Printk("\r\nFlash programer ");
AT91F_DBGU_Printk("ver1.02");
AT91F_DBGU_Printk("\r\n");
printf("cmd:\r\n");
printf(" r read data from flash.\r\n");
printf(" w write data to flash.\r\n");
printf(" e erase flash . \r\n");
printf(" f find flash ic.\r\n");
printf("---------------------------------------------------");
reset_flash();
//initbuf();
//enter_secode();
//flash_unlock_seq();
while(1){
unsigned int ch,status,i;
status = AT91F_US_RxReady((AT91PS_USART)AT91C_BASE_DBGU);
if(status){
ch = AT91F_US_GetChar((AT91PS_USART)AT91C_BASE_DBGU);
while (!AT91F_US_TxReady((AT91PS_USART)AT91C_BASE_DBGU));
AT91F_US_PutChar((AT91PS_USART)AT91C_BASE_DBGU, ch);
printf("\r\n");
switch(ch){
case 'E':
case 'e':{
printf("start erase flash ic , please wait...\r\n");
flashChipErase();
AT91F_DBGU_Printk("\r\nerase flash\r\n");
break;
}
case 'R':
case 'r':{
unsigned short uTemp;
for(i=0;i<IMAGE_SIZE;i+=2){
uTemp = *(unsigned short *)(NOR_FLASH_RW_ADDR + i);
if((i%256)==0) printf("\r\n");
if((i%16)==0) printf(" ");
if((i%32)==0) {
printf("\r\n");
sendhexstr16(i);
printf(" ");
}
sendhexstr8(uTemp&0xFF);
printf(" ");
sendhexstr8(uTemp>>8);
printf(" ");
}
break;
}
case 's':
case 'S':{
unsigned short uTempF,uTempR;
printf("start write flash , please wait...\r\n");
//enter_secode();
//flashSectorErase(0x00,0x00);
flashWrite((UINT16*)NOR_FLASH_BASE,(UINT16*)(BOOT_FLASH_BASE),(u8*)IMAGE_BASE,BOOT_IMG_SIZE);
#if 1
printf("start verify flash.\r\n");
for(i=0;i<IMAGE_SIZE;i+=2){
uTempF = *(unsigned short *)(NOR_FLASH_RW_ADDR + i);
uTempR = *(unsigned short *)(IMAGE_BASE+i);
#if 0
sendhexstr16(i);
printf(" :");
sendhexstr16(uTempF);
printf(" ");
sendhexstr16(uTempR);
printf("\r\n");
#endif
if(uTempF!=uTempR) {
printf("verify fail.\r\n");
goto err;
}
}
printf("finish,write success.\r\n");
err:;
#endif
break;
}
case 'U':
case 'u':{
unsigned short uTempF,uTempR;
printf("start write flash , please wait...\r\n");
//enter_secode();
//flashSectorErase(0x00,0x00);
flashWrite((UINT16*)NOR_FLASH_BASE,(UINT16*)(UBOOT_FLASH_BASE),(u8*)IMAGE_BASE,UBOOT_IMG_SIZE);
#if 1
printf("start verify flash.\r\n");
for(i=0;i<IMAGE_SIZE;i+=2){
uTempF = *(unsigned short *)(UBOOT_FLASH_BASE + i);
uTempR = *(unsigned short *)(IMAGE_BASE+i);
#if 0
sendhexstr16(i);
printf(" :");
sendhexstr16(uTempF);
printf(" ");
sendhexstr16(uTempR);
printf("\r\n");
#endif
if(uTempF!=uTempR) {
printf("verify fail.\r\n");
goto err3;
}
}
printf("finish,write success.\r\n");
err3:;
#endif
break;
}
case 'f':{
UINT32 uTemp;
uTemp = ReadId();
#if 1
sendhexstr16(uTemp >> 16);
printf(",");
sendhexstr16(uTemp);
#endif
if(uTemp == 0xEC22A2){
printf("find a nor flash K8D3X16UBC ic \r\n");
}else{
printf("no find a nor flash\r\n");
}
break;
}
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -