Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 17 additions & 7 deletions .github/workflows/HSLinkPro-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,32 +60,42 @@ jobs:
export HPM_SDK_TOOLCHAIN_VARIANT=gcc
export PYTHON_EXECUTABLE=~/HPM_PYTHON/bin/python3

cmake -GNinja -DBOARD=hslinkpro -DHPM_BUILD_TYPE=flash_uf2 -Dpython_exec="~/HPM_PYTHON/bin/python3" -DCUSTOM_TARGET_TRIPLET=riscv-none-elf -DRV_ARCH="rv32imac_zicsr_zifencei" . -B=./build
cmake -GNinja -DBOARD=hslinkpro -DHPM_BUILD_TYPE=flash_uf2 -Dpython_exec="~/HPM_PYTHON/bin/python3" -DCUSTOM_TARGET_TRIPLET=riscv-none-elf -DRV_ARCH="rv32imac_zicsr_zifencei" -DCONFIG_HARDWARE_ISOLATED=0 . -B=./build
cmake --build ./build
cmake -GNinja -DBOARD=hslinkpro -DHPM_BUILD_TYPE=flash_uf2 -Dpython_exec="~/HPM_PYTHON/bin/python3" -DCUSTOM_TARGET_TRIPLET=riscv-none-elf -DRV_ARCH="rv32imac_zicsr_zifencei" -DCONFIG_HARDWARE_ISOLATED=1 . -B=./build
cmake --build ./build

- name: Merge Bin
run: |
cd projects/HSLink-Pro
cp bootloader/build/output/HSLink-Pro-Bootloader.bin Merger.bin
dd if=src/build/output/HSLink-Pro.bin of=Merger.bin bs=1024 seek=127 conv=notrunc
cp bootloader/build/output/HSLink-Pro-Bootloader.bin HSLink-Pro-Merger.bin
cp bootloader/build/output/HSLink-Pro-Bootloader.bin HSLink-Iso-Merger.bin
dd if=src/build/output/HSLink-Pro.bin of=HSLink-Pro-Merger.bin bs=1024 seek=127 conv=notrunc
dd if=src/build/output/HSLink-Iso.bin of=HSLink-Iso-Merger.bin bs=1024 seek=127 conv=notrunc

- run: |
mkdir -p releases
cd releases
cp ../projects/HSLink-Pro/bootloader/build/output/HSLink-Pro-Bootloader.bin HSLink-Pro-Bootloader.bin
cp ../projects/HSLink-Pro/bootloader/build/output/HSLink-Pro-Bootloader.bin HSLink-Bootloader.bin
cp ../projects/HSLink-Pro/src/build/output/HSLink-Pro.uf2 HSLink-Pro.uf2
cp ../projects/HSLink-Pro/src/build/output/HSLink-Iso.uf2 HSLink-Iso.uf2
cp ../projects/HSLink-Pro/src/build/output/HSLink-Pro.bin HSLink-Pro.bin
cp ../projects/HSLink-Pro/Merger.bin Merger.bin
cp ../projects/HSLink-Pro/src/build/output/HSLink-Iso.bin HSLink-Iso.bin
cp ../projects/HSLink-Pro/HSLink-Pro-Merger.bin HSLink-Pro-Merger.bin
cp ../projects/HSLink-Pro/HSLink-Iso-Merger.bin HSLink-Iso-Merger.bin

- name: Upload file
uses: actions/upload-artifact@v4
with:
name: build-artifact
path: |
releases/HSLink-Pro-Bootloader.bin
releases/HSLink-Bootloader.bin
releases/HSLink-Pro.uf2
releases/HSLink-Iso.uf2
releases/HSLink-Pro.bin
releases/Merger.bin
releases/HSLink-Iso.bin
releases/HSLink-Pro-Merger.bin
releases/HSLink-Iso-Merger.bin

release:
runs-on: ubuntu-latest
Expand Down
13 changes: 12 additions & 1 deletion projects/HSLink-Pro/src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,12 @@

cmake_minimum_required(VERSION 3.13)

set(APP_NAME "HSLink-Pro")
if (DEFINED CONFIG_HARDWARE_ISOLATED AND (CONFIG_HARDWARE_ISOLATED EQUAL "1"))
set(APP_NAME "HSLink-Iso")
else ()
set(APP_NAME "HSLink-Pro")
endif ()

set(BOARD_SEARCH_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../common)

set(CONFIG_USB_DEVICE 1)
Expand Down Expand Up @@ -32,6 +37,12 @@ if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.version)
set(CONFIG_BUILD_VERSION ${BUILD_VERSION})
endif ()

if (DEFINED CONFIG_HARDWARE_ISOLATED AND (CONFIG_HARDWARE_ISOLATED EQUAL "1"))
sdk_compile_definitions(-DHSLINK_ISOLATE=1)
else()
sdk_compile_definitions(-DHSLINK_ISOLATE=0)
endif ()

if (CONFIG_BUILD_VERSION)
sdk_compile_definitions(-DCONFIG_BUILD_VERSION="${CONFIG_BUILD_VERSION}")
string(REGEX REPLACE "([0-9]+)\\..*" "\\1" VERSION_MAJOR ${CONFIG_BUILD_VERSION})
Expand Down
23 changes: 21 additions & 2 deletions projects/HSLink-Pro/src/DAP_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -389,6 +389,9 @@ __STATIC_INLINE void PORT_OFF(void)
HPM_IOC->PAD[PIN_TMS].PAD_CTL = IOC_PAD_PAD_CTL_PRS_SET(2);
HPM_IOC->PAD[PIN_TMS].FUNC_CTL = IOC_PAD_FUNC_CTL_ALT_SELECT_SET(0);

HPM_IOC->PAD[PIN_TMS_IN].PAD_CTL = IOC_PAD_PAD_CTL_PRS_SET(2);
HPM_IOC->PAD[PIN_TMS_IN].FUNC_CTL = IOC_PAD_FUNC_CTL_ALT_SELECT_SET(0);

HPM_IOC->PAD[PIN_TDI].PAD_CTL = IOC_PAD_PAD_CTL_PRS_SET(2);
HPM_IOC->PAD[PIN_TDI].FUNC_CTL = IOC_PAD_FUNC_CTL_ALT_SELECT_SET(0);

Expand All @@ -415,6 +418,10 @@ __STATIC_INLINE void PORT_OFF(void)
gpio_disable_pin_interrupt(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_TMS), GPIO_GET_PIN_INDEX(PIN_TMS));
gpiom_set_pin_controller(HPM_GPIOM, GPIO_GET_PORT_INDEX(PIN_TMS), GPIO_GET_PIN_INDEX(PIN_TMS), PIN_GPIOM);

gpio_set_pin_input(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_TMS_IN), GPIO_GET_PIN_INDEX(PIN_TMS_IN));
gpio_disable_pin_interrupt(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_TMS_IN), GPIO_GET_PIN_INDEX(PIN_TMS_IN));
gpiom_set_pin_controller(HPM_GPIOM, GPIO_GET_PORT_INDEX(PIN_TMS_IN), GPIO_GET_PIN_INDEX(PIN_TMS_IN), PIN_GPIOM);

gpio_set_pin_input(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_TDI), GPIO_GET_PIN_INDEX(PIN_TDI));
gpio_disable_pin_interrupt(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_TDI), GPIO_GET_PIN_INDEX(PIN_TDI));
gpiom_set_pin_controller(HPM_GPIOM, GPIO_GET_PORT_INDEX(PIN_TDI), GPIO_GET_PIN_INDEX(PIN_TDI), PIN_GPIOM);
Expand Down Expand Up @@ -472,7 +479,11 @@ __STATIC_FORCEINLINE void PIN_SWCLK_TCK_CLR(void)
*/
__STATIC_FORCEINLINE uint32_t PIN_SWDIO_TMS_IN(void)
{
uint32_t sta = gpio_read_pin(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_TMS), GPIO_GET_PIN_INDEX(PIN_TMS));
#if HSLINK_ISOLATE
uint32_t sta = gpio_read_pin(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_TMS_IN), GPIO_GET_PIN_INDEX(PIN_TMS_IN));
#else
uint32_t sta = gpio_read_pin(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_TMS), GPIO_GET_PIN_INDEX(PIN_TMS));
#endif
__asm volatile("fence io, io");
return sta;
}
Expand Down Expand Up @@ -500,7 +511,11 @@ __STATIC_FORCEINLINE void PIN_SWDIO_TMS_CLR(void)
*/
__STATIC_FORCEINLINE uint32_t PIN_SWDIO_IN(void)
{
uint32_t sta = gpio_read_pin(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_TMS), GPIO_GET_PIN_INDEX(PIN_TMS));
#if HSLINK_ISOLATE
uint32_t sta = gpio_read_pin(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_TMS_IN), GPIO_GET_PIN_INDEX(PIN_TMS_IN));
#else
uint32_t sta = gpio_read_pin(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_TMS), GPIO_GET_PIN_INDEX(PIN_TMS));
#endif
__asm volatile("fence io, io");
return sta;
}
Expand All @@ -521,10 +536,12 @@ called prior \ref PIN_SWDIO_OUT function calls.
__STATIC_FORCEINLINE void PIN_SWDIO_OUT_ENABLE(void)
{
gpio_write_pin(PIN_GPIO, GPIO_GET_PORT_INDEX(SWDIO_DIR), GPIO_GET_PIN_INDEX(SWDIO_DIR), 1);
#if !HSLINK_ISOLATE
HPM_IOC->PAD[PIN_TMS].FUNC_CTL = IOC_PAD_FUNC_CTL_ALT_SELECT_SET(0); /* as gpio*/
HPM_IOC->PAD[PIN_TMS].PAD_CTL = IOC_PAD_PAD_CTL_PRS_SET(2) | IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1);
gpiom_configure_pin_control_setting(PIN_TMS);
gpio_set_pin_output(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_TMS), GPIO_GET_PIN_INDEX(PIN_TMS));
#endif
}

/** SWDIO I/O pin: Switch to Input mode (used in SWD mode only).
Expand All @@ -534,11 +551,13 @@ called prior \ref PIN_SWDIO_IN function calls.
__STATIC_FORCEINLINE void PIN_SWDIO_OUT_DISABLE(void)
{
gpio_write_pin(PIN_GPIO, GPIO_GET_PORT_INDEX(SWDIO_DIR), GPIO_GET_PIN_INDEX(SWDIO_DIR), 0);
#if !HSLINK_ISOLATE
HPM_IOC->PAD[PIN_TMS].PAD_CTL = IOC_PAD_PAD_CTL_PRS_SET(2);
HPM_IOC->PAD[PIN_TMS].FUNC_CTL = IOC_PAD_FUNC_CTL_ALT_SELECT_SET(0);
gpio_set_pin_input(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_TMS), GPIO_GET_PIN_INDEX(PIN_TMS));
gpio_disable_pin_interrupt(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_TMS), GPIO_GET_PIN_INDEX(PIN_TMS));
gpiom_set_pin_controller(HPM_GPIOM, GPIO_GET_PORT_INDEX(PIN_TMS), GPIO_GET_PIN_INDEX(PIN_TMS), gpiom_soc_gpio0);
#endif
}


Expand Down
4 changes: 4 additions & 0 deletions projects/HSLink-Pro/src/HID_COMM/hid_comm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,11 @@ static void Hello(Document &root, char *res)
writer.String(serial_number_dynamic);

writer.Key("model");
#if HSLINK_ISOLATE
writer.String("HSLink-Iso");
#else
writer.String("HSLink-Pro");
#endif

writer.Key("version");
char version[32];
Expand Down
11 changes: 8 additions & 3 deletions projects/HSLink-Pro/src/JTAG_DP/JTAG_DP_IO.c
Original file line number Diff line number Diff line change
Expand Up @@ -266,14 +266,16 @@ void IO_PORT_JTAG_SETUP (void) {
HPM_IOC->PAD[PIN_TCK].FUNC_CTL = IOC_PAD_FUNC_CTL_ALT_SELECT_SET(0) | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK; /* as gpio*/
HPM_IOC->PAD[PIN_TMS].FUNC_CTL = IOC_PAD_FUNC_CTL_ALT_SELECT_SET(0); /* as gpio*/
HPM_IOC->PAD[PIN_TDI].FUNC_CTL = IOC_PAD_FUNC_CTL_ALT_SELECT_SET(0); /* as gpio*/
HPM_IOC->PAD[SWDIO_DIR].FUNC_CTL = IOC_PAD_FUNC_CTL_ALT_SELECT_SET(0); /* as gpio*/
HPM_IOC->PAD[PIN_TDO].FUNC_CTL = IOC_PAD_FUNC_CTL_ALT_SELECT_SET(0);
HPM_IOC->PAD[PIN_JTAG_TRST].FUNC_CTL = IOC_PAD_FUNC_CTL_ALT_SELECT_SET(0);
HPM_IOC->PAD[PIN_SRST].FUNC_CTL = IOC_PAD_FUNC_CTL_ALT_SELECT_SET(0);

HPM_IOC->PAD[PIN_TDO].PAD_CTL = IOC_PAD_PAD_CTL_PRS_SET(2) | IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
HPM_IOC->PAD[PIN_TCK].PAD_CTL = IOC_PAD_PAD_CTL_PRS_SET(2) | IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
HPM_IOC->PAD[PIN_TMS].PAD_CTL = IOC_PAD_PAD_CTL_PRS_SET(2) | IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
HPM_IOC->PAD[PIN_TDI].PAD_CTL = IOC_PAD_PAD_CTL_PRS_SET(2) | IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
HPM_IOC->PAD[PIN_TDO].PAD_CTL = IOC_PAD_PAD_CTL_PRS_SET(2) | IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
HPM_IOC->PAD[SWDIO_DIR].PAD_CTL = IOC_PAD_PAD_CTL_PRS_SET(2) | IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
HPM_IOC->PAD[PIN_JTAG_TRST].PAD_CTL = IOC_PAD_PAD_CTL_PRS_SET(2) | IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
HPM_IOC->PAD[PIN_SRST].PAD_CTL = IOC_PAD_PAD_CTL_PRS_SET(2) | IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);

Expand All @@ -290,17 +292,20 @@ void IO_PORT_JTAG_SETUP (void) {
gpio_set_pin_output(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_LED_CONNECTED), GPIO_GET_PIN_INDEX(PIN_LED_CONNECTED));
#endif


gpiom_configure_pin_control_setting(PIN_TDO);
gpiom_configure_pin_control_setting(PIN_TCK);
gpiom_configure_pin_control_setting(PIN_TMS);
gpiom_configure_pin_control_setting(PIN_TDI);
gpiom_configure_pin_control_setting(PIN_TDO);
gpiom_configure_pin_control_setting(SWDIO_DIR);
gpiom_configure_pin_control_setting(PIN_JTAG_TRST);
gpiom_configure_pin_control_setting(PIN_SRST);

gpio_set_pin_input(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_TDO), GPIO_GET_PIN_INDEX(PIN_TDO));
gpio_set_pin_output(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_TCK), GPIO_GET_PIN_INDEX(PIN_TCK));
gpio_set_pin_output(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_TMS), GPIO_GET_PIN_INDEX(PIN_TMS));
gpio_set_pin_output(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_TDI), GPIO_GET_PIN_INDEX(PIN_TDI));
gpio_set_pin_input(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_TDO), GPIO_GET_PIN_INDEX(PIN_TDO));
gpio_set_pin_output(PIN_GPIO, GPIO_GET_PORT_INDEX(SWDIO_DIR), GPIO_GET_PIN_INDEX(SWDIO_DIR));
gpio_set_pin_output(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_JTAG_TRST), GPIO_GET_PIN_INDEX(PIN_JTAG_TRST));
gpio_set_pin_output(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_SRST), GPIO_GET_PIN_INDEX(PIN_SRST));

Expand Down
1 change: 1 addition & 0 deletions projects/HSLink-Pro/src/JTAG_DP/JTAG_DP_SPI.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ void SPI_PORT_JTAG_SETUP(void)
HPM_IOC->PAD[PIN_TDI].FUNC_CTL = IOC_PAD_FUNC_CTL_ALT_SELECT_SET(5); /** as spi miso */
HPM_IOC->PAD[PIN_TMS].FUNC_CTL = IOC_PAD_FUNC_CTL_ALT_SELECT_SET(0);
HPM_IOC->PAD[PIN_SRST].FUNC_CTL = IOC_PAD_FUNC_CTL_ALT_SELECT_SET(0);
HPM_IOC->PAD[SWDIO_DIR].FUNC_CTL = IOC_PAD_FUNC_CTL_ALT_SELECT_SET(0);
HPM_IOC->PAD[PIN_JTAG_TRST].FUNC_CTL = IOC_PAD_FUNC_CTL_ALT_SELECT_SET(0);
HPM_IOC->PAD[IOC_PAD_PB10].PAD_CTL = IOC_PAD_PAD_CTL_SR_MASK | IOC_PAD_PAD_CTL_SPD_SET(3);
HPM_IOC->PAD[PIN_TCK].PAD_CTL = IOC_PAD_PAD_CTL_SR_MASK | IOC_PAD_PAD_CTL_SPD_SET(3);
Expand Down
3 changes: 3 additions & 0 deletions projects/HSLink-Pro/src/SW_DP/SW_DP_IO.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,10 +87,13 @@ void IO_PORT_SWD_SETUP (void) {

gpiom_configure_pin_control_setting(PIN_TCK);
gpiom_configure_pin_control_setting(PIN_TMS);
gpiom_configure_pin_control_setting(PIN_TMS_IN);
gpiom_configure_pin_control_setting(SWDIO_DIR);
gpiom_configure_pin_control_setting(PIN_SRST);

gpio_set_pin_output(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_TCK), GPIO_GET_PIN_INDEX(PIN_TCK));
gpio_set_pin_output(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_TMS), GPIO_GET_PIN_INDEX(PIN_TMS));
gpio_set_pin_input(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_TMS_IN), GPIO_GET_PIN_INDEX(PIN_TMS_IN));
gpio_set_pin_output(PIN_GPIO, GPIO_GET_PORT_INDEX(PIN_SRST), GPIO_GET_PIN_INDEX(PIN_SRST));

gpio_write_pin(PIN_GPIO, GPIO_GET_PORT_INDEX(SWDIO_DIR), GPIO_GET_PIN_INDEX(SWDIO_DIR), 0); // 默认SWDIO为输入
Expand Down
36 changes: 35 additions & 1 deletion projects/HSLink-Pro/src/SW_DP/SW_DP_SPI.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,9 @@ void SPI_PORT_SWD_SETUP(void)
board_init_spi_pins(SWD_SPI_BASE);
HPM_IOC->PAD[PIN_TCK].PAD_CTL = IOC_PAD_PAD_CTL_SR_MASK | IOC_PAD_PAD_CTL_SPD_SET(3);
HPM_IOC->PAD[PIN_TMS].PAD_CTL = IOC_PAD_PAD_CTL_SR_MASK | IOC_PAD_PAD_CTL_SPD_SET(3) | IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(0);

#if HSLINK_ISOLATE
HPM_IOC->PAD[PIN_TMS_IN].PAD_CTL = IOC_PAD_PAD_CTL_SR_MASK | IOC_PAD_PAD_CTL_SPD_SET(3) | IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(0);
#endif
HPM_IOC->PAD[PIN_SRST].FUNC_CTL = IOC_PAD_FUNC_CTL_ALT_SELECT_SET(0);
HPM_IOC->PAD[PIN_SRST].PAD_CTL = IOC_PAD_PAD_CTL_PRS_SET(2) | IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
gpiom_configure_pin_control_setting(PIN_SRST);
Expand Down Expand Up @@ -235,7 +237,11 @@ uint8_t SPI_SWD_Transfer(uint32_t request, uint32_t *data)
/* Read data */
gpio_write_pin(PIN_GPIO, GPIO_GET_PORT_INDEX(SWDIO_DIR), GPIO_GET_PIN_INDEX(SWDIO_DIR), 0);
SWD_SPI_BASE->TRANSCTRL = 0x2000000; /* only read mode*/
#if HSLINK_ISOLATE
SWD_SPI_BASE->TRANSFMT = 0x1F08; /* datalen = 32bit, mosibidir = 0, lsb=1 */
#else
SWD_SPI_BASE->TRANSFMT = 0x1F18; /* datalen = 32bit, mosibidir = 1, lsb=1 */
#endif
SWD_SPI_BASE->CMD = 0xFF;
while (SWD_SPI_BASE->STATUS & SPI_STATUS_SPIACTIVE_MASK) {
};
Expand All @@ -253,7 +259,11 @@ uint8_t SPI_SWD_Transfer(uint32_t request, uint32_t *data)
if (DAP_Data.swd_conf.turnaround > 0) {
gpio_write_pin(PIN_GPIO, GPIO_GET_PORT_INDEX(SWDIO_DIR), GPIO_GET_PIN_INDEX(SWDIO_DIR), 1);
SWD_SPI_BASE->TRANSCTRL = 0x01000000; /* only write mode*/
#if HSLINK_ISOLATE
SWD_SPI_BASE->TRANSFMT = 0x0008; /* datalen = 1bit, mosibidir = 0, lsb=1 */
#else
SWD_SPI_BASE->TRANSFMT = 0x0018; /* datalen = 1bit, mosibidir = 1, lsb=1 */
#endif
spi_set_write_data_count(SWD_SPI_BASE, DAP_Data.swd_conf.turnaround);
SWD_SPI_BASE->CMD = 0xFF;
SWD_SPI_BASE->DATA = 0;
Expand All @@ -274,7 +284,11 @@ uint8_t SPI_SWD_Transfer(uint32_t request, uint32_t *data)
} else {
gpio_write_pin(PIN_GPIO, GPIO_GET_PORT_INDEX(SWDIO_DIR), GPIO_GET_PIN_INDEX(SWDIO_DIR), 1);
SWD_SPI_BASE->TRANSCTRL = 0x1000000; /* only write mode*/
#if HSLINK_ISOLATE
SWD_SPI_BASE->TRANSFMT = 0x1F08; /* datalen = 32bit, mosibidir = 0, lsb=1 */
#else
SWD_SPI_BASE->TRANSFMT = 0x1F18; /* datalen = 32bit, mosibidir = 1, lsb=1 */
#endif
SWD_SPI_BASE->CMD = 0xFF;
SWD_SPI_BASE->DATA = (*data);
while (SWD_SPI_BASE->STATUS & SPI_STATUS_SPIACTIVE_MASK) {
Expand All @@ -293,7 +307,11 @@ uint8_t SPI_SWD_Transfer(uint32_t request, uint32_t *data)
if (DAP_Data.transfer.idle_cycles > 0) {
gpio_write_pin(PIN_GPIO, GPIO_GET_PORT_INDEX(SWDIO_DIR), GPIO_GET_PIN_INDEX(SWDIO_DIR), 1);
SWD_SPI_BASE->TRANSCTRL = 0x01000000; /* only write mode*/
#if HSLINK_ISOLATE
SWD_SPI_BASE->TRANSFMT = 0x0008; /* datalen = 1bit, mosibidir = 0, lsb=1 */
#else
SWD_SPI_BASE->TRANSFMT = 0x0018; /* datalen = 1bit, mosibidir = 1, lsb=1 */
#endif
spi_set_write_data_count(SWD_SPI_BASE, DAP_Data.transfer.idle_cycles);
SWD_SPI_BASE->CMD = 0xFF;
for (int i = 0; i < DAP_Data.transfer.idle_cycles; i++) {
Expand All @@ -313,7 +331,11 @@ uint8_t SPI_SWD_Transfer(uint32_t request, uint32_t *data)
if ((ack == DAP_TRANSFER_WAIT) || (ack == DAP_TRANSFER_FAULT)) {
gpio_write_pin(PIN_GPIO, GPIO_GET_PORT_INDEX(SWDIO_DIR), GPIO_GET_PIN_INDEX(SWDIO_DIR), 0);
SWD_SPI_BASE->TRANSCTRL = 0x02000000; /* only read mode*/
#if HSLINK_ISOLATE
SWD_SPI_BASE->TRANSFMT = 0x0008; /* datalen = 1bit, mosibidir = 0, lsb=1 */
#else
SWD_SPI_BASE->TRANSFMT = 0x0018; /* datalen = 1bit, mosibidir = 1, lsb=1 */
#endif
/* Dummy Read RDATA[0:31] + Parity */
if (DAP_Data.swd_conf.data_phase && ((request & DAP_TRANSFER_RnW) != 0U)) {
spi_set_write_data_count(SWD_SPI_BASE, 33);
Expand All @@ -328,7 +350,11 @@ uint8_t SPI_SWD_Transfer(uint32_t request, uint32_t *data)
if (DAP_Data.swd_conf.turnaround > 0) {
gpio_write_pin(PIN_GPIO, GPIO_GET_PORT_INDEX(SWDIO_DIR), GPIO_GET_PIN_INDEX(SWDIO_DIR), 1);
SWD_SPI_BASE->TRANSCTRL = 0x01000000; /* only write mode*/
#if HSLINK_ISOLATE
SWD_SPI_BASE->TRANSFMT = 0x0008; /* datalen = 1bit, mosibidir = 0, lsb=1 */
#else
SWD_SPI_BASE->TRANSFMT = 0x0018; /* datalen = 1bit, mosibidir = 1, lsb=1 */
#endif
spi_set_write_data_count(SWD_SPI_BASE, DAP_Data.swd_conf.turnaround);
SWD_SPI_BASE->CMD = 0xFF;
SWD_SPI_BASE->DATA = 0;
Expand All @@ -341,7 +367,11 @@ uint8_t SPI_SWD_Transfer(uint32_t request, uint32_t *data)
if (DAP_Data.swd_conf.data_phase && ((request & DAP_TRANSFER_RnW) == 0U)) {
gpio_write_pin(PIN_GPIO, GPIO_GET_PORT_INDEX(SWDIO_DIR), GPIO_GET_PIN_INDEX(SWDIO_DIR), 1);
SWD_SPI_BASE->TRANSCTRL = 0x01000000; /* only write mode*/
#if HSLINK_ISOLATE
SWD_SPI_BASE->TRANSFMT = 0x0008; /* datalen = 1bit, mosibidir = 0, lsb=1 */
#else
SWD_SPI_BASE->TRANSFMT = 0x0018; /* datalen = 1bit, mosibidir = 1, lsb=1 */
#endif
spi_set_write_data_count(SWD_SPI_BASE, 33);
SWD_SPI_BASE->CMD = 0xFF;
for (i = 0; i < 33; i++) {
Expand Down Expand Up @@ -398,7 +428,11 @@ static void swd_emulation_init(void)
format_config.master_config.addr_len_in_bytes = 1U;
format_config.common_config.data_len_in_bits = 1;
format_config.common_config.data_merge = false;
#if HSLINK_ISOLATE
format_config.common_config.mosi_bidir = false;
#else
format_config.common_config.mosi_bidir = true;
#endif
format_config.common_config.lsb = true;
format_config.common_config.mode = spi_master_mode;
format_config.common_config.cpol = spi_sclk_low_idle;
Expand Down
8 changes: 8 additions & 0 deletions projects/HSLink-Pro/src/dp_common.c
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,14 @@ void SPI_Set_Clock_Delay(uint32_t clock)

void Set_Clock_Delay(uint32_t clock)
{
#if HSLINK_ISOLATE
// the isolator olny works below 20MHz
// so we set a limit avoid communication failure
if (clock > 20000000)
{
clock = 20000000;
}
#endif
if (((HSLink_Setting.swd_port_mode == PORT_MODE_SPI) && (DAP_Data.debug_port == DAP_PORT_SWD)) ||
((HSLink_Setting.jtag_port_mode == PORT_MODE_SPI) && (DAP_Data.debug_port == DAP_PORT_JTAG))) {
SPI_Set_Clock_Delay(clock);
Expand Down