📄 compactflash.c
字号:
#if 0
//*----------------------------------------------------------------------------
//* ATMEL Microcontroller Software Support - ROUSSET -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name : CompactFlash.c
//* Object : main application written in C
//* Creation : GGi 12/11/2002
//*
//*----------------------------------------------------------------------------
#endif
#include "CompactFlash.h"
volatile char *CompactFlash_BASE = (volatile char *)(AT91_PCMCIA_CM_BASE(0)+0x400);
volatile char *CompactFlash_CIS_BASE = (volatile char *)(AT91_PCMCIA_AT_BASE(0));
volatile char *CompactFlash_Attribute = (volatile char *)(AT91_PCMCIA_AT_BASE(0)+0x200);
volatile short *CompactFlash_BASE_16 = (volatile short *)(AT91_PCMCIA_CM_BASE(0));
volatile char *CompactFlash_COMMAND_BASE = (volatile char *)(AT91_PCMCIA_CM_BASE(0));
#define BUF_SIZE 512
/*delay fct*/
void delay(int nb){
while(nb--);
}
char AT91F_GetStatus (void){
return ( *(CompactFlash_COMMAND_BASE + CF_ATA_STATUS_OFFSET));
}
int AT91F_CF_RDY (void){
char status = 1;
int cpt = 0;
while (status && cpt++ < 100000){
status = (AT91F_GetStatus()) & CF_ATA_ST_BUSY;
}
if (cpt == 100000) return -1;
return 1;
}
int AT91F_CF_ERR (void){
char status = 1;
int cpt = 0;
while (status && cpt++ < 100000){
status = (AT91F_GetStatus()) & CF_ATA_ST_ERR;
}
if (cpt == 100000) return -1;
return 1;
}
int AT91F_CF_Card_OK (void)
{
int count =1000;
while ( count>0 && ( ((AT91F_GetStatus()) & CF_ATA_ST_ERR) || !((AT91F_GetStatus()) & CF_ATA_ST_RDY) ) )
{
count--;
}
if(count>0) return (1);
else return 0;
}
int AT91F_CF_DRQ (void){
char status = 0;
int cpt = 0;
while (!status && cpt++ < 100000){
status = (AT91F_GetStatus()) & CF_ATA_ST_DRQ;
}
if (cpt == 100000) return -1;
return 1;
}
int AT91F_CF_Read(unsigned char *buffer,int size){
int cpt = 0;
if (AT91F_CF_DRQ() < 0) return -1;
while ((cpt < size) && (cpt < BUF_SIZE)){
*buffer++ =*(CompactFlash_BASE);
cpt ++;
}
return cpt;
}
int AT91F_CF_Write(unsigned char *buffer,int size){
int cpt = 0;
if (AT91F_CF_DRQ() < 0) return -1;
while ((cpt < size) && (cpt < BUF_SIZE)){
*(CompactFlash_BASE ) = *buffer++;
cpt++;
}
return cpt;
}
int AT91F_CF_Read16(unsigned short *buffer,int size){
int cpt = 0,status = 1;
if (AT91F_CF_DRQ() < 0) return -1;
while (status) {
*buffer++ =*(CompactFlash_BASE_16);
delay(100);
status = (AT91F_GetStatus()) & CF_ATA_ST_DRQ;
cpt ++;
}
return size;
}
int AT91F_CF_Write16(unsigned short *buffer,int size){
int cpt = 0, status = 1;
if (AT91F_CF_DRQ() < 0) return -1;
//while ((cpt < size) && (cpt < BUF_SIZE)){
while (status) {
*(CompactFlash_BASE_16 ) = *buffer++;
delay(1000);
status = (AT91F_GetStatus()) & CF_ATA_ST_DRQ;
cpt++;
}
return size;
}
void AT91F_CF_WriteReg(int offset, char data){
*(CompactFlash_Attribute + offset) = data;
}
int AT91F_CF_WriteCommand(char * buffer, int size, int offset){
int i, status = 1, cpt = 0;
if (AT91F_CF_RDY() < 0) return -1;
for (i=0;i<size;i++){
delay(10000);
*(CompactFlash_COMMAND_BASE + i + offset) = *buffer++;
}
return 0;
}
int AT91F_CF_READ_ID (unsigned char * buf){
char cmd[6] = {1,0,0,0,0,DRIVE_ID};
if (AT91F_CF_WriteCommand(cmd,6,2) < 0) return -1;
if (AT91F_CF_Read(buf,BUF_SIZE) != BUF_SIZE) return -1;
if (AT91F_CF_ERR() < 0) return -1;
return 0;
}
int AT91F_CF_READ16_ID (unsigned short * buf){
/* char cmd[2] = {0,DRIVE_ID};
if (AT91F_CF_WriteCommand(cmd,2,6) < 0) return -1;
*/ char cmd[6] = {1,0,0,0,0,DRIVE_ID};
if (AT91F_CF_WriteCommand(cmd,6,2) < 0) return -1;
delay(1000000);
if (AT91F_CF_Read16(buf,BUF_SIZE/2) != BUF_SIZE/2) return -1;
if (AT91F_CF_ERR() < 0) return -1;
return 0;
}
void AT91F_CF_READ_CIS (unsigned char * buf, int size){
int i;
for(i=0;i<size/2;i++) *buf++ = *(CompactFlash_CIS_BASE + 2*i);
}
/*__inline*/ int AT91F_CF_WRITE_SECTOR (unsigned char * buf, char head, char cyl_high, char cyl_low, char sector){
char cmd[6];
cmd[5] = WRITE_SECTOR;
cmd[4] = (1 << 7) | (1 << 5) | (head & 0xff);
cmd[3] = cyl_high;
cmd[2] = cyl_low;
cmd[1] = sector;
cmd[0] = 1;
if (AT91F_CF_WriteCommand(cmd,6,2) <0) return -1;
if (AT91F_CF_Write(buf,BUF_SIZE) != BUF_SIZE) return -1;
if (AT91F_CF_ERR() < 0) return -1;
return 0;
}
int AT91F_CF_WRITE16_SECTOR (unsigned short * buf, char head, char cyl_high, char cyl_low, char sector){
char cmd[6];
cmd[5] = WRITE_SECTOR;
cmd[4] = (1 << 7) | (1 << 6) | (1 << 5) | (head & 0xff);
cmd[3] = cyl_high;
cmd[2] = cyl_low;
cmd[1] = sector;
cmd[0] = 1;
if (AT91F_CF_WriteCommand(cmd,6,2) < 0) return -1;
if (AT91F_CF_Write16(buf,BUF_SIZE/2) != BUF_SIZE/2) return -1;
if (AT91F_CF_ERR() < 0) return -1;
return 0;
}
int AT91F_CF_FORMAT_SECTOR (unsigned short * buf, char drive, char cyl, char head){
char cmd[4];
cmd[3] = FORMAT_TRACK;
cmd[2] = (1 << 7) | (1 << 5) | (drive & 0xff);
cmd[1] = cyl;
cmd[0] = head;
if (AT91F_CF_WriteCommand(cmd,4,4) < 0) return -1;
if (AT91F_CF_Write16(buf,BUF_SIZE/2) < 0) return -1;
if (AT91F_CF_ERR() < 0) return -1;
return 0;
}
int AT91F_CF_READ_SECTOR (unsigned char * buf, char head, char cyl_high, char cyl_low, char sector){
char cmd[6];
cmd[5] = READ_SECTOR;
cmd[4] = (1 << 7) | (1 << 5) | (head & 0xff);
cmd[3] = cyl_high;
cmd[2] = cyl_low;
cmd[1] = sector;
cmd[0] = 255;
if (AT91F_CF_WriteCommand(cmd,6,2) < 0) return -1;
if (AT91F_CF_Read(buf,BUF_SIZE) != BUF_SIZE) return -1;
if (AT91F_CF_ERR() < 0) return -1;
return 0;
}
/*__inline*/ int AT91F_CF_READ16_SECTOR (unsigned short * buf, char head, char cyl_high, char cyl_low, char sector)
{
char cmd[6];
cmd[5] = READ_SECTOR;
cmd[4] = (1 << 7) | (1 << 6) | (1 << 5) | (head & 0xff);
cmd[3] = cyl_high;
cmd[2] = cyl_low;
cmd[1] = sector;
cmd[0] = 1;
AT91F_CF_WriteCommand(cmd,6,2);
if (AT91F_CF_Read16(buf,BUF_SIZE/2) != BUF_SIZE/2) return -1;
if (AT91F_CF_ERR() < 0) return -1;
return 0;
}
/*__inline*/ int AT91F_CF_WRITE_BUF (unsigned char * buf, char head, char cyl_high, char cyl_low, char sector){
char cmd[6];
cmd[5] = WRITE_BUF;
cmd[4] = (1 << 7) | (1 << 5) | (head & 0xff);
cmd[3] = cyl_high;
cmd[2] = cyl_low;
cmd[1] = sector;
cmd[0] = 1;
if (AT91F_CF_WriteCommand(cmd,6,2) < 0) return -1;
if (AT91F_CF_Write(buf,BUF_SIZE) < 0) return -1;
if (AT91F_CF_ERR() < 0) return -1;
return 0;
}
/*__inline*/ int AT91F_CF_READ_BUF (unsigned char * buf, char head, char cyl_high, char cyl_low, char sector){
char cmd[6];
cmd[5] = READ_BUF;
cmd[4] = (1 << 7) | (1 << 5) | (head & 0xff);
cmd[3] = cyl_high;
cmd[2] = cyl_low;
cmd[1] = sector;
cmd[0] = 1;
if (AT91F_CF_WriteCommand(cmd,6,2) <0) return -1;
if (AT91F_CF_Read(buf,BUF_SIZE) < 0) return -1;
if (AT91F_CF_ERR() < 0) return -1;
return 0;
}
/*__inline*/ int AT91F_CF_READ16_BUF (unsigned short * buf, char head, char cyl_high, char cyl_low, char sector){
char cmd[6];
cmd[5] = READ_BUF;
cmd[4] = (1 << 7) | (1 << 6) | (1 << 5) | (head & 0xff);
cmd[3] = cyl_high;
cmd[2] = cyl_low;
cmd[1] = sector;
cmd[0] = 1;
if (AT91F_CF_WriteCommand(cmd,6,2) <0) return -1;
if (AT91F_CF_Read16(buf,BUF_SIZE/2) < 0) return -1;
if (AT91F_CF_ERR() < 0) return -1;
return 0;
}
#if 0
//*----------------------------------------------------------------------------
//* \fn AT91F_CF_WRITE_BUF
//* \brief fill in the sector buffer
//*----------------------------------------------------------------------------
#endif
/*__inline*/ int AT91F_CF_ERASE_SECTOR (char head, char cyl_high, char cyl_low, char sector){
char cmd[6];
cmd[5] = ERASE_SECTOR;
cmd[4] = (1 << 7) | (1 << 5) | (head & 0xff);
cmd[3] = cyl_high;
cmd[2] = cyl_low;
cmd[1] = sector;
cmd[0] = 1;
if(AT91F_CF_WriteCommand(cmd,6,2) < 0) return -1;
if (AT91F_CF_ERR() < 0) return -1;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -