Skip to content

Commit fd72478

Browse files
authored
Jtag single bit (#48)
1 parent 3f85f52 commit fd72478

File tree

5 files changed

+288
-168
lines changed

5 files changed

+288
-168
lines changed

docs/src/projects/HSLink Pro.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ HSLink Pro 的引脚定义满足 [20-pin J-Link Connector](https://wiki.segger.c
6565
* SWD/JTAG输出方式
6666
* SPI模式为使用SPI外设模拟时序
6767
* GPIO模式为GPIO模拟时序
68+
* JTAG_SHIFT 加速
69+
* 该设置项只有当JTAG输出方式设置为SPI时才会生效
70+
* 选择启用代表将使用SPI外设模拟JTAG的单bit数据(可能会导致一些兼容性问题)
71+
* 选择禁用代表将使用GPIO模拟JTAG的单bit数据(兼容性较好)
6872

6973
* 参考电压
7074
* 在Vref没有电压输入或电压小于等于1.6V时,调试器内部Tvcc的电压

projects/HSLink-Pro/src/HID_COMM/hid_comm.cpp

Lines changed: 67 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
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

516551
using 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

Comments
 (0)