)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1000687,"name":"Tomas Vanek","display_name":"Tomas Vanek","email":"vanekt@fbl.cz","username":"vanekt"},"change_message_id":"616292b6d31bd51ae44ada9230e916084a55c568","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"214efe26_50ac9e7d","updated":"2026-07-17 09:29:04.000000000","message":"Ahmed, thanks for the new driver.\nI commented just a couple of issues I\u0027ve seen on the first sight.\n\nI\u0027m curious about STLDR compatibility to other standards. Is it e.g. CMSIS loader compliant?","commit_id":"8f54f9004edcadd8cb79fe71bf483701f03bcced"},{"author":{"_account_id":1000863,"name":"Tarek BOCHKATI","email":"tarek.bouchkati@gmail.com","username":"BouchkatiTarek"},"change_message_id":"9e7a3e1a6cc2b24b2da00a709ac42e5344eab9a7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"a893e42a_8ec48e8f","updated":"2026-07-20 13:45:54.000000000","message":"Thanks for the feedback Tomas.","commit_id":"8f54f9004edcadd8cb79fe71bf483701f03bcced"},{"author":{"_account_id":1000863,"name":"Tarek BOCHKATI","email":"tarek.bouchkati@gmail.com","username":"BouchkatiTarek"},"change_message_id":"9e7a3e1a6cc2b24b2da00a709ac42e5344eab9a7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"cabffb0b_ba5a1b54","in_reply_to":"214efe26_50ac9e7d","updated":"2026-07-20 13:45:54.000000000","message":"short answer: no, it is not compliant (the APIs do have different prototypes/arguments)\n\nbut, it could be extended easily to support the Keil (ARM) API loaders.\n\nplease be aware that the Keil (ARM) loaders API is supported IFAIK only by ARM tooling\n  - Keil MDK-ARM (µVision)\n  - Keil Studio (VScode extenstion), uses pyOCD\n  - pyOCD\n  \nplease note that CMSIS loaders are not defined yet (https://open-cmsis-pack.github.io/Open-CMSIS-Pack-Spec/main/html/pdsc_family_pg.html#AlgorithmStyleEnum)\nand what is know as *.FLM is the Flash Programming loader as defined by Arm/Keil","commit_id":"8f54f9004edcadd8cb79fe71bf483701f03bcced"},{"author":{"_account_id":1002386,"name":"Ahmed Haoues","email":"ahmed.haoues@st.com","username":"ahmed-haoues"},"change_message_id":"539f0f2e9ff5d2a0ee0a172ca92a689d6923ce41","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"b401887b_4a0c13ef","updated":"2026-07-21 14:35:48.000000000","message":"Thank you for the feedback, Tomas","commit_id":"12fc809598fa5726f7083f8b91726f1d4c422993"}],"src/flash/nor/stldr_driver.c":[{"author":{"_account_id":1000687,"name":"Tomas Vanek","display_name":"Tomas Vanek","email":"vanekt@fbl.cz","username":"vanekt"},"change_message_id":"616292b6d31bd51ae44ada9230e916084a55c568","unresolved":true,"context_lines":[{"line_number":847,"context_line":"\treturn ERROR_OK;"},{"line_number":848,"context_line":"}"},{"line_number":849,"context_line":""},{"line_number":850,"context_line":"static int stldr_protect(struct flash_bank *bank, int set, unsigned int first,"},{"line_number":851,"context_line":"\t\tunsigned int last)"},{"line_number":852,"context_line":"{"},{"line_number":853,"context_line":"\tLOG_ERROR(\"The stldr driver does not support option bytes modification\");"},{"line_number":854,"context_line":""},{"line_number":855,"context_line":"\treturn ERROR_FLASH_OPER_UNSUPPORTED;"},{"line_number":856,"context_line":"}"},{"line_number":857,"context_line":""},{"line_number":858,"context_line":"static int stldr_write(struct flash_bank *bank, const uint8_t *buffer,"},{"line_number":859,"context_line":"\t\tuint32_t offset, uint32_t count)"}],"source_content_type":"text/x-csrc","patch_set":2,"id":"fea1c254_c69a7642","line":856,"range":{"start_line":850,"start_character":0,"end_line":856,"end_character":1},"updated":"2026-07-17 09:29:04.000000000","message":"Remove, the flash infrastructure handles NULL protect pointer correctly.","commit_id":"8f54f9004edcadd8cb79fe71bf483701f03bcced"},{"author":{"_account_id":1002386,"name":"Ahmed Haoues","email":"ahmed.haoues@st.com","username":"ahmed-haoues"},"change_message_id":"539f0f2e9ff5d2a0ee0a172ca92a689d6923ce41","unresolved":false,"context_lines":[{"line_number":847,"context_line":"\treturn ERROR_OK;"},{"line_number":848,"context_line":"}"},{"line_number":849,"context_line":""},{"line_number":850,"context_line":"static int stldr_protect(struct flash_bank *bank, int set, unsigned int first,"},{"line_number":851,"context_line":"\t\tunsigned int last)"},{"line_number":852,"context_line":"{"},{"line_number":853,"context_line":"\tLOG_ERROR(\"The stldr driver does not support option bytes modification\");"},{"line_number":854,"context_line":""},{"line_number":855,"context_line":"\treturn ERROR_FLASH_OPER_UNSUPPORTED;"},{"line_number":856,"context_line":"}"},{"line_number":857,"context_line":""},{"line_number":858,"context_line":"static int stldr_write(struct flash_bank *bank, const uint8_t *buffer,"},{"line_number":859,"context_line":"\t\tuint32_t offset, uint32_t count)"}],"source_content_type":"text/x-csrc","patch_set":2,"id":"5595c661_5e4cce0b","line":856,"range":{"start_line":850,"start_character":0,"end_line":856,"end_character":1},"in_reply_to":"fea1c254_c69a7642","updated":"2026-07-21 14:35:48.000000000","message":"Done","commit_id":"8f54f9004edcadd8cb79fe71bf483701f03bcced"},{"author":{"_account_id":1000687,"name":"Tomas Vanek","display_name":"Tomas Vanek","email":"vanekt@fbl.cz","username":"vanekt"},"change_message_id":"616292b6d31bd51ae44ada9230e916084a55c568","unresolved":true,"context_lines":[{"line_number":998,"context_line":"\tfor (unsigned int i \u003d 0; i \u003c dev_info-\u003en_sectors; i++)"},{"line_number":999,"context_line":"\t\tbank-\u003enum_sectors +\u003d dev_info-\u003esectors[i].count;"},{"line_number":1000,"context_line":""},{"line_number":1001,"context_line":"\tbank-\u003esectors \u003d malloc(sizeof(struct flash_sector) * bank-\u003enum_sectors);"},{"line_number":1002,"context_line":"\tif (!bank-\u003esectors) {"},{"line_number":1003,"context_line":"\t\tLOG_ERROR(\"failed to allocate bank sectors\");"},{"line_number":1004,"context_line":"\t\treturn ERROR_FAIL;"},{"line_number":1005,"context_line":"\t}"},{"line_number":1006,"context_line":""},{"line_number":1007,"context_line":"\tuint32_t s_i \u003d 0, s_offset \u003d 0;"},{"line_number":1008,"context_line":"\tfor (unsigned int i \u003d 0; i \u003c dev_info-\u003en_sectors; i++) {"},{"line_number":1009,"context_line":"\t\tfor (unsigned int j \u003d 0; j \u003c dev_info-\u003esectors[i].count; j++) {"},{"line_number":1010,"context_line":"\t\t\tbank-\u003esectors[s_i].offset \u003d s_offset;"},{"line_number":1011,"context_line":"\t\t\tbank-\u003esectors[s_i].size \u003d dev_info-\u003esectors[i].size;"},{"line_number":1012,"context_line":"\t\t\tbank-\u003esectors[s_i].is_erased \u003d -1;"},{"line_number":1013,"context_line":"\t\t\tbank-\u003esectors[s_i].is_protected \u003d -1;"},{"line_number":1014,"context_line":""},{"line_number":1015,"context_line":"\t\t\ts_i++;"},{"line_number":1016,"context_line":"\t\t\ts_offset +\u003d dev_info-\u003esectors[i].size;"},{"line_number":1017,"context_line":"\t\t}"},{"line_number":1018,"context_line":"\t}"},{"line_number":1019,"context_line":""},{"line_number":1020,"context_line":"\tLOG_DEBUG(\"Bank (%u) size is %\" PRIu32 \" kb, base address is \" TARGET_ADDR_FMT,"},{"line_number":1021,"context_line":"\t\t\tbank-\u003ebank_number, bank-\u003esize \u003e\u003e 10, bank-\u003ebase);"}],"source_content_type":"text/x-csrc","patch_set":2,"id":"fd7a3c64_be672711","line":1018,"range":{"start_line":1001,"start_character":1,"end_line":1018,"end_character":1},"updated":"2026-07-17 09:29:04.000000000","message":"Use alloc_block_array() instead","commit_id":"8f54f9004edcadd8cb79fe71bf483701f03bcced"},{"author":{"_account_id":1002386,"name":"Ahmed Haoues","email":"ahmed.haoues@st.com","username":"ahmed-haoues"},"change_message_id":"539f0f2e9ff5d2a0ee0a172ca92a689d6923ce41","unresolved":true,"context_lines":[{"line_number":998,"context_line":"\tfor (unsigned int i \u003d 0; i \u003c dev_info-\u003en_sectors; i++)"},{"line_number":999,"context_line":"\t\tbank-\u003enum_sectors +\u003d dev_info-\u003esectors[i].count;"},{"line_number":1000,"context_line":""},{"line_number":1001,"context_line":"\tbank-\u003esectors \u003d malloc(sizeof(struct flash_sector) * bank-\u003enum_sectors);"},{"line_number":1002,"context_line":"\tif (!bank-\u003esectors) {"},{"line_number":1003,"context_line":"\t\tLOG_ERROR(\"failed to allocate bank sectors\");"},{"line_number":1004,"context_line":"\t\treturn ERROR_FAIL;"},{"line_number":1005,"context_line":"\t}"},{"line_number":1006,"context_line":""},{"line_number":1007,"context_line":"\tuint32_t s_i \u003d 0, s_offset \u003d 0;"},{"line_number":1008,"context_line":"\tfor (unsigned int i \u003d 0; i \u003c dev_info-\u003en_sectors; i++) {"},{"line_number":1009,"context_line":"\t\tfor (unsigned int j \u003d 0; j \u003c dev_info-\u003esectors[i].count; j++) {"},{"line_number":1010,"context_line":"\t\t\tbank-\u003esectors[s_i].offset \u003d s_offset;"},{"line_number":1011,"context_line":"\t\t\tbank-\u003esectors[s_i].size \u003d dev_info-\u003esectors[i].size;"},{"line_number":1012,"context_line":"\t\t\tbank-\u003esectors[s_i].is_erased \u003d -1;"},{"line_number":1013,"context_line":"\t\t\tbank-\u003esectors[s_i].is_protected \u003d -1;"},{"line_number":1014,"context_line":""},{"line_number":1015,"context_line":"\t\t\ts_i++;"},{"line_number":1016,"context_line":"\t\t\ts_offset +\u003d dev_info-\u003esectors[i].size;"},{"line_number":1017,"context_line":"\t\t}"},{"line_number":1018,"context_line":"\t}"},{"line_number":1019,"context_line":""},{"line_number":1020,"context_line":"\tLOG_DEBUG(\"Bank (%u) size is %\" PRIu32 \" kb, base address is \" TARGET_ADDR_FMT,"},{"line_number":1021,"context_line":"\t\t\tbank-\u003ebank_number, bank-\u003esize \u003e\u003e 10, bank-\u003ebase);"}],"source_content_type":"text/x-csrc","patch_set":2,"id":"d13e9c6f_17a25068","line":1018,"range":{"start_line":1001,"start_character":1,"end_line":1018,"end_character":1},"in_reply_to":"fd7a3c64_be672711","updated":"2026-07-21 14:35:48.000000000","message":"For some devices, such as the STM32F20x/21x, the sector size is not the same for all sectors. Therefore, we need to keep the loop and set the size from dev_info-\u003esectors[i].size.","commit_id":"8f54f9004edcadd8cb79fe71bf483701f03bcced"},{"author":{"_account_id":1000687,"name":"Tomas Vanek","display_name":"Tomas Vanek","email":"vanekt@fbl.cz","username":"vanekt"},"change_message_id":"616292b6d31bd51ae44ada9230e916084a55c568","unresolved":true,"context_lines":[{"line_number":1047,"context_line":"\treturn ERROR_OK;"},{"line_number":1048,"context_line":"}"},{"line_number":1049,"context_line":""},{"line_number":1050,"context_line":"static int stldr_protect_check(struct flash_bank *bank)"},{"line_number":1051,"context_line":"{"},{"line_number":1052,"context_line":"\t/* probe is required before checking protection */"},{"line_number":1053,"context_line":"\t/* Nothing to do since we set the protection to unknown during the probe */"},{"line_number":1054,"context_line":"\tLOG_WARNING(\"The stldr driver does not support flash protection\");"},{"line_number":1055,"context_line":"\treturn ERROR_OK;"},{"line_number":1056,"context_line":"}"},{"line_number":1057,"context_line":""},{"line_number":1058,"context_line":"COMMAND_HANDLER(stldr_handle_set_loader_command)"},{"line_number":1059,"context_line":"{"}],"source_content_type":"text/x-csrc","patch_set":2,"id":"10ff4ce9_bd8f8d37","line":1056,"range":{"start_line":1050,"start_character":0,"end_line":1056,"end_character":1},"updated":"2026-07-17 09:29:04.000000000","message":"Remove, the infrastructure handles NULL protect_check pointer correctly.","commit_id":"8f54f9004edcadd8cb79fe71bf483701f03bcced"},{"author":{"_account_id":1002386,"name":"Ahmed Haoues","email":"ahmed.haoues@st.com","username":"ahmed-haoues"},"change_message_id":"539f0f2e9ff5d2a0ee0a172ca92a689d6923ce41","unresolved":false,"context_lines":[{"line_number":1047,"context_line":"\treturn ERROR_OK;"},{"line_number":1048,"context_line":"}"},{"line_number":1049,"context_line":""},{"line_number":1050,"context_line":"static int stldr_protect_check(struct flash_bank *bank)"},{"line_number":1051,"context_line":"{"},{"line_number":1052,"context_line":"\t/* probe is required before checking protection */"},{"line_number":1053,"context_line":"\t/* Nothing to do since we set the protection to unknown during the probe */"},{"line_number":1054,"context_line":"\tLOG_WARNING(\"The stldr driver does not support flash protection\");"},{"line_number":1055,"context_line":"\treturn ERROR_OK;"},{"line_number":1056,"context_line":"}"},{"line_number":1057,"context_line":""},{"line_number":1058,"context_line":"COMMAND_HANDLER(stldr_handle_set_loader_command)"},{"line_number":1059,"context_line":"{"}],"source_content_type":"text/x-csrc","patch_set":2,"id":"d3e9b615_094b8703","line":1056,"range":{"start_line":1050,"start_character":0,"end_line":1056,"end_character":1},"in_reply_to":"10ff4ce9_bd8f8d37","updated":"2026-07-21 14:35:48.000000000","message":"Done","commit_id":"8f54f9004edcadd8cb79fe71bf483701f03bcced"}]}
