📄 memory card.c
字号:
#include <atmega128.h>
#include <ina90.h>
#include <string.h>
#include <__debug_stdio.h>
#include "delays.h"
#include "compactflash.h"
#include "memory card.h"
#define make16(varhigh,varlow) (((unsigned int)varhigh & 0xFF)* 0x100) + ((unsigned int)varlow & 0x00FF)
static unsigned char driveNumber=0;
static unsigned int sector[256];
void waitWhileBusy(unsigned int registerNo)
{
while(rd_cf_io8(registerNo)&BUSY);
}
unsigned char sendCommand(unsigned char cmd, unsigned char drive,unsigned long address,unsigned char nSectors)
{
unsigned char status;
waitWhileBusy(STATUS);
wr_cf_io8(0xe0|(drive*DRIVE_NO)|(0xf&(address>>24)),DRIVE_HEAD);
wr_cf_io8(0xff&(address>>16),CYLINDER_HI);
wr_cf_io8(0xff&(address>>8),CYLINDER_LO);
wr_cf_io8(0xff&address,SECTOR_NO);
wr_cf_io8(nSectors,SECTOR_CNT);
wr_cf_io8(cmd,COMMAND);
Delay10TCYx(1);
waitWhileBusy(STATUS);
status=rd_cf_io8(STATUS);
if(status&ERROR) return rd_cf_io8(ERROR_REG);
else return 0;
}
unsigned char writeSector(unsigned long address)
{
unsigned int i;
if(sendCommand(WRITE_SECTOR,driveNumber,address,1)) return 1;
for(i=0;i<256;i++)
{
wr_cf_io8(sector[i]&0xff,WR_DATA);
wr_cf_io8((sector[i]>>8)&0xff,WR_DATA);
}
return 0;
}
unsigned char readSector(unsigned long address)
{
unsigned int i;
if(sendCommand(READ_SECTOR,driveNumber,address,1)) return 1;
for(i=0;i<256;i++) sector[i]=make16(rd_cf_io8(RD_DATA),rd_cf_io8(RD_DATA));
return 0;
}
unsigned char getDriveNumber(void)
{
driveNumber=0x1&(rd_cf_reg(SOCKET_COPY)>>4);
return driveNumber;
}
void setDriveNumber(unsigned char n)
{
driveNumber=n;
wr_cf_reg((0xef&rd_cf_reg(SOCKET_COPY))|((n&1)<<4),SOCKET_COPY);
}
void setOperatingMode(unsigned char mode)
{
unsigned int corcon;
unsigned char corData;
corcon=getCORCONAddress();
corData = rd_cf_reg(corcon);
Delay10KTCYx(2);
wr_cf_reg(mode|(corData&0xe0),corcon);
Delay10KTCYx(10);
while(!(rd_cf_io8(STATUS)&READY));
}
unsigned long initMemoryCard(void)
{
unsigned int i;
getDriveNumber();
printf("Drive number is %i\n",driveNumber);
setOperatingMode(IO_MAPPED);
if(sendCommand(IDENTIFY_DRIVE,driveNumber,0,0)) return 0;
for(i=0;i<256;i++) sector[i]=make16(rd_cf_io8(RD_DATA),rd_cf_io8(RD_DATA));
return (((unsigned long)sector[7])<<16)|sector[8]; // number of sectors on card
}
unsigned char getByteFromSector(unsigned int i)
{
return (i&1) ? 0xff§or[i>>1] : 0xff&(sector[i>>1]>>8);
}
void setByteInSector(unsigned int i,unsigned char byte)
{
sector[i>>1] = (i&1) ? (sector[i>>1]&0xff00)|byte : (sector[i>>1]&0x00ff)|(byte<<8);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -