CEBF746 Module.. with TPM

Dependencies:   cube_CEBF746 cube_crypto cube_crc_16

Committer:
gandol2
Date:
Wed Oct 19 08:53:08 2016 +0000
Revision:
4:85dda8d9a528
Parent:
3:9ab0f5f0ed9e
Child:
5:79ea2d57baf3
implement
; - MENU_READ_STATUS_REG
; - MENU_SPI_SELF_TEST_WRITE
; - MENU_SPI_SELF_TEST_READ
; - MENU_SPI_WRITE_ENC_DATA

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gandol2 0:86ca686388bb 1 // firmware for CBEF746
gandol2 0:86ca686388bb 2 // ======== SPI Slave Pin
gandol2 0:86ca686388bb 3 // PA5 - SCK
gandol2 0:86ca686388bb 4 // PA6 - MISO
gandol2 0:86ca686388bb 5 // PA7 - MOSI
gandol2 0:86ca686388bb 6 // PA14 - SEL
gandol2 0:86ca686388bb 7 // ======== I2C Pin for TPM
gandol2 0:86ca686388bb 8 // PB9 - SDA
gandol2 0:86ca686388bb 9 // PB8 - SCL
bcup 1:15f935f03383 10
gandol2 0:86ca686388bb 11 #include "mbed.h"
gandol2 4:85dda8d9a528 12 #include "lib_CEBF746.h"
gandol2 3:9ab0f5f0ed9e 13 #include "lib_crc.h"
gandol2 0:86ca686388bb 14
gandol2 4:85dda8d9a528 15 #define SPI_INTERRUPT 0
gandol2 4:85dda8d9a528 16
gandol2 0:86ca686388bb 17 #define DEBUG_SPI
gandol2 0:86ca686388bb 18 #ifdef DEBUG_SPI
gandol2 0:86ca686388bb 19 #define PRINTD(arg1,arg2...) printf(arg1,##arg2)
gandol2 0:86ca686388bb 20 #endif
gandol2 0:86ca686388bb 21
gandol2 0:86ca686388bb 22 // ======== SPI Slave Pin define
gandol2 0:86ca686388bb 23 #define SPI_MOSI PA_7
gandol2 0:86ca686388bb 24 #define SPI_MISO PA_6
gandol2 0:86ca686388bb 25 #define SPI_SCLK PA_5
gandol2 0:86ca686388bb 26 #define SPI_SSEL PA_4
gandol2 0:86ca686388bb 27
gandol2 3:9ab0f5f0ed9e 28 // ======== SPI Func define
gandol2 0:86ca686388bb 29 #define EEPROM_WREN 0x06 // Write Enable
gandol2 0:86ca686388bb 30 #define EEPROM_WRDI 0x04 // Write Disable
gandol2 0:86ca686388bb 31 #define EEPROM_RDSR 0x05 // Read Status Register
gandol2 0:86ca686388bb 32 #define EEPROM_WRSR 0x01 // Write Status Register
gandol2 0:86ca686388bb 33 #define EEPROM_READ 0x03 // Read EEPROM Memory
gandol2 0:86ca686388bb 34 #define EEPROM_WRITE 0x02 // Write EEPROM Memory
gandol2 0:86ca686388bb 35 #define EEPROM_MULTIREAD 0x07 // Read Multibyte EEPROM Memory
gandol2 0:86ca686388bb 36
gandol2 3:9ab0f5f0ed9e 37 #define SPI_CONFIG_BIT 8
gandol2 3:9ab0f5f0ed9e 38 #define SPI_CONFIG_FREQUENCY 1000000 // 1Mhz
gandol2 3:9ab0f5f0ed9e 39 //#define SPI_CONFIG_FREQUENCY 50000000 // 50Mhz
gandol2 3:9ab0f5f0ed9e 40
gandol2 3:9ab0f5f0ed9e 41
gandol2 0:86ca686388bb 42 Serial pc_serial(USBTX, USBRX);
gandol2 4:85dda8d9a528 43 #if SPI_INTERRUPT
gandol2 3:9ab0f5f0ed9e 44 InterruptIn spi_interrupt(SPI_SSEL); // Falling Edge
gandol2 4:85dda8d9a528 45 #endif /* SPI_INTERRUPT */
gandol2 0:86ca686388bb 46
gandol2 4:85dda8d9a528 47 SPISlave spi_slave(SPI_MOSI, SPI_MISO, SPI_SCLK, SPI_SSEL); // MOSI, MISO, SCLK(CLK), SSEL(CS)=NC
gandol2 4:85dda8d9a528 48
gandol2 3:9ab0f5f0ed9e 49
gandol2 4:85dda8d9a528 50 uint8_t cebStatus; // 1byte Status Register
gandol2 4:85dda8d9a528 51 uint8_t cebBufEncrypt[CEB_BUF_SIZE] = {}; // 암호화 예정 버퍼
gandol2 4:85dda8d9a528 52 uint8_t cebBufEncrypted[CEB_BUF_SIZE] = {}; // 암호화 완료된 버퍼
gandol2 4:85dda8d9a528 53
gandol2 4:85dda8d9a528 54 uint8_t cebBufDecrypt[CEB_BUF_SIZE] = {}; // 복호화 예정 버퍼
gandol2 4:85dda8d9a528 55 uint8_t cebBufDecrypted[CEB_BUF_SIZE] = {}; // 복호화 완료된 버퍼
gandol2 4:85dda8d9a528 56
gandol2 4:85dda8d9a528 57 extern uint8_t readSelfTestValidateData[CEB_BUF_SIZE];
gandol2 4:85dda8d9a528 58 extern uint8_t writeSelfTestValidateData[CEB_BUF_SIZE];
gandol2 4:85dda8d9a528 59
gandol2 3:9ab0f5f0ed9e 60
gandol2 3:9ab0f5f0ed9e 61
gandol2 4:85dda8d9a528 62 enum cubeMenu
gandol2 0:86ca686388bb 63 {
gandol2 4:85dda8d9a528 64 CEBF746_SPI_SELF_TEST = 1,
gandol2 4:85dda8d9a528 65 CEBF746_SPI_SELF_TEST2 = 2,
gandol2 4:85dda8d9a528 66 CEBF746_READ_STATUS_REG = 3,
gandol2 4:85dda8d9a528 67 MENU_EXIT_Program = 9
gandol2 4:85dda8d9a528 68 };
gandol2 4:85dda8d9a528 69
gandol2 4:85dda8d9a528 70 static char cebf746_status_reg = 0xAA;
gandol2 4:85dda8d9a528 71
gandol2 3:9ab0f5f0ed9e 72
gandol2 4:85dda8d9a528 73 bool spi_receive_wait(void)
gandol2 4:85dda8d9a528 74 {
gandol2 4:85dda8d9a528 75 #define ISR_TIMEOUT 100
gandol2 4:85dda8d9a528 76 int timeout;
gandol2 4:85dda8d9a528 77
gandol2 4:85dda8d9a528 78 while(!spi_slave.receive()) // wait SPI data input...
gandol2 3:9ab0f5f0ed9e 79 {
gandol2 4:85dda8d9a528 80 timeout++;
gandol2 4:85dda8d9a528 81 if(ISR_TIMEOUT <= timeout)
gandol2 3:9ab0f5f0ed9e 82 {
gandol2 4:85dda8d9a528 83 pc_serial.printf("spi isr timeout\n");
gandol2 4:85dda8d9a528 84 return false;
gandol2 3:9ab0f5f0ed9e 85 }
gandol2 3:9ab0f5f0ed9e 86 }
gandol2 3:9ab0f5f0ed9e 87
gandol2 4:85dda8d9a528 88 return true;
gandol2 0:86ca686388bb 89 }
gandol2 0:86ca686388bb 90
gandol2 4:85dda8d9a528 91 static char retCnt=0xFF;
gandol2 4:85dda8d9a528 92
gandol2 4:85dda8d9a528 93 #if SPI_INTERRUPT
gandol2 4:85dda8d9a528 94 void execute_spi_slave_isr( void )
gandol2 4:85dda8d9a528 95 {
gandol2 4:85dda8d9a528 96
gandol2 4:85dda8d9a528 97 char cebf746Func;
gandol2 4:85dda8d9a528 98
gandol2 4:85dda8d9a528 99 spi_receive_wait();
gandol2 4:85dda8d9a528 100
gandol2 4:85dda8d9a528 101 cebf746Func = spi_slave.read();
gandol2 4:85dda8d9a528 102
gandol2 4:85dda8d9a528 103
gandol2 4:85dda8d9a528 104 switch(cebf746Func)
gandol2 4:85dda8d9a528 105 {
gandol2 4:85dda8d9a528 106 case 0x01: // FUNC_STATUS_REG
gandol2 4:85dda8d9a528 107
gandol2 4:85dda8d9a528 108 //spi_receive_wait();
gandol2 4:85dda8d9a528 109
gandol2 4:85dda8d9a528 110
gandol2 4:85dda8d9a528 111 //printf("[DEBUG] [M to S] eepAddr=0x%02x\n",eepAddr);
gandol2 4:85dda8d9a528 112 //for(int i=0;i<3;i++)
gandol2 4:85dda8d9a528 113 {
gandol2 4:85dda8d9a528 114 spi_slave.reply( retCnt );
gandol2 4:85dda8d9a528 115
gandol2 4:85dda8d9a528 116 //++eepAddr;
gandol2 4:85dda8d9a528 117 //printf("[0x%02x] ",spiMulti);
gandol2 4:85dda8d9a528 118 }
gandol2 4:85dda8d9a528 119
gandol2 4:85dda8d9a528 120 printf("[DEBUG] [M to S] retCnt [0x%02X]\n", retCnt);
gandol2 4:85dda8d9a528 121 retCnt--;
gandol2 4:85dda8d9a528 122 break;
gandol2 4:85dda8d9a528 123
gandol2 4:85dda8d9a528 124
gandol2 4:85dda8d9a528 125
gandol2 4:85dda8d9a528 126 }
gandol2 4:85dda8d9a528 127
gandol2 4:85dda8d9a528 128
gandol2 4:85dda8d9a528 129
gandol2 4:85dda8d9a528 130
gandol2 4:85dda8d9a528 131
gandol2 4:85dda8d9a528 132 /*
gandol2 4:85dda8d9a528 133 #define ISR_TIMEOUT 100
gandol2 4:85dda8d9a528 134 int timeout;
gandol2 4:85dda8d9a528 135 char cebf746Func = 0;
gandol2 4:85dda8d9a528 136 //pc_serial.printf("init spi inturrupt!!\n");
gandol2 4:85dda8d9a528 137
gandol2 4:85dda8d9a528 138
gandol2 4:85dda8d9a528 139
gandol2 4:85dda8d9a528 140 timeout = 0;
gandol2 4:85dda8d9a528 141 while(!spi_slave.receive()) // wiat for cebf746 func byte (first byte)
gandol2 4:85dda8d9a528 142 {
gandol2 4:85dda8d9a528 143 timeout++;
gandol2 4:85dda8d9a528 144 if(ISR_TIMEOUT <= timeout)
gandol2 4:85dda8d9a528 145 {
gandol2 4:85dda8d9a528 146 pc_serial.printf("spi isr timeout\n");
gandol2 4:85dda8d9a528 147 return;
gandol2 4:85dda8d9a528 148 }
gandol2 4:85dda8d9a528 149 }
gandol2 4:85dda8d9a528 150
gandol2 4:85dda8d9a528 151 cebf746Func = spi_slave.read(); // read cebf746 func byte
gandol2 4:85dda8d9a528 152 //pc_serial.printf("[0x%02X]\n", cebf746Func);
gandol2 4:85dda8d9a528 153
gandol2 4:85dda8d9a528 154
gandol2 4:85dda8d9a528 155
gandol2 4:85dda8d9a528 156 switch(cebf746Func)
gandol2 4:85dda8d9a528 157 {
gandol2 4:85dda8d9a528 158 case 0x01: // FUNC_STATUS_REG
gandol2 4:85dda8d9a528 159 while(!spi_slave.receive());
gandol2 4:85dda8d9a528 160 spi_slave.reply( retCnt ); // return code
gandol2 4:85dda8d9a528 161 while(!spi_slave.receive());
gandol2 4:85dda8d9a528 162 spi_slave.reply( retCnt+1 ); // return code
gandol2 4:85dda8d9a528 163 while(!spi_slave.receive());
gandol2 4:85dda8d9a528 164 spi_slave.reply( retCnt+2 ); // return code
gandol2 4:85dda8d9a528 165 break;
gandol2 4:85dda8d9a528 166 }
gandol2 4:85dda8d9a528 167
gandol2 4:85dda8d9a528 168
gandol2 4:85dda8d9a528 169
gandol2 4:85dda8d9a528 170 pc_serial.printf("return code : 0x%02X \n", 0xBB);
gandol2 4:85dda8d9a528 171 pc_serial.printf("data : 0x%02X \n", retCnt);
gandol2 4:85dda8d9a528 172 retCnt++;
gandol2 4:85dda8d9a528 173 */
gandol2 4:85dda8d9a528 174 }
gandol2 4:85dda8d9a528 175 #endif /* SPI_INTERRUPT */
gandol2 3:9ab0f5f0ed9e 176
gandol2 3:9ab0f5f0ed9e 177 /** @brief slave init
gandol2 3:9ab0f5f0ed9e 178 *
gandol2 3:9ab0f5f0ed9e 179 */
gandol2 3:9ab0f5f0ed9e 180 void SPI_InitSlave()
gandol2 3:9ab0f5f0ed9e 181 {
gandol2 3:9ab0f5f0ed9e 182 spi_slave.format(SPI_CONFIG_BIT,0);
gandol2 3:9ab0f5f0ed9e 183 spi_slave.frequency(SPI_CONFIG_FREQUENCY);
gandol2 3:9ab0f5f0ed9e 184 PRINTD("SPI Init.. Packet bit size=[%d] Frequency=[%d]Mhz\n", SPI_CONFIG_BIT, (SPI_CONFIG_FREQUENCY/1000000));
gandol2 3:9ab0f5f0ed9e 185
gandol2 4:85dda8d9a528 186 /*
gandol2 4:85dda8d9a528 187 spi_slave.reply(0);
gandol2 4:85dda8d9a528 188 spi_slave.reply(0);
gandol2 4:85dda8d9a528 189 spi_slave.reply(0);
gandol2 4:85dda8d9a528 190 spi_slave.reply(0);
gandol2 4:85dda8d9a528 191 spi_slave.reply(0);
gandol2 4:85dda8d9a528 192 spi_slave.reply(0);
gandol2 4:85dda8d9a528 193 */
gandol2 4:85dda8d9a528 194 PRINTD("SPI Init.. OK\n");
gandol2 4:85dda8d9a528 195
gandol2 4:85dda8d9a528 196
gandol2 4:85dda8d9a528 197
gandol2 3:9ab0f5f0ed9e 198 }
gandol2 3:9ab0f5f0ed9e 199
gandol2 4:85dda8d9a528 200 #if SPI_INTERRUPT
gandol2 4:85dda8d9a528 201 void SPI_InitInterrupt()
gandol2 4:85dda8d9a528 202 {
gandol2 4:85dda8d9a528 203 spi_interrupt.rise(&execute_spi_slave_isr);
gandol2 4:85dda8d9a528 204 spi_interrupt.enable_irq();
gandol2 4:85dda8d9a528 205 //spi_interrupt.mode(PullDown); // Pull down input
gandol2 4:85dda8d9a528 206 //spi_interrupt.fall(&execute_spi_slave_isr); // Attach the isr address to the falling edge interrupt
gandol2 4:85dda8d9a528 207 PRINTD("SPI Interrupt Init.. OK\n");
gandol2 4:85dda8d9a528 208 }
gandol2 4:85dda8d9a528 209 #endif /* SPI_INTERRUPT */
gandol2 3:9ab0f5f0ed9e 210
gandol2 0:86ca686388bb 211 void SPI_SlaveWrite()
gandol2 0:86ca686388bb 212 {
gandol2 0:86ca686388bb 213 char tx_buffer[255]={0};
gandol2 0:86ca686388bb 214 char i;
gandol2 0:86ca686388bb 215 char temp;
gandol2 0:86ca686388bb 216 char tx_cnt = 0;
gandol2 0:86ca686388bb 217 int value;
gandol2 0:86ca686388bb 218 PRINTD("Input Strging=");
gandol2 0:86ca686388bb 219 while(1)
gandol2 0:86ca686388bb 220 {
gandol2 3:9ab0f5f0ed9e 221
gandol2 0:86ca686388bb 222 temp=getchar();
gandol2 0:86ca686388bb 223 tx_buffer[tx_cnt++]=temp;
gandol2 0:86ca686388bb 224 if(temp==0x0d)
gandol2 0:86ca686388bb 225 {
gandol2 0:86ca686388bb 226 tx_buffer[tx_cnt]=0;
gandol2 0:86ca686388bb 227 PRINTD("\nData send Finish...\n");
gandol2 0:86ca686388bb 228 for(i=0;i<=tx_cnt;++i)
gandol2 0:86ca686388bb 229 {
gandol2 0:86ca686388bb 230 PRINTD("%c[%02x]",tx_buffer[i],tx_buffer[i]);
gandol2 0:86ca686388bb 231 }
gandol2 0:86ca686388bb 232 PRINTD("\n\n");
gandol2 0:86ca686388bb 233 for(i=0;i<=tx_cnt;++i)
gandol2 0:86ca686388bb 234 {
gandol2 0:86ca686388bb 235 value=tx_buffer[i];
gandol2 0:86ca686388bb 236 PRINTD("write[%d]=%c[%02x]\n",i,value,value);
gandol2 0:86ca686388bb 237 spi_slave.reply(value);
gandol2 0:86ca686388bb 238 }
gandol2 0:86ca686388bb 239 for(i=0;i<tx_cnt;++i)
gandol2 0:86ca686388bb 240 {
gandol2 0:86ca686388bb 241 tx_buffer[i]=0;
gandol2 0:86ca686388bb 242 PRINTD("init_tx_buf[%d]=%c\n",i,tx_buffer[i]);
gandol2 0:86ca686388bb 243 }
gandol2 0:86ca686388bb 244 tx_cnt=0;
gandol2 0:86ca686388bb 245 PRINTD("break\n");
gandol2 0:86ca686388bb 246 break;
gandol2 0:86ca686388bb 247 }
gandol2 0:86ca686388bb 248 else
gandol2 0:86ca686388bb 249 {
gandol2 0:86ca686388bb 250 PRINTD("%c[%02x]",tx_buffer[tx_cnt],tx_buffer[tx_cnt]);
gandol2 0:86ca686388bb 251 }
gandol2 0:86ca686388bb 252 }
gandol2 0:86ca686388bb 253 return;
gandol2 0:86ca686388bb 254 }
gandol2 0:86ca686388bb 255
gandol2 0:86ca686388bb 256 void spi_dummy_reply(void)
gandol2 0:86ca686388bb 257 {
gandol2 0:86ca686388bb 258 spi_slave.reply( 0xA0 );
gandol2 0:86ca686388bb 259 }
gandol2 0:86ca686388bb 260
gandol2 0:86ca686388bb 261 #define EEPROM_SIZE 256
gandol2 4:85dda8d9a528 262
gandol2 0:86ca686388bb 263 char eepBuf[EEPROM_SIZE];
gandol2 0:86ca686388bb 264
gandol2 3:9ab0f5f0ed9e 265 /** @brief char buf print
gandol2 3:9ab0f5f0ed9e 266 *
gandol2 3:9ab0f5f0ed9e 267 * @param buf print buf
gandol2 3:9ab0f5f0ed9e 268 * @param length buf length
gandol2 3:9ab0f5f0ed9e 269 */
gandol2 0:86ca686388bb 270 void printBuf(char * buf, int length)
gandol2 0:86ca686388bb 271 {
gandol2 0:86ca686388bb 272 pc_serial.printf("=======================[EEPROM]========================\n");
gandol2 0:86ca686388bb 273 pc_serial.printf(" |");
gandol2 0:86ca686388bb 274 for(int iCnt = 0 ; iCnt < 16 ; ++iCnt)
gandol2 0:86ca686388bb 275 {
gandol2 0:86ca686388bb 276 pc_serial.printf("%02X|", iCnt);
gandol2 0:86ca686388bb 277 }
gandol2 0:86ca686388bb 278 pc_serial.printf("\n");
gandol2 3:9ab0f5f0ed9e 279
gandol2 3:9ab0f5f0ed9e 280
gandol2 0:86ca686388bb 281 for(int iCnt = 0 ; iCnt < length ; ++iCnt)
gandol2 0:86ca686388bb 282 {
gandol2 0:86ca686388bb 283 if(0 == ((iCnt) % 16))
gandol2 0:86ca686388bb 284 {
gandol2 0:86ca686388bb 285 pc_serial.printf("[0x%02X] ", iCnt);
gandol2 0:86ca686388bb 286 }
gandol2 3:9ab0f5f0ed9e 287
gandol2 0:86ca686388bb 288 pc_serial.printf("%02X ", *(buf + iCnt));
gandol2 3:9ab0f5f0ed9e 289
gandol2 0:86ca686388bb 290 if(0 == ((iCnt+1) % 16))
gandol2 0:86ca686388bb 291 {
gandol2 0:86ca686388bb 292 pc_serial.printf("\n");
gandol2 3:9ab0f5f0ed9e 293
gandol2 0:86ca686388bb 294 }
gandol2 3:9ab0f5f0ed9e 295
gandol2 0:86ca686388bb 296 }
gandol2 0:86ca686388bb 297 pc_serial.printf("=======================================================\n");
gandol2 0:86ca686388bb 298 }
gandol2 0:86ca686388bb 299
gandol2 3:9ab0f5f0ed9e 300
gandol2 4:85dda8d9a528 301 Timeout receiveTimeOut;
gandol2 4:85dda8d9a528 302 bool timeOut = false;
gandol2 4:85dda8d9a528 303 #define CEBF746_TIMEOUT 10 // 1 sec
gandol2 4:85dda8d9a528 304
gandol2 4:85dda8d9a528 305 uint8_t slave_read_byte()
gandol2 4:85dda8d9a528 306 {
gandol2 4:85dda8d9a528 307 while(!spi_slave.receive());
gandol2 4:85dda8d9a528 308 return spi_slave.read();
gandol2 4:85dda8d9a528 309 }
gandol2 4:85dda8d9a528 310 void slave_write_byte(uint8_t txData)
gandol2 4:85dda8d9a528 311 {
gandol2 4:85dda8d9a528 312 spi_slave.reply( txData );
gandol2 4:85dda8d9a528 313 while(!spi_slave.receive());
gandol2 4:85dda8d9a528 314 spi_slave.read();
gandol2 4:85dda8d9a528 315 }
gandol2 4:85dda8d9a528 316
gandol2 4:85dda8d9a528 317 void slave_read_uint16(uint16_t* buf16)
gandol2 4:85dda8d9a528 318 {
gandol2 4:85dda8d9a528 319 uint16_t temp;
gandol2 4:85dda8d9a528 320
gandol2 4:85dda8d9a528 321 temp = slave_read_byte();
gandol2 4:85dda8d9a528 322 *buf16 = temp << 8;
gandol2 4:85dda8d9a528 323
gandol2 4:85dda8d9a528 324 temp = slave_read_byte();
gandol2 4:85dda8d9a528 325 *buf16 |= temp;
gandol2 4:85dda8d9a528 326
gandol2 4:85dda8d9a528 327 //*buf16 = (slave_read_byte() << 8) | (slave_read_byte());
gandol2 4:85dda8d9a528 328 }
gandol2 4:85dda8d9a528 329 void slave_read_multi_byte(uint8_t* buf, int size)
gandol2 4:85dda8d9a528 330 {
gandol2 4:85dda8d9a528 331 for(int iCnt = 0 ; iCnt < size ; ++iCnt)
gandol2 4:85dda8d9a528 332 *(buf+iCnt) = slave_read_byte();
gandol2 4:85dda8d9a528 333 }
gandol2 4:85dda8d9a528 334
gandol2 4:85dda8d9a528 335 void slave_write_multi_byte(uint8_t* buf, int size)
gandol2 4:85dda8d9a528 336 {
gandol2 4:85dda8d9a528 337 for(int iCnt = 0 ; iCnt < size ; ++iCnt)
gandol2 4:85dda8d9a528 338 slave_write_byte(*(buf+iCnt));
gandol2 4:85dda8d9a528 339 }
gandol2 4:85dda8d9a528 340
gandol2 4:85dda8d9a528 341
gandol2 4:85dda8d9a528 342 #define YSH_CODE 1
gandol2 4:85dda8d9a528 343 #if YSH_CODE
gandol2 4:85dda8d9a528 344 typedef struct // #include <aes.h> -> mbed tls lib
gandol2 4:85dda8d9a528 345 {
gandol2 4:85dda8d9a528 346 int nr; /*!< number of rounds */
gandol2 4:85dda8d9a528 347 uint32_t rk; /*!< AES round keys */
gandol2 4:85dda8d9a528 348 uint32_t buf[68]; /*!< unaligned data */
gandol2 4:85dda8d9a528 349 }
gandol2 4:85dda8d9a528 350 mbedtls_aes_context;
gandol2 4:85dda8d9a528 351
gandol2 4:85dda8d9a528 352 typedef struct
gandol2 4:85dda8d9a528 353 {
gandol2 4:85dda8d9a528 354 uint8_t iv[16];
gandol2 4:85dda8d9a528 355 uint8_t key[32];
gandol2 4:85dda8d9a528 356 uint8_t key_size;
gandol2 4:85dda8d9a528 357 uint16_t key_crc;
gandol2 4:85dda8d9a528 358 }
gandol2 4:85dda8d9a528 359 cube_sec_key;
gandol2 4:85dda8d9a528 360
gandol2 4:85dda8d9a528 361 typedef struct
gandol2 4:85dda8d9a528 362 {
gandol2 4:85dda8d9a528 363 uint8_t input_data[16];
gandol2 4:85dda8d9a528 364 uint8_t output_data[16];
gandol2 4:85dda8d9a528 365 uint8_t input_data_size;
gandol2 4:85dda8d9a528 366 uint8_t output_data_size;
gandol2 4:85dda8d9a528 367 }
gandol2 4:85dda8d9a528 368 cube_sec_data;
gandol2 4:85dda8d9a528 369
gandol2 4:85dda8d9a528 370 typedef struct
gandol2 4:85dda8d9a528 371 {
gandol2 4:85dda8d9a528 372 mbedtls_aes_context mbed_ctx;
gandol2 4:85dda8d9a528 373 uint8_t cmd;
gandol2 4:85dda8d9a528 374 cube_sec_data sec_data;
gandol2 4:85dda8d9a528 375 cube_sec_key sec_key;
gandol2 4:85dda8d9a528 376 }
gandol2 4:85dda8d9a528 377 cube_sec_context;
gandol2 4:85dda8d9a528 378
gandol2 4:85dda8d9a528 379
gandol2 4:85dda8d9a528 380 void print_mbedtls_aes_context(mbedtls_aes_context printStr)
gandol2 4:85dda8d9a528 381 {
gandol2 4:85dda8d9a528 382 printf("-------------mbedtls_aes_context---------\n");
gandol2 4:85dda8d9a528 383 printf("number of rounds : %d\n", printStr.nr);
gandol2 4:85dda8d9a528 384 printf("AES round keys : 0x%X\n", printStr.rk);
gandol2 4:85dda8d9a528 385 printf("unaligned data : ");
gandol2 4:85dda8d9a528 386 for(int iCnt = 0 ; iCnt < 68 ; iCnt++)
gandol2 4:85dda8d9a528 387 {
gandol2 4:85dda8d9a528 388 printf("%X",printStr.buf[iCnt]);
gandol2 4:85dda8d9a528 389 }
gandol2 4:85dda8d9a528 390 printf("\n");
gandol2 4:85dda8d9a528 391 //printf("-----------------------------------------\n");
gandol2 4:85dda8d9a528 392 }
gandol2 4:85dda8d9a528 393 void print_cube_sec_data(cube_sec_data printStr)
gandol2 4:85dda8d9a528 394 {
gandol2 4:85dda8d9a528 395 printf("--------------cube_sec_data--------------\n");
gandol2 4:85dda8d9a528 396 printf("input_data : ");
gandol2 4:85dda8d9a528 397 for(int iCnt = 0 ; iCnt < 16 ; iCnt++)
gandol2 4:85dda8d9a528 398 {
gandol2 4:85dda8d9a528 399 printf("%02X ",printStr.input_data[iCnt]);
gandol2 4:85dda8d9a528 400 }
gandol2 4:85dda8d9a528 401 printf("\n");
gandol2 4:85dda8d9a528 402
gandol2 4:85dda8d9a528 403 printf("output_data : ");
gandol2 4:85dda8d9a528 404 for(int iCnt = 0 ; iCnt < 16 ; iCnt++)
gandol2 4:85dda8d9a528 405 {
gandol2 4:85dda8d9a528 406 printf("%02X ",printStr.output_data[iCnt]);
gandol2 4:85dda8d9a528 407 }
gandol2 4:85dda8d9a528 408 printf("\n");
gandol2 4:85dda8d9a528 409
gandol2 4:85dda8d9a528 410 printf("input_data_size : %d\n", printStr.input_data_size);
gandol2 4:85dda8d9a528 411 printf("output_data_size : %d\n", printStr.output_data_size);
gandol2 4:85dda8d9a528 412
gandol2 4:85dda8d9a528 413 //printf("-----------------------------------------\n");
gandol2 4:85dda8d9a528 414 }
gandol2 4:85dda8d9a528 415 void print_cube_sec_key(cube_sec_key printStr)
gandol2 4:85dda8d9a528 416 {
gandol2 4:85dda8d9a528 417 printf("-------------cube_sec_key------------------\n");
gandol2 4:85dda8d9a528 418 printf("iv : ");
gandol2 4:85dda8d9a528 419 for(int iCnt = 0 ; iCnt < 16 ; iCnt++)
gandol2 4:85dda8d9a528 420 {
gandol2 4:85dda8d9a528 421 printf("%02X ",printStr.iv[iCnt]);
gandol2 4:85dda8d9a528 422 }
gandol2 4:85dda8d9a528 423 printf("\n");
gandol2 4:85dda8d9a528 424
gandol2 4:85dda8d9a528 425 printf("key : ");
gandol2 4:85dda8d9a528 426 for(int iCnt = 0 ; iCnt < 32 ; iCnt++)
gandol2 4:85dda8d9a528 427 {
gandol2 4:85dda8d9a528 428 printf("%02X ",printStr.key[iCnt]);
gandol2 4:85dda8d9a528 429 }
gandol2 4:85dda8d9a528 430 printf("\n");
gandol2 4:85dda8d9a528 431
gandol2 4:85dda8d9a528 432 printf("key_size : %d\n", printStr.key_size);
gandol2 4:85dda8d9a528 433 printf("key_crc : %04X\n", printStr.key_crc);
gandol2 4:85dda8d9a528 434
gandol2 4:85dda8d9a528 435 //printf("-----------------------------------------\n");
gandol2 4:85dda8d9a528 436 }
gandol2 4:85dda8d9a528 437 void print_cube_sec_context(cube_sec_context printStr)
gandol2 4:85dda8d9a528 438 {
gandol2 4:85dda8d9a528 439 printf("=============cube sec context print================\n");
gandol2 4:85dda8d9a528 440 print_mbedtls_aes_context(printStr.mbed_ctx);
gandol2 4:85dda8d9a528 441 printf("---------------- cmd --------------------\n");
gandol2 4:85dda8d9a528 442 printf("cmd : %02X\n", printStr.cmd);
gandol2 4:85dda8d9a528 443 //printf("-----------------------------------------\n");
gandol2 4:85dda8d9a528 444 print_cube_sec_data(printStr.sec_data);
gandol2 4:85dda8d9a528 445 print_cube_sec_key(printStr.sec_key);
gandol2 4:85dda8d9a528 446 printf("===================================================\n");
gandol2 4:85dda8d9a528 447 }
gandol2 4:85dda8d9a528 448
gandol2 4:85dda8d9a528 449 bool cube_crypt_spi_cmd_set(cube_sec_context *cube_ctx, uint8_t cmd, // test func
gandol2 4:85dda8d9a528 450 uint8_t input_data[16], uint16_t keycrc)
gandol2 4:85dda8d9a528 451 {
gandol2 4:85dda8d9a528 452 bool ret = false;
gandol2 4:85dda8d9a528 453
gandol2 4:85dda8d9a528 454 cube_ctx->cmd = cmd;
gandol2 4:85dda8d9a528 455 for(int iCnt = 0 ; iCnt < 16 ; ++iCnt)
gandol2 4:85dda8d9a528 456 cube_ctx->sec_data.input_data[iCnt] = input_data[iCnt];
gandol2 4:85dda8d9a528 457 cube_ctx->sec_key.key_crc = keycrc;
gandol2 4:85dda8d9a528 458
gandol2 4:85dda8d9a528 459 print_cube_sec_context(*cube_ctx);
gandol2 4:85dda8d9a528 460
gandol2 4:85dda8d9a528 461 return ret;
gandol2 4:85dda8d9a528 462 }
gandol2 4:85dda8d9a528 463
gandol2 4:85dda8d9a528 464 cube_sec_context tempContext;
gandol2 4:85dda8d9a528 465
gandol2 4:85dda8d9a528 466 #endif
gandol2 3:9ab0f5f0ed9e 467
gandol2 3:9ab0f5f0ed9e 468
gandol2 3:9ab0f5f0ed9e 469 /** @brief main function ###################################################################
gandol2 3:9ab0f5f0ed9e 470 *
gandol2 3:9ab0f5f0ed9e 471 */
gandol2 0:86ca686388bb 472 int main()
gandol2 0:86ca686388bb 473 {
gandol2 4:85dda8d9a528 474 uint8_t ret;
gandol2 4:85dda8d9a528 475 uint8_t spiMOSIBuf[255];
gandol2 4:85dda8d9a528 476 uint8_t spiMISOBuf[255];
gandol2 3:9ab0f5f0ed9e 477 char eepAddr = 0;
gandol2 0:86ca686388bb 478 char eepData = 0;
gandol2 0:86ca686388bb 479
gandol2 4:85dda8d9a528 480 int packetLength = 0;
gandol2 3:9ab0f5f0ed9e 481
gandol2 4:85dda8d9a528 482 uint8_t spiRxTempBuf = 0;
gandol2 4:85dda8d9a528 483
gandol2 4:85dda8d9a528 484
gandol2 4:85dda8d9a528 485 bool crcCheck = false;
gandol2 4:85dda8d9a528 486 uint16_t size = 0;
gandol2 4:85dda8d9a528 487 uint16_t readCrc = 0;
gandol2 4:85dda8d9a528 488 uint16_t genCrc = 0;
gandol2 3:9ab0f5f0ed9e 489
gandol2 4:85dda8d9a528 490 spiDataStr rxData;
gandol2 4:85dda8d9a528 491
gandol2 4:85dda8d9a528 492 pc_serial.printf("\n\n========== KSS SPI Slave1 [Start] ==========\n");
gandol2 3:9ab0f5f0ed9e 493
gandol2 3:9ab0f5f0ed9e 494 SPI_InitSlave();
gandol2 3:9ab0f5f0ed9e 495
gandol2 4:85dda8d9a528 496 #if SPI_INTERRUPT
gandol2 4:85dda8d9a528 497 SPI_InitInterrupt();
gandol2 4:85dda8d9a528 498 while(1);
gandol2 4:85dda8d9a528 499 #endif /* SPI_INTERRUPT */
gandol2 3:9ab0f5f0ed9e 500
gandol2 4:85dda8d9a528 501 pc_serial.printf("\n\n========== KSS SPI Slave2 [Start] ==========\n");
gandol2 3:9ab0f5f0ed9e 502
gandol2 0:86ca686388bb 503
gandol2 4:85dda8d9a528 504 memset(spiMISOBuf, 0, 255);
gandol2 4:85dda8d9a528 505 memset(spiMOSIBuf, 0, 255);
gandol2 4:85dda8d9a528 506 while(1)
gandol2 4:85dda8d9a528 507 {
gandol2 4:85dda8d9a528 508 pc_serial.printf("\n\nwaiting CEBF746 cmd...\n");
gandol2 4:85dda8d9a528 509
gandol2 4:85dda8d9a528 510
gandol2 4:85dda8d9a528 511
gandol2 4:85dda8d9a528 512
gandol2 4:85dda8d9a528 513 spiRxTempBuf = slave_read_byte();
gandol2 4:85dda8d9a528 514 printf("menu[%02X]\n", spiRxTempBuf);
gandol2 3:9ab0f5f0ed9e 515
gandol2 4:85dda8d9a528 516 switch(spiRxTempBuf)
gandol2 4:85dda8d9a528 517 {
gandol2 4:85dda8d9a528 518 case FUNC_READ_STATUS:
gandol2 4:85dda8d9a528 519 slave_write_byte( cebf746_status_reg );
gandol2 4:85dda8d9a528 520 printf("[INFO] Response Status reg [%02X]\n", cebf746_status_reg);
gandol2 4:85dda8d9a528 521 break;
gandol2 4:85dda8d9a528 522
gandol2 4:85dda8d9a528 523 case FUNC_WRITE_ENC_DATA:
gandol2 4:85dda8d9a528 524
gandol2 4:85dda8d9a528 525 uint16_t packetSize = 0;
gandol2 4:85dda8d9a528 526 uint8_t tempBuf[CEB_BUF_SIZE] = {0, };
gandol2 4:85dda8d9a528 527 uint16_t retCrc = 0;
gandol2 4:85dda8d9a528 528
gandol2 4:85dda8d9a528 529
gandol2 4:85dda8d9a528 530 slave_read_uint16(&packetSize);
gandol2 4:85dda8d9a528 531 if(packetSize != CEB_BUF_SIZE)
gandol2 4:85dda8d9a528 532 {
gandol2 4:85dda8d9a528 533 printf("[ERROR] %s : %d : packet size error, recived packet size[%d]\n", __FILE__, __LINE__, packetSize);
gandol2 4:85dda8d9a528 534 continue;
gandol2 4:85dda8d9a528 535 }
gandol2 4:85dda8d9a528 536 slave_read_multi_byte(tempBuf, CEB_BUF_SIZE);
gandol2 4:85dda8d9a528 537 slave_read_uint16(&retCrc);
gandol2 4:85dda8d9a528 538
gandol2 4:85dda8d9a528 539 cube_crc_16(CEB_BUF_SIZE, tempBuf, &genCrc);
gandol2 4:85dda8d9a528 540 crcCheck = cube_crc_compare(retCrc, genCrc);
gandol2 4:85dda8d9a528 541 if(true == crcCheck )
gandol2 4:85dda8d9a528 542 slave_write_byte(WRITE_SELF_TEST_RET_CODE);
gandol2 4:85dda8d9a528 543 else
gandol2 4:85dda8d9a528 544 slave_write_byte(0x00);
gandol2 4:85dda8d9a528 545
gandol2 4:85dda8d9a528 546 _cebf746_print_packet(packetSize, tempBuf, retCrc);
gandol2 4:85dda8d9a528 547
gandol2 4:85dda8d9a528 548 if(true == crcCheck )
gandol2 4:85dda8d9a528 549 {
gandol2 4:85dda8d9a528 550 cube_crypt_spi_cmd_set(&tempContext, 0x02,tempBuf, 0);
gandol2 4:85dda8d9a528 551 pc_serial.printf("call \"cube_crypt_spi_cmd_set()\"\n");
gandol2 4:85dda8d9a528 552 }
gandol2 4:85dda8d9a528 553 else
gandol2 4:85dda8d9a528 554 {
gandol2 4:85dda8d9a528 555 printf("[ERROR] %s : %d : FUNC_WRITE_ENC_DATA CRC Error\n", __FILE__, __LINE__);
gandol2 4:85dda8d9a528 556 }
gandol2 4:85dda8d9a528 557
gandol2 4:85dda8d9a528 558 break;
gandol2 4:85dda8d9a528 559
gandol2 4:85dda8d9a528 560 case FUNC_READ_ENC_DATA:
gandol2 4:85dda8d9a528 561 break;
gandol2 4:85dda8d9a528 562
gandol2 4:85dda8d9a528 563 case FUNC_WRITE_DEC_DATA:
gandol2 4:85dda8d9a528 564 break;
gandol2 4:85dda8d9a528 565
gandol2 4:85dda8d9a528 566 case FUNC_READ_DEC_DATA:
gandol2 4:85dda8d9a528 567 break;
gandol2 4:85dda8d9a528 568
gandol2 4:85dda8d9a528 569
gandol2 4:85dda8d9a528 570 case FUNC_WRITE_SELF_TEST: // 161017_KSS_Test OK
gandol2 4:85dda8d9a528 571
gandol2 4:85dda8d9a528 572 slave_read_uint16(&rxData.size);
gandol2 4:85dda8d9a528 573
gandol2 4:85dda8d9a528 574 rxData.buf = (uint8_t*)malloc(rxData.size);
gandol2 4:85dda8d9a528 575 slave_read_multi_byte(rxData.buf, rxData.size);
gandol2 4:85dda8d9a528 576
gandol2 4:85dda8d9a528 577 slave_read_uint16(&rxData.crc16);
gandol2 4:85dda8d9a528 578
gandol2 4:85dda8d9a528 579
gandol2 4:85dda8d9a528 580
gandol2 4:85dda8d9a528 581 cube_crc_16(rxData.size, rxData.buf, &genCrc);
gandol2 4:85dda8d9a528 582
gandol2 4:85dda8d9a528 583 crcCheck = cube_crc_compare(rxData.crc16, genCrc);
gandol2 4:85dda8d9a528 584 if(true == crcCheck )
gandol2 4:85dda8d9a528 585 slave_write_byte(WRITE_SELF_TEST_RET_CODE);
gandol2 4:85dda8d9a528 586 else
gandol2 4:85dda8d9a528 587 slave_write_byte(0x00);
gandol2 4:85dda8d9a528 588
gandol2 4:85dda8d9a528 589 // ----- print rx buf
gandol2 4:85dda8d9a528 590 cebf746_print_packet(&rxData);
gandol2 4:85dda8d9a528 591
gandol2 4:85dda8d9a528 592 pc_serial.printf("crc read[%04X], gen[%04X] check...", rxData.crc16, genCrc);
gandol2 4:85dda8d9a528 593 if(true == crcCheck )
gandol2 4:85dda8d9a528 594 pc_serial.printf("[OK]\n");
gandol2 4:85dda8d9a528 595 else
gandol2 4:85dda8d9a528 596 pc_serial.printf("[FAIL]\n");
gandol2 4:85dda8d9a528 597
gandol2 4:85dda8d9a528 598 // ----- free()
gandol2 4:85dda8d9a528 599 free(rxData.buf);
gandol2 4:85dda8d9a528 600
gandol2 4:85dda8d9a528 601 break;
gandol2 4:85dda8d9a528 602
gandol2 4:85dda8d9a528 603 case FUNC_READ_SELF_TEST: // 161017_KSS_Test OK
gandol2 4:85dda8d9a528 604 //printf("FUNC_READ_SELF_TEST\n");
gandol2 4:85dda8d9a528 605 // TODO check status reg
gandol2 4:85dda8d9a528 606
gandol2 4:85dda8d9a528 607 cube_crc_16(CEB_BUF_SIZE, readSelfTestValidateData, &genCrc);
gandol2 4:85dda8d9a528 608
gandol2 4:85dda8d9a528 609
gandol2 4:85dda8d9a528 610 slave_write_byte((CEB_BUF_SIZE >> 8) & 0xFF);
gandol2 4:85dda8d9a528 611 slave_write_byte((CEB_BUF_SIZE ) & 0xFF);
gandol2 4:85dda8d9a528 612 slave_write_multi_byte(readSelfTestValidateData, CEB_BUF_SIZE);
gandol2 4:85dda8d9a528 613 slave_write_byte((genCrc >> 8) & 0xFF);
gandol2 4:85dda8d9a528 614 slave_write_byte((genCrc ) & 0xFF);
gandol2 4:85dda8d9a528 615
gandol2 4:85dda8d9a528 616
gandol2 4:85dda8d9a528 617
gandol2 4:85dda8d9a528 618 printf("--send end\n");
gandol2 4:85dda8d9a528 619
gandol2 4:85dda8d9a528 620 wait_ms(100);
gandol2 4:85dda8d9a528 621
gandol2 4:85dda8d9a528 622 break;
gandol2 4:85dda8d9a528 623
gandol2 4:85dda8d9a528 624
gandol2 3:9ab0f5f0ed9e 625
gandol2 3:9ab0f5f0ed9e 626
gandol2 3:9ab0f5f0ed9e 627
gandol2 4:85dda8d9a528 628 }
gandol2 3:9ab0f5f0ed9e 629
gandol2 4:85dda8d9a528 630
gandol2 3:9ab0f5f0ed9e 631
gandol2 4:85dda8d9a528 632
gandol2 0:86ca686388bb 633 }
gandol2 3:9ab0f5f0ed9e 634
gandol2 0:86ca686388bb 635
gandol2 3:9ab0f5f0ed9e 636
gandol2 0:86ca686388bb 637
gandol2 3:9ab0f5f0ed9e 638
gandol2 0:86ca686388bb 639
gandol2 3:9ab0f5f0ed9e 640
gandol2 0:86ca686388bb 641 }//end of main