2
.github/actions/setup_toolchain/action.yml
vendored
2
.github/actions/setup_toolchain/action.yml
vendored
@@ -17,7 +17,7 @@ runs:
|
|||||||
if: inputs.toolchain == 'arm-gcc'
|
if: inputs.toolchain == 'arm-gcc'
|
||||||
uses: carlosperate/arm-none-eabi-gcc-action@v1
|
uses: carlosperate/arm-none-eabi-gcc-action@v1
|
||||||
with:
|
with:
|
||||||
release: '13.2.Rel1'
|
release: '14.2.Rel1'
|
||||||
|
|
||||||
- name: Pull ESP-IDF docker
|
- name: Pull ESP-IDF docker
|
||||||
if: inputs.toolchain == 'esp-idf'
|
if: inputs.toolchain == 'esp-idf'
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"aarch64-gcc": "https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf.tar.xz",
|
"aarch64-gcc": "https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf.tar.xz",
|
||||||
"arm-clang": "https://github.com/ARM-software/LLVM-embedded-toolchain-for-Arm/releases/download/release-19.1.1/LLVM-ET-Arm-19.1.1-Linux-x86_64.tar.xz",
|
"arm-clang": "https://github.com/ARM-software/LLVM-embedded-toolchain-for-Arm/releases/download/release-19.1.1/LLVM-ET-Arm-19.1.1-Linux-x86_64.tar.xz",
|
||||||
"arm-gcc": "https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases/download/v13.2.1-1.1/xpack-arm-none-eabi-gcc-13.2.1-1.1-linux-x64.tar.gz",
|
"arm-gcc": "https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases/download/v14.2.1-1.1/xpack-arm-none-eabi-gcc-14.2.1-1.1-linux-x64.tar.gz",
|
||||||
"msp430-gcc": "http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSPGCC/9_2_0_0/export/msp430-gcc-9.2.0.50_linux64.tar.bz2",
|
"msp430-gcc": "http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSPGCC/9_2_0_0/export/msp430-gcc-9.2.0.50_linux64.tar.bz2",
|
||||||
"riscv-gcc": "https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v13.2.0-2/xpack-riscv-none-elf-gcc-13.2.0-2-linux-x64.tar.gz",
|
"riscv-gcc": "https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v13.2.0-2/xpack-riscv-none-elf-gcc-13.2.0-2-linux-x64.tar.gz",
|
||||||
"rx-gcc": "https://github.com/hathach/rx_device/releases/download/0.0.1/gcc-8.3.0.202411-GNURX-ELF.run",
|
"rx-gcc": "https://github.com/hathach/rx_device/releases/download/0.0.1/gcc-8.3.0.202411-GNURX-ELF.run",
|
||||||
|
6
.github/workflows/codeql.yml
vendored
6
.github/workflows/codeql.yml
vendored
@@ -66,7 +66,7 @@ jobs:
|
|||||||
|
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@v2
|
uses: github/codeql-action/init@v3
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
# If you wish to specify custom queries, you can do so here or in a config file.
|
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||||
@@ -93,7 +93,7 @@ jobs:
|
|||||||
./.github/workflows/codeql-buildscript.sh
|
./.github/workflows/codeql-buildscript.sh
|
||||||
|
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v2
|
uses: github/codeql-action/analyze@v3
|
||||||
with:
|
with:
|
||||||
category: "/language:${{matrix.language}}"
|
category: "/language:${{matrix.language}}"
|
||||||
upload: false
|
upload: false
|
||||||
@@ -129,7 +129,7 @@ jobs:
|
|||||||
sarif_file: ${{ steps.step1.outputs.sarif-output }}
|
sarif_file: ${{ steps.step1.outputs.sarif-output }}
|
||||||
category: "/language:${{matrix.language}}"
|
category: "/language:${{matrix.language}}"
|
||||||
|
|
||||||
- name: Archive CodeQL results
|
- name: Upload CodeQL results as an artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
name: codeql-results
|
name: codeql-results
|
||||||
|
@@ -190,7 +190,9 @@ void tuh_hid_umount_cb(uint8_t dev_addr, uint8_t instance) {
|
|||||||
// look up new key in previous keys
|
// look up new key in previous keys
|
||||||
static inline bool find_key_in_report(hid_keyboard_report_t const* report, uint8_t keycode) {
|
static inline bool find_key_in_report(hid_keyboard_report_t const* report, uint8_t keycode) {
|
||||||
for (uint8_t i = 0; i < 6; i++) {
|
for (uint8_t i = 0; i < 6; i++) {
|
||||||
if (report->keycode[i] == keycode) return true;
|
if (report->keycode[i] == keycode) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -230,7 +232,9 @@ static void process_kbd_report(uint8_t dev_addr, hid_keyboard_report_t const* re
|
|||||||
// TODO example skips key released
|
// TODO example skips key released
|
||||||
}
|
}
|
||||||
|
|
||||||
if (flush) tud_cdc_write_flush();
|
if (flush) {
|
||||||
|
tud_cdc_write_flush();
|
||||||
|
}
|
||||||
|
|
||||||
prev_report = *report;
|
prev_report = *report;
|
||||||
}
|
}
|
||||||
|
@@ -78,6 +78,22 @@ static void print_device_info(uint8_t daddr, const tusb_desc_device_t* desc_devi
|
|||||||
void led_blinking_task(void);
|
void led_blinking_task(void);
|
||||||
void cdc_task(void);
|
void cdc_task(void);
|
||||||
|
|
||||||
|
#define cdc_printf(...) \
|
||||||
|
do { \
|
||||||
|
char _tempbuf[256]; \
|
||||||
|
char* _bufptr = _tempbuf; \
|
||||||
|
uint32_t count = (uint32_t) sprintf(_tempbuf, __VA_ARGS__); \
|
||||||
|
while (count > 0) { \
|
||||||
|
uint32_t wr_count = tud_cdc_write(_bufptr, count); \
|
||||||
|
count -= wr_count; \
|
||||||
|
_bufptr += wr_count; \
|
||||||
|
if (count > 0){ \
|
||||||
|
tud_task(); \
|
||||||
|
tud_cdc_write_flush(); \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
/*------------- MAIN -------------*/
|
/*------------- MAIN -------------*/
|
||||||
int main(void) {
|
int main(void) {
|
||||||
board_init();
|
board_init();
|
||||||
@@ -160,22 +176,6 @@ void cdc_task(void) {
|
|||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// Host Get device information
|
// Host Get device information
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
#define cdc_printf(...) \
|
|
||||||
do { \
|
|
||||||
char _tempbuf[256]; \
|
|
||||||
char* _bufptr = _tempbuf; \
|
|
||||||
uint32_t count = (uint32_t) sprintf(_tempbuf, __VA_ARGS__); \
|
|
||||||
while (count > 0) { \
|
|
||||||
uint32_t wr_count = tud_cdc_write(_bufptr, count); \
|
|
||||||
count -= wr_count; \
|
|
||||||
_bufptr += wr_count; \
|
|
||||||
if (count > 0){ \
|
|
||||||
tud_task();\
|
|
||||||
tud_cdc_write_flush(); \
|
|
||||||
} \
|
|
||||||
} \
|
|
||||||
} while(0)
|
|
||||||
|
|
||||||
static void print_device_info(uint8_t daddr, const tusb_desc_device_t* desc_device) {
|
static void print_device_info(uint8_t daddr, const tusb_desc_device_t* desc_device) {
|
||||||
// Get String descriptor using Sync API
|
// Get String descriptor using Sync API
|
||||||
uint16_t serial[64];
|
uint16_t serial[64];
|
||||||
@@ -232,12 +232,14 @@ void tuh_enum_descriptor_device_cb(uint8_t daddr, tusb_desc_device_t const* desc
|
|||||||
}
|
}
|
||||||
|
|
||||||
void tuh_mount_cb(uint8_t daddr) {
|
void tuh_mount_cb(uint8_t daddr) {
|
||||||
printf("mounted device %u\r\n", daddr);
|
cdc_printf("mounted device %u\r\n", daddr);
|
||||||
|
tud_cdc_write_flush();
|
||||||
is_print[daddr] = true;
|
is_print[daddr] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tuh_umount_cb(uint8_t daddr) {
|
void tuh_umount_cb(uint8_t daddr) {
|
||||||
printf("unmounted device %u\r\n", daddr);
|
cdc_printf("unmounted device %u\r\n", daddr);
|
||||||
|
tud_cdc_write_flush();
|
||||||
is_print[daddr] = false;
|
is_print[daddr] = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -249,7 +251,9 @@ void led_blinking_task(void) {
|
|||||||
static bool led_state = false;
|
static bool led_state = false;
|
||||||
|
|
||||||
// Blink every interval ms
|
// Blink every interval ms
|
||||||
if (board_millis() - start_ms < blink_interval_ms) return; // not enough time
|
if (board_millis() - start_ms < blink_interval_ms) {
|
||||||
|
return;// not enough time
|
||||||
|
}
|
||||||
start_ms += blink_interval_ms;
|
start_ms += blink_interval_ms;
|
||||||
|
|
||||||
board_led_write(led_state);
|
board_led_write(led_state);
|
||||||
@@ -300,7 +304,9 @@ static int _count_utf8_bytes(const uint16_t *buf, size_t len) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void print_utf16(uint16_t *temp_buf, size_t buf_len) {
|
static void print_utf16(uint16_t *temp_buf, size_t buf_len) {
|
||||||
if ((temp_buf[0] & 0xff) == 0) return; // empty
|
if ((temp_buf[0] & 0xff) == 0) {
|
||||||
|
return;// empty
|
||||||
|
}
|
||||||
size_t utf16_len = ((temp_buf[0] & 0xff) - 2) / sizeof(uint16_t);
|
size_t utf16_len = ((temp_buf[0] & 0xff) - 2) / sizeof(uint16_t);
|
||||||
size_t utf8_len = (size_t) _count_utf8_bytes(temp_buf + 1, utf16_len);
|
size_t utf8_len = (size_t) _count_utf8_bytes(temp_buf + 1, utf16_len);
|
||||||
_convert_utf16le_to_utf8(temp_buf + 1, utf16_len, (uint8_t *) temp_buf, sizeof(uint16_t) * buf_len);
|
_convert_utf16le_to_utf8(temp_buf + 1, utf16_len, (uint8_t *) temp_buf, sizeof(uint16_t) * buf_len);
|
||||||
|
@@ -29,14 +29,9 @@
|
|||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// MACRO TYPEDEF CONSTANT ENUM DECLARATION
|
// MACRO TYPEDEF CONSTANT ENUM DECLARATION
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
|
|
||||||
// If your host terminal support ansi escape code such as TeraTerm
|
|
||||||
// it can be use to simulate mouse cursor movement within terminal
|
|
||||||
#define USE_ANSI_ESCAPE 0
|
|
||||||
|
|
||||||
#define MAX_REPORT 4
|
#define MAX_REPORT 4
|
||||||
|
|
||||||
static uint8_t const keycode2ascii[128][2] = { HID_KEYCODE_TO_ASCII };
|
static uint8_t const keycode2ascii[128][2] = {HID_KEYCODE_TO_ASCII};
|
||||||
|
|
||||||
// Each HID instance can has multiple reports
|
// Each HID instance can has multiple reports
|
||||||
static struct {
|
static struct {
|
||||||
@@ -45,8 +40,8 @@ static struct {
|
|||||||
} hid_info[CFG_TUH_HID];
|
} hid_info[CFG_TUH_HID];
|
||||||
|
|
||||||
static void process_kbd_report(hid_keyboard_report_t const *report);
|
static void process_kbd_report(hid_keyboard_report_t const *report);
|
||||||
static void process_mouse_report(hid_mouse_report_t const * report);
|
static void process_mouse_report(hid_mouse_report_t const *report);
|
||||||
static void process_generic_report(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len);
|
static void process_generic_report(uint8_t dev_addr, uint8_t instance, uint8_t const *report, uint16_t len);
|
||||||
|
|
||||||
void hid_app_task(void) {
|
void hid_app_task(void) {
|
||||||
// nothing to do
|
// nothing to do
|
||||||
@@ -70,7 +65,7 @@ void tuh_hid_mount_cb(uint8_t dev_addr, uint8_t instance, uint8_t const *desc_re
|
|||||||
|
|
||||||
printf("HID Interface Protocol = %s\r\n", protocol_str[itf_protocol]);
|
printf("HID Interface Protocol = %s\r\n", protocol_str[itf_protocol]);
|
||||||
|
|
||||||
// By default host stack will use activate boot protocol on supported interface.
|
// By default, host stack will use boot protocol on supported interface.
|
||||||
// Therefore for this simple example, we only need to parse generic report descriptor (with built-in parser)
|
// Therefore for this simple example, we only need to parse generic report descriptor (with built-in parser)
|
||||||
if (itf_protocol == HID_ITF_PROTOCOL_NONE) {
|
if (itf_protocol == HID_ITF_PROTOCOL_NONE) {
|
||||||
hid_info[instance].report_count = tuh_hid_parse_report_descriptor(hid_info[instance].report_info, MAX_REPORT, desc_report, desc_len);
|
hid_info[instance].report_count = tuh_hid_parse_report_descriptor(hid_info[instance].report_info, MAX_REPORT, desc_report, desc_len);
|
||||||
@@ -121,7 +116,7 @@ void tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t cons
|
|||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
|
|
||||||
// look up new key in previous keys
|
// look up new key in previous keys
|
||||||
static inline bool find_key_in_report(hid_keyboard_report_t const* report, uint8_t keycode) {
|
static inline bool find_key_in_report(hid_keyboard_report_t const *report, uint8_t keycode) {
|
||||||
for (uint8_t i = 0; i < 6; i++) {
|
for (uint8_t i = 0; i < 6; i++) {
|
||||||
if (report->keycode[i] == keycode) {
|
if (report->keycode[i] == keycode) {
|
||||||
return true;
|
return true;
|
||||||
@@ -130,28 +125,25 @@ static inline bool find_key_in_report(hid_keyboard_report_t const* report, uint8
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void process_kbd_report(hid_keyboard_report_t const *report)
|
static void process_kbd_report(hid_keyboard_report_t const *report) {
|
||||||
{
|
static hid_keyboard_report_t prev_report = {0, 0, {0}};// previous report to check key released
|
||||||
static hid_keyboard_report_t prev_report = { 0, 0, {0} }; // previous report to check key released
|
|
||||||
|
|
||||||
//------------- example code ignore control (non-printable) key affects -------------//
|
//------------- example code ignore control (non-printable) key affects -------------//
|
||||||
for(uint8_t i=0; i<6; i++)
|
for (uint8_t i = 0; i < 6; i++) {
|
||||||
{
|
if (report->keycode[i]) {
|
||||||
if ( report->keycode[i] )
|
if (find_key_in_report(&prev_report, report->keycode[i])) {
|
||||||
{
|
|
||||||
if ( find_key_in_report(&prev_report, report->keycode[i]) )
|
|
||||||
{
|
|
||||||
// exist in previous report means the current key is holding
|
// exist in previous report means the current key is holding
|
||||||
}else
|
} else {
|
||||||
{
|
|
||||||
// not existed in previous report means the current key is pressed
|
// not existed in previous report means the current key is pressed
|
||||||
bool const is_shift = report->modifier & (KEYBOARD_MODIFIER_LEFTSHIFT | KEYBOARD_MODIFIER_RIGHTSHIFT);
|
bool const is_shift = report->modifier & (KEYBOARD_MODIFIER_LEFTSHIFT | KEYBOARD_MODIFIER_RIGHTSHIFT);
|
||||||
uint8_t ch = keycode2ascii[report->keycode[i]][is_shift ? 1 : 0];
|
uint8_t ch = keycode2ascii[report->keycode[i]][is_shift ? 1 : 0];
|
||||||
putchar(ch);
|
putchar(ch);
|
||||||
if ( ch == '\r' ) putchar('\n'); // added new line for enter key
|
if (ch == '\r') {
|
||||||
|
putchar('\n');
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef __ICCARM__ // TODO IAR doesn't support stream control ?
|
#ifndef __ICCARM__ // TODO IAR doesn't support stream control ?
|
||||||
fflush(stdout); // flush right away, else nanolib will wait for newline
|
fflush(stdout);// flush right away, else nanolib will wait for newline
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -166,55 +158,22 @@ static void process_kbd_report(hid_keyboard_report_t const *report)
|
|||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
|
|
||||||
static void cursor_movement(int8_t x, int8_t y, int8_t wheel) {
|
static void cursor_movement(int8_t x, int8_t y, int8_t wheel) {
|
||||||
#if USE_ANSI_ESCAPE
|
|
||||||
// Move X using ansi escape
|
|
||||||
if ( x < 0)
|
|
||||||
{
|
|
||||||
printf(ANSI_CURSOR_BACKWARD(%d), (-x)); // move left
|
|
||||||
}else if ( x > 0)
|
|
||||||
{
|
|
||||||
printf(ANSI_CURSOR_FORWARD(%d), x); // move right
|
|
||||||
}
|
|
||||||
|
|
||||||
// Move Y using ansi escape
|
|
||||||
if ( y < 0)
|
|
||||||
{
|
|
||||||
printf(ANSI_CURSOR_UP(%d), (-y)); // move up
|
|
||||||
}else if ( y > 0)
|
|
||||||
{
|
|
||||||
printf(ANSI_CURSOR_DOWN(%d), y); // move down
|
|
||||||
}
|
|
||||||
|
|
||||||
// Scroll using ansi escape
|
|
||||||
if (wheel < 0)
|
|
||||||
{
|
|
||||||
printf(ANSI_SCROLL_UP(%d), (-wheel)); // scroll up
|
|
||||||
}else if (wheel > 0)
|
|
||||||
{
|
|
||||||
printf(ANSI_SCROLL_DOWN(%d), wheel); // scroll down
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("\r\n");
|
|
||||||
#else
|
|
||||||
printf("(%d %d %d)\r\n", x, y, wheel);
|
printf("(%d %d %d)\r\n", x, y, wheel);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void process_mouse_report(hid_mouse_report_t const * report)
|
static void process_mouse_report(hid_mouse_report_t const *report) {
|
||||||
{
|
static hid_mouse_report_t prev_report = {0};
|
||||||
static hid_mouse_report_t prev_report = { 0 };
|
|
||||||
|
|
||||||
//------------- button state -------------//
|
// button state
|
||||||
uint8_t button_changed_mask = report->buttons ^ prev_report.buttons;
|
uint8_t button_changed_mask = report->buttons ^ prev_report.buttons;
|
||||||
if ( button_changed_mask & report->buttons)
|
if (button_changed_mask & report->buttons) {
|
||||||
{
|
|
||||||
printf(" %c%c%c ",
|
printf(" %c%c%c ",
|
||||||
report->buttons & MOUSE_BUTTON_LEFT ? 'L' : '-',
|
report->buttons & MOUSE_BUTTON_LEFT ? 'L' : '-',
|
||||||
report->buttons & MOUSE_BUTTON_MIDDLE ? 'M' : '-',
|
report->buttons & MOUSE_BUTTON_MIDDLE ? 'M' : '-',
|
||||||
report->buttons & MOUSE_BUTTON_RIGHT ? 'R' : '-');
|
report->buttons & MOUSE_BUTTON_RIGHT ? 'R' : '-');
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------- cursor movement -------------//
|
// cursor movement
|
||||||
cursor_movement(report->x, report->y, report->wheel);
|
cursor_movement(report->x, report->y, report->wheel);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -263,18 +222,23 @@ static void process_generic_report(uint8_t dev_addr, uint8_t instance, uint8_t c
|
|||||||
if (rpt_info->usage_page == HID_USAGE_PAGE_DESKTOP) {
|
if (rpt_info->usage_page == HID_USAGE_PAGE_DESKTOP) {
|
||||||
switch (rpt_info->usage) {
|
switch (rpt_info->usage) {
|
||||||
case HID_USAGE_DESKTOP_KEYBOARD:
|
case HID_USAGE_DESKTOP_KEYBOARD:
|
||||||
TU_LOG1("HID receive keyboard report\r\n");
|
TU_LOG2("HID receive keyboard report\r\n");
|
||||||
// Assume keyboard follow boot report layout
|
// Assume keyboard follow boot report layout
|
||||||
process_kbd_report((hid_keyboard_report_t const *) report);
|
process_kbd_report((hid_keyboard_report_t const *) report);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HID_USAGE_DESKTOP_MOUSE:
|
case HID_USAGE_DESKTOP_MOUSE:
|
||||||
TU_LOG1("HID receive mouse report\r\n");
|
TU_LOG2("HID receive mouse report\r\n");
|
||||||
// Assume mouse follow boot report layout
|
// Assume mouse follow boot report layout
|
||||||
process_mouse_report((hid_mouse_report_t const *) report);
|
process_mouse_report((hid_mouse_report_t const *) report);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
printf("report[%u] ", rpt_info->report_id);
|
||||||
|
for (uint8_t i = 0; i < len; i++) {
|
||||||
|
printf("%02X ", report[i]);
|
||||||
|
}
|
||||||
|
printf("\r\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -3,21 +3,26 @@
|
|||||||
**
|
**
|
||||||
** File : stm32wb55xx_flash_cm4.ld
|
** File : stm32wb55xx_flash_cm4.ld
|
||||||
**
|
**
|
||||||
** Abstract : System Workbench Minimal System calls file
|
** Author : STM32CubeIDE
|
||||||
**
|
**
|
||||||
** For more information about which c-functions
|
** Abstract : Linker script for STM32WB55xx Device
|
||||||
** need which of these lowlevel functions
|
** 1024Kbytes FLASH
|
||||||
** please consult the Newlib libc-manual
|
** 128Kbytes RAM
|
||||||
**
|
**
|
||||||
** Environment : System Workbench for MCU
|
** Set heap size, stack size and stack location according
|
||||||
|
** to application requirements.
|
||||||
**
|
**
|
||||||
** Distribution: The file is distributed “as is,” without any warranty
|
** Set memory bank area and size if external memory is used.
|
||||||
|
**
|
||||||
|
** Target : STMicroelectronics STM32
|
||||||
|
**
|
||||||
|
** Distribution: The file is distributed as is without any warranty
|
||||||
** of any kind.
|
** of any kind.
|
||||||
**
|
**
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
** @attention
|
** @attention
|
||||||
**
|
**
|
||||||
** Copyright (c) 2019 STMicroelectronics.
|
** Copyright (c) 2019-2022 STMicroelectronics.
|
||||||
** All rights reserved.
|
** All rights reserved.
|
||||||
**
|
**
|
||||||
** This software is licensed under terms that can be found in the LICENSE file
|
** This software is licensed under terms that can be found in the LICENSE file
|
||||||
@@ -81,7 +86,10 @@ SECTIONS
|
|||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
} >FLASH
|
} >FLASH
|
||||||
|
|
||||||
.ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
|
.ARM.extab :
|
||||||
|
{
|
||||||
|
*(.ARM.extab* .gnu.linkonce.armextab.*)
|
||||||
|
} >FLASH
|
||||||
.ARM : {
|
.ARM : {
|
||||||
__exidx_start = .;
|
__exidx_start = .;
|
||||||
*(.ARM.exidx*)
|
*(.ARM.exidx*)
|
||||||
@@ -124,7 +132,6 @@ SECTIONS
|
|||||||
_edata = .; /* define a global symbol at data end */
|
_edata = .; /* define a global symbol at data end */
|
||||||
} >RAM1 AT> FLASH
|
} >RAM1 AT> FLASH
|
||||||
|
|
||||||
|
|
||||||
/* Uninitialized data section */
|
/* Uninitialized data section */
|
||||||
. = ALIGN(4);
|
. = ALIGN(4);
|
||||||
.bss :
|
.bss :
|
||||||
@@ -152,8 +159,6 @@ SECTIONS
|
|||||||
. = ALIGN(8);
|
. = ALIGN(8);
|
||||||
} >RAM1
|
} >RAM1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Remove information from the standard libraries */
|
/* Remove information from the standard libraries */
|
||||||
/DISCARD/ :
|
/DISCARD/ :
|
||||||
{
|
{
|
||||||
@@ -165,5 +170,13 @@ SECTIONS
|
|||||||
.ARM.attributes 0 : { *(.ARM.attributes) }
|
.ARM.attributes 0 : { *(.ARM.attributes) }
|
||||||
MAPPING_TABLE (NOLOAD) : { *(MAPPING_TABLE) } >RAM_SHARED
|
MAPPING_TABLE (NOLOAD) : { *(MAPPING_TABLE) } >RAM_SHARED
|
||||||
MB_MEM1 (NOLOAD) : { *(MB_MEM1) } >RAM_SHARED
|
MB_MEM1 (NOLOAD) : { *(MB_MEM1) } >RAM_SHARED
|
||||||
MB_MEM2 (NOLOAD) : { _sMB_MEM2 = . ; *(MB_MEM2) ; _eMB_MEM2 = . ; } >RAM_SHARED
|
|
||||||
|
/* used by the startup to initialize .MB_MEM2 data */
|
||||||
|
_siMB_MEM2 = LOADADDR(.MB_MEM2);
|
||||||
|
.MB_MEM2 :
|
||||||
|
{
|
||||||
|
_sMB_MEM2 = . ;
|
||||||
|
*(MB_MEM2) ;
|
||||||
|
_eMB_MEM2 = . ;
|
||||||
|
} >RAM_SHARED AT> FLASH
|
||||||
}
|
}
|
||||||
|
@@ -184,8 +184,7 @@ void HardFault_Handler(void) {
|
|||||||
asm("bkpt 1");
|
asm("bkpt 1");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Required by __libc_init_array in startup code if we are compiling using
|
// Required by __libc_init_array in startup code if we are compiling using -nostdlib/-nostartfiles.
|
||||||
// -nostdlib/-nostartfiles.
|
void _init(void);
|
||||||
void _init(void) {
|
void _init(void) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -672,7 +672,7 @@ void cdch_close(uint8_t daddr) {
|
|||||||
|
|
||||||
bool cdch_xfer_cb(uint8_t daddr, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes) {
|
bool cdch_xfer_cb(uint8_t daddr, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes) {
|
||||||
// TODO handle stall response, retry failed transfer ...
|
// TODO handle stall response, retry failed transfer ...
|
||||||
TU_ASSERT(event == XFER_RESULT_SUCCESS);
|
TU_VERIFY(event == XFER_RESULT_SUCCESS);
|
||||||
|
|
||||||
uint8_t const idx = get_idx_by_ep_addr(daddr, ep_addr);
|
uint8_t const idx = get_idx_by_ep_addr(daddr, ep_addr);
|
||||||
cdch_interface_t * p_cdc = get_itf(idx);
|
cdch_interface_t * p_cdc = get_itf(idx);
|
||||||
|
@@ -444,7 +444,7 @@ bool hidh_xfer_cb(uint8_t daddr, uint8_t ep_addr, xfer_result_t result, uint32_t
|
|||||||
hidh_epbuf_t* epbuf = get_hid_epbuf(idx);
|
hidh_epbuf_t* epbuf = get_hid_epbuf(idx);
|
||||||
|
|
||||||
if (dir == TUSB_DIR_IN) {
|
if (dir == TUSB_DIR_IN) {
|
||||||
TU_LOG_DRV(" Get Report callback (%u, %u)\r\n", daddr, idx);
|
TU_LOG_DRV(" [idx=%u] Get Report callback\r\n", idx);
|
||||||
TU_LOG3_MEM(epbuf->epin, xferred_bytes, 2);
|
TU_LOG3_MEM(epbuf->epin, xferred_bytes, 2);
|
||||||
tuh_hid_report_received_cb(daddr, idx, epbuf->epin, (uint16_t) xferred_bytes);
|
tuh_hid_report_received_cb(daddr, idx, epbuf->epin, (uint16_t) xferred_bytes);
|
||||||
} else {
|
} else {
|
||||||
@@ -461,7 +461,9 @@ void hidh_close(uint8_t daddr) {
|
|||||||
hidh_interface_t* p_hid = &_hidh_itf[i];
|
hidh_interface_t* p_hid = &_hidh_itf[i];
|
||||||
if (p_hid->daddr == daddr) {
|
if (p_hid->daddr == daddr) {
|
||||||
TU_LOG_DRV(" HIDh close addr = %u index = %u\r\n", daddr, i);
|
TU_LOG_DRV(" HIDh close addr = %u index = %u\r\n", daddr, i);
|
||||||
if (tuh_hid_umount_cb) tuh_hid_umount_cb(daddr, i);
|
if (tuh_hid_umount_cb) {
|
||||||
|
tuh_hid_umount_cb(daddr, i);
|
||||||
|
}
|
||||||
tu_memclr(p_hid, sizeof(hidh_interface_t));
|
tu_memclr(p_hid, sizeof(hidh_interface_t));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -201,7 +201,6 @@ bool hub_port_get_status(uint8_t hub_addr, uint8_t hub_port, void* resp,
|
|||||||
|
|
||||||
bool hub_port_get_status_local(uint8_t hub_addr, uint8_t hub_port, hub_port_status_response_t* resp) {
|
bool hub_port_get_status_local(uint8_t hub_addr, uint8_t hub_port, hub_port_status_response_t* resp) {
|
||||||
(void) hub_port;
|
(void) hub_port;
|
||||||
TU_VERIFY(hub_addr > CFG_TUH_DEVICE_MAX);
|
|
||||||
hub_interface_t* p_hub = get_hub_itf(hub_addr);
|
hub_interface_t* p_hub = get_hub_itf(hub_addr);
|
||||||
*resp = p_hub->port_status;
|
*resp = p_hub->port_status;
|
||||||
return true;
|
return true;
|
||||||
|
@@ -547,7 +547,7 @@ void tuh_task_ext(uint32_t timeout_ms, bool in_isr) {
|
|||||||
// TODO better to have an separated queue for newly attached devices
|
// TODO better to have an separated queue for newly attached devices
|
||||||
if (_usbh_data.enumerating_daddr == TUSB_INDEX_INVALID_8) {
|
if (_usbh_data.enumerating_daddr == TUSB_INDEX_INVALID_8) {
|
||||||
// New device attached and we are ready
|
// New device attached and we are ready
|
||||||
TU_LOG1("[%u:] USBH Device Attach\r\n", event.rhport);
|
TU_LOG_USBH("[%u:] USBH Device Attach\r\n", event.rhport);
|
||||||
_usbh_data.enumerating_daddr = 0; // enumerate new device with address 0
|
_usbh_data.enumerating_daddr = 0; // enumerate new device with address 0
|
||||||
enum_new_device(&event);
|
enum_new_device(&event);
|
||||||
} else {
|
} else {
|
||||||
@@ -562,7 +562,7 @@ void tuh_task_ext(uint32_t timeout_ms, bool in_isr) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case HCD_EVENT_DEVICE_REMOVE:
|
case HCD_EVENT_DEVICE_REMOVE:
|
||||||
TU_LOG1("[%u:%u:%u] USBH DEVICE REMOVED\r\n", event.rhport, event.connection.hub_addr, event.connection.hub_port);
|
TU_LOG_USBH("[%u:%u:%u] USBH DEVICE REMOVED\r\n", event.rhport, event.connection.hub_addr, event.connection.hub_port);
|
||||||
if (_usbh_data.enumerating_daddr == 0 &&
|
if (_usbh_data.enumerating_daddr == 0 &&
|
||||||
event.rhport == _usbh_data.dev0_bus.rhport &&
|
event.rhport == _usbh_data.dev0_bus.rhport &&
|
||||||
event.connection.hub_addr == _usbh_data.dev0_bus.hub_addr &&
|
event.connection.hub_addr == _usbh_data.dev0_bus.hub_addr &&
|
||||||
@@ -579,7 +579,8 @@ void tuh_task_ext(uint32_t timeout_ms, bool in_isr) {
|
|||||||
uint8_t const epnum = tu_edpt_number(ep_addr);
|
uint8_t const epnum = tu_edpt_number(ep_addr);
|
||||||
uint8_t const ep_dir = (uint8_t) tu_edpt_dir(ep_addr);
|
uint8_t const ep_dir = (uint8_t) tu_edpt_dir(ep_addr);
|
||||||
|
|
||||||
TU_LOG_USBH("on EP %02X with %u bytes: %s\r\n", ep_addr, (unsigned int) event.xfer_complete.len, tu_str_xfer_result[event.xfer_complete.result]);
|
TU_LOG_USBH("[:%u] on EP %02X with %u bytes: %s\r\n",
|
||||||
|
event.dev_addr, ep_addr, (unsigned int) event.xfer_complete.len, tu_str_xfer_result[event.xfer_complete.result]);
|
||||||
|
|
||||||
if (event.dev_addr == 0) {
|
if (event.dev_addr == 0) {
|
||||||
// device 0 only has control endpoint
|
// device 0 only has control endpoint
|
||||||
@@ -618,7 +619,7 @@ void tuh_task_ext(uint32_t timeout_ms, bool in_isr) {
|
|||||||
uint8_t drv_id = dev->ep2drv[epnum][ep_dir];
|
uint8_t drv_id = dev->ep2drv[epnum][ep_dir];
|
||||||
usbh_class_driver_t const* driver = get_driver(drv_id);
|
usbh_class_driver_t const* driver = get_driver(drv_id);
|
||||||
if (driver) {
|
if (driver) {
|
||||||
TU_LOG_USBH("%s xfer callback\r\n", driver->name);
|
TU_LOG_USBH(" %s xfer callback\r\n", driver->name);
|
||||||
driver->xfer_cb(event.dev_addr, ep_addr, (xfer_result_t) event.xfer_complete.result,
|
driver->xfer_cb(event.dev_addr, ep_addr, (xfer_result_t) event.xfer_complete.result,
|
||||||
event.xfer_complete.len);
|
event.xfer_complete.len);
|
||||||
} else {
|
} else {
|
||||||
@@ -1463,7 +1464,7 @@ static void process_enumeration(tuh_xfer_t* xfer) {
|
|||||||
bool retry = (_usbh_data.enumerating_daddr != TUSB_INDEX_INVALID_8) && (failed_count < ATTEMPT_COUNT_MAX);
|
bool retry = (_usbh_data.enumerating_daddr != TUSB_INDEX_INVALID_8) && (failed_count < ATTEMPT_COUNT_MAX);
|
||||||
if (retry) {
|
if (retry) {
|
||||||
tusb_time_delay_ms_api(ATTEMPT_DELAY_MS); // delay a bit
|
tusb_time_delay_ms_api(ATTEMPT_DELAY_MS); // delay a bit
|
||||||
TU_LOG1("Enumeration attempt %u/%u\r\n", failed_count+1, ATTEMPT_COUNT_MAX);
|
TU_LOG_USBH("Enumeration attempt %u/%u\r\n", failed_count+1, ATTEMPT_COUNT_MAX);
|
||||||
retry = tuh_control_xfer(xfer);
|
retry = tuh_control_xfer(xfer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -59,7 +59,7 @@ deps_optional = {
|
|||||||
'144f1eb7ea8c06512e12f12b27383601c0272410',
|
'144f1eb7ea8c06512e12f12b27383601c0272410',
|
||||||
'kinetis_k kinetis_k32l2 kinetis_kl lpc51 lpc54 lpc55 mcx imxrt'],
|
'kinetis_k kinetis_k32l2 kinetis_kl lpc51 lpc54 lpc55 mcx imxrt'],
|
||||||
'hw/mcu/raspberry_pi/Pico-PIO-USB': ['https://github.com/hathach/Pico-PIO-USB.git',
|
'hw/mcu/raspberry_pi/Pico-PIO-USB': ['https://github.com/hathach/Pico-PIO-USB.git',
|
||||||
'810653f66adadba3e0e4b4b56d5167ac4f7fdbf7',
|
'032a469e79f6a4ba40760d7868e6db26e15002d7',
|
||||||
'rp2040'],
|
'rp2040'],
|
||||||
'hw/mcu/renesas/fsp': ['https://github.com/renesas/fsp.git',
|
'hw/mcu/renesas/fsp': ['https://github.com/renesas/fsp.git',
|
||||||
'edcc97d684b6f716728a60d7a6fea049d9870bd6',
|
'edcc97d684b6f716728a60d7a6fea049d9870bd6',
|
||||||
@@ -122,7 +122,7 @@ deps_optional = {
|
|||||||
'5ad9797c54ec3e55eff770fc9b3cd4a1aefc1309',
|
'5ad9797c54ec3e55eff770fc9b3cd4a1aefc1309',
|
||||||
'stm32u5'],
|
'stm32u5'],
|
||||||
'hw/mcu/st/cmsis_device_wb': ['https://github.com/STMicroelectronics/cmsis_device_wb.git',
|
'hw/mcu/st/cmsis_device_wb': ['https://github.com/STMicroelectronics/cmsis_device_wb.git',
|
||||||
'9c5d1920dd9fabbe2548e10561d63db829bb744f',
|
'd6a7fa2e7de084f5e5e47f2ab88b022fe9b50e5a',
|
||||||
'stm32wb'],
|
'stm32wb'],
|
||||||
'hw/mcu/st/stm32-mfxstm32l152': ['https://github.com/STMicroelectronics/stm32-mfxstm32l152.git',
|
'hw/mcu/st/stm32-mfxstm32l152': ['https://github.com/STMicroelectronics/stm32-mfxstm32l152.git',
|
||||||
'7f4389efee9c6a655b55e5df3fceef5586b35f9b',
|
'7f4389efee9c6a655b55e5df3fceef5586b35f9b',
|
||||||
|
Reference in New Issue
Block a user