📄 pd6710.c
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style type="text/css">
<!--
body,td,p,th{font-size:14px;}
input{font-size:12px;}
-->
</style>
<title></title>
<script language=javascript src="http://mimg.163.com/jsstyle/js/readletter.js"></script>
</head>
<body leftmargin="5" topmargin="5" marginwidth="0" marginheight="0" border="0">
<pre style="width:100%;word-wrap:break-word">#include "pd6710.h"
/*
A24=1, I/O
A24=0, 存储
AEN=nGCS2,
绝对地址:
0x10000000~0x10FFFFFF: 存储区域
0x11000000~0x11FFFFFF: I/O区域
*/
int PD6710_Init(void);
void PD6710_InitBoard(void);
void PD6710_InitInterrupt(void);
void PD6710_CardEnable(void);
void PD6710_Wr(U8 index, U8 data);
U8 PD6710_Rd(U8 index);
void PD6710_Modify(U8 index,U8 mask,U8 data);
void PD6710_CommonMemAccess(void);
void PD6710_AttrMemAccess(void);
U8 Card_RdAttrMem(U32 memaddr);
U8 Card_RdIO(U32 ioaddr);
void Card_WrIO(U32 ioaddr,U8 data);
void PrintCIS(void);
void __irq IsrPD6710Card(void);
void __irq IsrPD6710Management(void);
volatile int isCardInsert=0;
void _dbg(int i)
{
Uart_Printf("<%d>",i);
}
void Test_PD6710(void)
{
Uart_Printf("[PD6710 test for reading pc_card CIS]\n");
Uart_Printf("Insert PC card!!!\n");
PD6710_InitBoard();
PD6710_Init();
PD6710_InitInterrupt();
//如果nCD1,2为低, 说明PCMCIA插入.
//这种情况下, 不出现中断管理.
if((PD6710_Rd(INTERFACE_STATUS)&0xc)==0xc)
{
Uart_Printf("Card is inserted.\n");
Delay(2000);
//为了保持系统稳定,需要一定时延
//如果没有时延,一些 CF card可能检测不到
PD6710_CardEnable();
PrintCIS();
}
Uart_Printf("Waiting now.\n");
while(1)
{
Uart_Printf(".");
Delay(10000);
}
}
//IRQ堆栈扩展到4096 byte.
void PrintCIS(void)
{
int i,j;
U32 cisEnd=0;
static U8 str[16];
U8 c;
Uart_Printf("[Card Information Structure]\n");
PD6710_AttrMemAccess();
//查找CIS尾部
while(1)
{
c=Card_RdAttrMem((cisEnd)*2);
Uart_Printf("c=%x,cisEnd=%d",c,cisEnd);
if(c==0xff) //0xff= 终止
break;
cisEnd++;
cisEnd+=Card_RdAttrMem((cisEnd)*2)+1;
}
Uart_Printf("cisEnd=0~%x\n",cisEnd);
for(i=0;i<=cisEnd*2;i+=2)
{
c=Card_RdAttrMem(i);
str[(i%0x20)/2]=c;
Uart_Printf("%2x,",c);
if((i%0x20)>=0x1e)
{
Uart_Printf("//");
for(j=0;j<0x10;j++)
if(str[j]>=' ' && str[j]<=127)Uart_Printf("%c",str[j]);
else Uart_Printf(".");
Uart_Printf("\n");
}
}
Uart_Printf("\n");
}
#define B6710_Tacs (0x0) // 0clk
#define B6710_Tcos (0x3) // 4clk
#define B6710_Tacc (0x7) // 14clk
#define B6710_Tcoh (0x1) // 1clk
#define B6710_Tah (0x0) // 0clk
#define B6710_Tacp (0x3) // 6clk
#define B6710_PMC (0x0) // 正常(1data)
void PD6710_InitBoard(void)
{
//硬件板上初始化PD6710
rGPFCON=rGPFCON&~(3<<6)|(2<<6);
rGPGCON=rGPGCON&~(3<<0)|(2<<0);
rBWSCON=rBWSCON&~(0xf<<8)|(0xd<<8);
//nGCS2=nUB/nLB(nSBHE),nWAIT,16bit
rBANKCON2=((B6710_Tacs<<13)+(B6710_Tcos<<11)+(B6710_Tacc<<8)+(B6710_Tcoh<<6)\
+(B6710_Tah<<4)+(B6710_Tacp<<2)+(B6710_PMC));
}
void PD6710_InitInterrupt(void)
{
rEXTINT0=rEXTINT0&~(7<<12)|(2<<12);
//EINT3(GPF3)下降沿
rEXTINT1=rEXTINT1&~(7<<0)|(4<<0);
//EINT8(GPG0)上升沿
pISR_EINT3=(U32)IsrPD6710Management; //nINT_P_CON
pISR_EINT8_23=(U32)IsrPD6710Card; //nINT_P_DEV
rSRCPND = BIT_EINT3|BIT_EINT8_23; //清除 pending状态
rINTPND = BIT_EINT3|BIT_EINT8_23;
rINTMSK=~(BIT_EINT3|BIT_EINT8_23);
rEINTMASK=rEINTMASK&~(1<<8)|(0<<8); //EINTMASK[8]=中断使能
}
int PD6710_Init(void)
{
//初始化PD-6710
PD6710_Wr(POWER_CTRL,(0<<7)|(1<<5)|(0<<4)|(0<<0));
//电源Vpp1=0V
PD6710_Wr(INT_GENERAL_CTRL,(1<<7)|(0<<5)|(1<<4)|(3<<0));
//manage_int=-INTR pin, nINT_P_DEV=IRQ3
PD6710_Wr(MANAGEMENT_INT_CONFIG,(1<<0)|(1<<3)|(3<<4));
PD6710_Wr(IO_WINDOW_CTRL,0|(0<<3));
//IO0=8bit,timing_set_0
// I/O窗口不能包括 3e0h and 3e1h
// IO内容=0x3f8~0x3ff(COM1) ->0x3f8~0x3ff
PD6710_Wr(SYS_IO_MAP0_START_L,0xf8);
PD6710_Wr(SYS_IO_MAP0_START_H,0x3);
PD6710_Wr(SYS_IO_MAP0_END_L,0xff);
PD6710_Wr(SYS_IO_MAP0_END_H,0x3);
PD6710_Wr(CARD_IO_MAP0_OFFSET_L,0x0);
PD6710_Wr(CARD_IO_MAP0_OFFSET_H,0x0);
//内存窗口, 最小64KB
PD6710_Wr(SYS_MEM_MAP0_START_L,0x0); //MEM0=8bit数据宽度
PD6710_Wr(SYS_MEM_MAP0_START_H,0x0);
PD6710_Wr(SYS_MEM_MAP0_END_L,0x0f); //0x0 ~ 0xffff
PD6710_Wr(SYS_MEM_MAP0_END_H,0x0|(0<<6)); //timing_set_0
PD6710_Wr(CARD_MEM_MAP0_OFFSET_L,0x0);
PD6710_Wr(CARD_MEM_MAP0_OFFSET_H,0x0|(1<<6)); //nREG=active
//MEM AREA=0x0~0xFFFF ->0x0~0xFFFFFF
PD6710_Wr(MAPPING_ENABLE,1|(1<<6));
//memory map 0,使能I/O map 0使能
PD6710_Wr(MISC_CTRL1,(0<<7)|(1<<4)|(1<<3)|(1<<2)|(1<<1));
// nVCC_3_使能(暂时)
PD6710_Wr(MISC_CTRL2,1|(1<<1)|(1<<4));
//25Mhz,IRQ12=drive_LED
PD6710_Wr(FIFO_CTRL,0x80); // FIFO
//配置时钟寄存器前,FIFO应清零
//默认访问时间为300ns
PD6710_Wr(SETUP_TIMING0,0x2); PD6710_Wr(CMD_TIMING0,0x8); //25Mhz 时钟
PD6710_Wr(RECOVERY_TIMING0,0x2);
Delay(1000);
Uart_Printf("INT_GENERAL_CTRL=%x\n",PD6710_Rd(INT_GENERAL_CTRL));
Uart_Printf("MANAGEMENT_INT_CONFIG=%x\n",PD6710_Rd(MANAGEMENT_INT_CONFIG));
Uart_Printf("SYS_IO_MAP0_END_L=%x\n",PD6710_Rd(SYS_IO_MAP0_END_L));
Uart_Printf("POWER_CTRL=%x\n",PD6710_Rd(POWER_CTRL));
Uart_Printf("MISC_CTRL1=%x\n",PD6710_Rd(MISC_CTRL1));
Uart_Printf("SYS_IO_MAP0_START_L=%x\n",PD6710_Rd(SYS_IO_MAP0_START_L));
Uart_Printf("IO_WINDOW_CTRL=%x\n",PD6710_Rd(IO_WINDOW_CTRL));
Uart_Printf("CARD_IO_MAP0_OFFSET_H=%x\n",PD6710_Rd(CARD_IO_MAP0_OFFSET_H));
Uart_Printf("CARD_IO_MAP0_OFFSET_L=%x\n",PD6710_Rd(CARD_IO_MAP0_OFFSET_L));
Uart_Printf("SYS_IO_MAP0_END_H=%x\n",PD6710_Rd(SYS_IO_MAP0_END_H));
Uart_Printf("SYS_IO_MAP0_START_H=%x\n",PD6710_Rd(SYS_IO_MAP0_START_H));
Uart_Printf("SYS_MEM_MAP0_START_L=%x\n",PD6710_Rd(SYS_MEM_MAP0_START_L));
Uart_Printf("SYS_MEM_MAP0_END_L=%x\n",PD6710_Rd(SYS_MEM_MAP0_END_L));
Uart_Printf("SYS_MEM_MAP0_END_H=%x\n",PD6710_Rd(SYS_MEM_MAP0_END_H));
Uart_Printf("SYS_MEM_MAP0_START_H=%x\n",PD6710_Rd(SYS_MEM_MAP0_START_H));
Uart_Printf("CARD_MEM_MAP0_OFFSET_L=%x\n",PD6710_Rd(CARD_MEM_MAP0_OFFSET_L));
Uart_Printf("CARD_MEM_MAP0_OFFSET_H=%x\n",PD6710_Rd(CARD_MEM_MAP0_OFFSET_H));
Uart_Printf("MAPPING_ENABLE=%x\n",PD6710_Rd(MAPPING_ENABLE));
Uart_Printf("MISC_CTRL2=%x\n",PD6710_Rd(MISC_CTRL2));
Uart_Printf("FIFO_CTRL=%x\n",PD6710_Rd(FIFO_CTRL));
Uart_Printf("SETUP_TIMING0=%x\n",PD6710_Rd(SETUP_TIMING0));
Uart_Printf("CMD_TIMING0=%x\n",PD6710_Rd(CMD_TIMING0));
Uart_Printf("RECOVERY_TIMING0=%x\n",PD6710_Rd(RECOVERY_TIMING0));
PD6710_Wr(CHIP_INFO,0x0);
if((PD6710_Rd(CHIP_INFO)&0xc0)!=0xc0 || (PD6710_Rd(CHIP_INFO)&0xc0)!=0x00 )
{
Uart_Printf("PD6710 hardware identification error!!!\n");
return 0;
}
return 1;
}
void PD6710_CardEnable(void) //中断之后
{
if(PD6710_Rd(MISC_CTRL1)&0x1) //MISC_CTRL1[0] 0=3.3V 1=5.0V
{
PD6710_Modify(MISC_CTRL1,0x2,0x0); //nVCC_5使能 Uart_Printf("5.0V card is detected.\n");
}
else
{
PD6710_Modify(MISC_CTRL1,0x2,0x2); //nVCC_3使能
Uart_Printf("3.3V card is detected.\n");
}
PD6710_Modify(POWER_CTRL,(1<<4)|3,(1<<4)|1);
//VCC_POWER_on,VPP=Vcc(3.3V 或 5.0V)
Delay(100);
Delay(10); //RESET 应Hi-Z状态最少10ms
PD6710_Modify(POWER_CTRL,(1<<7),(1<<7));
PD6710_Modify(INT_GENERAL_CTRL,(1<<6),0); //RESET=active(高电平)
PD6710_Modify(INT_GENERAL_CTRL,(1<<6),(1<<6)); //RESET=inactive(低电平)
Delay(200); //等待200ms
PD6710_Modify(INT_GENERAL_CTRL,(1<<5),(1<<5));
//mem_card -> mem_io_card
Delay(5000); //等待500ms
Uart_Printf("Card Enable!\n");
Uart_Printf("INT_GENERAL_CTRL=%x\n",PD6710_Rd(INT_GENERAL_CTRL));
Uart_Printf("POWER_CTRL=%x\n",PD6710_Rd(INT_GENERAL_CTRL));
//如果没有时延,一些 CF card可能检测不到
}
void PD6710_Wr(U8 index, U8 data)
{
//nREG为低
rPD6710_INDEX=index;
rPD6710_DATA=data;
}
U8 PD6710_Rd(U8 index)
{
//nREG为低
rPD6710_INDEX=index;
return rPD6710_DATA;
}
void PD6710_Modify(U8 index,U8 mask,U8 data)
{
//nREG为低
rPD6710_INDEX=index;
rPD6710_DATA=(rPD6710_DATA)&~mask|data;
}
U8 Card_RdAttrMem(U32 memaddr)
{
//nREG为低
return *((volatile U8 *)(PD6710_MEM_BASE_ADDRESS+memaddr));
}
U8 Card_RdIO(U32 ioaddr)
{
return *((volatile U8 *)(PD6710_IO_BASE_ADDRESS+ioaddr));
}
void Card_WrIO(U32 ioaddr,U8 data)
{
*((volatile U8 *)(PD6710_IO_BASE_ADDRESS+ioaddr))=data;
}
/*
访问I/O: nREG为低 (自动)
访问contribute内存: nREG为低
访问common内存: nREG为高
*/
void PD6710_CommonMemAccess(void)
{
PD6710_Modify(CARD_MEM_MAP0_OFFSET_H,(1<<6),(0<<6)); //nREG=inactive, H
}
void PD6710_AttrMemAccess(void)
{
PD6710_Modify(CARD_MEM_MAP0_OFFSET_H,(1<<6),(1<<6)); //nREG=active, L
Uart_Printf("CARD_MEM_MAP0_OFFSET_H=%x\n",PD6710_Rd(CARD_MEM_MAP0_OFFSET_H));
}
void __irq IsrPD6710Management(void) //nINT_P_CON
{
U8 cardStat;
//ClearPending(BIT_EINT7);
Uart_Printf("\nPD6710 interrupt is occurred.\n");
Delay(2000);
//为了保持系统稳定,需要一定时延
//如果没有时延,一些 CF card可能检测不到
cardStat=PD6710_Rd(CARD_STAT_CHANGE);
//PCMCIA Card状态改变否?
if(cardStat&0x8)
{
//校验CD1,2是否低电平
if((PD6710_Rd(INTERFACE_STATUS)&0xc)==0xc)
{
Uart_Printf("Card is inserted.\n");
PD6710_CardEnable();
PrintCIS();
}
else
{
Uart_Printf("Card is ejected.\n");
PD6710_Init(); //可以拔出
}
}
ClearPending(BIT_EINT3);
// 中断,int pending在ISR结束时清零
}
void __irq IsrPD6710Card(void) //nINT_P_DEV
{
rEINTPEND=(1<<8); //EINTPEND[8]清空.
ClearPending(BIT_EINT8_23);
Uart_Printf("PC card interrupt is occurred.\n");
}
</pre>
</body>
</html>
<!-- CoreMail Version 3.1.0 Copyright (c) 2002-2006 www.mailtech.cn -->
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -