From 08dead4b310b4a7e0d5cd035324d266fc1df5e29 Mon Sep 17 00:00:00 2001 From: "Dr. Michael Lauer" Date: Sun, 14 Jan 2024 16:04:04 +0100 Subject: [PATCH] feat(ulp-riscv): Add convenience print function that supports different widths This commit adds a convenience function to print hex numbers of different widths on the ULP RISC-V core. Closes https://github.com/espressif/esp-idf/pull/13180 --- .../ulp_core/include/ulp_riscv_print.h | 8 +++++ .../ulp/ulp_riscv/ulp_core/ulp_riscv_print.c | 35 +++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/components/ulp/ulp_riscv/ulp_core/include/ulp_riscv_print.h b/components/ulp/ulp_riscv/ulp_core/include/ulp_riscv_print.h index 39d7fa2aee..ac9e8931f6 100644 --- a/components/ulp/ulp_riscv/ulp_core/include/ulp_riscv_print.h +++ b/components/ulp/ulp_riscv/ulp_core/include/ulp_riscv_print.h @@ -35,6 +35,14 @@ void ulp_riscv_print_str(const char *str); */ void ulp_riscv_print_hex(int h); +/** + * @brief Prints a hex number with the specified number of digits. Does not print 0x, only the digits + * + * @param Hex number to print + * @param number_of_digits Number of digits to print. + */ +void ulp_riscv_print_hex_with_number_of_digits(int h, int number_of_digits); + #ifdef __cplusplus } #endif diff --git a/components/ulp/ulp_riscv/ulp_core/ulp_riscv_print.c b/components/ulp/ulp_riscv/ulp_core/ulp_riscv_print.c index 6c3ed2c88a..713ed6fb86 100644 --- a/components/ulp/ulp_riscv/ulp_core/ulp_riscv_print.c +++ b/components/ulp/ulp_riscv/ulp_core/ulp_riscv_print.c @@ -60,3 +60,38 @@ void ulp_riscv_print_hex(int h) ULP_RISCV_EXIT_CRITICAL(); } + +void ulp_riscv_print_hex_with_number_of_digits(int h, int number_of_digits) +{ + int x; + int c; + + if (!s_print_ctx.putc) { + return; + } + + if (number_of_digits < 1) { + return; + } + + if (number_of_digits >= 8) { + ulp_riscv_print_hex(h); + return; + } + + /* Perform the bit-banged UART operation in a critical section */ + ULP_RISCV_ENTER_CRITICAL(); + + // Does not print '0x', only the digits specified by the number_of_digits argument + for (x = 0; x < number_of_digits; x++) { + c = (h >> ((number_of_digits - 1) * 4)) & 0xf; // extract the leftmost byte + if (c < 10) { + s_print_ctx.putc(s_print_ctx.putc_ctx, '0' + c); + } else { + s_print_ctx.putc(s_print_ctx.putc_ctx, 'a' + c - 10); + } + h <<= 4; // move the 2nd leftmost byte to the left, to be extracted next + } + + ULP_RISCV_EXIT_CRITICAL(); +}