?? sharp16.c
字號:
/*************************************************************************/
/* */
/* FILE NAME VERSION */
/* */
/* Sharp16.c 1.0 */
/* */
/* DESCRIPTION */
/* */
/* */
/* DATA STRUCTURES */
/* */
/* FUNCTIONS : Sharp Flash LRS1826 program code */
/* */
/* DEPENDENCIES */
/* */
/* */
/* The last mofification date: 07-04-2002 */
/* REMARKS: Created initial version 1.0 */
/* */
/* Copyrigth (C) 2001 AIJISYSTEM CO.,LTD */
/*************************************************************************/
#include <stdio.h>
#include <string.h>
#include "common.h"
#define AUTOKICK
#define TABLE_CNT 270+1 // Sector count
ulong Sector_Table[TABLE_CNT] = {
BASE_ADDRESS+0x0,
BASE_ADDRESS+0x00002000,
BASE_ADDRESS+0x00004000,
BASE_ADDRESS+0x00006000,
BASE_ADDRESS+0x00008000,
BASE_ADDRESS+0x0000a000,
BASE_ADDRESS+0x0000c000,
BASE_ADDRESS+0x0000e000,
BASE_ADDRESS+0x00010000,
BASE_ADDRESS+0x00020000,
BASE_ADDRESS+0x00030000,
BASE_ADDRESS+0x00040000,
BASE_ADDRESS+0x00050000,
BASE_ADDRESS+0x00060000,
BASE_ADDRESS+0x00070000,
BASE_ADDRESS+0x00080000,
BASE_ADDRESS+0x00090000,
BASE_ADDRESS+0x000a0000,
BASE_ADDRESS+0x000b0000,
BASE_ADDRESS+0x000c0000,
BASE_ADDRESS+0x000d0000,
BASE_ADDRESS+0x000e0000,
BASE_ADDRESS+0x000f0000,
BASE_ADDRESS+0x00100000,
BASE_ADDRESS+0x00110000,
BASE_ADDRESS+0x00120000,
BASE_ADDRESS+0x00130000,
BASE_ADDRESS+0x00140000,
BASE_ADDRESS+0x00150000,
BASE_ADDRESS+0x00160000,
BASE_ADDRESS+0x00170000,
BASE_ADDRESS+0x00180000,
BASE_ADDRESS+0x00190000,
BASE_ADDRESS+0x001a0000,
BASE_ADDRESS+0x001b0000,
BASE_ADDRESS+0x001c0000,
BASE_ADDRESS+0x001d0000,
BASE_ADDRESS+0x001e0000,
BASE_ADDRESS+0x001f0000,
BASE_ADDRESS+0x00200000,
BASE_ADDRESS+0x00210000,
BASE_ADDRESS+0x00220000,
BASE_ADDRESS+0x00230000,
BASE_ADDRESS+0x00240000,
BASE_ADDRESS+0x00250000,
BASE_ADDRESS+0x00260000,
BASE_ADDRESS+0x00270000,
BASE_ADDRESS+0x00280000,
BASE_ADDRESS+0x00290000,
BASE_ADDRESS+0x002a0000,
BASE_ADDRESS+0x002b0000,
BASE_ADDRESS+0x002c0000,
BASE_ADDRESS+0x002d0000,
BASE_ADDRESS+0x002e0000,
BASE_ADDRESS+0x002f0000,
BASE_ADDRESS+0x00300000,
BASE_ADDRESS+0x00310000,
BASE_ADDRESS+0x00320000,
BASE_ADDRESS+0x00330000,
BASE_ADDRESS+0x00340000,
BASE_ADDRESS+0x00350000,
BASE_ADDRESS+0x00360000,
BASE_ADDRESS+0x00370000,
BASE_ADDRESS+0x00380000,
BASE_ADDRESS+0x00390000,
BASE_ADDRESS+0x003a0000,
BASE_ADDRESS+0x003b0000,
BASE_ADDRESS+0x003c0000,
BASE_ADDRESS+0x003d0000,
BASE_ADDRESS+0x003e0000,
BASE_ADDRESS+0x003f0000,
BASE_ADDRESS+0x00400000,
BASE_ADDRESS+0x00410000,
BASE_ADDRESS+0x00420000,
BASE_ADDRESS+0x00430000,
BASE_ADDRESS+0x00440000,
BASE_ADDRESS+0x00450000,
BASE_ADDRESS+0x00460000,
BASE_ADDRESS+0x00470000,
BASE_ADDRESS+0x00480000,
BASE_ADDRESS+0x00490000,
BASE_ADDRESS+0x004a0000,
BASE_ADDRESS+0x004b0000,
BASE_ADDRESS+0x004c0000,
BASE_ADDRESS+0x004d0000,
BASE_ADDRESS+0x004e0000,
BASE_ADDRESS+0x004f0000,
BASE_ADDRESS+0x00500000,
BASE_ADDRESS+0x00510000,
BASE_ADDRESS+0x00520000,
BASE_ADDRESS+0x00530000,
BASE_ADDRESS+0x00540000,
BASE_ADDRESS+0x00550000,
BASE_ADDRESS+0x00560000,
BASE_ADDRESS+0x00570000,
BASE_ADDRESS+0x00580000,
BASE_ADDRESS+0x00590000,
BASE_ADDRESS+0x005a0000,
BASE_ADDRESS+0x005b0000,
BASE_ADDRESS+0x005c0000,
BASE_ADDRESS+0x005d0000,
BASE_ADDRESS+0x005e0000,
BASE_ADDRESS+0x005f0000,
BASE_ADDRESS+0x00600000,
BASE_ADDRESS+0x00610000,
BASE_ADDRESS+0x00620000,
BASE_ADDRESS+0x00630000,
BASE_ADDRESS+0x00640000,
BASE_ADDRESS+0x00650000,
BASE_ADDRESS+0x00660000,
BASE_ADDRESS+0x00670000,
BASE_ADDRESS+0x00680000,
BASE_ADDRESS+0x00690000,
BASE_ADDRESS+0x006a0000,
BASE_ADDRESS+0x006b0000,
BASE_ADDRESS+0x006c0000,
BASE_ADDRESS+0x006d0000,
BASE_ADDRESS+0x006e0000,
BASE_ADDRESS+0x006f0000,
BASE_ADDRESS+0x00700000,
BASE_ADDRESS+0x00710000,
BASE_ADDRESS+0x00720000,
BASE_ADDRESS+0x00730000,
BASE_ADDRESS+0x00740000,
BASE_ADDRESS+0x00750000,
BASE_ADDRESS+0x00760000,
BASE_ADDRESS+0x00770000,
BASE_ADDRESS+0x00780000,
BASE_ADDRESS+0x00790000,
BASE_ADDRESS+0x007a0000,
BASE_ADDRESS+0x007b0000,
BASE_ADDRESS+0x007c0000,
BASE_ADDRESS+0x007d0000,
BASE_ADDRESS+0x007e0000,
BASE_ADDRESS+0x007f0000,
BASE_ADDRESS+0x007f2000,
BASE_ADDRESS+0x007f4000,
BASE_ADDRESS+0x007f6000,
BASE_ADDRESS+0x007f8000,
BASE_ADDRESS+0x007fa000,
BASE_ADDRESS+0x007fc000,
BASE_ADDRESS+0x007fe000,
BASE_ADDRESS+0x00800000
};
#ifdef AUTOKICK
//volatile ushort *AutoKick_reg = (ushort *)0x3000600; //MSM3000, 3100, 5000, 5105
//volatile ushort *AutoKick_reg = (ushort *)0x3000700; //MSM5100 watch dog address
volatile ushort *AutoKick_reg = (ushort *)0x30006d0; //MSM6050
//volatile ushort *AutoKick_reg = (ushort *)0x3001080; //MSM5500
//volatile ushort *AutoKick_reg = (ushort *)0x80000700; //MSM6100
#endif
extern FLASH_INFO Flash_Info;
void Main(void)
{
switch(Flash_Info.Command)
{
case FPROGRAM: Program();
break;
case FERASEALL: EraseAll();
break;
case FERASESEC: EraseSector();
break;
case FREADID: ReadChipID();
break;
default :
Flash_Info.Result = 0;
}
}
void Program(void)
{
ulong i;
ushort status, data;
volatile ushort * targetP;
ushort * srcP;
targetP = (ushort *)Flash_Info.TargetAddr;
srcP = (ushort *)Flash_Info.Buf;
for(i=0; i<Flash_Info.Length; i+=2, targetP++, srcP++)
{
*targetP = PROGRAM_CMD;
*targetP = *srcP;
while(1)
{
*targetP = READ_STATUS;
status=*targetP & STATUS_WSMS;
if(status)
break;
#ifdef AUTOKICK
// AutoKick for Qualcomm MSM
*AutoKick_reg = 1;
*AutoKick_reg = 0;
#endif
}
*targetP = READ_STATUS;
status=*targetP & STATUS_PROG;
if(status)
Flash_Info.Result = 0; // error
else
Flash_Info.Result = 1; // Success
}
targetP = (ushort *)Flash_Info.TargetAddr;
*targetP = STATUS_CLEAR;
*targetP = RESET_CMD;
// Flash_Info.Result = Verification(Flash_Info.TargetAddr, Flash_Info.Length, (ulong)Flash_Info.Buf);
Flash_Info.Result = 1;
}
void EraseAll(void)
{
ushort status;
volatile ushort * targetP;
Flash_Info.Result = 0; // error
// first flash
targetP = (volatile ushort *)BASE_ADDRESS;
*targetP = RESET_CMD;
ClearAllBlockLock();
// to one Bank
*targetP = UNLOCK_SETUP;
*targetP = PCRC_CMD;
*(targetP+3) = 0x0;
*targetP = ERASE_ALL_CMD;
*targetP = ERASE_CONFIRM;
// second flash
// targetP = (volatile ushort *)BASE_ADDRESS2;
// *targetP = RESET_CMD;
ClearAllBlockLock();
// to one Bank
*targetP = UNLOCK_SETUP;
*targetP = PCRC_CMD;
*(targetP+3) = 0x0;
*targetP = ERASE_ALL_CMD;
*targetP = ERASE_CONFIRM;
// first flash
targetP = (volatile ushort *)BASE_ADDRESS;
status = 0;
while(!status)
{
*targetP = READ_STATUS;
status=*targetP & STATUS_WSMS;
#ifdef AUTOKICK
// AutoKick for Qualcomm MSM
*AutoKick_reg = 1;
*AutoKick_reg = 0;
#endif
}
*targetP = READ_STATUS;
status=*targetP & STATUS_ERASE;
if(status) {
*targetP = RESET_CMD;
return;
}
*targetP = STATUS_CLEAR;
*targetP = RESET_CMD;
// second flash
/* targetP = (volatile ushort *)BASE_ADDRESS2;
status = 0;
while(!status)
{
*targetP = READ_STATUS;
status=*targetP & STATUS_WSMS;
#ifdef AUTOKICK
// AutoKick for Qualcomm MSM
*AutoKick_reg = 1;
*AutoKick_reg = 0;
#endif
}
*targetP = READ_STATUS;
status=*targetP & STATUS_ERASE;
if(status) {
*targetP = RESET_CMD;
return;
}
*targetP = STATUS_CLEAR;
*targetP = RESET_CMD;
*/
// Flash_Info.Result = BlankCheck(BASE_ADDRESS, 0x800000);
Flash_Info.Result = 1;
}
// Sector erase function
void EraseSector(void)
{
int i;
Flash_Info.Result = 0;
for(i=0; i<TABLE_CNT-1; i++) // Start sector 茫扁
if(Sector_Table[i+1]>Flash_Info.TargetAddr)
break;
for(;i<TABLE_CNT-1; i++) {
if(Sector_Table[i] >= (Flash_Info.TargetAddr+Flash_Info.Length))
break;
if(!OneSectorErase(Sector_Table[i]))
return;
}
// Flash_Info.Result = BlankCheck(Flash_Info.TargetAddr, Flash_Info.Length);
Flash_Info.Result = 1;
}
void ReadChipID(void)
{
ushort manId,devId;
volatile ushort *targetP = (ushort *)BASE_ADDRESS;
*targetP = RESET_CMD;
*targetP = ID_CMD;
manId=*((volatile uchar *)targetP);
manId &= 0xff;
*targetP = ID_CMD;
devId=*((volatile uchar *)(targetP+1));
devId &= 0xff;
devId &= 0xff;
Flash_Info.Result = (devId << 8) + manId;
*targetP = RESET_CMD;
}
void ClearBlockLock(ulong targetAddr)
{
unsigned long Status, time_out;
volatile ushort *targetP = (ushort *)targetAddr;
*targetP = UNLOCK_SETUP;
*targetP = UNLOCK_CONFIRM;
Status = 0;
time_out = 100000;
while(!Status && time_out) {
*targetP = READ_STATUS;
Status = *targetP & STATUS_WSMS;
#ifdef AUTOKICK
// AutoKick for Qualcomm MSM
*AutoKick_reg = 1;
*AutoKick_reg = 0;
#endif
time_out--;
}
*targetP = STATUS_CLEAR;
*targetP = RESET_CMD;
}
// Erase one Sector
int OneSectorErase(ulong targetAddr)
{
volatile ulong status;
volatile ushort *targetP;
targetP = (ushort *)targetAddr;
*targetP = RESET_CMD;
ClearBlockLock(targetAddr);
*targetP = ERASE_SEC_CMD;
*targetP = ERASE_CONFIRM;
while(1)
{
#ifdef AUTOKICK
// AutoKick for Qualcomm MSM
*AutoKick_reg = 1;
*AutoKick_reg = 0;
#endif
*targetP = READ_STATUS;
status=(*targetP & STATUS_WSMS);
if(status)
break;
}
*targetP = READ_STATUS;
status=(*targetP & STATUS_ERASE);
*targetP = STATUS_CLEAR;
*targetP = RESET_CMD;
if(status)
return 0;
else
return 1; // Success
}
void ClearAllBlockLock(void)
{
ulong i;
for(i = 0; i < TABLE_CNT-1; i++)
ClearBlockLock(Sector_Table[i]);
}
int BlankCheck(ulong targetAddr,ulong targetSize)
{
ulong i;
volatile ulong *targetP = (volatile ulong *)targetAddr;
for (i=0; i<targetSize; i+=4) {
if (*targetP++ != 0xffffffff)
return 0;
#ifdef AUTOKICK
// AutoKick for Qualcomm MSM
*AutoKick_reg = 1;
*AutoKick_reg = 0;
#endif
}
return 1;
}
int Verification(ulong targetAddr, ulong limit, ulong srcAddr)
{
int i=0;
volatile ulong * targetP;
volatile ulong * sourceP;
targetP = (volatile ulong *)targetAddr;
sourceP = (volatile ulong *)srcAddr;
for(i=0; i<limit; i+=4)
{
if(*targetP++ != *sourceP++)
{
return 0;
}
#ifdef AUTOKICK
if (((ulong)targetP & 0x1fff) == 0) {
*AutoKick_reg = 1;
*AutoKick_reg = 0;
}
#endif
}
return 1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -