Skip to content

Commit c5e7c70

Browse files
author
Maksymilian Wojczuk
committed
Remote Flashing
Added possibility to flash target STM32F4Discovery remotely
1 parent b2eaca9 commit c5e7c70

File tree

8 files changed

+196
-64
lines changed

8 files changed

+196
-64
lines changed

Inc/communication/wakaama_client/objects/object_target.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
#define __OBJECT_TARGET_H
33

44

5+
#include "target.h"
6+
57
/*
68
* Multiple instance objects can use userdata to store data that will be shared between the different instances.
79
* The lwm2m_object_t object structure - which represent every object of the liblwm2m as seen in the single instance
@@ -17,13 +19,15 @@ typedef struct _target_instance_
1719
uint16_t shortID; // matches lwm2m_list_t::id
1820

1921
uint8_t flash_state;
20-
uint32_t * target_type;
22+
char * target_type;
2123
char * firmware_url;
2224
uint8_t download_state;
2325
int16_t download_error;
2426
uint32_t firmware_version;
2527
char * binary_filename;
2628
uint8_t download_progress;
29+
uint8_t flash_error;
30+
TARGET_t *target;
2731
} target_instance_t;
2832

2933

Inc/fatfs.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ void MX_FATFS_Init(void);
7070

7171
/* USER CODE BEGIN Prototypes */
7272
void usb_ls();
73+
int usb_close_file(FIL *fp);
74+
int usb_open_file(const char *filename, FIL *fp, BYTE mode);
7375
int usb_write(const void *bytes, const char *filename, size_t size);
7476
/* USER CODE END Prototypes */
7577
#ifdef __cplusplus

Inc/target.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,14 @@
33

44
#include "fatfs.h"
55

6+
// Flash States
7+
#define NO_FLASH_DATA 0
8+
#define FLASH_IN_PROGRESS 1
9+
#define FLASH_ERROR 2
10+
#define FLASH_COMPLETED 3
11+
12+
#define USB_FS_ERROR 1
13+
614
// TODO: define real functions with real arguments
715
typedef struct TARGET_OPS_s {
816
int (*flash_target)(void *priv, FIL *file);
@@ -19,6 +27,8 @@ typedef struct TARGET_s {
1927
} TARGET_t;
2028

2129
void register_target(void *priv, TARGET_OPS_t *ops, char *name);
30+
void reset_target_task(void *object);
31+
void flash_target_task(void *object);
2232

2333
// Head of targets list
2434
extern TARGET_t target_list;

Src/communication/binary_download.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,6 @@ int startDownload(target_instance_t *targetP) {
121121
targetP->download_error = NO_ERROR;
122122
lwip_close(socket);
123123
lwm2m_free(url_str);
124-
vTaskDelete();
124+
vTaskDelete(NULL);
125125

126126
}

Src/communication/wakaama_client/objects/object_target.c

Lines changed: 115 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,16 @@
99
* Supported Multiple
1010
* Name | ID | Operations | Instances | Mandatory | Type | Range | Units | Description |
1111
* -----------------|----|------------|-----------|-----------|---------|-------|-------|-------------------------------|
12-
* target_type | 1 | R/W | No | Yes | | | | type of the programmable board|
12+
* target_type | 1 | R/W | No | Yes | string | | | type of the programmable board|
1313
* firmware_url | 2 | R/W | No | Yes | string | | | url to the binary |
1414
* download_state | 3 | R | No | Yes | integer | 0-255 | | state of the download |
1515
* firmware_version | 4 | R | No | Yes | integer | | | timestamp of the latest binary|
1616
* flash_target | 5 | E | No | Yes | | | | programms the target |
1717
* flash_state | 6 | R | No | Yes | integer | 0-100 | % | progress of flashing the board|
1818
* reset_target | 7 | E | No | Yes | | | | resets the target |
1919
* download_error | 8 | R | No | Yes | integer | | | download error |
20-
* download_progres | 9 | R | No | Yes | integer | 0-100 | % | progress of binary download |
20+
* download_progress| 9 | R | No | Yes | integer | 0-100 | % | progress of binary download |
21+
* flash_error | 10| R | No | Yes | integer | | | flashing error |
2122
*
2223
*/
2324

@@ -81,7 +82,7 @@ static uint8_t target_read(uint16_t instanceId,
8182

8283
if (*numDataP == 0)
8384
{
84-
*dataArrayP = lwm2m_data_new(7);
85+
*dataArrayP = lwm2m_data_new(8);
8586
if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;
8687
*numDataP = 4;
8788
(*dataArrayP)[0].id = 1;
@@ -91,14 +92,15 @@ static uint8_t target_read(uint16_t instanceId,
9192
(*dataArrayP)[4].id = 6;
9293
(*dataArrayP)[5].id = 8;
9394
(*dataArrayP)[6].id = 9;
95+
(*dataArrayP)[7].id = 10;
9496
}
9597

9698
for (i = 0 ; i < *numDataP ; i++)
9799
{
98100
switch ((*dataArrayP)[i].id)
99101
{
100102
case 1:
101-
lwm2m_data_encode_int(targetP->target_type, *dataArrayP + i);
103+
lwm2m_data_encode_string(targetP->target_type, *dataArrayP + i);
102104
break;
103105
case 2:
104106
lwm2m_data_encode_string(targetP->firmware_url, *dataArrayP + i);
@@ -122,6 +124,9 @@ static uint8_t target_read(uint16_t instanceId,
122124
case 9:
123125
lwm2m_data_encode_int(targetP->download_progress, *dataArrayP + i);
124126
break;
127+
case 10:
128+
lwm2m_data_encode_int(targetP->flash_error, *dataArrayP + i);
129+
break;
125130
default:
126131
return COAP_404_NOT_FOUND;
127132
}
@@ -140,7 +145,7 @@ static uint8_t target_discover(uint16_t instanceId,
140145
// is the server asking for the full object ?
141146
if (*numDataP == 0)
142147
{
143-
*dataArrayP = lwm2m_data_new(9);
148+
*dataArrayP = lwm2m_data_new(10);
144149
if (*dataArrayP == NULL) return COAP_500_INTERNAL_SERVER_ERROR;
145150
*numDataP = 8;
146151
(*dataArrayP)[0].id = 1;
@@ -152,6 +157,7 @@ static uint8_t target_discover(uint16_t instanceId,
152157
(*dataArrayP)[6].id = 7;
153158
(*dataArrayP)[7].id = 8;
154159
(*dataArrayP)[8].id = 9;
160+
(*dataArrayP)[9].id = 10;
155161
}
156162
else
157163
{
@@ -168,6 +174,7 @@ static uint8_t target_discover(uint16_t instanceId,
168174
case 7:
169175
case 8:
170176
case 9:
177+
case 10:
171178
break;
172179
default:
173180
return COAP_404_NOT_FOUND;
@@ -194,17 +201,6 @@ static uint8_t target_write(uint16_t instanceId,
194201
{
195202
case 1:
196203
return COAP_405_METHOD_NOT_ALLOWED;
197-
/* we do not support writing the target_type yet
198-
{
199-
int64_t value;
200-
201-
if (1 != lwm2m_data_decode_int(dataArray + i, &value))
202-
{
203-
return COAP_400_BAD_REQUEST;
204-
}
205-
targetP->target_type = (uint32_t) value;
206-
}
207-
break;*/
208204
case 2:
209205
{
210206
if (targetP->download_state == DOWNLOAD_IN_PROGRESS) {
@@ -240,6 +236,8 @@ static uint8_t target_write(uint16_t instanceId,
240236
return COAP_405_METHOD_NOT_ALLOWED;
241237
case 9:
242238
return COAP_405_METHOD_NOT_ALLOWED;
239+
case 10:
240+
return COAP_405_METHOD_NOT_ALLOWED;
243241
default:
244242
return COAP_404_NOT_FOUND;
245243
}
@@ -319,30 +317,38 @@ static uint8_t target_exec(uint16_t instanceId,
319317
return COAP_412_PRECONDITION_FAILED;
320318
}
321319
fprintf(stdout, "\r\n-----------------\r\n"
322-
"Execute flash_target on %hu/%d/%d\r\n"
320+
"Executing flash_target on %hu/%d/%d\r\n"
321+
"Target Name: %s\n"
323322
" Parameter (%d bytes):\r\n",
324-
objectP->objID, instanceId, resourceId, length);
323+
objectP->objID, instanceId, resourceId, targetP->target_type, length);
325324
prv_output_buffer((uint8_t*)buffer, length);
326325
fprintf(stdout, "-----------------\r\n\r\n");
327-
328-
// TODO: FLASH TARGET AND Update flash progress
326+
targetP->flash_state=FLASH_IN_PROGRESS;
327+
// targetP->flash_progress=0;
328+
xTaskCreate(flash_target_task, "Flash_Target", 2000, targetP, 2, NULL);
329329
return COAP_204_CHANGED;
330330
case 6:
331331
return COAP_405_METHOD_NOT_ALLOWED;
332332
case 7:
333-
if (targetP->flash_state != 100 && targetP->flash_state != 0) {
334-
return COAP_503_SERVICE_UNAVAILABLE;
333+
if (targetP->flash_state == FLASH_IN_PROGRESS) {
334+
return COAP_412_PRECONDITION_FAILED;
335335
}
336336
fprintf(stdout, "\r\n-----------------\r\n"
337337
"Execute reset_target on %hu/%d/%d\r\n"
338+
"Target Name: %s\n"
338339
" Parameter (%d bytes):\r\n",
339-
objectP->objID, instanceId, resourceId, length);
340+
objectP->objID, instanceId, resourceId, targetP->target_type, length);
340341
prv_output_buffer((uint8_t*)buffer, length);
341342
fprintf(stdout, "-----------------\r\n\r\n");
343+
xTaskCreate(reset_target_task, "ResetTarget", 300, targetP, 2, NULL);
342344
// TODO: RESET TARGET
343345
return COAP_204_CHANGED;
344346
case 8:
345347
return COAP_405_METHOD_NOT_ALLOWED;
348+
case 9:
349+
return COAP_405_METHOD_NOT_ALLOWED;
350+
case 10:
351+
return COAP_405_METHOD_NOT_ALLOWED;
346352
default:
347353
return COAP_404_NOT_FOUND;
348354
}
@@ -351,48 +357,97 @@ static uint8_t target_exec(uint16_t instanceId,
351357
lwm2m_object_t * get_target_object(void)
352358
{
353359
lwm2m_object_t * targetObj;
360+
targetObj = (lwm2m_object_t *)lwm2m_malloc(sizeof(lwm2m_object_t));
361+
362+
if (NULL != targetObj) {
363+
target_instance_t * targetP;
364+
int i = 1;
365+
memset(targetObj, 0, sizeof(lwm2m_object_t));
366+
targetObj->objID = 31025;
367+
368+
TARGET_t *target = target_list.next;
369+
while(target != NULL) {
370+
printf("Add targetObject: %d\n", i);
371+
targetP = (target_instance_t *)lwm2m_malloc(sizeof(target_instance_t));
372+
if (NULL == targetP) return NULL;
373+
memset(targetP, 0, sizeof(target_instance_t));
374+
targetP->shortID = i;
375+
targetP->target_type = target->name;
376+
targetP->firmware_url = NULL;
377+
targetP->download_state = NO_DOWNLOAD_DATA;
378+
targetP->firmware_version = 0;
379+
targetP->flash_state = NO_FLASH_DATA;
380+
targetP->download_progress = 0;
381+
targetP->download_error = NO_ERROR;
382+
targetP->binary_filename = lwm2m_malloc(25);
383+
targetP->target = target;
384+
385+
targetObj->instanceList = LWM2M_LIST_ADD(targetObj->instanceList, targetP);
386+
387+
target = target->next;
388+
i++;
389+
}
354390

355-
targetObj = (lwm2m_object_t *)lwm2m_malloc(sizeof(lwm2m_object_t));
356391

357-
if (NULL != targetObj)
358-
{
359-
int i;
360-
target_instance_t * targetP;
392+
/*
393+
* From a single instance object, two more functions are available.
394+
* - The first one (createFunc) create a new instance and filled it with the provided informations. If an ID is
395+
* provided a check is done for verifying his disponibility, or a new one is generated.
396+
* - The other one (deleteFunc) delete an instance by removing it from the instance list (and freeing the memory
397+
* allocated to it)
398+
*/
399+
targetObj->readFunc = target_read;
400+
targetObj->writeFunc = target_write;
401+
targetObj->executeFunc = target_exec;
402+
targetObj->createFunc = target_create;
403+
targetObj->deleteFunc = target_delete;
404+
targetObj->discoverFunc = target_discover;
405+
}
406+
return targetObj;
361407

362-
memset(targetObj, 0, sizeof(lwm2m_object_t));
363408

364-
targetObj->objID = 31025;
365-
366-
targetP = (target_instance_t *)lwm2m_malloc(sizeof(target_instance_t));
367-
if (NULL == targetP) return NULL;
368-
memset(targetP, 0, sizeof(target_instance_t));
369-
targetP->shortID = 1;
370-
targetP->target_type = 3124;
371-
targetP->firmware_url = NULL;
372-
targetP->download_state = NO_DOWNLOAD_DATA;
373-
targetP->firmware_version = 0;
374-
targetP->flash_state = 0;
375-
targetP->download_progress = 0;
376-
targetP->download_error = NO_ERROR;
377-
targetP->binary_filename = lwm2m_malloc(25);
378-
379-
targetObj->instanceList = LWM2M_LIST_ADD(targetObj->instanceList, targetP);
380-
/*
381-
* From a single instance object, two more functions are available.
382-
* - The first one (createFunc) create a new instance and filled it with the provided informations. If an ID is
383-
* provided a check is done for verifying his disponibility, or a new one is generated.
384-
* - The other one (deleteFunc) delete an instance by removing it from the instance list (and freeing the memory
385-
* allocated to it)
386-
*/
387-
targetObj->readFunc = target_read;
388-
targetObj->writeFunc = target_write;
389-
targetObj->executeFunc = target_exec;
390-
targetObj->createFunc = target_create;
391-
targetObj->deleteFunc = target_delete;
392-
targetObj->discoverFunc = target_discover;
393-
}
394409

395-
return targetObj;
410+
411+
// lwm2m_object_t * targetObj;
412+
// targetObj = (lwm2m_object_t *)lwm2m_malloc(sizeof(lwm2m_object_t));
413+
// if (NULL != targetObj)
414+
// {
415+
// target_instance_t * targetP;
416+
417+
// memset(targetObj, 0, sizeof(lwm2m_object_t));
418+
419+
// targetObj->objID = 31025;
420+
421+
// targetP = (target_instance_t *)lwm2m_malloc(sizeof(target_instance_t));
422+
// if (NULL == targetP) return NULL;
423+
// memset(targetP, 0, sizeof(target_instance_t));
424+
// targetP->shortID = 1;
425+
// targetP->target_type = "STM32";
426+
// targetP->firmware_url = NULL;
427+
// targetP->download_state = NO_DOWNLOAD_DATA;
428+
// targetP->firmware_version = 0;
429+
// targetP->flash_state = 0;
430+
// targetP->download_progress = 0;
431+
// targetP->download_error = NO_ERROR;
432+
// targetP->binary_filename = lwm2m_malloc(25);
433+
434+
// targetObj->instanceList = LWM2M_LIST_ADD(targetObj->instanceList, targetP);
435+
// /*
436+
// * From a single instance object, two more functions are available.
437+
// * - The first one (createFunc) create a new instance and filled it with the provided informations. If an ID is
438+
// * provided a check is done for verifying his disponibility, or a new one is generated.
439+
// * - The other one (deleteFunc) delete an instance by removing it from the instance list (and freeing the memory
440+
// * allocated to it)
441+
// */
442+
// targetObj->readFunc = target_read;
443+
// targetObj->writeFunc = target_write;
444+
// targetObj->executeFunc = target_exec;
445+
// targetObj->createFunc = target_create;
446+
// targetObj->deleteFunc = target_delete;
447+
// targetObj->discoverFunc = target_discover;
448+
// }
449+
450+
// return targetObj;
396451
}
397452

398453
void free_target_object(lwm2m_object_t * object)

Src/fatfs.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,31 @@ void usb_ls() {
127127
return (er); \
128128
}
129129

130+
131+
int usb_open_file(const char *filename, FIL *fp, BYTE mode) {
132+
FRESULT result = f_mount(&USBHFatFS, "", 1);
133+
if (result == FR_OK) {
134+
char *path = pvPortMalloc(sizeof filename + 4);
135+
sprintf(path, "0:/%s", filename);
136+
result = f_open(fp, path, mode);
137+
vPortFree(path);
138+
if(result != FR_OK) {
139+
f_mount(NULL, "", 0);
140+
}
141+
CHECK_FRESULT(result, "open failed", -1);
142+
} else {
143+
CHECK_FRESULT(result, "mount failed", -1);
144+
}
145+
return 0;
146+
}
147+
148+
int usb_close_file(FIL *fp) {
149+
FRESULT result = f_close(fp);
150+
f_mount(NULL, "", 0);
151+
CHECK_FRESULT(result, "close failed", -1);
152+
return 0;
153+
}
154+
130155
int usb_write(const void *bytes, const char *filename, size_t size) {
131156
FRESULT result;
132157

0 commit comments

Comments
 (0)