⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sharp16.c

📁 Sharp 1850 的驱动程序
💻 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 + -