// Select Device // // CryptoMemory Library Include Files #include "CM_LIB.h" #include "CM_I2C.h" #include "CM_I2C_L.h" #include "CM_GPA.h" // ------------------------------------------------------------------------------------------------- // Data // ------------------------------------------------------------------------------------------------- uint8_t ucCM_DevGpaRegisters[16][Gpa_Regs]; uint8_t ucCM_DevEncrypt[16]; uint8_t ucCM_DevAuthenticate[16]; uint8_t ucCM_DevUserZone[16]; uint8_t ucCM_DevAntiTearing[16]; // ------------------------------------------------------------------------------------------------- // Functions // ------------------------------------------------------------------------------------------------- // Select Chip uint8_t cm_SelectChip(uint8_t ucChipNew) { uint8_t ucChip, i; if (ucChipNew == 0xFF) { // Clear All State for (ucChip = 0; ucChip < 16; ++ucChip) { for (i = 0; i < 16; ++i) ucCM_DevGpaRegisters[ucChip][i] = 0; ucCM_DevEncrypt[ucChip] = 0; ucCM_DevAuthenticate[ucChip] = 0; ucCM_DevUserZone[ucChip] = 0; ucCM_DevAntiTearing[ucChip] = 0; } } else { ucChip = CM_PORT_CFG.ucChipSelect; if (ucChip != ucChipNew) { // Set Chip Select CM_PORT_CFG.ucChipSelect = ucChipNew; // Shift Addresses ucChip = (ucChip>>4)&0xF0; ucChipNew = (ucChipNew>>4)&0xF0; // Swap GPA Registers for (i = 0; i < 16; ++i) { ucCM_DevGpaRegisters[ucChip][i] = ucGpaRegisters[i]; ucGpaRegisters[i] = ucCM_DevGpaRegisters[ucChipNew][i]; } //Save State ucCM_DevEncrypt[ucChip] = ucCM_Encrypt; ucCM_DevAuthenticate[ucChip] = ucCM_Authenticate; ucCM_DevUserZone[ucChip] = ucCM_UserZone; ucCM_DevAntiTearing[ucChip] = ucCM_AntiTearing; // Restore Saved State ucCM_Encrypt = ucCM_DevEncrypt[ucChipNew]; ucCM_Authenticate = ucCM_DevAuthenticate[ucChipNew]; ucCM_UserZone = ucCM_DevUserZone[ucChipNew]; ucCM_AntiTearing = ucCM_DevAntiTearing[ucChipNew]; } } return SUCCESS; }