DA14580 Bluetooth Smart IC writer library

Dependents:   11u35_usbLocalFilesystem

Committer:
k4zuki
Date:
Fri Aug 12 06:34:58 2016 +0000
Revision:
9:e2e84de053fc
Parent:
8:af5210dbfe64
load() handles filename

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