?? dsk_flash.c
字號(hào):
/*****************************************************************************
* File name : FLASH.c
* Description: Including Functions Supporting 8-bit Flash (AT29LV010A)
******************************************************************************/
#ifndef MASTER_FILE
#define C6711_GLOBALS
#include "includes.h"
#endif
#define PWD 0x12345678
void delay_msec(int );
void flash_page_prog( unsigned int src_addr, unsigned int dst_addr, int page_size);
/*-------------------------------------------------------------------------*
* Function: flash_prog()
* Description: Any byte that is not loaded during the programming of its
* sector will be erased to read FFh.
*-------------------------------------------------------------------------*/
#pragma DATA_SECTION(host_buffer, "BUFFER")
unsigned int host_buffer[33];
unsigned int start_addr, prog_ptr, prog_flag, page_count, checksum, i;
char *check_ptr;
void flash_prog()
{
host_buffer[0] = PWD; /* send flag, indicating dsp is ready */
while(host_buffer[0] != 0); /* wait host acknowledge */
start_addr = host_buffer[1]; /* save start programming address */
prog_ptr = start_addr; /* initialize pointer value */
page_count = 0; /* initialize programmed page counter */
prog_flag = 1; /* set prog_flag */
while(prog_flag) /* loop of receiving host data & program flash */
{
while (host_buffer[0] == 0); /* wait to receive a host packet data */
if (host_buffer[0] == 1) /* check if last packet */
{
flash_page_prog((unsigned int)&host_buffer[1], prog_ptr, FLASH_WRITE_SIZE); /* prog a page of flash */
prog_ptr += FLASH_WRITE_SIZE; /* update programming pointer */
page_count++; /* increment the programmed page counter */
host_buffer[0] = 0; /* send acknowledgement to host */
}
else /* host_buffer[0] == 2 */
{
prog_flag = 0;
host_buffer[0] = 0;
}
}
checksum = 0; /* initialize checksum */
check_ptr = (char *)start_addr;
for (i = 0; i < page_count*FLASH_WRITE_SIZE; i++)
{
checksum += *check_ptr++;
}
while ( host_buffer[0] == 0 );
host_buffer[1] = checksum;
host_buffer[0] = PWD;
}
void flash_page_prog( unsigned int src_addr, unsigned int dst_addr, int page_size)
{
int i;
char temp,temp1;
char *flash_ptr = (char *)dst_addr;
char *src_ptr = (char *)src_addr;
*(char *)FLASH_ADR1 = FLASH_KEY1;/*FLASH_ADR1=0x90005555,FLASH_KEY1=0xAA*/
*(char *)FLASH_ADR2 = FLASH_KEY2;/*FLASH_ADR2=0x90002AAA,FLASH_KEY2=0x55*/
*(char *)FLASH_ADR1 = FLASH_KEY3;/*FLASH_KEY3=0xA0 */
for (i=0;i<page_size;i++)
*flash_ptr++ = *src_ptr++;
temp = *--flash_ptr;
temp1 = *--src_ptr;
while ( temp != temp1)
{
temp = *flash_ptr;
}
}
/*-------------------------------------------------------------------------*
* Function: flash_erase()
* Description: erase the whole flash
*-------------------------------------------------------------------------*/
void flash_erase()
{
printf("Begin erase the Flash\n");
*(char *)FLASH_ADR1 = FLASH_KEY1;/*FLASH_ADR1=0x90005555,FLASH_KEY1=0xAA*/
*(char *)FLASH_ADR2 = FLASH_KEY2;/*FLASH_ADR2=0x90002AAA,FLASH_KEY2=0x55*/
*(char *)FLASH_ADR1 = 0x80;
*(char *)FLASH_ADR1 = 0xAA;
*(char *)FLASH_ADR2 = 0x55;
*(char *)FLASH_ADR1 = 0x10;
delay_msec(10000);
}
/*-------------------------------------------------------------------------*
* Function: flash_product_identify()
* Argument: sel==0 return manufacture code
* sel==1 return device code
* Description: Read the product identifier
* Manufacture Code is 1F;Device Code is 35.
*-------------------------------------------------------------------------*/
int flash_product_identify(char sel)
{
int code;
printf("Flash manufactue code identify\n");
/*Enter Product Identification Mode*/
*(char *)FLASH_ADR1 = FLASH_KEY1;
*(char *)FLASH_ADR2 = FLASH_KEY2;
*(char *)FLASH_ADR1 = 0x90;
delay_msec(20);
/*Read Manufacture Code*/
if(sel==0)
code=(*(char *)(FLASH_START));
/*Read Device Code*/
else if(sel==1)
code=(*(char *)(FLASH_START+0x01));
else
code=0;
/*Enter Product Identification Mode*/
*(char *)FLASH_ADR1 = FLASH_KEY1;
*(char *)FLASH_ADR2 = FLASH_KEY2;
*(char *)FLASH_ADR1 = 0xF0;
delay_msec(20);
return code;
}
/*-------------------------------------------------------------------------*
* Function: flash_bootlock_enable()
* Description: Boot block lockout feature enable
* sel==0 enable lower address boot block
* sel==1 enable higher address boot block
*-------------------------------------------------------------------------*/
BOOLEAN flash_bootlock_enable(char sel)
{
*(char *)FLASH_ADR1 = FLASH_KEY1;
*(char *)FLASH_ADR2 = FLASH_KEY2;
*(char *)FLASH_ADR1 = 0x80;
*(char *)FLASH_ADR1 = FLASH_KEY1;
*(char *)FLASH_ADR2 = FLASH_KEY2;
*(char *)FLASH_ADR1 = 0x40;
/*Lockout feature set on lower address boot block*/
if(sel==0)
{*(char *)(FLASH_START)=0x00;
delay_msec(20);
return TRUE;
}
/*Lockout feature set on higher address boot block*/
else if(sel==1)
{ *(char *)(FLASH_START+0x1FFFF)=0xFF;
delay_msec(20);
return TRUE;
}
else
return ERROR;
}
/*-------------------------------------------------------------------------*
* Function: flash_bootblock_detect()
* Description: sel==0 lower address boot block detect
* sel==1 higher address boot block detect
*-------------------------------------------------------------------------*/
BOOLEAN flash_bootblock_detect(char sel)
{
char block_lockout;
/*Enter Product Identification Mode*/
*(char *)FLASH_ADR1 = FLASH_KEY1;
*(char *)FLASH_ADR2 = FLASH_KEY2;
*(char *)FLASH_ADR1 = 0x90;
delay_msec(20);
/*Lower address boot block lockout detection*/
if(sel==0)
block_lockout=(*(char *)(FLASH_START+0x00002));
/*Higher address boot block lockout detection*/
if(sel==1)
block_lockout=(*(char *)(FLASH_START+0x1FFF2));
/*Enter Product Identification Mode*/
*(char *)FLASH_ADR1 = FLASH_KEY1;
*(char *)FLASH_ADR2 = FLASH_KEY2;
*(char *)FLASH_ADR1 = 0xF0;
delay_msec(20);
//return block_lockout;
if(block_lockout==0xfffffffe)
return 0; /*The corresponding block can be programmed */
else if(block_lockout==0xffffffff)
return 1; /*The corresponding block cannot be programmed*/
else
return 10;
}
/* END OF FILE */
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -