📄 cfcard.c
字号:
#include <atmega128.h>
#include <ina90.h>
#include <string.h>
#include <__debug_stdio.h>
#include "compactflash.h"
#include "delays.h"
#include "airdrop.h"
void printByte(unsigned char);
void printInt(unsigned int);
#define make16(varhigh,varlow) (((unsigned int)varhigh & 0xFF)* 0x100) + ((unsigned int)varlow & 0x00FF)
#define NULL 0
void wr_cf_addr(unsigned int addr)
{
addr_hi = 0xff&(addr>>8);//(make8(addr,1));
addr_lo = addr & 0x00FF;
}
void wr_cf_reg(unsigned int reg_data,unsigned int reg_addr)
{
TO_NIC;
wr_cf_addr(reg_addr);
data_out = reg_data;
clr_WE;
Delay10KTCYx(1);
set_WE;
FROM_NIC;
}
void wr_cf_io16(unsigned int data16,unsigned int addr)
{
unsigned char i;
wr_cf_addr(addr);
data_out = data16&0xff;//LOW_BYTE(data16);
TO_NIC;
clr_IOWR;
Delay10TCYx(1);
set_IOWR;
Nop();
data_out = 0xFF;
wr_cf_addr(addr+1);
data_out = (data16>>8)&0xff;//HIGH_BYTE(data16);
clr_IOWR;
Delay10TCYx(1);
set_IOWR;
Nop();
data_out = 0xFF;
FROM_NIC;
}
void wr_cf_io8(unsigned char data8,unsigned int addr)
{
wr_cf_addr(addr);
data_out = data8;//LOW_BYTE(data16);
TO_NIC;
clr_IOWR;
Delay10TCYx(1);
set_IOWR;
Nop();
data_out = 0xFF;
FROM_NIC;
}
unsigned char rd_cf_reg(unsigned int reg_addr)
{
unsigned char data,i;
wr_cf_addr(reg_addr);
clr_OE;
Delay10TCYx(1);
data = data_in;
set_OE;
return(data);
}
unsigned char rd_cf_io8(unsigned int addr)
{
unsigned char data8;
wr_cf_addr(addr);
clr_IORD;
Delay10TCYx(2);
data8=data_in;
set_IORD;
Nop();
return(data8);
}
unsigned int rd_cf_io16(unsigned int addr)
{
unsigned char data_lo,data_hi,i;
unsigned int data16;
wr_cf_addr(addr);
clr_IORD;
Delay10TCYx(2);
data_lo=data_in;
set_IORD;
Nop();
wr_cf_addr(addr+1);
clr_IORD;
Delay10TCYx(2);
data_hi=data_in;
set_IORD;
Nop();
data16 = make16(data_hi,data_lo);
return(data16);
}
/***********************
/ CF management
/***********************/
void resetCF(void)
{
SETUP_IO_PORTS;
set_RSET;
Delay100TCYx(1);
FROM_NIC;
clr_RSET;
}
void getCISTuples(void)
{
unsigned int i;
unsigned int cis_addr=0;
unsigned char code_tuple,link_tuple;
for(i=0;i<500;i++)
{
Delay10KTCYx(1);
if(rd_cf_reg(0x0000)==1) break;
}
do
{
code_tuple = rd_cf_reg(cis_addr);
cis_addr+=2;
link_tuple = rd_cf_reg(cis_addr);
cis_addr+=2;
if(code_tuple != 0xFF)
{
printf("%02x %02x\n",code_tuple,link_tuple);
cis_addr+=2*link_tuple;
}
} while(code_tuple!=0xff);
}
unsigned char tupleInList(unsigned char tuple,unsigned char nTuples,unsigned char tuples[])
{
unsigned char i;
for(i=0;i<nTuples;i++) if(tuple==tuples[i]) return 1;
return 0;
}
void getCISInfo(NetworkParameters *params,unsigned char nTuples,unsigned char tuples[])
{
unsigned char len;
unsigned int cis_addr=0;
unsigned char code_tuple;
unsigned char link_tuple;
unsigned char tuple_link_cnt;
unsigned int i;
static unsigned char data[32];
for(i=0;i<500;i++)
{
Delay10KTCYx(1);
if(rd_cf_reg(0x0000)==1) break;
}
initNetworkParameters(params);
do
{
code_tuple = rd_cf_reg(cis_addr);
cis_addr+=2;
link_tuple = rd_cf_reg(cis_addr);
len=link_tuple;
if(len>32) len=32;
cis_addr+=2;
if(code_tuple != 0xFF)
{
if(tupleInList(code_tuple,nTuples,tuples))
{
for(tuple_link_cnt=0;tuple_link_cnt<link_tuple;++tuple_link_cnt)
{
if(tuple_link_cnt<len) data[tuple_link_cnt]=rd_cf_reg(cis_addr);
cis_addr+=2;
}
addNetworkParameter(params,code_tuple,len,data);
}
else cis_addr+=2*link_tuple;
}
} while(code_tuple!=0xff);
}
static NetworkParameters CISInfo;
unsigned int getCORCONAddress(void)
{
unsigned char tuples[]={CISTPL_CONFIG};
unsigned char data[16];
unsigned char length,label,i;
getCISInfo(&CISInfo,(unsigned char)1,tuples);
resetNetworkParameters(&CISInfo);
while(getNextNetworkParameter(&CISInfo,&label,&length,data)) if(label==CISTPL_CONFIG) return make16(data[3],data[2]);
return 0;
}
int getVoltage(unsigned char *data,unsigned char *pos)
{
unsigned char c;
unsigned int m;
unsigned int h=0;
c=data[(*pos)++];
if(c&0x80) h=data[(*pos)++];
m=(int)((0x7f&c)>>3);
return h+50*m;
}
void getOperatingVoltage(int *min,int *max,int *nominal)
{
unsigned char tuples[]={CISTPL_CFTABLE_ENTRY};
unsigned char data[32];
unsigned char length,label,i,paramSel,pos;
getCISInfo(&CISInfo,(unsigned char)1,tuples);
resetNetworkParameters(&CISInfo);
*min=*max=*nominal=-1;
while(getNextNetworkParameter(&CISInfo,&label,&length,data)) if(label==CISTPL_CFTABLE_ENTRY)
{
paramSel=data[3];
pos=4;
if(paramSel&1) *nominal=getVoltage(data,&pos);
if(paramSel&2) *min=getVoltage(data,&pos);
if(paramSel&4) *max=getVoltage(data,&pos);
}
}
void getCardInfo(unsigned char *string)
{
unsigned char tuples[]={CISTPL_VERS_1};
unsigned char length,label,i;
string[0]='\0';
getCISInfo(&CISInfo,(unsigned char)1,tuples);
resetNetworkParameters(&CISInfo);
while(getNextNetworkParameter(&CISInfo,&label,&length,string))
{
if(label==CISTPL_VERS_1)
{
string[length]='\0';
for(i=0;i<length;i++) if(string[i]==0x00) string[i]='_';
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -