mirror of
https://github.com/tpunix/HMCLOCK.git
synced 2025-12-06 08:12:48 +08:00
测试SPI Flash代码
This commit is contained in:
@@ -120,7 +120,7 @@
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
<Key>DLGUARM</Key>
|
||||
<Name>d</Name>
|
||||
<Name></Name>
|
||||
</SetRegEntry>
|
||||
<SetRegEntry>
|
||||
<Number>0</Number>
|
||||
@@ -149,6 +149,14 @@
|
||||
</SetRegEntry>
|
||||
</TargetDriverDllRegistry>
|
||||
<Breakpoint/>
|
||||
<MemoryWindow1>
|
||||
<Mm>
|
||||
<WinNumber>1</WinNumber>
|
||||
<SubType>0</SubType>
|
||||
<ItemText>0x07f8ff00</ItemText>
|
||||
<AccSizeX>0</AccSizeX>
|
||||
</Mm>
|
||||
</MemoryWindow1>
|
||||
<Tracepoint>
|
||||
<THDelay>0</THDelay>
|
||||
</Tracepoint>
|
||||
|
||||
BIN
pinout_0.xlsx
Normal file
BIN
pinout_0.xlsx
Normal file
Binary file not shown.
BIN
pinout_1.xlsx
Normal file
BIN
pinout_1.xlsx
Normal file
Binary file not shown.
@@ -17,11 +17,12 @@ int gpio_get(int index);
|
||||
|
||||
|
||||
// spi flash
|
||||
int fspi_init(u32 gpio_word);
|
||||
int epcs_readid(void);
|
||||
int epcs_sector_erase(int addr);
|
||||
int epcs_page_write(int addr, u8 *buf, int size);
|
||||
int epcs_read(int addr, int len, u8 *buf);
|
||||
int fspi_config(u32 gpio_word);
|
||||
int fspi_init(void);
|
||||
int sf_readid(void);
|
||||
int sf_sector_erase(int addr);
|
||||
int sf_page_write(int addr, u8 *buf, int size);
|
||||
int sf_read(int addr, int len, u8 *buf);
|
||||
|
||||
// epd_hw
|
||||
void epd_hw_init(u32 config0, u32 config1);
|
||||
|
||||
@@ -3,230 +3,222 @@
|
||||
|
||||
|
||||
|
||||
#define SPI_CTRL0 *(volatile unsigned short*)(0x50001200)
|
||||
#define SPI_RXTX0 *(volatile unsigned short*)(0x50001202)
|
||||
#define SPI_RXTX1 *(volatile unsigned short*)(0x50001204)
|
||||
#define SPI_IACK *(volatile unsigned short*)(0x50001206)
|
||||
#define SPI_CTRL1 *(volatile unsigned short*)(0x50001208)
|
||||
|
||||
|
||||
static int spio_clk;
|
||||
static int spio_cs;
|
||||
static int spio_di;
|
||||
static int spio_do;
|
||||
|
||||
#define BIT_8 0
|
||||
#define BIT_16 1
|
||||
#define BIT_32 2
|
||||
|
||||
static int spi_bitmode;
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
|
||||
#define FSPI_DELAY 10
|
||||
#define FSPI_CS(n) gpio_set(spio_cs, (n));
|
||||
|
||||
void fspi_delay(void)
|
||||
void fspi_set_bitmode(int mode)
|
||||
{
|
||||
int i;
|
||||
spi_bitmode = mode;
|
||||
|
||||
for(i=0; i<FSPI_DELAY; i++){
|
||||
__asm("nop");
|
||||
}
|
||||
SPI_CTRL0 &= 0xfe7e;
|
||||
SPI_CTRL0 |= (mode&3)<<7;
|
||||
SPI_CTRL0 |= 0x0001;
|
||||
}
|
||||
|
||||
|
||||
#define FSPI_CS(n) gpio_set(spio_cs, (n));
|
||||
#define FSPI_CK(n) gpio_set(spio_clk, (n));
|
||||
#define FSPI_SI(n) gpio_set(spio_di, (n));
|
||||
#define FSPI_SO() gpio_get(spio_do);
|
||||
|
||||
|
||||
int fspi_trans(int byte)
|
||||
int fspi_trans(int data)
|
||||
{
|
||||
int i, data;
|
||||
|
||||
data = 0;
|
||||
for(i=0; i<8; i++){
|
||||
FSPI_SI(byte&0x80);
|
||||
FSPI_CK(0);
|
||||
fspi_delay();
|
||||
|
||||
data <<= 1;
|
||||
data |= FSPI_SO();
|
||||
|
||||
FSPI_CK(1);
|
||||
fspi_delay();
|
||||
byte <<= 1;
|
||||
if(spi_bitmode==BIT_32){
|
||||
SPI_RXTX1 = data>>16;
|
||||
}
|
||||
SPI_RXTX0 = data;
|
||||
|
||||
while((SPI_CTRL0&0x2000)==0);
|
||||
SPI_IACK = 0;
|
||||
|
||||
data = SPI_RXTX0;
|
||||
if(spi_bitmode==BIT_8){
|
||||
data &= 0xff;
|
||||
}else if(spi_bitmode==BIT_32){
|
||||
data |= (SPI_RXTX1)<<16;
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
int fspi_init(u32 gpio_word)
|
||||
int fspi_config(u32 gpio_word)
|
||||
{
|
||||
spio_clk = (gpio_word>>24)&0xff;
|
||||
spio_cs = (gpio_word>>16)&0xff;
|
||||
spio_di = (gpio_word>> 8)&0xff;
|
||||
spio_do = (gpio_word>> 0)&0xff;
|
||||
spio_do = (gpio_word>> 8)&0xff;
|
||||
spio_di = (gpio_word>> 0)&0xff;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int fspi_init(void)
|
||||
{
|
||||
SetBits16(CLK_PER_REG, SPI_ENABLE, 1);
|
||||
|
||||
gpio_config(spio_clk, 0x0300, 0);
|
||||
gpio_config(spio_cs, 0x0300, 1);
|
||||
gpio_config(spio_di, 0x0300, 1);
|
||||
gpio_config(spio_do, 0x0100, 1);
|
||||
|
||||
gpio_config(spio_clk, 0x0307, 0);
|
||||
gpio_config(spio_do, 0x0306, 1);
|
||||
gpio_config(spio_di, 0x0105, 1);
|
||||
|
||||
SPI_CTRL0 = 0x0010;
|
||||
fspi_set_bitmode(BIT_32);
|
||||
|
||||
FSPI_CS(0);
|
||||
fspi_delay();
|
||||
fspi_trans(0xab);
|
||||
fspi_trans(0xab000000);
|
||||
FSPI_CS(1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int fspi_exit(void)
|
||||
{
|
||||
SPI_CTRL0 = 0;
|
||||
SetBits16(CLK_PER_REG, SPI_ENABLE, 0);
|
||||
|
||||
gpio_config(spio_cs, 0x0300, 1);
|
||||
gpio_config(spio_clk, 0x0300, 0);
|
||||
gpio_config(spio_do, 0x0300, 0);
|
||||
gpio_config(spio_di, 0x0100, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************/
|
||||
/* SPI flash */
|
||||
/******************************************************************************/
|
||||
|
||||
int epcs_readid(void)
|
||||
int sf_readid(void)
|
||||
{
|
||||
int mid, pid;
|
||||
|
||||
fspi_set_bitmode(BIT_32);
|
||||
FSPI_CS(0);
|
||||
fspi_delay();
|
||||
|
||||
fspi_trans(0x90);
|
||||
fspi_trans(0);
|
||||
fspi_trans(0);
|
||||
fspi_trans(0);
|
||||
|
||||
mid = fspi_trans(0);
|
||||
pid = fspi_trans(0);
|
||||
|
||||
fspi_trans(0x90000000);
|
||||
int id = fspi_trans(0);
|
||||
FSPI_CS(1);
|
||||
fspi_delay();
|
||||
|
||||
return (mid<<8)|pid;
|
||||
return id;
|
||||
}
|
||||
|
||||
int epcs_status(void)
|
||||
int sf_status(void)
|
||||
{
|
||||
int status;
|
||||
|
||||
fspi_set_bitmode(BIT_16);
|
||||
FSPI_CS(0);
|
||||
fspi_delay();
|
||||
fspi_trans(0x05);
|
||||
status = fspi_trans(0);
|
||||
status = fspi_trans(0x0500);
|
||||
FSPI_CS(1);
|
||||
fspi_delay();
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
int epcs_wstat(int stat)
|
||||
int sf_wstat(int stat)
|
||||
{
|
||||
|
||||
// status write enable
|
||||
fspi_set_bitmode(BIT_8);
|
||||
FSPI_CS(0);
|
||||
fspi_delay();
|
||||
fspi_trans(0x50);
|
||||
FSPI_CS(1);
|
||||
fspi_delay();
|
||||
|
||||
fspi_set_bitmode(BIT_16);
|
||||
FSPI_CS(0);
|
||||
fspi_delay();
|
||||
fspi_trans(0x01);
|
||||
fspi_trans(stat);
|
||||
fspi_trans(0x0100|stat);
|
||||
FSPI_CS(1);
|
||||
fspi_delay();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int epcs_wen(int en)
|
||||
int sf_wen(int en)
|
||||
{
|
||||
fspi_set_bitmode(BIT_8);
|
||||
FSPI_CS(0);
|
||||
fspi_delay();
|
||||
if(en)
|
||||
fspi_trans(0x06);
|
||||
else
|
||||
fspi_trans(0x04);
|
||||
FSPI_CS(1);
|
||||
fspi_delay();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int epcs_wait()
|
||||
int sf_wait()
|
||||
{
|
||||
int status;
|
||||
|
||||
while(1){
|
||||
status = epcs_status();
|
||||
status = sf_status();
|
||||
if((status&1)==0)
|
||||
break;
|
||||
fspi_delay();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int epcs_sector_erase(int addr)
|
||||
int sf_sector_erase(int addr)
|
||||
{
|
||||
epcs_wen(1);
|
||||
sf_wen(1);
|
||||
|
||||
fspi_set_bitmode(BIT_32);
|
||||
FSPI_CS(0);
|
||||
fspi_delay();
|
||||
|
||||
fspi_trans(0x20);
|
||||
fspi_trans((addr>>16)&0xff);
|
||||
fspi_trans((addr>> 8)&0xff);
|
||||
fspi_trans((addr>> 0)&0xff);
|
||||
|
||||
fspi_trans(0x20000000|addr);
|
||||
FSPI_CS(1);
|
||||
fspi_delay();
|
||||
|
||||
epcs_wait();
|
||||
sf_wait();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int epcs_page_write(int addr, u8 *buf, int size)
|
||||
int sf_page_write(int addr, u8 *buf, int size)
|
||||
{
|
||||
int i;
|
||||
|
||||
epcs_wen(1);
|
||||
sf_wen(1);
|
||||
|
||||
fspi_set_bitmode(BIT_32);
|
||||
FSPI_CS(0);
|
||||
fspi_delay();
|
||||
|
||||
fspi_trans(0x02);
|
||||
fspi_trans((addr>>16)&0xff);
|
||||
fspi_trans((addr>> 8)&0xff);
|
||||
fspi_trans((addr>> 0)&0xff);
|
||||
|
||||
for(i=0; i<size; i++){
|
||||
fspi_trans(buf[i]);
|
||||
fspi_trans(0x02000000|addr);
|
||||
for(i=0; i<size; i+=4){
|
||||
fspi_trans(*(u32*)(buf+i));
|
||||
}
|
||||
|
||||
FSPI_CS(1);
|
||||
fspi_delay();
|
||||
|
||||
epcs_wait();
|
||||
sf_wait();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int epcs_read(int addr, int len, u8 *buf)
|
||||
int sf_read(int addr, int len, u8 *buf)
|
||||
{
|
||||
int i;
|
||||
|
||||
fspi_set_bitmode(BIT_32);
|
||||
FSPI_CS(0);
|
||||
fspi_delay();
|
||||
|
||||
fspi_trans(0x0b);
|
||||
fspi_trans((addr>>16)&0xff);
|
||||
fspi_trans((addr>> 8)&0xff);
|
||||
fspi_trans((addr>> 0)&0xff);
|
||||
fspi_trans(0x03000000|addr);
|
||||
|
||||
fspi_trans(0);
|
||||
|
||||
for(i=0; i<len; i++){
|
||||
buf[i] = fspi_trans(0);
|
||||
for(i=0; i<len; i+=4){
|
||||
*(u32*)(buf+i) = fspi_trans(0);
|
||||
}
|
||||
|
||||
FSPI_CS(1);
|
||||
fspi_delay();
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
@@ -143,8 +143,13 @@ void user_app_init(void)
|
||||
app_clock_timer_used = EASY_TIMER_INVALID_TIMER;
|
||||
|
||||
adv_count = 0;
|
||||
fspi_config(0x00030605);
|
||||
epd_hw_init(0x23200700, 0x05210006); // for 2.13 board BW
|
||||
|
||||
|
||||
fspi_init();
|
||||
int id = sf_readid();
|
||||
printk("Flash ID: %08x\n", id);
|
||||
|
||||
default_app_on_init();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user