DA14580 Bluetooth Smart IC writer library

Dependents:   11u35_usbLocalFilesystem

Committer:
k4zuki
Date:
Thu Jul 07 01:26:52 2016 +0000
Revision:
8:af5210dbfe64
Parent:
7:5f0fe36be5b3
Child:
9:e2e84de053fc
resets target at init; use external header file "loader.h" which declares loader[] to load secondary bootloader

Who changed what in which revision?

UserRevisionLine numberNew contents of line
k4zuki 6:db0ae78150a3 1 /*
k4zuki 5:45e9f3723a08 2 @file DA14580.cpp
k4zuki 5:45e9f3723a08 3 */
k4zuki 5:45e9f3723a08 4 //#include "mbed.h"
k4zuki 0:3bdbabca8a09 5 #include "DA14580.h"
k4zuki 8:af5210dbfe64 6 #include "loader.h"
k4zuki 0:3bdbabca8a09 7
k4zuki 0:3bdbabca8a09 8 DA14580::DA14580( PinName TX, PinName RX, PinName RESET ) : _ble(TX,RX), _reset(RESET)
k4zuki 0:3bdbabca8a09 9 {
k4zuki 5:45e9f3723a08 10 _ble.baud(57600);
k4zuki 0:3bdbabca8a09 11 init();
k4zuki 0:3bdbabca8a09 12 }
k4zuki 0:3bdbabca8a09 13
k4zuki 0:3bdbabca8a09 14 DA14580::DA14580( RawSerial &ble, PinName RESET ) : _ble(ble), _reset(RESET)
k4zuki 0:3bdbabca8a09 15 {
k4zuki 5:45e9f3723a08 16 _ble.baud(57600);
k4zuki 0:3bdbabca8a09 17 init();
k4zuki 0:3bdbabca8a09 18 }
k4zuki 0:3bdbabca8a09 19
k4zuki 0:3bdbabca8a09 20 DA14580::~DA14580()
k4zuki 0:3bdbabca8a09 21 {
k4zuki 0:3bdbabca8a09 22 }
k4zuki 0:3bdbabca8a09 23
k4zuki 0:3bdbabca8a09 24 void DA14580::init()
k4zuki 0:3bdbabca8a09 25 {
k4zuki 0:3bdbabca8a09 26
k4zuki 8:af5210dbfe64 27 _reset.write(_RESET);
k4zuki 8:af5210dbfe64 28 _loadersize = sizeof(loader)/sizeof(loader[0]);
k4zuki 0:3bdbabca8a09 29 _crc = 0x00;
k4zuki 0:3bdbabca8a09 30 _recieve = 0;
k4zuki 0:3bdbabca8a09 31 _read = 0;
k4zuki 0:3bdbabca8a09 32 _filesize = 0;
k4zuki 5:45e9f3723a08 33 _reset.write(_RESET);
k4zuki 5:45e9f3723a08 34 _timeout = _TIMEOUT;
k4zuki 0:3bdbabca8a09 35 _status = SUCCESS;
k4zuki 0:3bdbabca8a09 36 }
k4zuki 0:3bdbabca8a09 37
k4zuki 0:3bdbabca8a09 38 int DA14580::load()
k4zuki 0:3bdbabca8a09 39 {
k4zuki 0:3bdbabca8a09 40
k4zuki 7:5f0fe36be5b3 41 _reset.write(_RESET);
k4zuki 0:3bdbabca8a09 42 _status = SUCCESS;
k4zuki 8:af5210dbfe64 43 /*
k4zuki 7:5f0fe36be5b3 44 _fp = fopen(TARGET_FILE, "r" );
k4zuki 0:3bdbabca8a09 45 if (_fp) {
k4zuki 0:3bdbabca8a09 46 _filesize = file_size(_fp);
k4zuki 0:3bdbabca8a09 47 } else {
k4zuki 0:3bdbabca8a09 48 _status = E_FILE_NOT_FOUND;
k4zuki 0:3bdbabca8a09 49 }
k4zuki 8:af5210dbfe64 50 */
k4zuki 5:45e9f3723a08 51 if(_status == SUCCESS) {
k4zuki 5:45e9f3723a08 52 _reset.write(_BOOT);
k4zuki 5:45e9f3723a08 53 wait_us(1);
k4zuki 5:45e9f3723a08 54 while(1) {
k4zuki 5:45e9f3723a08 55 while( _ble.readable() ) {
k4zuki 5:45e9f3723a08 56 _recieve = _ble.getc();
k4zuki 5:45e9f3723a08 57 }
k4zuki 5:45e9f3723a08 58 if(_recieve == STX) {
k4zuki 5:45e9f3723a08 59 _ble.putc(SOH);
k4zuki 8:af5210dbfe64 60 _ble.putc(_loadersize & 0xff);
k4zuki 8:af5210dbfe64 61 _ble.putc( (_loadersize >> 8) & 0xff);
k4zuki 5:45e9f3723a08 62 break;
k4zuki 5:45e9f3723a08 63 }
k4zuki 5:45e9f3723a08 64 }
k4zuki 5:45e9f3723a08 65
k4zuki 5:45e9f3723a08 66 while(1) {
k4zuki 5:45e9f3723a08 67 _recieve = _ble.getc();
k4zuki 5:45e9f3723a08 68 if(_recieve == ACK) {
k4zuki 5:45e9f3723a08 69 break;
k4zuki 5:45e9f3723a08 70 } else {
k4zuki 5:45e9f3723a08 71 _status = E_ACK_NOT_RETURNED;
k4zuki 5:45e9f3723a08 72 break;
k4zuki 5:45e9f3723a08 73 }
k4zuki 5:45e9f3723a08 74 }
k4zuki 5:45e9f3723a08 75
k4zuki 5:45e9f3723a08 76 if(_status == SUCCESS) {
k4zuki 8:af5210dbfe64 77 for(int i = 0; i < _loadersize; i++) {
k4zuki 8:af5210dbfe64 78 _read = loader[i];
k4zuki 5:45e9f3723a08 79 _ble.putc(_read);
k4zuki 5:45e9f3723a08 80 _crc = _crc ^ _read;
k4zuki 5:45e9f3723a08 81 }
k4zuki 5:45e9f3723a08 82 while(1) {
k4zuki 5:45e9f3723a08 83 _recieve = _ble.getc();
k4zuki 5:45e9f3723a08 84 if(_recieve == _crc) {
k4zuki 5:45e9f3723a08 85 _ble.putc(ACK);
k4zuki 5:45e9f3723a08 86 break;
k4zuki 5:45e9f3723a08 87 } else {
k4zuki 5:45e9f3723a08 88 _status = E_CRC_MISMATCH;
k4zuki 5:45e9f3723a08 89 break;
k4zuki 5:45e9f3723a08 90 }
k4zuki 5:45e9f3723a08 91 }
k4zuki 5:45e9f3723a08 92 }
k4zuki 5:45e9f3723a08 93 }
k4zuki 8:af5210dbfe64 94 /*
k4zuki 5:45e9f3723a08 95 fclose(_fp);
k4zuki 5:45e9f3723a08 96 #if defined(__MICROLIB) && defined(__ARMCC_VERSION) // with microlib and ARM compiler
k4zuki 5:45e9f3723a08 97 #warning "free(_fp)"
k4zuki 5:45e9f3723a08 98 free(_fp);
k4zuki 5:45e9f3723a08 99 #endif
k4zuki 8:af5210dbfe64 100 */
k4zuki 0:3bdbabca8a09 101 return _status;
k4zuki 0:3bdbabca8a09 102
k4zuki 0:3bdbabca8a09 103 }
k4zuki 0:3bdbabca8a09 104
k4zuki 8:af5210dbfe64 105 /*
k4zuki 8:af5210dbfe64 106 header[0] | 0x70 | 'p'
k4zuki 8:af5210dbfe64 107 header[1] | 0x50 | 'P'
k4zuki 8:af5210dbfe64 108 header[2] | 0x00 | dummy[3]
k4zuki 8:af5210dbfe64 109 header[3] | 0x00 | dummy[2]
k4zuki 8:af5210dbfe64 110 header[4] | 0x00 | dummy[1]
k4zuki 8:af5210dbfe64 111 header[5] | 0x00 | dummy[0]
k4zuki 8:af5210dbfe64 112 header[6] | 0x00 | binary size MSB <- to be replaced to actual size
k4zuki 8:af5210dbfe64 113 header[7] | 0x00 | binary size LSB <- to be replaced to actual size
k4zuki 8:af5210dbfe64 114 */
k4zuki 8:af5210dbfe64 115 void DA14580::copy_to_flash(W25X40BV* flash)
k4zuki 8:af5210dbfe64 116 {
k4zuki 8:af5210dbfe64 117 uint8_t Headerbuffer[8] = {0x70,0x50,0x00,0x00,0x00,0x00,0x00,0x00};
k4zuki 8:af5210dbfe64 118 char data[256];
k4zuki 8:af5210dbfe64 119 int i=1;
k4zuki 8:af5210dbfe64 120 _fp = fopen(TARGET_FILE, "rb" );
k4zuki 8:af5210dbfe64 121 if (_fp) {
k4zuki 8:af5210dbfe64 122 _reset.write(_RESET);
k4zuki 8:af5210dbfe64 123 //erase 64KByte
k4zuki 8:af5210dbfe64 124 flash->block32Erase(0);
k4zuki 8:af5210dbfe64 125 flash->block32Erase(1);
k4zuki 8:af5210dbfe64 126
k4zuki 8:af5210dbfe64 127 _filesize = file_size(_fp);
k4zuki 8:af5210dbfe64 128 Headerbuffer[6]= (uint8_t)( (_filesize >> 8) & 0xff);
k4zuki 8:af5210dbfe64 129 Headerbuffer[7]= (uint8_t)(_filesize & 0xff);
k4zuki 8:af5210dbfe64 130
k4zuki 8:af5210dbfe64 131 flash->writeStream(0, Headerbuffer, 8);
k4zuki 8:af5210dbfe64 132 if(_filesize >= 248) {
k4zuki 8:af5210dbfe64 133 fgets(data, 248,_fp);
k4zuki 8:af5210dbfe64 134 flash->writeStream(8, (uint8_t*)data, (248));
k4zuki 8:af5210dbfe64 135 }
k4zuki 8:af5210dbfe64 136 _filesize -= (256-8);
k4zuki 8:af5210dbfe64 137
k4zuki 8:af5210dbfe64 138 while(_filesize >= 256) {
k4zuki 8:af5210dbfe64 139 fgets(data, (256), _fp);
k4zuki 8:af5210dbfe64 140 flash->writeStream(256*i, (uint8_t*)data, (256));
k4zuki 8:af5210dbfe64 141 i++;
k4zuki 8:af5210dbfe64 142 _filesize -= (256);
k4zuki 8:af5210dbfe64 143 }
k4zuki 8:af5210dbfe64 144
k4zuki 8:af5210dbfe64 145 if(_filesize > 0) {
k4zuki 8:af5210dbfe64 146 fgets(data, _filesize, _fp);
k4zuki 8:af5210dbfe64 147 flash->writeStream(256*i, (uint8_t*)data, (_filesize));
k4zuki 8:af5210dbfe64 148 }
k4zuki 8:af5210dbfe64 149 }
k4zuki 8:af5210dbfe64 150 fclose(_fp);
k4zuki 8:af5210dbfe64 151 #if defined(__MICROLIB) && defined(__ARMCC_VERSION) // with microlib and ARM compiler
k4zuki 8:af5210dbfe64 152 #warning "free(_fp)"
k4zuki 8:af5210dbfe64 153 free(_fp);
k4zuki 8:af5210dbfe64 154 #endif
k4zuki 8:af5210dbfe64 155 }
k4zuki 8:af5210dbfe64 156
k4zuki 0:3bdbabca8a09 157 int DA14580::file_size( FILE *fp )
k4zuki 0:3bdbabca8a09 158 {
k4zuki 0:3bdbabca8a09 159 int size;
k4zuki 0:3bdbabca8a09 160
k4zuki 0:3bdbabca8a09 161 fseek( fp, 0, SEEK_END ); // seek to end of file
k4zuki 0:3bdbabca8a09 162 size = ftell( fp ); // get current file pointer
k4zuki 0:3bdbabca8a09 163 fseek( fp, 0, SEEK_SET ); // seek back to beginning of file
k4zuki 0:3bdbabca8a09 164
k4zuki 0:3bdbabca8a09 165 return size;
k4zuki 0:3bdbabca8a09 166 }
k4zuki 0:3bdbabca8a09 167