DA14580 Bluetooth Smart IC writer library
Dependents: 11u35_usbLocalFilesystem
DA14580.cpp@9:e2e84de053fc, 2016-08-12 (annotated)
- 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?
User | Revision | Line number | New 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 |