1010#include " crc32.h"
1111
1212#define LOG_TAG " HID_COMM"
13+
1314#include " elog.h"
1415
1516#ifdef CONFIG_USE_HID_CONFIG
@@ -79,14 +80,16 @@ const uint8_t hid_custom_report_desc[HID_CUSTOM_REPORT_DESC_SIZE] = {
7980 0xC0 /* END_COLLECTION */
8081};
8182
82- void usbd_hid_custom_in_callback (uint8_t busid, uint8_t ep, uint32_t nbytes) {
83+ void usbd_hid_custom_in_callback (uint8_t busid, uint8_t ep, uint32_t nbytes)
84+ {
8385 (void ) busid;
8486 (void ) ep;
8587 USB_LOG_DBG (" actual in len:%d\r\n " , nbytes);
8688 // custom_state = HID_STATE_IDLE;
8789}
8890
89- void usbd_hid_custom_out_callback (uint8_t busid, uint8_t ep, uint32_t nbytes) {
91+ void usbd_hid_custom_out_callback (uint8_t busid, uint8_t ep, uint32_t nbytes)
92+ {
9093 (void ) busid;
9194 HID_ReadState = HID_STATE_DONE;
9295 // usbd_ep_start_read(0, HID_OUT_EP, HID_read_buffer, HID_PACKET_SIZE);// 重新开启读取
@@ -102,7 +105,8 @@ struct usbd_endpoint hid_custom_out_ep = {
102105 .ep_cb = usbd_hid_custom_out_callback,
103106};
104107
105- static bool CheckField (const Value &object, std::pair<std::string_view, Type> field) {
108+ static bool CheckField (const Value &object, std::pair<std::string_view, Type> field)
109+ {
106110 auto &[field_name, field_type] = field;
107111 if (!object.HasMember (field_name.data ())) {
108112 return false ;
@@ -113,7 +117,8 @@ static bool CheckField(const Value &object, std::pair<std::string_view, Type> fi
113117 return true ;
114118}
115119
116- static bool CheckFields (const Value &object, std::vector<std::pair<std::string_view, Type>> fields) {
120+ static bool CheckFields (const Value &object, std::vector<std::pair<std::string_view, Type>> fields)
121+ {
117122 for (auto &field: fields) {
118123 if (!CheckField (object, field)) {
119124 return false ;
@@ -122,7 +127,8 @@ static bool CheckFields(const Value &object, std::vector<std::pair<std::string_v
122127 return true ;
123128}
124129
125- static void FillStatus (HID_Response_t status, char *res, const char *message) {
130+ static void FillStatus (HID_Response_t status, char *res, const char *message)
131+ {
126132 StringBuffer buffer;
127133 Writer writer (buffer);
128134 writer.StartObject ();
@@ -134,15 +140,18 @@ static void FillStatus(HID_Response_t status, char *res, const char *message) {
134140 std::strcpy (res, buffer.GetString ());
135141}
136142
137- static void FillStatus (HID_Response_t status, char *res, std::string_view message) {
143+ static void FillStatus (HID_Response_t status, char *res, std::string_view message)
144+ {
138145 FillStatus (status, res, message.data ());
139146}
140147
141- static void FillStatus (HID_Response_t status, char *res) {
148+ static void FillStatus (HID_Response_t status, char *res)
149+ {
142150 FillStatus (status, res, " " );
143151}
144152
145- static void Hello (Document &root, char *res) {
153+ static void Hello (Document &root, char *res)
154+ {
146155 (void ) root;
147156 StringBuffer buffer;
148157
@@ -198,14 +207,24 @@ static void Hello(Document &root, char *res) {
198207 std::strcpy (res, buffer.GetString ());
199208}
200209
201- static void settings (Document &root, char *res) {
210+ static void settings (Document &root, char *res)
211+ {
202212 if (!root.HasMember (" data" ) || !root[" data" ].IsObject ()) {
203213 const char *message = " data not found" ;
204214 USB_LOG_WRN (" %s\n " , message);
205215 FillStatus (HID_RESPONSE_FAILED, res, message);
206216 return ;
207217 }
208218
219+ auto get_value_bool = [&](const Value &val, const char *key, bool default_value) -> bool
220+ {
221+ if (val.HasMember (key)) {
222+ printf (" key: %s, value: %d\n " , key, val[key].GetBool ());
223+ return val[key].GetBool ();
224+ }
225+ return default_value;
226+ };
227+
209228 const Value &data = root[" data" ].GetObject ();
210229
211230 if (!data.HasMember (" boost" )) {
@@ -215,14 +234,16 @@ static void settings(Document &root, char *res) {
215234 return ;
216235 }
217236 HSLink_Setting.boost = data[" boost" ].GetBool ();
218- auto mode = [](const char *mode) {
237+ auto mode = [](const char *mode)
238+ {
219239 if (strcmp (mode, " spi" ) == 0 ) {
220240 return PORT_MODE_SPI;
221241 }
222242 return PORT_MODE_GPIO;
223243 };
224244 HSLink_Setting.swd_port_mode = mode (data[" swd_port_mode" ].GetString ());
225245 HSLink_Setting.jtag_port_mode = mode (data[" jtag_port_mode" ].GetString ());
246+ HSLink_Setting.jtag_single_bit_mode = get_value_bool (data, " jtag_single_bit_mode" , false );
226247
227248 const Value &power = data[" power" ];
228249 HSLink_Setting.power .vref = power[" vref" ].GetDouble ();
@@ -248,7 +269,8 @@ static void settings(Document &root, char *res) {
248269 FillStatus (HID_RESPONSE_SUCCESS, res);
249270}
250271
251- static void set_nickname (Document &root, char *res) {
272+ static void set_nickname (Document &root, char *res)
273+ {
252274 if (!root.HasMember (" nickname" ) || !root[" nickname" ].IsString ()) {
253275 const char *message = " nickname not found" ;
254276 USB_LOG_WRN (" %s\n " , message);
@@ -263,7 +285,8 @@ static void set_nickname(Document &root, char *res) {
263285 FillStatus (HID_RESPONSE_SUCCESS, res);
264286}
265287
266- static void upgrade (Document &root, char *res) {
288+ static void upgrade (Document &root, char *res)
289+ {
267290 (void ) root;
268291
269292 FillStatus (HID_RESPONSE_SUCCESS, res);
@@ -272,7 +295,8 @@ static void upgrade(Document &root, char *res) {
272295 HSP_EnterHSLinkBootloader ();
273296}
274297
275- static void entry_sys_bl (Document &root, char *res) {
298+ static void entry_sys_bl (Document &root, char *res)
299+ {
276300 (void ) root;
277301
278302 FillStatus (HID_RESPONSE_SUCCESS, res);
@@ -281,7 +305,8 @@ static void entry_sys_bl(Document &root, char *res) {
281305 HSP_EntrySysBootloader ();
282306}
283307
284- static void entry_hslink_bl (Document &root, char *res) {
308+ static void entry_hslink_bl (Document &root, char *res)
309+ {
285310 (void ) root;
286311
287312 FillStatus (HID_RESPONSE_SUCCESS, res);
@@ -290,7 +315,8 @@ static void entry_hslink_bl(Document &root, char *res) {
290315 HSP_EnterHSLinkBootloader ();
291316}
292317
293- static void set_hw_ver (Document &root, char *res) {
318+ static void set_hw_ver (Document &root, char *res)
319+ {
294320 if (!root.HasMember (" hw_ver" ) || !root[" hw_ver" ].IsString ()) {
295321 const char *message = " hw_ver not found" ;
296322 USB_LOG_WRN (" %s\n " , message);
@@ -311,7 +337,8 @@ static void set_hw_ver(Document &root, char *res) {
311337 FillStatus (HID_RESPONSE_SUCCESS, res);
312338}
313339
314- static void get_setting (Document &root, char *res) {
340+ static void get_setting (Document &root, char *res)
341+ {
315342 (void ) root;
316343 StringBuffer buffer;
317344 Writer writer (buffer);
@@ -326,6 +353,9 @@ static void get_setting(Document &root, char *res) {
326353 writer.Key (" jtag_port_mode" );
327354 writer.String (HSLink_Setting.jtag_port_mode == PORT_MODE_SPI ? " spi" : " gpio" );
328355
356+ writer.Key (" jtag_single_bit_mode" );
357+ writer.Bool (HSLink_Setting.jtag_single_bit_mode );
358+
329359 writer.Key (" power" );
330360 writer.StartObject ();
331361 writer.Key (" vref" );
@@ -360,12 +390,14 @@ static void get_setting(Document &root, char *res) {
360390 std::strcpy (res, buffer.GetString ());
361391}
362392
363- static void erase_bl_b (Document &root, char *res) {
364- fal_partition_erase (bl_b_part,0 , bl_b_part->len );
393+ static void erase_bl_b (Document &root, char *res)
394+ {
395+ fal_partition_erase (bl_b_part, 0 , bl_b_part->len );
365396 FillStatus (HID_RESPONSE_SUCCESS, res);
366397}
367398
368- static void write_bl_b (Document &root, char *res) {
399+ static void write_bl_b (Document &root, char *res)
400+ {
369401#define PACK_SIZE 512
370402 if (!CheckFields (root,
371403 {{" addr" , Type::kNumberType },
@@ -380,7 +412,7 @@ static void write_bl_b(Document &root, char *res) {
380412 auto data_b64_len = root[" data" ].GetStringLength ();
381413 log_d (" addr: 0x%X, len: %d, data_len: %d" , addr, len, data_b64_len);
382414 // elog_hexdump("b64", 16, data_b64, data_b64_len);
383- if (addr + len > bl_b_part->len ) {
415+ if (size_t ( addr + len) > bl_b_part->len ) {
384416 const char *message = " addr out of range" ;
385417 USB_LOG_WRN (" %s\n " , message);
386418 FillStatus (HID_RESPONSE_FAILED, res, message);
@@ -402,7 +434,7 @@ static void write_bl_b(Document &root, char *res) {
402434 uint8_t *data = b64_decode_ex (data_b64, data_b64_len, &data_len);
403435 log_d (" solve b64 data_len: %d" , data_len);
404436 // elog_hexdump(LOG_TAG, 16, data, data_len);
405- if (data_len != len) {
437+ if (data_len != ( size_t ) len) {
406438 log_w (" data_len != len" );
407439 FillStatus (HID_RESPONSE_FAILED, res, " data_len != len" );
408440 return ;
@@ -420,7 +452,8 @@ static void write_bl_b(Document &root, char *res) {
420452 free (data);
421453}
422454
423- static void upgrade_bl (Document &root, char *res) {
455+ static void upgrade_bl (Document &root, char *res)
456+ {
424457 if (!CheckFields (root,
425458 {{" len" , Type::kNumberType },
426459 {" crc" , Type::kStringType }})) {
@@ -430,7 +463,7 @@ static void upgrade_bl(Document &root, char *res) {
430463 auto len = root[" len" ].GetInt ();
431464 auto crc_str = root[" crc" ].GetString ();
432465 auto crc = strtoul (crc_str + 2 , nullptr , 16 );
433- if (len > bl_b_part->len ) {
466+ if (( size_t ) len > bl_b_part->len ) {
434467 char msg[64 ];
435468 snprintf (msg, sizeof (msg), " len %d > %d" , len, bl_b_part->len );
436469 log_w (msg);
@@ -447,7 +480,7 @@ static void upgrade_bl(Document &root, char *res) {
447480 uint32_t crc_calc = 0xFFFFFFFF ;
448481 const uint32_t CRC_CALC_LEN = 8 * 1024 ;
449482 auto buf = std::make_unique<uint8_t []>(CRC_CALC_LEN);
450- for (uint32_t i = 0 ; i < len; i += CRC_CALC_LEN) {
483+ for (uint32_t i = 0 ; i < ( size_t ) len; i += CRC_CALC_LEN) {
451484 auto calc_len = std::min (CRC_CALC_LEN, len - i);
452485 fal_partition_read (bl_b_part, i, buf.get (), calc_len);
453486 crc_calc = CRC_CalcArray_Software (buf.get (), calc_len, crc_calc);
@@ -466,7 +499,7 @@ static void upgrade_bl(Document &root, char *res) {
466499 auto buf = std::make_unique<uint8_t []>(COPY_LEN);
467500 fal_partition_erase (bl_part, 0 , bl_part->len );
468501 for (size_t i = 0 ; i < bl_part->len ; i += COPY_LEN) {
469- auto copy_len = std::min (COPY_LEN, (uint32_t )(bl_part->len - i));
502+ auto copy_len = std::min (COPY_LEN, (uint32_t ) (bl_part->len - i));
470503 log_d (" copy from 0x%X to 0x%X, size 0x%X" ,
471504 i + bl_b_part->offset ,
472505 i + bl_part->offset ,
@@ -481,7 +514,7 @@ static void upgrade_bl(Document &root, char *res) {
481514 auto buf_1 = std::make_unique<uint8_t []>(COMP_LEN);
482515 auto buf_2 = std::make_unique<uint8_t []>(COMP_LEN);
483516 for (size_t i = 0 ; i < bl_part->len ; i += COMP_LEN) {
484- auto comp_len = std::min (COMP_LEN, (uint32_t )(bl_part->len - i));
517+ auto comp_len = std::min (COMP_LEN, (uint32_t ) (bl_part->len - i));
485518 fal_partition_read (bl_b_part, i, buf_1.get (), comp_len);
486519 fal_partition_read (bl_part, i, buf_2.get (), comp_len);
487520 if (memcmp (buf_1.get (), buf_2.get (), comp_len) != 0 ) {
@@ -505,17 +538,20 @@ static void upgrade_bl(Document &root, char *res) {
505538 HSP_Reboot ();
506539}
507540
508- static void HID_Write (const std::string &res) {
541+ static void HID_Write (const std::string &res)
542+ {
509543 std::strcpy (reinterpret_cast <char *>(HID_write_buffer + 1 ), res.c_str ());
510544}
511545
512- static void HID_Write (const char *res) {
546+ static void HID_Write (const char *res)
547+ {
513548 std::strcpy (reinterpret_cast <char *>(HID_write_buffer + 1 ), res);
514549}
515550
516551using HID_Command_t = std::function<void (Document &, char *res)>;
517552
518- void HID_Handle () {
553+ void HID_Handle ()
554+ {
519555 if (HID_ReadState == HID_STATE_BUSY) {
520556 return ; // 接收中,不处理
521557 }
@@ -538,7 +574,8 @@ void HID_Handle() {
538574 Document root;
539575 const auto parse = reinterpret_cast <char *>(HID_read_buffer + 1 );
540576 root.Parse (parse);
541- [&]() {
577+ [&]()
578+ {
542579 if (root.HasParseError ()
543580 || root.HasMember (" name" ) == false
544581 ) {
0 commit comments