Compare commits

...

13 Commits

Author SHA1 Message Date
liangkangnan 0463f8d773 README: add linux build steps
Signed-off-by: liangkangnan <liangkangnan@163.com>
2021-11-11 09:56:11 +08:00
liangkangnan 916fcb01cb loader: add tinyriscv
Signed-off-by: liangkangnan <liangkangnan@163.com>
2021-11-11 09:55:02 +08:00
liangkangnan 9bbbaf9bad add tinyriscv_program command
Signed-off-by: liangkangnan <liangkangnan@163.com>
2021-11-11 09:54:00 +08:00
liangkangnan e5a97681ea target: add load_bin command
Signed-off-by: liangkangnan <liangkangnan@163.com>
2021-05-31 11:48:54 +08:00
liangkangnan 76b7bb357b add README.md
Signed-off-by: liangkangnan <liangkangnan@163.com>
2020-06-13 13:29:05 +08:00
liangkangnan 26b7b3c917 README: update
Signed-off-by: liangkangnan <liangkangnan@163.com>
2020-06-13 13:23:26 +08:00
liangkangnan 66f480322a add tinyriscv manu code
Signed-off-by: liangkangnan <liangkangnan@163.com>
2020-06-13 13:14:10 +08:00
liangkangnan e2b555e287 git ignore release dir
Signed-off-by: liangkangnan <liangkangnan@163.com>
2020-06-13 13:13:19 +08:00
liangkangnan a610f377c9 add release.sh
Signed-off-by: liangkangnan <liangkangnan@163.com>
2020-06-13 13:12:30 +08:00
liangkangnan 65ff1f1dd2 add rebuild.sh
Signed-off-by: liangkangnan <liangkangnan@163.com>
2020-06-13 13:11:44 +08:00
Blue Liang c94bf74155 README: update
Signed-off-by: Blue Liang <liangkangnan@163.com>
2020-06-12 19:06:22 +08:00
Blue Liang 3cc6fe00af README: add build steps
Signed-off-by: Blue Liang <liangkangnan@163.com>
2020-06-12 19:01:20 +08:00
liangkangnan eefff456ca submodule: use gitee jimtcl repo
Signed-off-by: liangkangnan <liangkangnan@163.com>
2020-06-11 23:31:41 +08:00
8 changed files with 579 additions and 2 deletions

2
.gitignore vendored
View File

@ -99,3 +99,5 @@ TAGS
# ctags tag files
tags
release/

2
.gitmodules vendored
View File

@ -1,3 +1,3 @@
[submodule "jimtcl"]
path = jimtcl
url = https://github.com/msteveb/jimtcl
url = https://gitee.com/liangkangnan/jimtcl

55
README.md Normal file
View File

@ -0,0 +1,55 @@
# 编译Windows版本
## 1.安装msys2
到[msys2官网](https://www.msys2.org/)下载安装最新的64位版本安装完成后打开mingw-32bit窗口执行以下命令安装依赖
`pacman -S autoconf automake pkg-config libtool binutils gcc git make mingw-w64-i686-toolchain mingw-w64-i686-libusb mingw-w64-i686-hidapi mingw-w64-i686-libftdi`
## 2.下载源码
下载本项目的所有代码到msys2的某个目录下
`git clone --recursive https://gitee.com/liangkangnan/tinyriscv-openocd.git`
## 3.编译源码
### 3.1第一次编译或者重新编译
在项目的根目录下,执行以下命令:
`./rebuild.sh`
### 3.2打包openocd.exe
编译完成后就可以打包了,执行以下命令进行打包:
`./release.sh`
打包后的文件在根目录下的release目录里可以把整个release目录拷贝到电脑的其他目录下使用。
### 3.3修改源码后编译
修改源码后只需要执行make命令即可编译。
`make`
编译完可以按照步骤3.2进行打包。
# 编译Linux版本
以ubuntu系统为例。
## 1.安装依赖
`sudo apt-get install autoconf automake pkg-config libtool libusb-dev libusb-1.0-0-dev libhidapi-dev`
## 2.编译
```
./bootstrap
./configure --enable-remote-bitbang --enable-cmsis-dap --enable-ftdi
make
```
编译完成后会在src/目录下生成openocd可执行文件。

View File

@ -0,0 +1,70 @@
/* Autogenerated with ./bin2char.sh */
0x97,0x21,0x00,0x00,0x93,0x81,0x01,0x80,0x13,0x81,0x01,0xc0,0x17,0x05,0x00,0x00,
0x13,0x05,0x45,0x44,0x97,0x15,0x00,0x00,0x93,0x85,0xc5,0xfe,0x17,0x16,0x00,0x00,
0x13,0x06,0x46,0xfe,0x63,0xfc,0xc5,0x00,0x83,0x22,0x05,0x00,0x23,0xa0,0x55,0x00,
0x13,0x05,0x45,0x00,0x93,0x85,0x45,0x00,0xe3,0xe8,0xc5,0xfe,0x17,0x15,0x00,0x00,
0x13,0x05,0x45,0xfc,0x93,0x85,0x81,0x81,0x63,0x78,0xb5,0x00,0x23,0x20,0x05,0x00,
0x13,0x05,0x45,0x00,0xe3,0x6c,0xb5,0xfe,0x13,0x05,0x00,0x00,0x93,0x05,0x00,0x00,
0xef,0x00,0x80,0x00,0x6f,0x00,0x00,0x00,0x13,0x01,0x01,0xff,0x23,0x26,0x11,0x00,
0x23,0x24,0x81,0x00,0x13,0x04,0x01,0x01,0xb7,0x17,0x00,0x20,0x37,0x17,0x00,0x20,
0x13,0x07,0x07,0x50,0x23,0xa0,0xe7,0x00,0xb7,0x17,0x00,0x20,0x37,0x17,0x00,0x20,
0x13,0x07,0xc7,0x40,0x23,0xa2,0xe7,0x00,0xb7,0x17,0x00,0x20,0x93,0x87,0x07,0x40,
0x03,0xa7,0x07,0x00,0x23,0xa4,0xe1,0x80,0xb7,0x17,0x00,0x20,0x93,0x87,0x47,0x40,
0x03,0xa7,0x07,0x00,0x23,0xa6,0xe1,0x80,0xb7,0x17,0x00,0x20,0x93,0x87,0x87,0x40,
0x03,0xa7,0x07,0x00,0x23,0xa8,0xe1,0x80,0xb7,0x17,0x00,0x20,0x83,0xa7,0x47,0x00,
0x23,0xa0,0x07,0x00,0xef,0x00,0x80,0x08,0x83,0xa7,0x01,0x81,0x63,0x80,0x07,0x02,
0x83,0xa7,0xc1,0x80,0x13,0x85,0x07,0x00,0xef,0x00,0x00,0x2c,0x93,0x07,0x05,0x00,
0x13,0x87,0x07,0x00,0x23,0x8a,0xe1,0x80,0x6f,0x00,0x00,0x03,0x03,0xa7,0xc1,0x80,
0xb7,0x17,0x00,0x20,0x83,0xa6,0x07,0x00,0x83,0xa7,0x81,0x80,0x13,0x86,0x07,0x00,
0x93,0x85,0x06,0x00,0x13,0x05,0x07,0x00,0xef,0x00,0x40,0x10,0x93,0x07,0x05,0x00,
0x13,0x87,0x07,0x00,0x23,0x8a,0xe1,0x80,0xef,0x00,0x40,0x06,0x83,0xc7,0x41,0x81,
0x63,0x8c,0x07,0x00,0xb7,0x17,0x00,0x20,0x83,0xa7,0x47,0x00,0x13,0x07,0x30,0x00,
0x23,0xa0,0xe7,0x00,0x6f,0x00,0x40,0x01,0xb7,0x17,0x00,0x20,0x83,0xa7,0x47,0x00,
0x13,0x07,0x10,0x00,0x23,0xa0,0xe7,0x00,0x6f,0x00,0x00,0x00,0x13,0x01,0x01,0xff,
0x23,0x26,0x81,0x00,0x13,0x04,0x01,0x01,0xb7,0x07,0x00,0x0e,0x03,0xa7,0x07,0x00,
0xb7,0x07,0x00,0x0e,0x13,0x67,0x87,0x00,0x23,0xa0,0xe7,0x00,0x13,0x00,0x00,0x00,
0x03,0x24,0xc1,0x00,0x13,0x01,0x01,0x01,0x67,0x80,0x00,0x00,0x13,0x01,0x01,0xff,
0x23,0x26,0x81,0x00,0x13,0x04,0x01,0x01,0xb7,0x07,0x00,0x0e,0x03,0xa7,0x07,0x00,
0xb7,0x07,0x00,0x0e,0x13,0x77,0x77,0xff,0x23,0xa0,0xe7,0x00,0x13,0x00,0x00,0x00,
0x03,0x24,0xc1,0x00,0x13,0x01,0x01,0x01,0x67,0x80,0x00,0x00,0x13,0x01,0x01,0xff,
0x23,0x26,0x81,0x00,0x13,0x04,0x01,0x01,0xb7,0x07,0x00,0x0e,0x03,0xa7,0x07,0x00,
0xb7,0x07,0x00,0x0e,0x13,0x67,0x07,0x01,0x23,0xa0,0xe7,0x00,0x13,0x00,0x00,0x00,
0x03,0x24,0xc1,0x00,0x13,0x01,0x01,0x01,0x67,0x80,0x00,0x00,0x13,0x01,0x01,0xff,
0x23,0x26,0x81,0x00,0x13,0x04,0x01,0x01,0xb7,0x07,0x00,0x0e,0x03,0xa7,0x07,0x00,
0xb7,0x07,0x00,0x0e,0x13,0x77,0xf7,0xfe,0x23,0xa0,0xe7,0x00,0x13,0x00,0x00,0x00,
0x03,0x24,0xc1,0x00,0x13,0x01,0x01,0x01,0x67,0x80,0x00,0x00,0x13,0x01,0x01,0xfd,
0x23,0x26,0x11,0x02,0x23,0x24,0x81,0x02,0x13,0x04,0x01,0x03,0x23,0x2e,0xa4,0xfc,
0x23,0x2c,0xb4,0xfc,0x23,0x2a,0xc4,0xfc,0xb7,0x07,0x00,0x0e,0x03,0xa7,0x07,0x00,
0xb7,0x07,0x00,0x0e,0x13,0x77,0x97,0xff,0x23,0xa0,0xe7,0x00,0xb7,0x07,0x00,0x0e,
0x03,0xa7,0x07,0x00,0xb7,0x07,0x00,0x0e,0x13,0x67,0x27,0x00,0x23,0xa0,0xe7,0x00,
0xb7,0x07,0x00,0x0e,0x93,0x87,0x47,0x00,0x83,0x26,0xc4,0xfd,0x37,0x07,0x80,0x00,
0x13,0x07,0xf7,0xff,0x33,0xf7,0xe6,0x00,0x23,0xa0,0xe7,0x00,0x03,0x27,0x44,0xfd,
0x93,0x07,0x40,0x00,0x63,0xf4,0xe7,0x00,0xef,0xf0,0x5f,0xf3,0x83,0x27,0x44,0xfd,
0x23,0x20,0xf4,0xfe,0x23,0x24,0x04,0xfe,0x6f,0x00,0x40,0x0b,0x03,0x27,0x04,0xfe,
0x93,0x07,0x00,0x02,0x63,0xf8,0xe7,0x00,0x93,0x07,0x00,0x02,0x23,0x22,0xf4,0xfe,
0x6f,0x00,0xc0,0x00,0x83,0x27,0x04,0xfe,0x23,0x22,0xf4,0xfe,0x03,0x27,0x04,0xfe,
0x83,0x27,0x44,0xfe,0xb3,0x07,0xf7,0x40,0x23,0x20,0xf4,0xfe,0x83,0x27,0x44,0xfe,
0x93,0xd7,0x27,0x00,0x23,0x22,0xf4,0xfe,0x23,0x26,0x04,0xfe,0x6f,0x00,0x40,0x06,
0x83,0x27,0x84,0xfe,0x93,0x97,0x27,0x00,0x03,0x27,0x84,0xfd,0x33,0x07,0xf7,0x00,
0xb7,0x07,0x00,0x0e,0x93,0x87,0x87,0x00,0x03,0x27,0x07,0x00,0x23,0xa0,0xe7,0x00,
0xb7,0x07,0x00,0x0e,0x03,0xa7,0x07,0x00,0xb7,0x07,0x00,0x0e,0x13,0x67,0x17,0x00,
0x23,0xa0,0xe7,0x00,0x13,0x00,0x00,0x00,0xb7,0x07,0x00,0x0e,0x83,0xa7,0x07,0x00,
0x93,0xf7,0x17,0x00,0xe3,0x9a,0x07,0xfe,0x83,0x27,0x84,0xfe,0x93,0x87,0x17,0x00,
0x23,0x24,0xf4,0xfe,0x83,0x27,0xc4,0xfe,0x93,0x87,0x17,0x00,0x23,0x26,0xf4,0xfe,
0x03,0x27,0xc4,0xfe,0x83,0x27,0x44,0xfe,0xe3,0x6c,0xf7,0xf8,0x83,0x27,0x04,0xfe,
0xe3,0x96,0x07,0xf4,0x03,0x27,0x44,0xfd,0x93,0x07,0x40,0x00,0x63,0xfe,0xe7,0x00,
0xef,0xf0,0xdf,0xe8,0x13,0x00,0x00,0x00,0xb7,0x07,0x00,0x0e,0x83,0xa7,0x07,0x00,
0x93,0xf7,0x17,0x00,0xe3,0x9a,0x07,0xfe,0xb7,0x07,0x00,0x0e,0x83,0xa7,0x07,0x00,
0x93,0xf7,0x07,0x02,0x63,0x86,0x07,0x00,0x93,0x07,0x00,0x00,0x6f,0x00,0x80,0x00,
0x93,0x07,0x10,0x00,0x13,0x85,0x07,0x00,0x83,0x20,0xc1,0x02,0x03,0x24,0x81,0x02,
0x13,0x01,0x01,0x03,0x67,0x80,0x00,0x00,0x13,0x01,0x01,0xfe,0x23,0x2e,0x81,0x00,
0x13,0x04,0x01,0x02,0x23,0x26,0xa4,0xfe,0xb7,0x07,0x00,0x0e,0x03,0xa7,0x07,0x00,
0xb7,0x07,0x00,0x0e,0x13,0x77,0x97,0xff,0x23,0xa0,0xe7,0x00,0xb7,0x07,0x00,0x0e,
0x03,0xa7,0x07,0x00,0xb7,0x07,0x00,0x0e,0x13,0x67,0x47,0x00,0x23,0xa0,0xe7,0x00,
0xb7,0x07,0x00,0x0e,0x93,0x87,0x47,0x00,0x83,0x26,0xc4,0xfe,0x37,0x07,0x80,0x00,
0x13,0x07,0xf7,0xff,0x33,0xf7,0xe6,0x00,0x23,0xa0,0xe7,0x00,0xb7,0x07,0x00,0x0e,
0x03,0xa7,0x07,0x00,0xb7,0x07,0x00,0x0e,0x13,0x67,0x17,0x00,0x23,0xa0,0xe7,0x00,
0x13,0x00,0x00,0x00,0xb7,0x07,0x00,0x0e,0x83,0xa7,0x07,0x00,0x93,0xf7,0x17,0x00,
0xe3,0x9a,0x07,0xfe,0xb7,0x07,0x00,0x0e,0x83,0xa7,0x07,0x00,0x93,0xf7,0x07,0x02,
0x63,0x86,0x07,0x00,0x93,0x07,0x00,0x00,0x6f,0x00,0x80,0x00,0x93,0x07,0x10,0x00,
0x13,0x85,0x07,0x00,0x03,0x24,0xc1,0x01,0x13,0x01,0x01,0x02,0x67,0x80,0x00,0x00,

19
rebuild.sh Normal file
View File

@ -0,0 +1,19 @@
#!/bin/bash
set -e
BASE=`pwd`
NPROC=${NPROC:-$((`nproc`*2))}
PARALLEL=${PARALLEL:--j${NPROC}}
echo "building openocd......"
./bootstrap
./configure --build=i686-w64-mingw32 --host=i686-w64-mingw32 --disable-gccwarnings CFLAGS="-O2"
sed -i '$d' ./src/jtag/drivers/libjaylink/config.h
sed -i '$d' ./src/jtag/drivers/libjaylink/config.h
sed -i '$d' ./src/jtag/drivers/libjaylink/config.h
make ${PARALLEL}

25
release.sh Normal file
View File

@ -0,0 +1,25 @@
#!/bin/bash
set -e
BASE=`pwd`
NPROC=${NPROC:-$((`nproc`*2))}
PARALLEL=${PARALLEL:--j${NPROC}}
echo "relase openocd......"
rm -rf release
mkdir -p release
cp ./src/openocd.exe ./release
cp /mingw32/bin/libconfuse-2.dll ./release
cp /mingw32/bin/libftdi1.dll ./release
cp /mingw32/bin/libftdipp1.dll ./release
cp /mingw32/bin/libgcc_s_dw2-1.dll ./release
cp /mingw32/bin/libhidapi-0.dll ./release
cp /mingw32/bin/libiconv-2.dll ./release
cp /mingw32/bin/libintl-8.dll ./release
cp /mingw32/bin/libstdc++-6.dll ./release
cp /mingw32/bin/libusb-1.0.dll ./release
cp /mingw32/bin/libwinpthread-1.dll ./release

View File

@ -1309,7 +1309,7 @@
[10][0x34 - 1] = "Xiamen Kingblaze Technology Co Ltd",
[10][0x35 - 1] = "Shenzhen Lomica Technology Co Ltd",
[10][0x36 - 1] = "Nuclei System Technology Co Ltd",
[10][0x37 - 1] = "Wuhan Xun Zhan Electronic Technology",
[10][0x37 - 1] = "LiangKangNan",
[10][0x38 - 1] = "Shenzhen Ingacom Semiconductor Ltd",
[10][0x39 - 1] = "Zotac Technology Ltd",
[10][0x3a - 1] = "Foxline",

View File

@ -41,7 +41,9 @@
#include "config.h"
#endif
#include <sys/time.h>
#include <helper/time_support.h>
#include <helper/fileio.h>
#include <jtag/jtag.h>
#include <flash/nor/core.h>
@ -74,6 +76,7 @@ static int target_gdb_fileio_end_default(struct target *target, int retcode,
int fileio_errno, bool ctrl_c);
static int target_profiling_default(struct target *target, uint32_t *samples,
uint32_t max_num_samples, uint32_t *num_samples, uint32_t seconds);
static int halt_mcu(struct target *target);
/* targets */
extern struct target_type arm7tdmi_target;
@ -2853,6 +2856,12 @@ COMMAND_HANDLER(handle_reg_command)
target = get_current_target(CMD_CTX);
if (target->state != TARGET_HALTED) {
LOG_INFO("Please halt the target first");
retval = !ERROR_OK;
return retval;
}
/* list all available registers for the current target */
if (CMD_ARGC == 0) {
struct reg_cache *cache = target->reg_cache;
@ -3127,6 +3136,10 @@ COMMAND_HANDLER(handle_resume_command)
struct target *target = get_current_target(CMD_CTX);
if (target->state != TARGET_HALTED) {
halt_mcu(target);
}
/* with no CMD_ARGV, resume from current pc, addr = 0,
* with one arguments, addr = CMD_ARGV[0],
* handle breakpoints, not debugging */
@ -6181,6 +6194,385 @@ nextw:
return retval;
}
COMMAND_HANDLER(handle_load_bin_command)
{
struct image image;
target_addr_t addr;
int retval;
int i;
uint8_t *write_buffer = NULL;
uint8_t *read_buffer = NULL;
size_t buf_cnt;
uint32_t image_size;
if (CMD_ARGC != 3)
return ERROR_COMMAND_SYNTAX_ERROR;
COMMAND_PARSE_ADDRESS(CMD_ARGV[1], addr);
unsigned verify = 1;
COMMAND_PARSE_NUMBER(uint, CMD_ARGV[2], verify);
image.base_address = addr;
image.base_address_set = 1;
image.start_address_set = 0;
if (image_open(&image, CMD_ARGV[0], "bin") != ERROR_OK)
return ERROR_FAIL;
retval = ERROR_OK;
image_size = 0;
struct target *target = get_current_target(CMD_CTX);
struct duration bench;
duration_start(&bench);
for (i = 0; i < image.num_sections; i++) {
write_buffer = malloc(image.sections[i].size);
if (write_buffer == NULL) {
command_print(CMD,
"error allocating write buffer for section (%d bytes)",
(int)(image.sections[i].size));
retval = ERROR_FAIL;
break;
}
if (verify) {
read_buffer = malloc(image.sections[i].size);
if (read_buffer == NULL) {
command_print(CMD,
"error allocating read buffer for section (%d bytes)",
(int)(image.sections[i].size));
retval = ERROR_FAIL;
free(write_buffer);
break;
}
}
retval = image_read_section(&image, i, 0x0, image.sections[i].size, write_buffer, &buf_cnt);
if (retval != ERROR_OK) {
free(write_buffer);
break;
}
retval = target_write_buffer(target, image.sections[i].base_address, buf_cnt, write_buffer);
if (retval != ERROR_OK) {
free(write_buffer);
break;
}
if (verify) {
retval = target_read_buffer(target, image.sections[i].base_address, buf_cnt, read_buffer);
if (retval != ERROR_OK) {
free(write_buffer);
if (read_buffer != NULL)
free(read_buffer);
break;
}
size_t k;
for (k = 0; k < buf_cnt; k++) {
if (write_buffer[k] != read_buffer[k]) {
command_print(CMD, "write failed at address " TARGET_ADDR_FMT "",
image.sections[i].base_address);
free(write_buffer);
if (read_buffer != NULL)
free(read_buffer);
retval = ERROR_FAIL;
goto end;
}
}
}
image_size += buf_cnt;
command_print(CMD, "%u bytes written at address " TARGET_ADDR_FMT "",
(unsigned int)buf_cnt,
image.sections[i].base_address);
free(write_buffer);
if (verify && (read_buffer != NULL))
free(read_buffer);
}
if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) {
command_print(CMD, "downloaded %" PRIu32 " bytes "
"in %fs (%0.3f KiB/s)", image_size,
duration_elapsed(&bench), duration_kbps(&bench, image_size));
}
end:
image_close(&image);
return retval;
}
// 烧写数据地址4K + 1K + 256
#define DATA_ADDR (0x20001500)
// 烧写数据长度
#define DATA_LEN (0x20001400)
// 烧写(擦除)地址
#define PROGRAM_ADDR (0x20001404)
// 擦除标志
// 0: 不擦除1擦除
#define ERASE_FLAG (0x20001408)
// 烧写状态标志
// bit0为烧写结束标志0未烧写完成1烧写完成。
// bit1为烧写结果标志0烧写失败1烧写成功
#define RESULT_FLAG (0x2000140C)
// loader地址
#define LOADER_ADDR (0x20000000)
// 每次烧写最大长度
#define EACH_BURN_LEN (256)
// 扇区大小
#define FLASH_SECTOR_SIZE (4096)
static int program_result(struct target *target)
{
int retval;
int data;
int timeout = 0;
wait:
usleep(200000);
// 读烧写结束标记
retval = target_read_buffer(target, RESULT_FLAG, 4, (uint8_t *)(&data));
if (retval != ERROR_OK) {
goto end;
}
// 烧写结束
if (data & 0x1) {
// 烧写失败
if (!(data & 0x2)) {
retval = !ERROR_OK;
// 烧写成功
} else {
retval = ERROR_OK;
}
// 还没烧写结束
} else {
timeout++;
if (timeout >= 20) {
retval = !ERROR_OK;
goto end;
}
goto wait;
}
end:
return retval;
}
static int halt_mcu(struct target *target)
{
int retval;
target->verbose_halt_msg = true;
// halt住MCU
retval = target_halt(target);
if (retval != ERROR_OK) {
return retval;
}
// 等待halt成功
retval = target_wait_state(target, TARGET_HALTED, DEFAULT_HALT_TIMEOUT);
if (retval != ERROR_OK) {
return retval;
}
return retval;
}
COMMAND_HANDLER(handle_tinyriscv_program_command)
{
struct fileio *file;
target_addr_t addr;
int retval;
size_t i;
uint8_t *data_buffer;
size_t count;
size_t file_size;
size_t num;
int data;
struct target *target;
static const uint8_t tinyriscv_flash_write_code[] = {
#include "../../contrib/loaders/flash/tinyriscv/tinyriscv.inc"
};
target = get_current_target(CMD_CTX);
// 参数检查
if (CMD_ARGC != 2)
return ERROR_COMMAND_SYNTAX_ERROR;
// 烧写地址
COMMAND_PARSE_ADDRESS(CMD_ARGV[1], addr);
struct duration bench;
duration_start(&bench);
// halt住MCU
retval = halt_mcu(target);
if (retval != ERROR_OK) {
goto end2;
}
LOG_INFO("flash loader downloading...");
// 先下载loader到内存
retval = target_write_buffer(target, LOADER_ADDR, sizeof(tinyriscv_flash_write_code),
tinyriscv_flash_write_code);
if (retval != ERROR_OK) {
LOG_ERROR("Failed to download flash loader into ram");
goto end2;
}
// 打开要烧写的文件
if (fileio_open(&file, CMD_ARGV[0], FILEIO_READ, FILEIO_BINARY) != ERROR_OK) {
LOG_ERROR("fail to open %s", CMD_ARGV[0]);
retval = ERROR_FAIL;
goto end2;
}
// 文件大小
fileio_size(file, &file_size);
//LOG_INFO("bin file size: %d(bytes)", (int)(file_size));
LOG_INFO("erasing...");
// 要擦除多少个扇区
num = (file_size / FLASH_SECTOR_SIZE) + 1;
for (i = 0; i < num; i++) {
data = 0x1;
// 擦除标记
retval = target_write_buffer(target, ERASE_FLAG, 4, (uint8_t *)(&data));
if (retval != ERROR_OK) {
LOG_ERROR("write erase_flag failed!!!");
goto end1;
}
data = addr + (i * FLASH_SECTOR_SIZE);
LOG_INFO("erase addr: 0x%x", data);
// 擦除地址
retval = target_write_buffer(target, PROGRAM_ADDR, 4, (uint8_t *)(&data));
if (retval != ERROR_OK) {
LOG_ERROR("write erase_addr failed!!!");
goto end1;
}
// halt住MCU
retval = halt_mcu(target);
if (retval != ERROR_OK) {
goto end1;
}
// 开始烧写
retval = target_resume(target, 0, LOADER_ADDR, 1, 0);
if (retval != ERROR_OK) {
LOG_ERROR("resume failed!!!");
goto end1;
}
// 获取烧写结果
retval = program_result(target);
if (retval != ERROR_OK) {
LOG_ERROR("erase failed!!!");
goto end1;
}
}
// 清擦除标志
data = 0;
retval = target_write_buffer(target, ERASE_FLAG, 4, (uint8_t *)(&data));
if (retval != ERROR_OK) {
goto end1;
}
// 分配内存
data_buffer = malloc(EACH_BURN_LEN);
if (data_buffer == NULL) {
LOG_ERROR("error allocating data buffer (%d bytes)",
EACH_BURN_LEN);
retval = ERROR_FAIL;
goto end1;
}
retval = ERROR_OK;
LOG_INFO("programming...");
num = file_size;
while (num > 0) {
fileio_read(file, EACH_BURN_LEN, data_buffer, &count);
if (count > 0) {
// 下载数据
retval = target_write_buffer(target, DATA_ADDR, count, data_buffer);
if (retval != ERROR_OK) {
LOG_ERROR("write data failed!!!");
break;
}
data = addr;
LOG_INFO("program addr: 0x%x", data);
// 烧写地址
retval = target_write_buffer(target, PROGRAM_ADDR, 4, (uint8_t *)(&data));
if (retval != ERROR_OK) {
LOG_ERROR("write program addr failed!!!");
break;
}
data = count;
// 烧写长度
retval = target_write_buffer(target, DATA_LEN, 4, (uint8_t *)(&data));
if (retval != ERROR_OK) {
LOG_ERROR("write data len failed!!!");
break;
}
// halt住MCU
retval = halt_mcu(target);
if (retval != ERROR_OK) {
goto end1;
}
// 开始烧写
retval = target_resume(target, 0, LOADER_ADDR, 1, 0);
if (retval != ERROR_OK) {
LOG_ERROR("resume failed!!!");
break;
}
// 获取烧写结果
retval = program_result(target);
if (retval != ERROR_OK) {
LOG_ERROR("program failed!!!");
break;
}
addr += count;
}
num -= count;
}
if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK)) {
LOG_INFO("program %" PRIu32 " bytes "
"in %fs (%0.3f KiB/s)", (uint32_t)(file_size),
duration_elapsed(&bench), duration_kbps(&bench, file_size));
}
free(data_buffer);
end1:
fileio_close(file);
end2:
if (retval == ERROR_OK) {
LOG_INFO("End, program succ");
} else {
LOG_ERROR("End, program failed!!!");
}
return retval;
}
static const struct command_registration target_exec_command_handlers[] = {
{
.name = "fast_load_image",
@ -6427,6 +6819,20 @@ static const struct command_registration target_exec_command_handlers[] = {
.help = "Test the target's memory access functions",
.usage = "size",
},
{
.name = "load_bin",
.handler = handle_load_bin_command,
.mode = COMMAND_EXEC,
.help = "Download bin file into memory and verify it",
.usage = "filename address verify",
},
{
.name = "tinyriscv_program",
.handler = handle_tinyriscv_program_command,
.mode = COMMAND_EXEC,
.help = "Program file into external flash",
.usage = "filename address",
},
COMMAND_REGISTRATION_DONE
};