📄 ds8007.lst
字号:
1011 3 }
1012 2 }
1013 1 return 0;
1014 1 }
1015
1016 int16_t dssc_powerdown()
1017 {
1018 1 uint8_t val;
1019 1
1020 1 // Power down the card
1021 1 val = dssc_readregister(PCR);
1022 1 dssc_writeregister(PCR,val & ~PCR_START_MASK);
1023 1
1024 1 return 0;
1025 1 }
1026
1027 int16_t dssc_selectcard(uint8_t slot)
1028 {
1029 1 uint8_t val;
1030 1
1031 1 val = dssc_readregister(CSR);
1032 1 switch (slot)
1033 1 {
1034 2 case 1:
1035 2 // Select appropriate smartcard and clear other card selects
1036 2 dssc_writeregister(CSR,val & ~(CSR_SC3_MASK|CSR_SC2_MASK) | CSR_SC1_MASK);
1037 2 break;
1038 2 case 2:
1039 2 // Select appropriate smartcard and clear other card selects
1040 2 dssc_writeregister(CSR,val & ~(CSR_SC3_MASK|CSR_SC1_MASK) | CSR_SC2_MASK);
1041 2 break;
1042 2 case 3:
1043 2 // Select appropriate smartcard and clear other card selects
1044 2 dssc_writeregister(CSR,val & ~(CSR_SC2_MASK|CSR_SC1_MASK) | CSR_SC3_MASK);
1045 2 break;
1046 2 default:
C51 COMPILER V8.08 DS8007 10/26/2007 09:32:25 PAGE 18
1047 2 return ERR_INVALID_SLOT;
1048 2 }
1049 1
1050 1 // Set global slot identifier value
1051 1 currentSlot = slot-1;
1052 1
1053 1 return 0;
1054 1 }
1055
1056 int16_t dssc_checkpresence(uint8_t slot)
1057 {
1058 1 uint8_t val;
1059 1
1060 1 val = dssc_readregister(MSR);
1061 1
1062 1 switch(slot)
1063 1 {
1064 2 case 1:
1065 2 if (val & MSR_PR1_MASK) return 1;
1066 2 break;
1067 2 case 2:
1068 2 if (val & MSR_PR2_MASK) return 1;
1069 2 break;
1070 2 default:
1071 2 return ERR_INVALID_SLOT;
1072 2 break;
1073 2 }
1074 1 return 0;
1075 1 }
1076
1077 /*
1078 Library initialization
1079 */
1080 int16_t dssc_init()
1081 {
1082 1 uint8_t val;
1083 1
1084 1 // Reset the UART
1085 1 dssc_writeregister(CSR,0x00);
1086 1
1087 1 // Select smart card slot 1
1088 1 dssc_writeregister(CSR,CSR_SC1_MASK);
1089 1
1090 1 // Make sure card is powered down
1091 1 val = dssc_readregister(PCR);
1092 1 dssc_writeregister(PCR,val & ~PCR_START_MASK);
1093 1
1094 1 // Select smart card slot 2
1095 1 dssc_writeregister(CSR,CSR_SC2_MASK);
1096 1
1097 1 // Make sure card is powered down
1098 1 val = dssc_readregister(PCR);
1099 1 dssc_writeregister(PCR,val & ~PCR_START_MASK);
1100 1
1101 1 // Select smart card slot 3
1102 1 dssc_writeregister(CSR,CSR_SC3_MASK);
1103 1
1104 1 // Deselect all cards
1105 1 dssc_writeregister(CSR,0x00);
1106 1
1107 1 return 0;
1108 1 }
C51 COMPILER V8.08 DS8007 10/26/2007 09:32:25 PAGE 19
1109
1110 int16_t dssc_getATRbuffer(uint8_t *buff, int16_t length)
1111 {
1112 1 memcpy(buff,workingBuffer,(length<ATRLength[currentSlot])?length:ATRLength[currentSlot]);
1113 1 return ATRLength[currentSlot];
1114 1 }
1115
1116 void dssc_getATR(struct ATR *userATR)
1117 {
1118 1 memcpy(userATR,&lastATR[currentSlot],sizeof(struct ATR));
1119 1 }
1120
1121 #pragma REGPARMS
1122 uint8_t dssc_readregister(uint8_t address)
1123 {
1124 1 idata uint8_t rAddress, toReturn;
1125 1 #ifdef DEBUG_CRED
idata uint8_t count = 0;
#endif
1128 1 rAddress = address;
1129 1
1130 1 //ds5250 DMOS |= 0x01;
1131 1 RPCTL |= 0x20;
1132 1 P1 &= 0xEF; // Happy CS for DS8007 on Eval Refrence Design
1133 1 switch (rAddress)
1134 1 {
1135 2 case URR:
1136 2 // If reading URR, check the CRED bit in MSR so that
1137 2 // we don't overrun the DS8007. See MSR.CRED bit description on page
1138 2 // 18 of DS8007 spec.
1139 2 #ifdef DEBUG_CRED
while (!(BASE_ADDRESS[MSR] & MSR_CRED_MASK))
{
// If card de-powers exit with zero return value.
if ((BASE_ADDRESS[PCR] & 0x01) == 0)
{
//ds5250 DMOS &= 0xFE;
P1 |= 0x10; // Happy CS for DS8007 on Eval Refrence Design
RPCTL &= 0xDF;
return 0;
}
count++;
if (count == 30000)
{
printf("CRED read locked up on: %02bx\n",rAddress);
printf("PCR: %02bx\n",BASE_ADDRESS[PCR]);
printf("HSR: %02bx\n",BASE_ADDRESS[HSR]);
count = 0;
}
}
#else
1162 2 while (!(BASE_ADDRESS[MSR] & MSR_CRED_MASK))
1163 2 {
1164 3 // If card de-powers exit with zero return value.
1165 3 if ((BASE_ADDRESS[PCR] & 0x01) == 0)
1166 3 {
1167 4 //ds5250 DMOS &= 0xFE;
1168 4 P1 |= 0x10; // Happy CS for DS8007 on Eval Refrence Design
1169 4
1170 4 RPCTL &= 0xDF;
C51 COMPILER V8.08 DS8007 10/26/2007 09:32:25 PAGE 20
1171 4 return 0;
1172 4 }
1173 3 }
1174 2 #endif
1175 2 break;
1176 2 default:
1177 2 break;
1178 2 }
1179 1
1180 1 toReturn = BASE_ADDRESS[rAddress];
1181 1 //ds5250 DMOS &= 0xFE;
1182 1 P1 |= 0x10; // Happy CS for DS8007 on Eval Refrence Design
1183 1
1184 1 RPCTL &= 0xDF;
1185 1 return toReturn;
1186 1
1187 1 }
1188
1189 void dssc_writeregister(uint8_t address,uint8_t value)
1190 {
1191 1 idata uint8_t rAddress, rValue ;
1192 1 #ifdef DEBUG_CRED
idata int count = 0;
#endif
1195 1 rAddress = address;
1196 1 rValue = value;
1197 1
1198 1 //ds5250 DMOS |= 0x01;
1199 1 RPCTL |= 0x20;
1200 1 P1 &= 0xEF; // Happy CS for DS8007 on Eval Refrence Design
1201 1 switch (rAddress)
1202 1 {
1203 2 case TOC:
1204 2 case UTR:
1205 2 // If writing TOC or UTR, check the CRED bit in MSR so that
1206 2 // we don't overrun the DS8007. See MSR.CRED bit description on page
1207 2 // 18 of DS8007 spec.
1208 2 #ifdef DEBUG_CRED
while (!(BASE_ADDRESS[MSR] & MSR_CRED_MASK))
{
// If card de-powers exit with zero return value.
if ((BASE_ADDRESS[PCR] & 0x01) == 0)
{
//ds5250 DMOS &= 0xFE;
P1 |= 0x10; // Happy CS for DS8007 on Eval Refrence Design
RPCTL &= 0xDF;
return;
}
count++;
if (count == 30000)
{
printf("CRED write locked up on: %02bx\n",rAddress);
printf("PCR: %02bx\n",BASE_ADDRESS[PCR]);
printf("HSR: %02bx\n",BASE_ADDRESS[HSR]);
count = 0;
}
}
#else
1230 2 while (!(BASE_ADDRESS[MSR] & MSR_CRED_MASK));
1231 2 #endif
1232 2 break;
C51 COMPILER V8.08 DS8007 10/26/2007 09:32:25 PAGE 21
1233 2 default:
1234 2 break;
1235 2 }
1236 1 BASE_ADDRESS[rAddress] = rValue;
1237 1
1238 1 //ds5250 DMOS &= 0xFE;
1239 1 P1 |= 0x10; // Happy CS for DS8007 on Eval Refrence Design
1240 1 RPCTL &= 0xDF;
1241 1
1242 1 }
1243
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 4892 ----
CONSTANT SIZE = 100 ----
XDATA SIZE = 715 818
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- 4
BIT SIZE = ---- ----
EDATA SIZE = ---- ----
HDATA SIZE = ---- ----
XDATA CONST SIZE = ---- ----
FAR CONST SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -