📄 main.c
字号:
/*********************************************************************************************
* File: main.c
* Author: embest
* Desc: c main entry file for the IO port test
* History:
*********************************************************************************************/
/*------------------------------------------------------------------------------------------*/
/* includes files */
/*------------------------------------------------------------------------------------------*/
#include "2410lib.h"
#define BASE_FLASH 0x00000000
#define WriteFlash(addr,dat) (*(volatile unsigned short*)(addr*2)) = (unsigned short)dat
#define ReadFlash(addr) (*(volatile unsigned short*)(addr*2))
#define AM29LV160DB_FLASH_MASK 0x001FFFFF
#define myaddr 0x001f0000
#define RamBase 0x30002000
static void Flash_Delay(void)
{
volatile unsigned int i;
// delay about 70 us
//for(i=0; i<231; i++);
for(i=0; i<21; i++);
}
static void MyDelay(void)
{
volatile unsigned int i;
// delay about 70 us
for(i=0; i<1000; i++);
for(i=0; i<1000; i++);
}
void WriteInfo(unsigned int addr,unsigned short data)
{
unsigned int write_addr;
volatile unsigned short* p;// = ((volatile unsigned short*)(addr + write_addr));
short a;
write_addr = (addr & AM29LV160DB_FLASH_MASK);
addr &= ~AM29LV160DB_FLASH_MASK;
p = ((volatile unsigned short*)(addr + write_addr));
(*((volatile unsigned short*)(addr+0x555*2))) = 0xAA;
(*((volatile unsigned short*)(addr+0x2AA*2))) = 0x55;
(*((volatile unsigned short*)(addr+0x555*2))) = 0xA0;
//(*((volatile unsigned short*)(addr + write_addr))) = data;
*p = data;
MyDelay();
}
void UnlockByPass()
{
(*((volatile unsigned short*)(0x555 << 1))) = 0xAA;
(*((volatile unsigned short*)(0x2AA << 1))) = 0x55;
(*((volatile unsigned short*)(0x555 << 1))) = 0x20;
}
int FastWrite(unsigned int addr,unsigned short data)
{
int i;
unsigned int write_addr;
volatile unsigned short* p;// = ((volatile unsigned short*)(addr + write_addr));
volatile unsigned short a;
write_addr = (addr & AM29LV160DB_FLASH_MASK);
addr &= ~AM29LV160DB_FLASH_MASK;
(*((volatile unsigned short*)(addr+0xAAA))) = 0xA0;
p = (volatile unsigned short*)(addr+write_addr);
// (*((volatile unsigned short*)(addr+write_addr))) = data;
*p = data;
// uart_printf("address is: %x\n",p);
// uart_printf("data is: %d\n",*p);
//MyDelay();
for(i=0; i<1000; i++)
Flash_Delay();
/*
do
{
*p = data;
a = *p;
if(((a^data) & 0x0080) != 0)
{
uart_printf("result is:%d\n",1);
return 1;
}
else
{}
}while(((a^data)&0x0020) == 0);
if(((a^data) & 0x0080) != 0)
{
// uart_printf("result is:%d\n",1);
return 1;
}
else
return 1;
*/
return 1;
}
void UnlockBypassReset()
{
(*((volatile unsigned short*)(0x555 << 1))) = 0x90;
(*((volatile unsigned short*)(0xAAA << 1))) = 0x00;
}
unsigned short ReadInfo(unsigned int addr)
{
//return ReadFlash(addr);
return (*((volatile unsigned short*)(BASE_FLASH+addr)));
}
unsigned int _RD(addr)
{
return (*((volatile unsigned int*)(BASE_FLASH+addr)));
}
int _WAIT(unsigned int addr)
{
volatile int flashStatus,old;
old=_RD(addr);
while(1)
{
flashStatus=_RD(addr);
if( (old&0x40) == (flashStatus&0x40))
break;
if( flashStatus&0x20 ) //测试超时标志位DQ5
{
old=_RD(addr);
flashStatus=_RD(addr);
if( (old&0x40) == (flashStatus&0x40) ) return 1; //无翻转
else return 0; //翻转
}
old=flashStatus;
}
return 1;
}
void RamTest()
{
int base = RamBase;
int* p = base;
int* q = base;
int i = 0;
uart_printf("Begin check!\n");
for(i = 0; i < 256; i++)
{
*p = p;
p++;
}
p = q;
for(i = 0; i < 256; i++)
{
if(*p != q)
{
uart_printf("There is error in %x\n",q);
return;
}
p++;
q++;
}
uart_printf("Checking end! No Error!\n");
}
void SectorErase(unsigned int addr)
{
unsigned int sector_addr;
int i;
sector_addr = (addr & AM29LV160DB_FLASH_MASK);
sector_addr >>= 1;
sector_addr <<= 1;
addr &= ~AM29LV160DB_FLASH_MASK;
// OS_ENTER_CRITICAL();
(*((volatile unsigned short*)(addr+0x555*2))) = 0xAA;
(*((volatile unsigned short*)(addr+0x2AA*2))) = 0x55;
(*((volatile unsigned short*)(addr+0x555*2))) = 0x80;
(*((volatile unsigned short*)(addr+0x555*2))) = 0xAA;
(*((volatile unsigned short*)(addr+0x2AA*2))) = 0x55;
(*((volatile unsigned short*)(addr+sector_addr))) = 0x30;
// delay about 700 ms
for(i=0; i<10000; i++)
Flash_Delay();
// OS_EXIT_CRITICAL();
}
void Main(int argc,short **argv)
{
unsigned int i = 0;
unsigned int temp = (unsigned int)myaddr;
int size = 256;
unsigned short data[size];
unsigned short test[size];
unsigned int addr;
int d;
sys_init();
uart_printf("Begin to write\n");
for(i = 0; i < size; i++)
{
data[i] = (short)i;
//uart_printf("%d\n",data[i]);
}
temp = (unsigned int)myaddr;
SectorErase((unsigned int)myaddr);
uart_printf("End Erase\n");
for(i = 0; i < size; i++)
{
test[i] = ReadInfo(temp);
//uart_printf("%d ",test[i]);
//if(i % 16 == 0)
//uart_printf("\n");
temp += 2;
}
UnlockByPass();
temp = (unsigned int)myaddr;
for(i = 0; i < size; i++)
{
// WriteInfo(temp,(short)data[i]);
if((d = FastWrite(temp+i*2,(short)data[i])) == 0)
{
uart_printf("%d\n",data[i]);
UnlockBypassReset();
uart_printf("Error!\n");
return 0;
}
}
UnlockBypassReset();
temp = (unsigned int)myaddr;
addr = temp;
addr &= ~AM29LV160DB_FLASH_MASK;
uart_printf("Begin to read\n");
for(i = 0; i < size; i++)
{
test[i] = ReadInfo(temp+i*2);
uart_printf("%d ",test[i]);
if(i % 16 == 0)
uart_printf("\n");
// uart_printf("%x\n",data[i]);
}
uart_printf("End Fast write!\n");
temp = (unsigned int)myaddr;
SectorErase((unsigned int)myaddr);
uart_printf("End Erase\n");
for(i = 0; i < size; i++)
{
test[i] = ReadInfo(temp);
//uart_printf("%d ",test[i]);
//if(i % 16 == 0)
//uart_printf("\n");
temp += 2;
}
temp = (unsigned int)myaddr;
for(i = 0; i < size; i++)
{
// WriteInfo(temp,(short)data[i]);
WriteInfo(temp+i*2,(short)data[i]);
}
uart_printf("End slow write!\n");
temp = (unsigned int)myaddr;
addr = temp;
addr &= ~AM29LV160DB_FLASH_MASK;
uart_printf("Begin to read\n");
for(i = 0; i < size; i++)
{
test[i] = ReadInfo(temp+i*2);
uart_printf("%d ",test[i]);
if(i % 16 == 0)
uart_printf("\n");
// uart_printf("%x\n",data[i]);
}
uart_printf("\n");
RamTest();
}
/*********************************************************************************************
* name: main
* func: c code entry
* para: none
* ret: none
* modify:
* comment:
*********************************************************************************************/
/*void Main(int argc,short **argv)
{
sys_init(); /* Initial s3c2410's Clock, MMU, Interrupt,Port and UART */
// user interface
/* while(1)
{
led_test();
}
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -