📄 card.cpp
字号:
//card.cpp : source file for the card project
//
#include "card.h"
#include "cardTimer.h"
#include "progmem.h"
#include "eeprom.h"
#include "cardADC.h"
#include "cardSPI.h"
#include "cardUART.h"
#include "cardExtINT.h"
#include "carduser.h"
#include <util/delay.h>
/////////////
void WriteUart(unsigned int wTxNumber,unsigned char bIsWaitTx)
{
while(bTxBuffLock == TRUE)
{
asm("wdr");
}
bTxBuffLock = TRUE;
wTxByteNumber = wTxNumber;
TxCheckSum = 0;
wTxByteCounts = 0;
UDR = TxBuff[0];
UCSRB |= (RE_UDRIE0 | RE_TXEN0);
if(bIsWaitTx == TRUE)
{
while(TRUE)
{
asm("wdr");
if(wTxByteCounts == wTxByteNumber)
{
break;
}
}
}
}
//cCOMCommand::cCOMCommand()
//{
//}
//cCOMCommand::~cCOMCommand()
//{
//}
void SendIdentify(void)
{
ReadFlash(TxBuff,(prog_uchar *)Identify,IDENTIFY_LEN);
WriteUart(IDENTIFY_LEN,WAIT_TX);
}
//void SendContextButtonStatus(unsigned long int ButtonStatus)
//{
//ReadFlash(TxBuff,(prog_uchar *)ContextButtonStatus,CONTEXT_BUTTON_STATUS_LEN);
//*(unsigned long int *)(TxBuff + 5) = ButtonStatus;
//WriteUart(CONTEXT_BUTTON_STATUS_LEN,UN_WAIT_TX);
//}
void SendContextButtonStatus(unsigned long int ButtonStatus)
{
ReadFlash(TxBuff,(prog_uchar *)ContextButtonStatus,CONTEXT_BUTTON_STATUS_LEN);
*(unsigned long int *)(TxBuff + 5) = ButtonStatus;
WriteUart(CONTEXT_BUTTON_STATUS_LEN,UN_WAIT_TX);
}
/*
void SendIdentifyDeviceLingoes(void)
{
TxBuff[11] = 0x06; //SPI read command and register address
TxBuff[12] = 0x04; //SPI data length
ReadOrWriteSPI((unsigned char *)(TxBuff + 11),6);
ReadFlash(TxBuff,(prog_uchar *)IdentifyDeviceLingoes,(IDENTIFY_DEVICE_LINGO_LEN - 4));
WriteUart(IDENTIFY_DEVICE_LINGO_LEN,WAIT_TX);
}
void SendDevAuthenticationInfo(void)
{
TxBuff[3] = 0x02; //SPI read command and register address
TxBuff[4] = 0x02; //SPI data length
ReadOrWriteSPI(&TxBuff[3],4);
ReadFlash(TxBuff,(prog_uchar *)RetDevAuthenticationInfo,(RET_DEV_AUTHENTICATION_INFO_LEN - 2));
WriteUart(RET_DEV_AUTHENTICATION_INFO_LEN,UN_WAIT_TX);
}
void SendDevAuthenticationSignature(void)
{
unsigned char temp;
temp = TxBuff[0] - 3; //Signature data length
TxBuff[22] = 0xa0;
TxBuff[23] = 2;
TxBuff[24] = 0;
TxBuff[25] = temp;
ReadOrWriteSPI(&TxBuff[22],4);
TxBuff[1] = 0xa1;
TxBuff[2] = temp;
ReadOrWriteSPI(&TxBuff[1],temp + 2);
TxBuff[0] = 0x91;
TxBuff[1] = 0x01;
TxBuff[2] = 0x01;
ReadOrWriteSPI(TxBuff,3);
TxBuff[0] = 0x11;
TxBuff[1] = 0x01;
ReadOrWriteSPI(TxBuff,3);
if((TxBuff[2] & SIGNATURE_OK_MASK) == SIGNATURE_OK)
{
TxBuff[0] = 0x12;
TxBuff[1] = 0x02;
ReadOrWriteSPI(TxBuff,0x04);
temp = TxBuff[3];
TxBuff[3] = 0x13;
TxBuff[4] = temp;
ReadOrWriteSPI(&TxBuff[3],temp + 2);
ReadFlash(TxBuff,(prog_uchar *)RetDevAuthenticationSignature,5);
//asm("ldi R17,_TxBuff\n"
//"ldi R18,_RetDevAuthenticationSignature\n"
//"ldi R19,5\n"
//"rcall _ReadEeprom\n"
//);
TxBuff[2] = temp + 2;
WriteUart(temp + 5,UN_WAIT_TX);
//UartReceive = UART_RECEIVE;
//while(UartReceive != UART_RECEIVE_ONE_PACKET);
//UartReceive = UART_RECEIVE;
//if(ReceivePacket2 == ACK_AUTHENTICATION_STATUS)
//{
//if(ReceivePacket3 != ACK_OK)
//{
//PORTB |= LED;
//}
//}
}
}*/
void SendIdentifyDeviceLingoes(void)
{
#if defined(AUTH_PROT_VER20)
TxBuff[11] = 0x04; //SPI read command and register address
TxBuff[12] = 0x04; //0x04 //SPI data length
#endif
#if defined(AUTH_PROT_VER10)
TxBuff[11] = 0x06; //SPI read command and register address
TxBuff[12] = 0x04; //SPI data length
#endif
ReadOrWriteSPI((unsigned char *)(TxBuff + 11),6);
ReadFlash(TxBuff,(prog_uchar *)IdentifyDeviceLingoes,(IDENTIFY_DEVICE_LINGO_LEN - 4));
WriteUart(IDENTIFY_DEVICE_LINGO_LEN,WAIT_TX);
}
////////////
void SendDevAuthenticationInfo(void)
{
#if defined(AUTH_PROT_VER10)
TxBuff[3] = 0x02; //SPI read command and register address
TxBuff[4] = 0x02; //SPI data length
ReadOrWriteSPI(&TxBuff[3],4);
ReadFlash(TxBuff,(prog_uchar *)RetDevAuthenticationInfo,(RET_DEV_AUTHENTICATION_INFO_LEN - 2));
WriteUart(RET_DEV_AUTHENTICATION_INFO_LEN,UN_WAIT_TX);
#endif
#if defined(AUTH_PROT_VER20)
unsigned char temp;
TxBuff[5] = 0x02; //SPI read command and register address
TxBuff[6] = 0x02; //SPI data length
ReadOrWriteSPI(&TxBuff[5],4);
TxBuff[0] = 0x30; //SPI read command and register address
TxBuff[1] = 0x02; //SPI data length
ReadOrWriteSPI(&TxBuff[0],4);
temp = TxBuff[2];
TxBuff[2] = TxBuff[3];
TxBuff[3] = temp;
wResiCertDataCounts = *(unsigned int *)(TxBuff+2);
wCurrCertDataCounts = 0;
wOverCertDataCounts = 0;
CertPackCounts = 0;
CertPageCounts = 0x00;
CurrCertPageDataCounts = 0x00;
wOverCertDataCounts = 0;
TxBuff[0] = 0xff;
TxBuff[1] = 0x55;
TxBuff[2] = 0x00;
TxBuff[5] = 0x00;
TxBuff[6] = 0x15;
TxBuff[10] = wResiCertDataCounts/CERT_PACK_DATA_LEN;
while(wResiCertDataCounts > 0)
{
asm("wdr");
if(bTxBuffLock == FALSE)
{
asm("wdr");
if(wResiCertDataCounts > CERT_PACK_DATA_LEN)
{
wResiPackDataCounts = CERT_PACK_DATA_LEN;
*(unsigned int *)(TxBuff+3) = CERT_PACK_DATA_LEN + 6;
wResiCertDataCounts -= CERT_PACK_DATA_LEN;
}
else
{
wResiPackDataCounts = wResiCertDataCounts;
*(unsigned int *)(TxBuff+3) = wResiCertDataCounts + 6;
wResiCertDataCounts = 0;
}
TxBuff[9] = CertPackCounts;
temp = TxBuff[3];
TxBuff[3] = TxBuff[4];
TxBuff[4] = temp;
wPackTotalDataCounts = wResiPackDataCounts + 11;
CurrCertPageDataCounts = 0;
wCertDataOffset = 11;
while(wResiPackDataCounts > 0)
{
while(!(PINB & CP_READY))
{
asm("wdr");
} //Wait until CP_READY goes high.
SPIReadDataLen = (wResiPackDataCounts > CERT_PAGE_DATA_LEN) ? CERT_PAGE_DATA_LEN : wResiPackDataCounts;
temp = SPSR;
temp = SPDR; //Clear SPDIF
SPDR = CERT_PAGE_FIRST_ADDR + CertPageCounts;
while(!(SPSR & (1 << SPIF)));
temp = SPDR;
DelayUs(20);
SPDR = SPIReadDataLen;
while(!(SPSR & (1 << SPIF)));
temp = SPDR;
DelayUs(20);
CurrCertPageDataCounts = 0;
while(!(PINB & CP_READY))
{
asm("wdr");
} //Wait until CP_READY goes high.
while(CurrCertPageDataCounts != CERT_PAGE_DATA_LEN)
{
asm("wdr");
SPDR = 0xff;
while(!(SPSR & (1 << SPIF)));
temp = SPDR;
DelayUs(20);
if(wOverCertDataCounts == wCurrCertDataCounts)
{
TxBuff[wCertDataOffset] = temp;
wResiPackDataCounts--;
wCertDataOffset++;
wCurrCertDataCounts++;
if(wResiPackDataCounts == 0)
{
break;
}
}
wOverCertDataCounts++;
CurrCertPageDataCounts++;
}
CertPageCounts++;
}
WriteUart(wPackTotalDataCounts,UN_WAIT_TX);
CertPageCounts--;
wOverCertDataCounts = CertPageCounts * CERT_PAGE_DATA_LEN;
CertPackCounts++;
}
}
#endif
}
/////////////////////////
void SendDevAuthenticationSignature(void)
{
unsigned char temp;
temp = TxBuff[0] - 3; //Signature data length
TxBuff[30] = 0xa0;
TxBuff[31] = 2;
TxBuff[32] = 0;
TxBuff[33] = temp;
ReadOrWriteSPI(&TxBuff[30],4);
TxBuff[1] = 0xa1;
TxBuff[2] = temp;
ReadOrWriteSPI(&TxBuff[1],temp + 2);
#if defined(AUTH_PROT_VER10)
TxBuff[0] = 0x91;
#endif
#if defined(AUTH_PROT_VER20)
TxBuff[0] = 0x90;
#endif
TxBuff[1] = 0x01;
TxBuff[2] = 0x01;
ReadOrWriteSPI(TxBuff,3);
#if defined(AUTH_PROT_VER10)
TxBuff[0] = 0x11;
#endif
#if defined(AUTH_PROT_VER20)
TxBuff[0] = 0x10;
#endif
TxBuff[1] = 0x01;
ReadOrWriteSPI(TxBuff,3);
if((TxBuff[2] & SIGNATURE_OK_MASK) == SIGNATURE_OK)
{
#if defined(AUTH_PROT_VER10)
TxBuff[0] = 0x12;
#endif
#if defined(AUTH_PROT_VER20)
TxBuff[0] = 0x11;
#endif
TxBuff[1] = 0x02;
ReadOrWriteSPI(TxBuff,0x04);
temp = TxBuff[3];
#if defined(AUTH_PROT_VER10)
TxBuff[3] = 0x13;
#endif
#if defined(AUTH_PROT_VER20)
TxBuff[3] = 0x12;
#endif
TxBuff[4] = temp;
ReadOrWriteSPI(&TxBuff[3],temp + 2);
ReadFlash(TxBuff,(prog_uchar *)RetDevAuthenticationSignature,5);
//asm("ldi R17,_TxBuff\n"
//"ldi R18,_RetDevAuthenticationSignature\n"
//"ldi R19,5\n"
//"rcall _ReadEeprom\n"
//);
TxBuff[2] = temp + 2;
WriteUart(temp + 5,UN_WAIT_TX);
//UartReceive = UART_RECEIVE;
//while(UartReceive != UART_RECEIVE_ONE_PACKET);
//UartReceive = UART_RECEIVE;
//if(ReceivePacket2 == ACK_AUTHENTICATION_STATUS)
//{
//if(ReceivePacket3 != ACK_OK)
//{
//PORTB |= LED;
//}
//}
}
}
//////////////////////
void Lingo1Ack(unsigned char CommandID)
{
ReadFlash(TxBuff,(prog_uchar *)Lingo1AckOk,(LINGO1_ACK_OK_LEN - 1));
TxBuff[6] = CommandID;
WriteUart(LINGO1_ACK_OK_LEN,UN_WAIT_TX);//LINGO1_ACK_OK_LEN);
}
///////////
void SendSetIpodPreferences()
{
ReadFlash(TxBuff,(prog_uchar *)SetIpodPreferences,SET_IPOD_PREFERENCE_LEN);
WriteUart(SET_IPOD_PREFERENCE_LEN,WAIT_TX);
}
//void Lingo1AckError(unsigned char CommandID)
//{
//ReadFlash(TxBuff,(prog_uchar *)Lingo1AckErrors,(LINGO1_ACK_ERROR_LEN - 1));
//TxBuff[6] = CommandID;
//WriteUart(LINGO1_ACK_ERROR_LEN,UN_WAIT_TX);//LINGO1_ACK_OK_LEN);
//}
//void RetDevCap(void)
//{
//ReadFlash(TxBuff,(prog_uchar *)RetDevCaps,RET_DEV_CAPS_LEN);
//WriteUart(RET_DEV_CAPS_LEN,UN_WAIT_TX);
//}
//void cCOMCommand::GetiPodStatusInfo(void)
//{
//ReadFlash(TxBuff,(prog_uchar *)GetiPodStatusInfos,GET_IPOD_STATUS_INFO_LEN);
//WriteUart(GET_IPOD_STATUS_INFO_LEN,UN_WAIT_TX);
//}
//void cCOMCommand::SetiPodStateInfo(unsigned char StateInfo)
//{
//ReadFlash(TxBuff,(prog_uchar *)SetiPodStateInfos,SET_IPOD_STATE_INFO_LEN);
//TxBuff[SET_IPOD_STATE_INFO_LEN - 1] = StateInfo;
//WriteUart(SET_IPOD_STATE_INFO_LEN,UN_WAIT_TX);
//}
//void RetAccessoryCapbilite(void)
//{
//ReadFlash(TxBuff,(prog_uchar *)RetAccessoryCapbilites,RET_ACCESSORY_CAPBILITES_LEN);
//COMCommand.WriteUart(RET_ACCESSORY_CAPBILITES_LEN,WAIT_TX);
//}
//////////
void ReadOrWriteSPI(unsigned char *pSPIBuff,unsigned char Number)
{
char temp,i;
while(!(PINB & CP_READY))
{
asm("wdr");
} //Wait until CP_READY goes high.
temp = SPSR;
temp = SPDR; //Clear SPDIF
//PORTB &= ~SPI_NSS; //Pull down SPI_nSS
DelayUs(40);//38
for(i = 0;i < Number;i++)
{
SPDR = *(pSPIBuff + i);
while(!(SPSR & (1 << SPIF)));
//while(!(USISR & RE_USIOIF))
//{
//USICR = temp;
//DelayUs(6/3);
//}
*(pSPIBuff + i) = SPDR;
DelayUs(20);//20
asm("wdr");
#if defined(AUTH_PROT_VER20)
if(i == 1)
{
while(!(PINB & CP_READY))
{
asm("wdr");
} //Wait until CP_READY goes high.
}
#endif
}
//PORTB |= SPI_NSS; //Pull high SPI_nSS
}
//unsigned int FMFrequenceStepValue[] = {881,941,1001,0,1061};
//unsigned char FMFrequenceModeEeprom __attribute__((section(".eeprom"))) = NO_M;
/*
unsigned char ReadEeprom(unsigned char EepromAddress)
{
while(EECR & (1 << EEPE));
asm("cli");
EEARL = EepromAddress;
EEARH = 0;
EECR |= (1 << EERE);
asm("sei");
return EEDR;
}
void WriteEeprom(unsigned char EepromAddress,unsigned int wEepromData)
{
unsigned char i;
while(EECR & (1 << EEPE));
asm("cli");
for(i = 0;i < 2;i++)
{
asm("wdr");
while(EECR & (1 << EEPE));
EEAR = (EepromAddress + i);
EEDR = *((unsigned char *)&wEepromData + i);
EECR |= (1 << EEMPE);
EECR |= (1 << EEPE);
}
asm("sei");
}*/
//cLCD::cLCD()
//{
//unsigned char i;
//for(i = 0;i < 4;i++)
//{
//DisplayBuff[i] = 0xff;
//}
//}
//cLCD::~cLCD()
//{
//}
void WriteBit(unsigned char Data,unsigned char Number)
{
unsigned char i;
for(i = 0;i < Number;i++)
{
asm("wdr");
asm("cbi 0x15,1");
if(Data & 0x80)
{
asm("sbi 0x15,0");
}
else
{
asm("cbi 0x15,0");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -