⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds8007.lst

📁 dallas公司的ds8007芯片源代码。绝对好用。可以兼容tda8007.
💻 LST
📖 第 1 页 / 共 5 页
字号:
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 + -