#include "sysmgr.h" #include #include #include #include #include #include #include #include "nrf_spi.h" #include "nrf_drv_spi.h" #include "nrf_pwr_mgmt.h" #include "main.h" stSystemTimer SystemTimer; stSystemManager SystemManager; extern const nrf_drv_spi_t spi; /**< SPI instance. */ extern volatile bool spi_xfer_done; /**< Flag used to indicate that SPI instance completed the transfer. */ uint8_t m_tx_buf[64]; /**< TX buffer. */ uint8_t m_rx_buf[64]; /**< RX buffer. */ uint8_t m_length; /**< Transfer length. */ RegMacPool_t RegMacPool; const char *fds_err_str(ret_code_t ret) { /* Array to map FDS return values to strings. */ static char const * err_str[] = { "FDS_ERR_OPERATION_TIMEOUT", "FDS_ERR_NOT_INITIALIZED", "FDS_ERR_UNALIGNED_ADDR", "FDS_ERR_INVALID_ARG", "FDS_ERR_NULL_ARG", "FDS_ERR_NO_OPEN_RECORDS", "FDS_ERR_NO_SPACE_IN_FLASH", "FDS_ERR_NO_SPACE_IN_QUEUES", "FDS_ERR_RECORD_TOO_LARGE", "FDS_ERR_NOT_FOUND", "FDS_ERR_NO_PAGES", "FDS_ERR_USER_LIMIT_REACHED", "FDS_ERR_CRC_CHECK_FAILED", "FDS_ERR_BUSY", "FDS_ERR_INTERNAL", }; return err_str[ret - NRF_ERROR_FDS_ERR_BASE]; } void ParkSysInit() { SystemTimer.TMR_SYS_OFF = 3; } void ParkPowerOff() { SystemTimer.TMR_SYS_OFF = 0; } void SC16IS750_FIFOEnable(unsigned char fifo_enable) { unsigned char temp_fcr; temp_fcr = SC16IS750_ReadRegister(SC16IS750_REG_FCR); if (fifo_enable == 0){ temp_fcr &= 0xFE; } else { temp_fcr |= 0x01; } SC16IS750_WriteRegister(SC16IS750_REG_FCR,temp_fcr); return; } void SC16IS750_WriteRegister(unsigned char reg_addr, unsigned char val) { m_tx_buf[0] = reg_addr<<3; m_tx_buf[1] = val; //nrf_gpio_pin_write( SPI_SS_PIN,0); nrf_delay_us(10); nrf_drv_spi_transfer(&spi, m_tx_buf, 2, m_rx_buf, 0); nrf_delay_us(10); //nrf_gpio_pin_write( SPI_SS_PIN,1); return ; } unsigned char SC16IS750_ReadRegister(unsigned char reg_addr) { unsigned char result; m_tx_buf[0] = 0x80|(reg_addr<<3); // nrf_gpio_pin_write( SPI_SS_PIN,0); nrf_delay_us(10); nrf_drv_spi_transfer(&spi, m_tx_buf, 1, m_rx_buf, 1); result = m_rx_buf[0]; nrf_delay_us(10); // nrf_gpio_pin_write( SPI_SS_PIN,1); return result; } void SC16IS750_ResetDevice(void) { unsigned char reg; reg = SC16IS750_ReadRegister(SC16IS750_REG_IOCONTROL); reg |= 0x08; SC16IS750_WriteRegister(SC16IS750_REG_IOCONTROL, reg); return; } int16_t SC16IS750_SetBaudrate(uint32_t baudrate) //return error of baudrate parts per thousand { uint16_t divisor; uint8_t prescaler; uint32_t actual_baudrate; int16_t error; uint8_t temp_lcr; if ( (SC16IS750_ReadRegister(SC16IS750_REG_MCR)&0x80) == 0) { //if prescaler==1 prescaler = 1; } else { prescaler = 4; } prescaler = 1; divisor = (SC16IS750_CRYSTCAL_FREQ/prescaler)/(baudrate*16); temp_lcr = SC16IS750_ReadRegister(SC16IS750_REG_LCR); temp_lcr |= 0x80; SC16IS750_WriteRegister(SC16IS750_REG_LCR,temp_lcr); //write to DLL SC16IS750_WriteRegister(SC16IS750_REG_DLL,(uint8_t)divisor); //write to DLH SC16IS750_WriteRegister(SC16IS750_REG_DLH,(uint8_t)(divisor>>8)); temp_lcr &= 0x7F; SC16IS750_WriteRegister(SC16IS750_REG_LCR,temp_lcr); actual_baudrate = (SC16IS750_CRYSTCAL_FREQ/prescaler)/(16*divisor); error = ((float)actual_baudrate-baudrate)*1000/baudrate; return error; } void SC16IS750_SetLine(uint8_t data_length, uint8_t parity_select, uint8_t stop_length ) { uint8_t temp_lcr; temp_lcr = SC16IS750_ReadRegister(SC16IS750_REG_LCR); temp_lcr &= 0xC0; //Clear the lower six bit of LCR (LCR[0] to LCR[5] switch (data_length) { //data length settings case 5: break; case 6: temp_lcr |= 0x01; break; case 7: temp_lcr |= 0x02; break; case 8: temp_lcr |= 0x03; break; default: temp_lcr |= 0x03; break; } if ( stop_length == 2 ) { temp_lcr |= 0x04; } switch (parity_select) { //parity selection length settings case 0: //no parity break; case 1: //odd parity temp_lcr |= 0x08; break; case 2: //even parity temp_lcr |= 0x18; break; case 3: //force '1' parity temp_lcr |= 0x03; break; case 4: //force '0' parity break; default: break; } SC16IS750_WriteRegister(SC16IS750_REG_LCR,temp_lcr); } void SC16IS750_WriteByte(uint8_t val) { uint8_t tmp_lsr; do { tmp_lsr = SC16IS750_ReadRegister(SC16IS750_REG_LSR); } while ((tmp_lsr&0x20) ==0); //nrf_delay_ms(1); SC16IS750_WriteRegister(SC16IS750_REG_THR,val); } int DBGPrint(const char *fmt, ...) { char buff[128]; va_list args; int n; int i; va_start(args, fmt); n = vsnprintf(buff, 120, fmt, args); va_end(args); //HAL_UART_Transmit(CLIUart, (uint8_t*)buff, n, 500); for( i=0; iconfig1_on ? "on" : "off", p_cfg->config2_on ? "on" : "off", p_cfg->boot_count, p_cfg->device_name); rc = fds_record_close(&desc); APP_ERROR_CHECK(rc); } } static void print_all_cmd( ) { fds_find_token_t tok = {0}; fds_record_desc_t desc = {0}; uint8_t *data; NRF_LOG_INFO("rec. id \t file id \t rec. key \t length"); while (fds_record_iterate(&desc, &tok) != FDS_ERR_NOT_FOUND) { ret_code_t rc; fds_flash_record_t frec = {0}; rc = fds_record_open(&desc, &frec); switch (rc) { case NRF_SUCCESS: break; case FDS_ERR_CRC_CHECK_FAILED: NRF_LOG_INFO( "error: CRC check failed!\n"); continue; case FDS_ERR_NOT_FOUND: NRF_LOG_INFO( "error: record not found!\n"); continue; default: { NRF_LOG_INFO("error: unexpecte error %s.\n", fds_err_str(rc)); continue; } } uint32_t const len = frec.p_header->length_words * sizeof(uint32_t); NRF_LOG_INFO( " 0x%04x" "\t 0x%04x" "\t 0x%04x" "\t %4u bytes\t", frec.p_header->record_id, frec.p_header->file_id, frec.p_header->record_key, len); data = (uint8_t *) frec.p_data; for (uint8_t i=0;ilength_words * sizeof(uint32_t); NRF_LOG_RAW_INFO( " 0x%04x\t" "\t 0x%04x\t" "\t 0x%04x\t" "\t %4u bytes\t", frec.p_header->record_id, frec.p_header->file_id, frec.p_header->record_key, len); data = (uint8_t *) frec.p_data; if( RegMacPool.Count >= 5 ) { NRF_LOG_RAW_INFO( "Mac Pool Over\n"); return; } RegMacPool.Mac[RegMacPool.Count][12] = 0; strncpy( RegMacPool.Mac[RegMacPool.Count++], data, 12); //for (uint8_t i=0;ilength_words * sizeof(uint32_t); NRF_LOG_RAW_INFO( " 0x%04x\t" "\t 0x%04x\t" "\t 0x%04x\t" "\t %4u bytes\t", frec.p_header->record_id, frec.p_header->file_id, frec.p_header->record_key, len); data = (uint8_t *) frec.p_data; strncpy( SystemManager.StrRegPeerAddr, data, 12); strncpy( tmpBuf, SystemManager.StrRegPeerAddr, 12); SystemManager.StrRegPeerAddr[12] = 0; tmpBuf[12] = 0; NRF_LOG_RAW_INFO( "%s\n",SystemManager.StrRegPeerAddr); SystemManager.RegPeerAddr[5] = (uint8_t)strtol(&tmpBuf[10], NULL, 16); tmpBuf[10] = 0; SystemManager.RegPeerAddr[4] = (uint8_t)strtol(&tmpBuf[8], NULL, 16); tmpBuf[8] = 0; SystemManager.RegPeerAddr[3] = (uint8_t)strtol(&tmpBuf[6], NULL, 16); tmpBuf[6] = 0; SystemManager.RegPeerAddr[2] = (uint8_t)strtol(&tmpBuf[4], NULL, 16); tmpBuf[4] = 0; SystemManager.RegPeerAddr[1] = (uint8_t)strtol(&tmpBuf[2], NULL, 16); tmpBuf[2] = 0; SystemManager.RegPeerAddr[0] = (uint8_t)strtol(&tmpBuf[0], NULL, 16); rc = fds_record_close(&desc); APP_ERROR_CHECK(rc); } } void SaveRegMac(char* mac) { int i; if( RegMacPool.Count>= 5 ) return; for( i=0; i SaveReceiverMac : %s\n", m_data); record_write(1,1, m_data, 12); print_all_cmd(); //FlashTest(); } int FindRegMac(char* mac) { int i; for( i=0; i20) { Key[KEY_SELECT].softRelease = 1; KeySelectLongPressedOne(); } } } void KeySelectLongPressedOne(void) { NRF_LOG_INFO("KeySelectLongPressedOne\r\n" ); SystemManager.EmgSendButton = BUTTON_REG; } void PortInputCfg(void) { #if 1 uint32_t i; for (i = 17; i <= 20; ++i) { nrf_gpio_cfg_input(i, NRF_GPIO_PIN_PULLDOWN); //nrf_gpio_cfg_input(i, NRF_GPIO_PIN_PULLUP); } for (i = 12; i <= 15; ++i) { //nrf_gpio_cfg_input(i, NRF_GPIO_PIN_PULLDOWN); //nrf_gpio_cfg_input(i, NRF_GPIO_PIN_PULLUP); } nrf_gpio_cfg_input(7, NRF_GPIO_PIN_PULLDOWN); #endif } uint8_t AesBuffer[16]; void CarEncryptEcb(int mode) { uint8_t key[] = {0x53, 0x6D, 0x61, 0x72, 0x74, 0x42, 0x61, 0x6E, 0x64, 0x50, 0x41, 0x52, 0x54, 0x52, 0x4F, 0x4E}; // SmartBandPARTRON uint8_t in[] = {'C', 'A', 'R', 1,2,3,4,5,6,7,8,9,10,11,12,13 }; uint16_t tempVal; if( mode == AES_ENC_CAR ) { in[0] = 'C'; in[1] = 'A'; in[2] = 'R'; }else if( mode == AES_ENC_EMG ) { in[0] = 'E'; in[1] = 'M'; in[2] = 'G'; }else if( mode == AES_ENC_WES_EMG ) { in[0] = 'E'; in[1] = 'M'; in[2] = 'G'; } tempVal = rand(); in[3] = tempVal&0xff; in[4] = (tempVal>>8)&0xff; AES128_ECB_encrypt(in, key, SystemManager.AesEncData); NRF_LOG_RAW_INFO("ECB encrypt: %x\n", tempVal); } void WesEncryptEcb(uint8_t* in) { int i; uint8_t* inOrg = in; uint8_t key[] = {0x53, 0x6D, 0x61, 0x72, 0x74, 0x42, 0x61, 0x6E, 0x64, 0x50, 0x41, 0x52, 0x54, 0x52, 0x4F, 0x4E}; // SmartBandPARTRON //for( i=0; i<16; i++) { //*(in+i) = i+1; //in++; } AES128_ECB_encrypt(in, key, SystemManager.AesEncData); memcpy( inOrg, SystemManager.AesEncData, 16 ); } // 0x73:parking 0x72:emg void CarEncryptEcbACK(char type) { uint8_t key[] = {0x53, 0x6D, 0x61, 0x72, 0x74, 0x42, 0x61, 0x6E, 0x64, 0x50, 0x41, 0x52, 0x54, 0x52, 0x4F, 0x4E}; // SmartBandPARTRON uint8_t in[] = {'C', 'A', 'R', 'A','C','K',1,2,3,4,5,6,7,8,9,0x0A }; switch(type){ // BAND EMG case 0x72: in[3] = 'E'; in[4] = 'M'; in[5] = 'G'; break; // NEW iOS APP case 0x75: in[3] = 'P'; in[4] = 'C'; in[5] = 'A'; break; } AES128_ECB_encrypt(in, key, SystemManager.AesEncData); NRF_LOG_RAW_INFO("ECB ACK\n"); }