diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d6739cc8ad723..03d67c7050831 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,7 +3,7 @@ Thank you for your interest in contributing to Apache NuttX RTOS :-) If you haven't yet read -[The Inviolable Principles of NuttX]( https://github.com/apache/nuttx/blob/master/INVIOLABLES.md) +[The Inviolable Principles of NuttX](https://github.com/apache/nuttx/blob/master/INVIOLABLES.md) please do so first. Apache NuttX RTOS supports over 15 different architectures, 360+ boards, @@ -355,8 +355,8 @@ See: https://github.com/apache/nuttx/blob/master/INVIOLABLES.md 2. Single company / organization commit, review, and merge is not allowed. 3. Merge of PRs with unresolved discussions and "change request" marks is not allowed. -3. Self committed code merge with or without review is not allowed. -4. Direct push to master is not allowed. +4. Self committed code merge with or without review is not allowed. +5. Direct push to master is not allowed. Breaking these rules will be punished. @@ -395,7 +395,7 @@ Add g_ prefix to can_dlc_to_len and len_to_can_dlc to follow NuttX coding style conventions for global symbols, improving code readability and maintainability. * you can also use bullet points. -* to note different thing briefly. +* to note different things briefly. Signed-off-by: AuthorName ``` diff --git a/Documentation/ReleaseNotes/NuttX-12.13.0 b/Documentation/ReleaseNotes/NuttX-12.13.0 new file mode 100644 index 0000000000000..571b4b1968622 --- /dev/null +++ b/Documentation/ReleaseNotes/NuttX-12.13.0 @@ -0,0 +1,796 @@ +NuttX-12.13.0 +------------ + +What's New In This Release +Major Changes to Core OS +Sched +* [#17287](https://github.com/apache/nuttx/pull/17287) sched/clock: Fix missing clock_inittime() call +* [#17423](https://github.com/apache/nuttx/pull/17423) docs/sched/sched: Add documentation for different sleep interfaces +* [#17482](https://github.com/apache/nuttx/pull/17482) sched/clock: Remove unnecessary preprocessor definition +* [#17485](https://github.com/apache/nuttx/pull/17485) sched/misc: correct coredump log format +* [#17517](https://github.com/apache/nuttx/pull/17517) sched/sched: Part 1: add high resolution timer (hrtimer) only (without os tick support with hrtimer) for NuttX +* [#17535](https://github.com/apache/nuttx/pull/17535) sched/signal: assert if call timedwait from interrupt +* [#17545](https://github.com/apache/nuttx/pull/17545) sched: merge task_tcb_s and pthread_tcb_s into tcb to simplify the code. +* [#17546](https://github.com/apache/nuttx/pull/17546) sched/env_putenv:putenv is kernel function need use kmm_free +* [#17564](https://github.com/apache/nuttx/pull/17564) Revert "sched/group: move task group into task_tcb_s to improve perfo… +* [#17584](https://github.com/apache/nuttx/pull/17584) sched: Improvements on sched_timerexpiration. +* [#17640](https://github.com/apache/nuttx/pull/17640) sched/wdog: Fix-up for SMP and Improvements. +* [#17642](https://github.com/apache/nuttx/pull/17642) sched/hrtimer: hrtimer state machine improvement for SMP cases +* [#17644](https://github.com/apache/nuttx/pull/17644) sched/signals: add support to partially or fully disable signals +* [#17680](https://github.com/apache/nuttx/pull/17680) sched: Remove `CONFIG_SCHED_TICKLESS_TICK_ARGUMENT`. +* [#17681](https://github.com/apache/nuttx/pull/17681) sched/wdog: fix race condition in wd_gettime() +* [#17739](https://github.com/apache/nuttx/pull/17739) sched/task: fix Redundant memory allocation. +* [#17781](https://github.com/apache/nuttx/pull/17781) sched/hrtimer: isolate SMP logic in hrtimer +* [#17784](https://github.com/apache/nuttx/pull/17784) sched/hrtimer: Fix some functional correctness issues. +* [#17796](https://github.com/apache/nuttx/pull/17796) sched/wdog: Simplify the wdog expiration handling. +* [#17822](https://github.com/apache/nuttx/pull/17822) sched: binfmt remove csection +* [#17823](https://github.com/apache/nuttx/pull/17823) sched: merge nxsched_timer_expiration() into nxsched_process_timer() to simplify tick process +* [#17848](https://github.com/apache/nuttx/pull/17848) sched/hrtimer: Some improvements. +* [#17912](https://github.com/apache/nuttx/pull/17912) sched/sched: Improve sched make and cmake scripts +* [#17921](https://github.com/apache/nuttx/pull/17921) sched/hrtimer: fix Kconfig typo +* [#17941](https://github.com/apache/nuttx/pull/17941) sched/tls: fix uninitialized argv pointer in task info +* [#17953](https://github.com/apache/nuttx/pull/17953) sched/task: fix task_exit regression with critical section state +* [#17955](https://github.com/apache/nuttx/pull/17955) sched/addrenv: replace critical section with spinlock for refs protec… +* [#17957](https://github.com/apache/nuttx/pull/17957) sched/environ: rm cestion_in evn +* [#17958](https://github.com/apache/nuttx/pull/17958) sched/irq: handle NULL ISR handler in irq_default_handler +* [#17959](https://github.com/apache/nuttx/pull/17959) sched/signal: use spinlock to protect signal queues +* [#17969](https://github.com/apache/nuttx/pull/17969) sched/sched_roundrobin.c: fix round-robin scheduling in SMP mode +* [#17971](https://github.com/apache/nuttx/pull/17971) sched/list: some improvements. +* [#17981](https://github.com/apache/nuttx/pull/17981) sched: stack debugging improvements +* [#17985](https://github.com/apache/nuttx/pull/17985) sched/task: fix null pointer dereference in fork address environment … +* [#17991](https://github.com/apache/nuttx/pull/17991) sched/signals: improvements for when all signals are disabled +* [#17993](https://github.com/apache/nuttx/pull/17993) sched/wdog: Simplify tickless timer expiration. +* [#18002](https://github.com/apache/nuttx/pull/18002) sched/sched: add sched_timer.c to improve tick processing and enable hrtimer support for scheduler +* [#18007](https://github.com/apache/nuttx/pull/18007) sched/group: add spinlock in group_childstatus.c +* [#18012](https://github.com/apache/nuttx/pull/18012) sched: add spinlock to sched_note_preemption and nxsched_critmon_pree… +* [#18016](https://github.com/apache/nuttx/pull/18016) sched/task: MISRA/Coverity cleanups in scheduler, init, libc spawn, and ARMv8-R IRQ helpers +* [#18026](https://github.com/apache/nuttx/pull/18026) sched/hrtimer: add option for list-based hrtimer management +* [#18034](https://github.com/apache/nuttx/pull/18034) sched/environ: add interrupt context check to getenv +* [#18037](https://github.com/apache/nuttx/pull/18037) sched/tls: fix thread ID initialization in tls_dup_info +* [#18038](https://github.com/apache/nuttx/pull/18038) sched/pthread: use spin_lock_irqsave_nopreempt for mutex head lock +* [#18040](https://github.com/apache/nuttx/pull/18040) sched: move process ID from kernel to TLS for faster access +* [#18041](https://github.com/apache/nuttx/pull/18041) sched/pthread: remove duplicate robust mutex checking logic +* [#18047](https://github.com/apache/nuttx/pull/18047) [BUG-FIX] Fix some bug of sched +* [#18066](https://github.com/apache/nuttx/pull/18066) sched/irq: Avoid same static function name in different files +* [#18070](https://github.com/apache/nuttx/pull/18070) sched/signal: fix the occasional issue where SIGCONT was not executed +* [#18072](https://github.com/apache/nuttx/pull/18072) sched/wqueue: add configuring the stack of an hpwork/lpwork as static +* [#18078](https://github.com/apache/nuttx/pull/18078) sched: add configuration to record the busy waiting time +* [#18080](https://github.com/apache/nuttx/pull/18080) sched/sched: Modify the critical section interface name +* [#18084](https://github.com/apache/nuttx/pull/18084) sched/irq: declare the object in scope +* [#18086](https://github.com/apache/nuttx/pull/18086) sched/irq: avoid casting from signed int to unsigned int +* [#18090](https://github.com/apache/nuttx/pull/18090) sched/irq: Every function must have exactly one exit point +* [#18093](https://github.com/apache/nuttx/pull/18093) sched/irq: fix MISRA C problems for irq_chain.c +* [#18098](https://github.com/apache/nuttx/pull/18098) sched/pthread: move pthread mutex from syscall to user-space +* [#18105](https://github.com/apache/nuttx/pull/18105) sched/irq: Change the function parameter "regs" to "context" +* [#18111](https://github.com/apache/nuttx/pull/18111) sched/irq: Avoid directly converting variables of type uintptr_t to void +* [#18114](https://github.com/apache/nuttx/pull/18114) sched: add trace points during system startup and board initialization +* [#18118](https://github.com/apache/nuttx/pull/18118) sched: fix regression and improve NULL pointer safety in task information functions +* [#18122](https://github.com/apache/nuttx/pull/18122) sched/irq: Fix potential deadlock in irqchain_detach +* [#18131](https://github.com/apache/nuttx/pull/18131) sched/hrtimer: Fix functional correctness issues. +* [#18141](https://github.com/apache/nuttx/pull/18141) sched/hrtimer: refresh code comments to match implementation +* [#18160](https://github.com/apache/nuttx/pull/18160) sched/irq: Add architecture-specific IRQ-to-index mapping interface +* [#18174](https://github.com/apache/nuttx/pull/18174) sched/hrtimer: fix hrtimer regression introduced by recent update and add support for tickless with hrtimer +* [#18175](https://github.com/apache/nuttx/pull/18175) sched/irq: functions should have exactly one exit point +* [#18183](https://github.com/apache/nuttx/pull/18183) sched: Remove FS_PROCFS dependency for SCHED_CRITMONITOR +* [#18184](https://github.com/apache/nuttx/pull/18184) sched: Remove legacy sched_resumescheduler.c +* [#18187](https://github.com/apache/nuttx/pull/18187) sched: call spinlock nopreempt when need disable context swi… +* [#18189](https://github.com/apache/nuttx/pull/18189) sched: replace critical section with spinlock +* [#18190](https://github.com/apache/nuttx/pull/18190) sched/irq: Avoid negative array index in irqchain_dispatch +* [#18191](https://github.com/apache/nuttx/pull/18191) sched/irq: Fix type mismatch in irq_dispatch (MISRA C-2012 Rule 10.3) +* [#18192](https://github.com/apache/nuttx/pull/18192) sched/signal: Optimize code logic +* [#18193](https://github.com/apache/nuttx/pull/18193) sched/semaphore: Fix HIS_CALLS metric violation for MISRA compliance +* [#18196](https://github.com/apache/nuttx/pull/18196) sched: Add bounds checking to prevent OVERRUN defect +* [#18197](https://github.com/apache/nuttx/pull/18197) sched: Fix null pointer dereference (FORWARD_NULL defect) +* [#18198](https://github.com/apache/nuttx/pull/18198) sched: Reduce return points in sched_rrgetinterval() for MISRA compliance +* [#18201](https://github.com/apache/nuttx/pull/18201) sched/semaphore: Code quality improvements and MISRA compliance fixes +* [#18202](https://github.com/apache/nuttx/pull/18202) sched: Reduce return statements in sched_get_stackinfo() for MISRA compliance +* [#18203](https://github.com/apache/nuttx/pull/18203) sched/irq: Consolidate IRQ bounds checking into IRQ_TO_NDX macro +* [#18204](https://github.com/apache/nuttx/pull/18204) sched/irq: Avoid out-of-bounds array access +* [#18205](https://github.com/apache/nuttx/pull/18205) sched_setpriority: Consolidate return statements for MISRA HIS compliance +* [#18208](https://github.com/apache/nuttx/pull/18208) sched_setparam: Refactor nxsched_set_param() with helper functions for MISRA HIS compliance +* [#18210](https://github.com/apache/nuttx/pull/18210) sched: Optimize reader-writer semaphore and achieve MISRA HIS goto compliance +* [#18212](https://github.com/apache/nuttx/pull/18212) sched_getfiles: Consolidate return statements in nxsched_get_fdlist_from_tcb() for MISRA HIS compliance +* [#18215](https://github.com/apache/nuttx/pull/18215) sched_profil: Move static variable to block scope for MISRA C 2012 compliance +* [#18216](https://github.com/apache/nuttx/pull/18216) sched: Consolidate return statements for MISRA HIS compliance +* [#18217](https://github.com/apache/nuttx/pull/18217) sched_profil: Consolidate return statements for MISRA HIS compliance +* [#18220](https://github.com/apache/nuttx/pull/18220) sched_sysinfo: Consolidate return statements for MISRA HIS compliance +* [#18221](https://github.com/apache/nuttx/pull/18221) sched_get_stateinfo: Move static array to block scope for MISRA C 2012 Rule 8.9 +* [#18223](https://github.com/apache/nuttx/pull/18223) sched_setscheduler: Eliminate goto statements and consolidate returns for MISRA HIS compliance +* [#18224](https://github.com/apache/nuttx/pull/18224) sched/hrtimer: Fix functional correctness issues and improve the performance. +* [#18237](https://github.com/apache/nuttx/pull/18237) sched: Consolidate return statements in sched_critmonitor() for MISRA HIS compliance +* [#18227](https://github.com/apache/nuttx/pull/18227) sched_getscheduler: Consolidate return statements for MISRA HIS compliance +* [#18235](https://github.com/apache/nuttx/pull/18235) sched_waitid: Code quality improvements for HIS compliance and complexity reduction +* [#18239](https://github.com/apache/nuttx/pull/18239) sched_cpuload: Move static wdog to block scope for MISRA C 2012 Rule 8.9 +* [#18240](https://github.com/apache/nuttx/pull/18240) sched_sysinfo.c: misra_c_2012_rule_9_1_violation: uninit_use +* [#18241](https://github.com/apache/nuttx/pull/18241) Fix critical SMP scheduler issues with CPU selection and ready-to-run list management +* [#18255](https://github.com/apache/nuttx/pull/18255) sched/semaphore: optimize the source code +* [#18270](https://github.com/apache/nuttx/pull/18270) sched/spinlock: Replace critical_section with spinlock. +* [#18278](https://github.com/apache/nuttx/pull/18278) sched/sched: fix casting issue found by coverity +* [#18284](https://github.com/apache/nuttx/pull/18284) sched/clock: replace atomic operations with sequence lock for tick counter +* [#18306](https://github.com/apache/nuttx/pull/18306) sched: Fix CANCEL_FLAG_* macro definitions MISRA C:2012 Rule 10.4 violations +* [#18307](https://github.com/apache/nuttx/pull/18307) sched/spawn: Fix MISRA C Rule 10.4 violations +* [#18336](https://github.com/apache/nuttx/pull/18336) sched/waitpid: reduce cyclomatic complexity for HIS/MISRA compliance +* [#18338](https://github.com/apache/nuttx/pull/18338) sched/semaphore: Add debug assert to detect mutex recursion. +* [#18376](https://github.com/apache/nuttx/pull/18376) sched/mqueue: Enable receiving messages on an interrupt handler +* [#18437](https://github.com/apache/nuttx/pull/18437) sched/clock: fix CLOCK_BOOTTIME and CLOCK_MONOTONIC handling +* [#18438](https://github.com/apache/nuttx/pull/18438) sched/sched: fix typos and remove unused declarations in sched.h +* [#18444](https://github.com/apache/nuttx/pull/18444) sched/sched: Add nxsched_abstick_sleep() and make nxsched_ticksleep() a wrapper around it +* [#18448](https://github.com/apache/nuttx/pull/18448) sched/misc: fix incorrect mutex holder retrieval in assert backtrace +* [#18450](https://github.com/apache/nuttx/pull/18450) sched/misc: fix potential out-of-bounds access in coredump stack emission +* [#18451](https://github.com/apache/nuttx/pull/18451) sched/misc: fix incomplete data emission in coredump elf_emit function +MM +* [#17439](https://github.com/apache/nuttx/pull/17439) mm/iob: add iob_init method to support external buffer init as iob structure +* [#17537](https://github.com/apache/nuttx/pull/17537) mm/mempool: fix misjudged condition of interrupt memory release +* [#17668](https://github.com/apache/nuttx/pull/17668) mm/iob: limit the alignment length of IOB to no less than sizeof(uinptr_t) +* [#17704](https://github.com/apache/nuttx/pull/17704) mm/iob: update all iob information in the iob_update_pktlen +* [#18042](https://github.com/apache/nuttx/pull/18042) mm/kasan: prevent recursive report overflow +* [#18358](https://github.com/apache/nuttx/pull/18358) mm/mm_gran: fix data truncation on 64-bit systems by using size_t for mask +* [#18445](https://github.com/apache/nuttx/pull/18445) mm/mempool: Optimize undefined behavior in memory pool allocation +* [#18464](https://github.com/apache/nuttx/pull/18464) mm/mempool: fix the entry condition for semaphore during mempool allocation +* [#17538](https://github.com/apache/nuttx/pull/17538) mm: use Kconfig to control sequence number to save memory +* [#18152](https://github.com/apache/nuttx/pull/18152) mm: implement custom umm heap, and enable heap management on the simulator +* [#18427](https://github.com/apache/nuttx/pull/18427) mm: use mm_malloc inside of mm_memalig +libc +* [#17453](https://github.com/apache/nuttx/pull/17453) libs/libc: machine code update +* [#17479](https://github.com/apache/nuttx/pull/17479) libc/machine/xtensa: add mcount implementation for gprof +* [#17533](https://github.com/apache/nuttx/pull/17533) libc/libelf: fix bug for libelf_symname +* [#17534](https://github.com/apache/nuttx/pull/17534) libs/libc/misc: backtrace needs init lock before use +* [#17544](https://github.com/apache/nuttx/pull/17544) libs/libc: use builtin function to optimize string function +* [#17495](https://github.com/apache/nuttx/pull/17495) libs/libc/obstack/lib_obstack_free.c: fix object check within chunk +* [#17502](https://github.com/apache/nuttx/pull/17502) libc: improve libc dependencies in case of LIBM_NONE +* [#17568](https://github.com/apache/nuttx/pull/17568) libc/search: add foreach api for hcreate_data +* [#17571](https://github.com/apache/nuttx/pull/17571) libc/localtime: tz_lock/unlock should not touch tcb except FLAT +* [#17742](https://github.com/apache/nuttx/pull/17742) libc/syslograwstream: Use memrchr to locate the newline character for… +* [#17789](https://github.com/apache/nuttx/pull/17789) libc: Add Kconfig option to disable hex-string to float parsing +* [#17831](https://github.com/apache/nuttx/pull/17831) libs/libc/ftok: fix sizeof(char *), after tempbuffer +* [#17838](https://github.com/apache/nuttx/pull/17838) libcxx: porting libcxx test. +* [#17840](https://github.com/apache/nuttx/pull/17840) libs/libcxx: port for Infineon TASKING compiler. +* [#17841](https://github.com/apache/nuttx/pull/17841) libcxx: supports CXX_MINI_LOCALIZATION +* [#17846](https://github.com/apache/nuttx/pull/17846) libs/libxx: libcxxabi script updates +* [#17862](https://github.com/apache/nuttx/pull/17862) libs/libc: Fix fsetops func signature +* [#17898](https://github.com/apache/nuttx/pull/17898) libc/netdb: avoid unnecessary DNS notify if nameserver exists +* [#17910](https://github.com/apache/nuttx/pull/17910) libc/stdio: fix freopen fd handling and add fdsan support +* [#17936](https://github.com/apache/nuttx/pull/17936) libc: add creat function implementation +* [#17956](https://github.com/apache/nuttx/pull/17956) libs/libc: replace critical section with spinlock in hostname operations +* [#18028](https://github.com/apache/nuttx/pull/18028) libcxx/libstdc++: Add libsupc++.defs to support libsupc++ +* [#18046](https://github.com/apache/nuttx/pull/18046) libc/pthread: Avoid compiler optimizations for once_control->done +* [#18058](https://github.com/apache/nuttx/pull/18058) libs/libc/regex: remove logically dead code in regcomp.c +* [#18076](https://github.com/apache/nuttx/pull/18076) libc/spawn: support get/set priority +* [#18018](https://github.com/apache/nuttx/pull/18018) libxx: fix __config_site for libcxx compile errors +* [#17990](https://github.com/apache/nuttx/pull/17990) libs/libxx: change libcxxmini to libminiabi +* [#18019](https://github.com/apache/nuttx/pull/18019) libs/libxx: Add _LIBCPP_HAS_NO_CONTENTION_TABLE to reduce RAM usage +* [#18136](https://github.com/apache/nuttx/pull/18136) libs/libc/pthread: Optimize mutex robustness configuration and remove unnecessary tl_lock +* [#18285](https://github.com/apache/nuttx/pull/18285) libc/tls: update preprocessor condition comment to match implementation +* [#18334](https://github.com/apache/nuttx/pull/18334) libc/string: Add BSD-optimized memset implementation. +* [#18449](https://github.com/apache/nuttx/pull/18449) libs/libc: add configurable skip count for mutex backtrace addresses +* [#17853](https://github.com/apache/nuttx/pull/17853) libs/libs: fix wqueue config typo +* [#18068](https://github.com/apache/nuttx/pull/18068) libs/crc: implement AUTOSAR-compatible CRC algorithm +* [#18151](https://github.com/apache/nuttx/pull/18151) libstdc++: Relocate c++config.h from include/ to libstdc++ to preserv +tools +* [#17525](https://github.com/apache/nuttx/pull/17525) tools/nxtagspkgsfetch.sh: Fetch tags packages for NuttX and Apps. +* [#17874](https://github.com/apache/nuttx/pull/17874) Tools[feat]: Add config change impact simulation tool (checkkconfig) using kconfig-lib +* [#17886](https://github.com/apache/nuttx/pull/17886) tools/abi_check.py: Identify potential ABI incompatibility issues +* [#18035](https://github.com/apache/nuttx/pull/18035) tools/pynuttx/nxgdb: fix semaphore field access in debugging scripts +* [#18124](https://github.com/apache/nuttx/pull/18124) tools/parsetrace.py: Fix get_typesize bug in parsetrace.py +* [#18299](https://github.com/apache/nuttx/pull/18299) tools: fix `make host_info` flag parsing and config string escaping +Various +* [#17444](https://github.com/apache/nuttx/pull/17444) include/string.h: mark memset and memcpy as used_code +* [#17569](https://github.com/apache/nuttx/pull/17569) include/nuttx: Introduce seqlock, a sequential count based read-write lock. +* [#17575](https://github.com/apache/nuttx/pull/17575) include/nuttx/atomic.h: fix C++ definition conflicts +* [#17851](https://github.com/apache/nuttx/pull/17851) include/sys: extend the IOCTL defintion that compatible with linux kernel +* [#18236](https://github.com/apache/nuttx/pull/18236) include/notifier: fix undefined reference to spin_lock_irqsave_nopreempt +* [#18308](https://github.com/apache/nuttx/pull/18308) include/cxx/cmath: Fix compatibility with external toolchains +* [#18374](https://github.com/apache/nuttx/pull/18374) include/cxx/cmath: Use toolchain with toolchain libm +Crypto +* [#17932](https://github.com/apache/nuttx/pull/17932) crypto: export aes-cbc with 192/256 keysize +* [#17948](https://github.com/apache/nuttx/pull/17948) crypto/cryptodev: fix memory leak when failed to open /dev/crypto +* [#17952](https://github.com/apache/nuttx/pull/17952) Crypto key management with docs +* [#17994](https://github.com/apache/nuttx/pull/17994) crypto/cryptosoft: replace macro howmany with common macro div_round_up +* [#17995](https://github.com/apache/nuttx/pull/17995) crypto/blake2s.h: fix tasking compile warning +* [#17996](https://github.com/apache/nuttx/pull/17996) crypto/siphash: avoid redefine name issue +* [#18064](https://github.com/apache/nuttx/pull/18064) Crypto: export ecc software +* [#18138](https://github.com/apache/nuttx/pull/18138) crypto/cryptosoft: Fix HMAC-SHA when a long key is used +* [#18167](https://github.com/apache/nuttx/pull/18167) crypto: fixes for cryptodev, cryptosoft and RSA export updates +* [#18169](https://github.com/apache/nuttx/pull/18169) crypto: support software key management features (MTD storage, Key Gen) +Major Changes to the Build System +cmake +* [#18364](https://github.com/apache/nuttx/pull/18364) CMake: build implemented for NXP S32K3 Family +* [#17427](https://github.com/apache/nuttx/pull/17427) cmake: Add support for ccache +* [#17550](https://github.com/apache/nuttx/pull/17550) cmake:add lib_psa_set/getstackaddr file to CMakeLists.txt +* [#17558](https://github.com/apache/nuttx/pull/17558) cmake:add missing cflag "-D_FILE_OFFSET_BITS=64" of sim +* [#17579](https://github.com/apache/nuttx/pull/17579) arch/arm: Aligned Cmake with Make +* [#17430](https://github.com/apache/nuttx/pull/17430) boards/arm/stm32l4: CMake added boards Part1 +* [#17794](https://github.com/apache/nuttx/pull/17794) fix cmake build +* [#17810](https://github.com/apache/nuttx/pull/17810) arch/arm/xmc4: Aligned Cmake with Make and added XMC4500 and XMC4700 Relax +* [#17852](https://github.com/apache/nuttx/pull/17852) CMake[enhance][debug]: Add target information tracking and dump capability for CMake builds +* [#17857](https://github.com/apache/nuttx/pull/17857) CMake(enhance): Complete defconfig include support with menuconfig writeback capability +* [#17864](https://github.com/apache/nuttx/pull/17864) arch/arm/cmake: fix the gnu-elf.ld handle error at ghs pre-process +* [#17868](https://github.com/apache/nuttx/pull/17868) CMake[bugfix]:Fix incorrect include directory order in CMake application configuration +* [#17908](https://github.com/apache/nuttx/pull/17908) arch/arm/src/am335x: CMake build implemented for TI AM335x Sitara +* [#17922](https://github.com/apache/nuttx/pull/17922) ghs.cmake: add preprocess command to the .ld script generate procedure +* [#17927](https://github.com/apache/nuttx/pull/17927) CMake(feat): Implement CMake ELF Application Build Mode +* [#17968](https://github.com/apache/nuttx/pull/17968) build/cmake: add missing libcxxtoolchain support +* [#18382](https://github.com/apache/nuttx/pull/18382) arm64/chip/imx9: add cmake support, add reboot support +* [#18015](https://github.com/apache/nuttx/pull/18015) libs/libm: cmake fix +* [#18033](https://github.com/apache/nuttx/pull/18033) arch: fix cmake error +* [#18144](https://github.com/apache/nuttx/pull/18144) CMake build implemented for NXP S32K1 Family +* [#18194](https://github.com/apache/nuttx/pull/18194) CMake: Multiple bugfix and optimizations for build system reliability +* [#18390](https://github.com/apache/nuttx/pull/18390) CMake: build implemented for Microchip's SAM3 SAM4 Family +* [#18392](https://github.com/apache/nuttx/pull/18392) CMake: build implemented for Microchip's SAM D/L Family +* [#18400](https://github.com/apache/nuttx/pull/18400) cmake/nuttx_mkconfig: Improve .config comparison logic +* [#18411](https://github.com/apache/nuttx/pull/18411) CMake: build implemented for Microchip's SAM D5x/E5x Family +* [#18413](https://github.com/apache/nuttx/pull/18413) boards/arm/stm32f0l0g0: CMake fix build b-l072z-lrwan1:nxlines_oled +* [#18419](https://github.com/apache/nuttx/pull/18419) CMake: build implemented for STM32 STM32WB Series +* [#18423](https://github.com/apache/nuttx/pull/18423) CMake: build implemented for STM32 STM32L5 Series +* [#18432](https://github.com/apache/nuttx/pull/18432) CMake: build implemented for Allwinner A1X family +* [#18433](https://github.com/apache/nuttx/pull/18433) CMake: build implemented for Quicklogic EOS S3 +* [#18440](https://github.com/apache/nuttx/pull/18440) CMake: build implemented for STM32 STM32WL5 +* [#18443](https://github.com/apache/nuttx/pull/18443) cmake: bump minimum required CMake version to 3.20 +* [#18455](https://github.com/apache/nuttx/pull/18455) arm64/cmake: fix typo in CMAKE_STRIP flag +* [#18466](https://github.com/apache/nuttx/pull/18466) CMake: build implemented for Microchip's SAMA5 Family +Architectural Support +Architecture Improvements +* [#16795](https://github.com/apache/nuttx/pull/16795) arch/sim: save errno in sim context switch to avoid coroutine make errno mess between host api calls. +* [#17011](https://github.com/apache/nuttx/pull/17011) arch: Remove default value for BOARD_LOOPSPERMSEC +* [#17117](https://github.com/apache/nuttx/pull/17117) arch/arm/imxrt: serial registration fixes when no dev console defined +* [#17372](https://github.com/apache/nuttx/pull/17372) arch/arm64: fix create page table err +* [#17377](https://github.com/apache/nuttx/pull/17377) arch/arm64: config irq type +* [#17416](https://github.com/apache/nuttx/pull/17416) arch/arm/stm32h5: Add RS-485 support to serial driver +* [#17420](https://github.com/apache/nuttx/pull/17420) arch/xmc4 : various fixes and clean +* [#17425](https://github.com/apache/nuttx/pull/17425) arch/arm/samv7: allow all values for count in read +* [#17429](https://github.com/apache/nuttx/pull/17429) arch/arm/src/samv7/Kconfig: allow 0 in MCANx_RXFIFOx_SIZE +* [#17442](https://github.com/apache/nuttx/pull/17442) arch/arm/samv7: optimize MCUboot loader configuration +* [#17448](https://github.com/apache/nuttx/pull/17448) arch/armv8-r: use -mfpu=fpv5-sp-d16 for SP-only Cortex-R52 targets +* [#17450](https://github.com/apache/nuttx/pull/17450) arch/crt0.c: revert entry name to `_start` +* [#17454](https://github.com/apache/nuttx/pull/17454) arch/arm/src/kinetis: support RS485 on UART, fix warnings and pin assignment for K60 +* [#17484](https://github.com/apache/nuttx/pull/17484) arch/sim: USB host support isochronous transfer endpoint +* [#17486](https://github.com/apache/nuttx/pull/17486) arch/Toolchain.defs: ELF entry for more archs +* [#17507](https://github.com/apache/nuttx/pull/17507) arch/risc-v: add crt0 to LDELFFLAG +* [#17523](https://github.com/apache/nuttx/pull/17523) arch/sim: fix sim spi issue +* [#17542](https://github.com/apache/nuttx/pull/17542) arch/x86_64: fix syscall type mismatch +* [#17549](https://github.com/apache/nuttx/pull/17549) arch/arm: use cfi to debug syscall +* [#17684](https://github.com/apache/nuttx/pull/17684) arch/armv8-m: Fix IRQ number corruption in exception_direct with O2 optimization +* [#17690](https://github.com/apache/nuttx/pull/17690) arch/tricore: enable CONFIG_SYSTEM_TIME64 for TC397 +* [#17762](https://github.com/apache/nuttx/pull/17762) arch/risc-v: Fix incompatible pointer types in vector context switching +* [#17767](https://github.com/apache/nuttx/pull/17767) arch/risc-v: Enable VPU initialization for QEMU RV +* [#17788](https://github.com/apache/nuttx/pull/17788) arch/kinetis: Fix S32K3XX regressions caused by refactoring +* [#17795](https://github.com/apache/nuttx/pull/17795) arch/avr/src/avrdx: remove unused variable and update comment +* [#17815](https://github.com/apache/nuttx/pull/17815) arch/arm: fix the error in obtaining thread pointer after we use `-mtp=soft` +* [#17832](https://github.com/apache/nuttx/pull/17832) arch/arm/samv7: fix incorrect Kconfig SAMV7_EMAC0_RMII dependency +* [#17854](https://github.com/apache/nuttx/pull/17854) arch/arm: add -ffunction-sections and -fdata-sections compile options +* [#17855](https://github.com/apache/nuttx/pull/17855) arch/arm: change ghs vfpv3 to vfpv5 accrding to armv7-m documentation +* [#17856](https://github.com/apache/nuttx/pull/17856) arch/arm: replace the "-Wall" build option with the "-ghstd=last" +* [#17867](https://github.com/apache/nuttx/pull/17867) arch/sim: Refactor Wi-Fi simulation and add Pseudo Mode support +* [#17880](https://github.com/apache/nuttx/pull/17880) arch/x64: Syscall support is enabled by default +* [#17881](https://github.com/apache/nuttx/pull/17881) arch/x64: create qemu chip +* [#17883](https://github.com/apache/nuttx/pull/17883) arch/x86_64/intel64: fix build break for timerisr +* [#17891](https://github.com/apache/nuttx/pull/17891) arch/x64: add acpi procfs and poweroff +* [#17892](https://github.com/apache/nuttx/pull/17892) arch/x64:Fix the abnormal backtrace display issue +* [#17893](https://github.com/apache/nuttx/pull/17893) arch/x64: Fix crash issue after enabling KASAN +* [#17897](https://github.com/apache/nuttx/pull/17897) arch/sim: support SOCK_RAW in host_usrsock_socket +* [#17906](https://github.com/apache/nuttx/pull/17906) arch/arm/imxrt: fix error header guard +* [#17951](https://github.com/apache/nuttx/pull/17951) arch/x86_64: add support for linker map generation +* [#17961](https://github.com/apache/nuttx/pull/17961) arch: move STACK_ALIGNMENT to irq.h +* [#17964](https://github.com/apache/nuttx/pull/17964) arch/imx9: Modify default ddr config handling +* [#17965](https://github.com/apache/nuttx/pull/17965) arch/arm64: disable fork support in protected build mode +* [#17974](https://github.com/apache/nuttx/pull/17974) arch/tricore: support cache function +* [#17975](https://github.com/apache/nuttx/pull/17975) arch/tricore: enhanced irq handling +* [#17984](https://github.com/apache/nuttx/pull/17984) arch: enable ARCH_KERNEL_STACK support in protected builds +* [#17986](https://github.com/apache/nuttx/pull/17986) arch: fix addrenv_switch changing this_task causing exceptions +* [#17988](https://github.com/apache/nuttx/pull/17988) arch/stm32: Fix stm32-capture if timer don't support GTIM_CCER_CC1NP +* [#18006](https://github.com/apache/nuttx/pull/18006) arch: move some macros to public code. +* [#18008](https://github.com/apache/nuttx/pull/18008) arch/x86_64: Add gprof and stack check tool +* [#18010](https://github.com/apache/nuttx/pull/18010) arch/x64:add up_set_irq_type +* [#18020](https://github.com/apache/nuttx/pull/18020) arch/x86_64: fix revoke_low_memory +* [#18021](https://github.com/apache/nuttx/pull/18021) arch/x64: interrupt add CFI info +* [#18022](https://github.com/apache/nuttx/pull/18022) arch/x64: Solve the sig_nest hang issue +* [#18023](https://github.com/apache/nuttx/pull/18023) arch/x86_64i:Fix issue 02 Compile acpidump crash problem +* [#18030](https://github.com/apache/nuttx/pull/18030) arch/arm64: fix mpu_freeregion +* [#18048](https://github.com/apache/nuttx/pull/18048) arch: default enable TLS_ALIGNED when BUILD_PROTECTED=y +* [#18059](https://github.com/apache/nuttx/pull/18059) arch/tricore: disable CPU and system watchdogs during startup +* [#18060](https://github.com/apache/nuttx/pull/18060) arch/tricore: add NMI trap handler (weak) +* [#18065](https://github.com/apache/nuttx/pull/18065) arch/arm: armv8-r PL at startup needs to be checked +* [#18067](https://github.com/apache/nuttx/pull/18067) arch/arm: Add arm memmanage fault skip operation +* [#18079](https://github.com/apache/nuttx/pull/18079) arch/tricore: add tricore mpu driver +* [#18092](https://github.com/apache/nuttx/pull/18092) arch/arm/nrf: fix rtc functions return param +* [#18097](https://github.com/apache/nuttx/pull/18097) arch/xtensa: remove XCHAL_SYSCALL_LEVEL +* [#18099](https://github.com/apache/nuttx/pull/18099) arch/arm: Add the macro definitions for CFI instructions for ghs +* [#18103](https://github.com/apache/nuttx/pull/18103) arch: add stack alignment and size validation for CONFIG_TLS_ALIGNED +* [#18106](https://github.com/apache/nuttx/pull/18106) arch/arm64: fix backtrace return address precision +* [#18117](https://github.com/apache/nuttx/pull/18117) arch/arm/nrf{52|53|91}: fix timer timeout value (overflow issue) +* [#18130](https://github.com/apache/nuttx/pull/18130) arch/x86_64: optimize assembly instructions for size and performance +* [#18140](https://github.com/apache/nuttx/pull/18140) arch/arm/src/imxrt: Fix Ethernet RUNNING status regression +* [#18153](https://github.com/apache/nuttx/pull/18153) arch/arm: systick: fix off-by-one in SysTick RELOAD programming +* [#18157](https://github.com/apache/nuttx/pull/18157) arch/arm64: Enhance MPU infrastructure with unified interface and improved platform flexibility +* [#18158](https://github.com/apache/nuttx/pull/18158) arch/arm64: Enhance MPU with background region and region query interface +* [#18166](https://github.com/apache/nuttx/pull/18166) arch/xtensa/esp32/esp32s2 spi errors +* [#18168](https://github.com/apache/nuttx/pull/18168) arch/stm32: Add counter reset function +* [#18177](https://github.com/apache/nuttx/pull/18177) arch/armv8-r64: userspace PMU access +* [#18186](https://github.com/apache/nuttx/pull/18186) arch/risc-v: fix timer initialization for SMP mode using mtimer +* [#18195](https://github.com/apache/nuttx/pull/18195) arch/xtensa/espressif: ESP32 simpleboot improvements +* [#18214](https://github.com/apache/nuttx/pull/18214) arch/armv7-r: Enable userspace PMU access with performance event support +* [#18229](https://github.com/apache/nuttx/pull/18229) arch/arm: GPIO IMX9 Add support for IRQ line1 and GPIO5 +* [#18230](https://github.com/apache/nuttx/pull/18230) arch/arm: LPSPI imx9 add support for 2nd CS +* [#18268](https://github.com/apache/nuttx/pull/18268) arch/x86_64: use pause to reduce power consumption in spin wait loops +* [#18273](https://github.com/apache/nuttx/pull/18273) arch/imx9: Correct CONFIG_IMX9_ENET_PHYINIT flag and imx9_phy_boardinitialize +* [#18277](https://github.com/apache/nuttx/pull/18277) arch/sim: Add sigdelset to nuttx-names.in +* [#18279](https://github.com/apache/nuttx/pull/18279) arch/arm64: Delete the default save for SCTLR and fix the issue of including incorrect order +* [#18296](https://github.com/apache/nuttx/pull/18296) arch/arm/stm32: fix undeclared page variable in flash write +* [#18297](https://github.com/apache/nuttx/pull/18297) arch/xtensa: fix `INT32_C` macro to match `int32_t` type +* [#18298](https://github.com/apache/nuttx/pull/18298) arch/x86_64: replaced loop construct with rep movsb +* [#18300](https://github.com/apache/nuttx/pull/18300) arch/arm/stm32h7: fix sdcan clock, ILS register and ID +* [#18303](https://github.com/apache/nuttx/pull/18303) arch/x86: fixed errors in gdt_flush and idt_flush +* [#18349](https://github.com/apache/nuttx/pull/18349) arch/risc-v: Fix page table traversal for SV39 +* [#18381](https://github.com/apache/nuttx/pull/18381) arch/tricore: initialize spinlock used by tricore systimer +* [#18403](https://github.com/apache/nuttx/pull/18403) arch/arm64/Imx9: usdhc improvements +* [#18409](https://github.com/apache/nuttx/pull/18409) arch/arm64/imx9: Add enet MII clock calculation +* [#18418](https://github.com/apache/nuttx/pull/18418) arch/arm: remove all "select ARMV8M_HAVE_STACKCHECK". +* [#18429](https://github.com/apache/nuttx/pull/18429) arch/risc-v/espressif: Fix SHA errors +* [#18452](https://github.com/apache/nuttx/pull/18452) arch/sim: fix X11 framebuffer window not visible in POSIX simulator +* [#18453](https://github.com/apache/nuttx/pull/18453) arch/sim: fix incomplete HCI socket data reading in simulator interrupt handler +* [#18457](https://github.com/apache/nuttx/pull/18457) arch/arm: Add necessary conversion between tick and usec in systick_interrupt +* [#18461](https://github.com/apache/nuttx/pull/18461) arch/[risc-v|xtensa]/src/common: Create SoC-specific initialization routine +* [#18462](https://github.com/apache/nuttx/pull/18462) arch/xtensa/esp32: Fix buffer overflow in SPI poll exchange +Driver Support +Drivers With Improvements +* [#16925](https://github.com/apache/nuttx/pull/16925) drivers/timers/capture: fix typo in capture.h +* [#17373](https://github.com/apache/nuttx/pull/17373) drivers/pci: Calculate PCI bar size use mask 0xffffffff +* [#17375](https://github.com/apache/nuttx/pull/17375) drivers/pci: calculate bar size +* [#17376](https://github.com/apache/nuttx/pull/17376) drivers/eeprom: Support PE/SE/CE commands +* [#17379](https://github.com/apache/nuttx/pull/17379) drivers/pci: write legacy num to config sapce when enable legacy irq +* [#17426](https://github.com/apache/nuttx/pull/17426) drivers/lcd/st7789.c: fix byte order in st7789_fill for 3 wires +* [#17433](https://github.com/apache/nuttx/pull/17433) drivers/usbdev: fix cdcecm netdev can not enter running state +* [#17441](https://github.com/apache/nuttx/pull/17441) drivers/can/can.c: fix broken O_NONBLOCK +* [#17446](https://github.com/apache/nuttx/pull/17446) drivers/lpwan: Fix Kconfig SX1276 and SX1262 position +* [#17455](https://github.com/apache/nuttx/pull/17455) note/drivers: Get taskname more safely. +* [#17456](https://github.com/apache/nuttx/pull/17456) drivers/i3c: Revert "drivers/i3c: remove extra i3c_dev_register, do_daa has created them" +* [#17464](https://github.com/apache/nuttx/pull/17464) drivers/mmcsd: Aligned Cmake with Make +* [#17470](https://github.com/apache/nuttx/pull/17470) drivers/rpmsgdev: server functions enhanced +* [#17491](https://github.com/apache/nuttx/pull/17491) drivers/usbhost: improve usbhost hid kbd +* [#17498](https://github.com/apache/nuttx/pull/17498) drivers/timers/ptp: support ptp clock driver model,CLOCKFD and clock adjtime/settime/gettime for ptp device +* [#17501](https://github.com/apache/nuttx/pull/17501) drivers/battery: fix event lost before service open +* [#17510](https://github.com/apache/nuttx/pull/17510) drivers/ioexpander: add debounce and interrupt mask functions +* [#17512](https://github.com/apache/nuttx/pull/17512) drivers/sensors/goldfish: support more sensors +* [#17528](https://github.com/apache/nuttx/pull/17528) drivers/input: Adds a small extension to the Force Feedback (FF) input subsystem +* [#17529](https://github.com/apache/nuttx/pull/17529) drivers/virtio: Fix DRIVERS_VIRTIO_INPUT configuration dependencies +* [#17530](https://github.com/apache/nuttx/pull/17530) drivers: replace critical_section with spinlock +* [#17531](https://github.com/apache/nuttx/pull/17531) drivers/timers: A small improvements in the drivers/timers subsystem +* [#17540](https://github.com/apache/nuttx/pull/17540) drivers/timers: fix rtc_time struct +* [#17541](https://github.com/apache/nuttx/pull/17541) drivers/virtio: if in assert, don't wait semaphore +* [#17552](https://github.com/apache/nuttx/pull/17552) drivers/mtd: Add W25N SPI NAND flash driver +* [#17554](https://github.com/apache/nuttx/pull/17554) drivers/rpmsg: Add rpmsg_get_signals API and rpmsg transport ops support +* [#17586](https://github.com/apache/nuttx/pull/17586) drivers/net: fix "wapi save_config" and "wapi reconnect" commands +* [#17597](https://github.com/apache/nuttx/pull/17597) drivers/net: setting loopback network driver sending task to the HPWORK queue +* [#17604](https://github.com/apache/nuttx/pull/17604) drivers/mtd: add MTDIOC_ISBAD ioctl +* [#17746](https://github.com/apache/nuttx/pull/17746) drivers/i2c: add ioexpander-based lower-half implementation for I2C bit-bang +* [#17747](https://github.com/apache/nuttx/pull/17747) drivers/capture: add signal notification support and fake capture driver +* [#17752](https://github.com/apache/nuttx/pull/17752) drivers/sensors: add a dynamic sensor debugging tool sensor_monitor +* [#17760](https://github.com/apache/nuttx/pull/17760) drivers/rpmsg: port spi add debug log, low power feature and bug fixs +* [#17763](https://github.com/apache/nuttx/pull/17763) drivers/sx127x: Add support to different bitrate and RX timeout +* [#17764](https://github.com/apache/nuttx/pull/17764) drivers/adc: Use mutexlock to replace critical section protection +* [#17769](https://github.com/apache/nuttx/pull/17769) drivers/sensors: update upper->parsebuffer every new line +* [#17772](https://github.com/apache/nuttx/pull/17772) drivers/sensors: fix mpu9250 register function comments +* [#17776](https://github.com/apache/nuttx/pull/17776) drivers/pty: fix memory leak when pty_destroy +* [#17778](https://github.com/apache/nuttx/pull/17778) drivers/rpmsg: router double free and reconnect related bugs fix +* [#17782](https://github.com/apache/nuttx/pull/17782) drivers/usrsock: replace net_lock with conn_lock +* [#17783](https://github.com/apache/nuttx/pull/17783) drivers/Rpmsg: fix rpmsg dead lock and ns bind race condition problem +* [#17787](https://github.com/apache/nuttx/pull/17787) drivers/rptun: fix rptun stop related deadlock and crash bugs +* [#17797](https://github.com/apache/nuttx/pull/17797) drivers/can: replace critical-section mutex with spinlock +* [#17802](https://github.com/apache/nuttx/pull/17802) drivers/virtio-gpu: Avoid calling free in IRQ +* [#17805](https://github.com/apache/nuttx/pull/17805) drivers/net/e1000|igc.c: add PIDVID of NIC +* [#17813](https://github.com/apache/nuttx/pull/17813) drivers/ioexpander: add enable & disable macro for gpio SETDEBOUNCE and SETMASK +* [#17814](https://github.com/apache/nuttx/pull/17814) drivers/sensors: add get_info interface for gnss_uorb +* [#17816](https://github.com/apache/nuttx/pull/17816) drivers/rptun: refactor rptun to decoupling the rptun and rpmsg virtio, make rptun can work with any virtio devices +* [#17824](https://github.com/apache/nuttx/pull/17824) drivers/sensors: sensor bug fix - part 1 +* [#17833](https://github.com/apache/nuttx/pull/17833) drivers/net: fix igc build error +* [#17837](https://github.com/apache/nuttx/pull/17837) drivers/sensors: add a new sensor type ENG +* [#17842](https://github.com/apache/nuttx/pull/17842) drivers/net/rpmsgdrv.c: add bidirectional data netdev support +* [#17845](https://github.com/apache/nuttx/pull/17845) drivers/mtd: Optimizations for RRAM/MRAM Compatibility and Erase Logic Robustness +* [#17870](https://github.com/apache/nuttx/pull/17870) drivers/net: Fix crash in wifi_sim disconnect. +* [#17871](https://github.com/apache/nuttx/pull/17871) drivers/virtio: Use arc4random_buf to generate MAC address. +* [#17872](https://github.com/apache/nuttx/pull/17872) drivers/sensors/fakesensor: Remove GNSS dependency +* [#17923](https://github.com/apache/nuttx/pull/17923) drivers/timers: check CONFIG_BOARD_LOOPSPERMSEC != 0 at runtime +* [#17928](https://github.com/apache/nuttx/pull/17928) drivers/can: repair compiler error +* [#17942](https://github.com/apache/nuttx/pull/17942) drivers/mmcsd: fix typo, it should be "Byte" by spec +* [#17949](https://github.com/apache/nuttx/pull/17949) drivers/misc/optee: add missing addrenv header include +* [#17989](https://github.com/apache/nuttx/pull/17989) drivers/usbhost_hidkbd: Fix small typo in usbhost_hidkbd.c +* [#18005](https://github.com/apache/nuttx/pull/18005) drivers/rpmsg: remove unnecessary header files, revise make.def and cmake file +* [#18014](https://github.com/apache/nuttx/pull/18014) drivers/serial/Kconfig-16550: fix non-existent option +* [#18036](https://github.com/apache/nuttx/pull/18036) drivers/rpmsg: use nuttx/atomic.h instead metal/atomic.h +* [#18061](https://github.com/apache/nuttx/pull/18061) drivers/pipe: fix POLLHUP handling in poll() +* [#18073](https://github.com/apache/nuttx/pull/18073) drivers/sensors optimizes the sensor rpmsg driver proxy waiting mechanism to improve reliability. part 2 +* [#18081](https://github.com/apache/nuttx/pull/18081) drivers/analog/mcp47x6: fix configuration command +* [#18085](https://github.com/apache/nuttx/pull/18085) drivers/rpmsg_router: multiple fixes and improvements for multi-core stability +* [#18091](https://github.com/apache/nuttx/pull/18091) drivers/mtd: add nvs cache buffer +* [#18095](https://github.com/apache/nuttx/pull/18095) drivers/mtd: support ram_mtdconfig device && lomtdconfig device +* [#18100](https://github.com/apache/nuttx/pull/18100) drivers/net/slip: set serial port to raw mode to prevent character escaping +* [#18102](https://github.com/apache/nuttx/pull/18102) drivers/sensors: fix sensor deadlock. part 3 +* [#18108](https://github.com/apache/nuttx/pull/18108) drivers/rpmsg: unify cpuname handling and fix pm wakelock initialization +* [#18116](https://github.com/apache/nuttx/pull/18116) drivers/serial: Fix SIGINT not delivered to foreground process on Ctrl-C +* [#18125](https://github.com/apache/nuttx/pull/18125) drivers/usbdev: fix rndis net link status can't update timely issue +* [#18134](https://github.com/apache/nuttx/pull/18134) drivers/sensors: Add non-wakeup mode support and optimize RPMSG communication part 4. +* [#18156](https://github.com/apache/nuttx/pull/18156) drivers/rpmsg: fix struct alignment issue by removing flexible array member +* [#18159](https://github.com/apache/nuttx/pull/18159) drivers/rpmsg_port_spi: add PM support and stability improvements +* [#18163](https://github.com/apache/nuttx/pull/18163) drivers/rpmsg_port_uart: Improvements and bug fixes for stability and power management +* [#18164](https://github.com/apache/nuttx/pull/18164) drivers/sensors/dhtxx: Fix read return values to be POSIX compliant +* [#18165](https://github.com/apache/nuttx/pull/18165) drivers/rpmsg: refactor internal APIs to private header +* [#18180](https://github.com/apache/nuttx/pull/18180) drivers/sensors: Remove the uncalibrated member of the sensor lowerhalf layer part 5 +* [#18209](https://github.com/apache/nuttx/pull/18209) drivers/sensors: sensor bug fix. part 6 +* [#18231](https://github.com/apache/nuttx/pull/18231) drivers/serial: fix crash when buffer is full and only recvbuf is imp… +* [#18246](https://github.com/apache/nuttx/pull/18246) drivers/ioexapnder/mcp23x17 : Fix write gpio output values on OLAT registers +* [#18248](https://github.com/apache/nuttx/pull/18248) drivers/rpmsg: support release the rx buffer early in endpoint callback +* [#18250](https://github.com/apache/nuttx/pull/18250) drivers/timers: add timer driver implemented by watchdog +* [#18256](https://github.com/apache/nuttx/pull/18256) drivers/sensors: add sensor monitor debug log. part 7 +* [#18261](https://github.com/apache/nuttx/pull/18261) drivers/sensors/gnss: Add monitor logs for activation +* [#18265](https://github.com/apache/nuttx/pull/18265) drivers/virtio: virtio config space size-matched read operations +* [#18286](https://github.com/apache/nuttx/pull/18286) drivers/analog: fix adc ads1115 driver +* [#18289](https://github.com/apache/nuttx/pull/18289) drivers/vhost: Improvements and fixes for vhost framework +* [#18290](https://github.com/apache/nuttx/pull/18290) drivers/virtio: use virtqueue_nused() to check pending buffers +* [#18291](https://github.com/apache/nuttx/pull/18291) drivers/virtio: fix the minor code style in virtio.c +* [#18294](https://github.com/apache/nuttx/pull/18294) drivers/rpmsg: add timestamp support for rpmsg buffer latency measurement +* [#18301](https://github.com/apache/nuttx/pull/18301) drivers/lcd: Add ST7796 TFT LCD framebuffer driver +* [#18304](https://github.com/apache/nuttx/pull/18304) drivers/power/pm: Fix typos in comments +* [#18361](https://github.com/apache/nuttx/pull/18361) drivers/usbdev: Fix usbmsc_unbind() function for USB composite device +* [#18372](https://github.com/apache/nuttx/pull/18372) drivers/note: noteram ioctl FIONBIO should return -ENOTTY +* [#18410](https://github.com/apache/nuttx/pull/18410) drivers/serial/uart: implement uart rpmsg linux conterpart +* [#18435](https://github.com/apache/nuttx/pull/18435) drivers/sensors: Legacy sensor warning +* [#18446](https://github.com/apache/nuttx/pull/18446) drivers/serial: add common Xilinx UART Peripheral System (XUARTPS) support +* [#18454](https://github.com/apache/nuttx/pull/18454) drivers/syslog: add millisecond option for syslog timestamp formatting' +* [#17460](https://github.com/apache/nuttx/pull/17460) driver/usbhost: Support obtaining USB3.0 device descriptors +* [#17487](https://github.com/apache/nuttx/pull/17487) power/battery: battery gauge driver support +* [#17557](https://github.com/apache/nuttx/pull/17557) driver/note: make SIZEOF_NOTE_START return the right size +* [#17744](https://github.com/apache/nuttx/pull/17744) driver/cfi: fix write failed issue for unalign length with bankwidth +* [#17774](https://github.com/apache/nuttx/pull/17774) can: fix can driver error about hdr is not initilized +* [#17866](https://github.com/apache/nuttx/pull/17866) driver/cfi-flash: Add a config option for the page size of CFI flash. +* [#17979](https://github.com/apache/nuttx/pull/17979) crypto/cryptodev: support private data in driver +* [#18029](https://github.com/apache/nuttx/pull/18029) crypto/cryptodev: optimize driver +* [#18121](https://github.com/apache/nuttx/pull/18121) driver/note: Support poll threshold +* [#18123](https://github.com/apache/nuttx/pull/18123) driver/note: Add tag to note_event_s and note_printf_s +* [#18127](https://github.com/apache/nuttx/pull/18127) driver/syslog: Implement the rate limiting function for ramlog driver. +* [#18128](https://github.com/apache/nuttx/pull/18128) driver/note: Fix compilation error when CONFIG_SYSLOG_TO_SCHED_NOTE=y +* [#18280](https://github.com/apache/nuttx/pull/18280) driver/virtio: Delete reset on initialization +* [#18368](https://github.com/apache/nuttx/pull/18368) driver/input: Add keyboard matrix driver to read matrix keyboard using polling way. +* [#18370](https://github.com/apache/nuttx/pull/18370) video/sim_camera: Improve camera driver behavior and simulator camera coverage. +Board Support +New Board Support +* [#18460](https://github.com/apache/nuttx/pull/18460) Introduce i.MX93 (M33) and IMX93-QSB board support +Boards With Significant Improvements +* [#17397](https://github.com/apache/nuttx/pull/17397) boards/nucleo-h743zi: modify the romfs img file path +* [#17471](https://github.com/apache/nuttx/pull/17471) boards/defconfig: enable CONFIG_SCHED_CHILD_STATUS +* [#17477](https://github.com/apache/nuttx/pull/17477) boards/risc-v/esp32c3: Corrected the names of #include guards +* [#17532](https://github.com/apache/nuttx/pull/17532) boards/risc-v: Add lvgl64_vector configuration for RISC-V QEMU +* [#17547](https://github.com/apache/nuttx/pull/17547) boards/arm/mps3-an547: enable protected mode support +* [#17560](https://github.com/apache/nuttx/pull/17560) boards/nucleo-g431rb/qenco: reduce FLASH +* [#17562](https://github.com/apache/nuttx/pull/17562) boards/nucleo-f446re: disable OSTEST in some configs +* [#17563](https://github.com/apache/nuttx/pull/17563) boards/qemu-intel64/jumbo: enable more network tools +* [#17566](https://github.com/apache/nuttx/pull/17566) boards/risc-v/esp32c3: add Waveshare ESP32-C3-Zero +* [#17572](https://github.com/apache/nuttx/pull/17572) boards/esp32s3/lckfb-szpi: Add QMI8658 6-axis IMU sensor support +* [#17574](https://github.com/apache/nuttx/pull/17574) boards/esp32: Add initial support to Heltec WiFi LoRa32 +* [#17576](https://github.com/apache/nuttx/pull/17576) boards/leds: remove dependency on leds example for some boards +* [#17577](https://github.com/apache/nuttx/pull/17577) boards/nucleo-c0xxx: fix leds handling +* [#17581](https://github.com/apache/nuttx/pull/17581) boards/esp32/heltec_wifi_lora32: Add support to SX1276 transceiver +* [#17738](https://github.com/apache/nuttx/pull/17738) boards/{nrf53|stm32h7}: mark shmem region as NOLOAD +* [#17751](https://github.com/apache/nuttx/pull/17751) board/lm3s6432-s2e/nsh: disable LIBC_LONG_LONG to fix ci bb +* [#17771](https://github.com/apache/nuttx/pull/17771) boards/raspberrypi-4b: Add testing configurations +* [#17879](https://github.com/apache/nuttx/pull/17879) boards/arm/kinetis: fix freeform-k28f usbhshost undeclared 'errcode' +* [#17911](https://github.com/apache/nuttx/pull/17911) boards/esp32c3-xiao: Fix ble configuration crash +* [#17945](https://github.com/apache/nuttx/pull/17945) boards/stm32f103-minimum: Add GPIO in/out/int define +* [#18013](https://github.com/apache/nuttx/pull/18013) boards/qemu-intel64/jumbo: enable procfs ACPI +* [#18025](https://github.com/apache/nuttx/pull/18025) boards/smartl-c906: enable hrtimer ostest in CI +* [#18031](https://github.com/apache/nuttx/pull/18031) boards/boardctl: Add BOARDCTL_MACADDR command +* [#18032](https://github.com/apache/nuttx/pull/18032) boards/xtensa/esp32: add rtc_reserved_seg to legacy_sections +* [#18054](https://github.com/apache/nuttx/pull/18054) boards/nrf53: correct rptun names +* [#18094](https://github.com/apache/nuttx/pull/18094) boards/sim: Fix watchdog callback +* [#18132](https://github.com/apache/nuttx/pull/18132) boards/sim: enable list-based hrtimer in CI ostest +* [#18146](https://github.com/apache/nuttx/pull/18146) boards/boardctl: use spinlock IRQ-safe interfaces for consistency +* [#18154](https://github.com/apache/nuttx/pull/18154) boards/xtensa: fixes for build and start-up issues when legacy boot enabled +* [#18206](https://github.com/apache/nuttx/pull/18206) board: enable hritmer (RB-tree and list implementation) CITEST on arm and riscv board +* [#18251](https://github.com/apache/nuttx/pull/18251) boards/sim/crypto: enable cmocka testing framework +* [#18283](https://github.com/apache/nuttx/pull/18283) boards/boardctl: BOARDIOC_SPINLOCK missing some Conditional branch +* [#18310](https://github.com/apache/nuttx/pull/18310) boards/risc-v/esp32c6: Add missing config for esp32c6 romfs +* [#18355](https://github.com/apache/nuttx/pull/18355) boards/imx95-evk: enable mpu by default +* [#18363](https://github.com/apache/nuttx/pull/18363) boards/arm: add nxp mr-navq95b support +* [#18406](https://github.com/apache/nuttx/pull/18406) boards/xtensa/esp32: add three missing defconfigs +* [#18416](https://github.com/apache/nuttx/pull/18416) boards/xtensa/esp32s2: add efuse defconfig +* [#18420](https://github.com/apache/nuttx/pull/18420) boards/stm32h7: Add button support to nucleo-h743zi2 +* [#18459](https://github.com/apache/nuttx/pull/18459) boards/esp32c3-xiao: Add NimBLE example configuration +File System +Significant Improvements +* [#17488](https://github.com/apache/nuttx/pull/17488) fs/romfs: revert the romfs write feature +* [#17500](https://github.com/apache/nuttx/pull/17500) fs/vfs: fix poll covertify issue about out-of-bound access fds +* [#17539](https://github.com/apache/nuttx/pull/17539) fs/mqueue: fix msgq memleak +* [#17548](https://github.com/apache/nuttx/pull/17548) fs/procfs: bugfix in heapcheck, avoid '\n' to 0 +* [#17559](https://github.com/apache/nuttx/pull/17559) fs/tmpfs: fix memoryleak of tmpfs_opendir +* [#17706](https://github.com/apache/nuttx/pull/17706) littlefs: fix statfs underflow during active writes +* [#17731](https://github.com/apache/nuttx/pull/17731) fs/inode: bug fix about fdlist_extend, fdlist_install and eventfd/timerfd_blocking_io +* [#17740](https://github.com/apache/nuttx/pull/17740) fs/mqueue: fix inverted 'created' flag in file_mq_vopen +* [#17741](https://github.com/apache/nuttx/pull/17741) fs/epoll: release refs count and add TLS cleanup handler to release epoll fd reference on thread exit +* [#17748](https://github.com/apache/nuttx/pull/17748) fs/file: add reference count protection for stack-allocated file structures +* [#17513](https://github.com/apache/nuttx/pull/17513) bugfix/fs:write Bad buf addr should return EINVAL +* [#17811](https://github.com/apache/nuttx/pull/17811) fs/inode: using file_allocate and file_dup to avoid racecondition to allocate new fd +* [#17821](https://github.com/apache/nuttx/pull/17821) fs/userfs: keep mutex while reading iobuffer +* [#17839](https://github.com/apache/nuttx/pull/17839) fs/driver: Replace heap allocation of temporary device names +* [#18001](https://github.com/apache/nuttx/pull/18001) fs: add fs dump in ROMFS/LITTLEFS +* [#18062](https://github.com/apache/nuttx/pull/18062) fs: Fix the incorrect return value of the lseek interface. +* [#18107](https://github.com/apache/nuttx/pull/18107) fs/fat: add support for FIOC_FILEPATH ioctl +* [#18200](https://github.com/apache/nuttx/pull/18200) fs: fix inode information update outside of lock in SMP scene +* [#18238](https://github.com/apache/nuttx/pull/18238) fs/timerfd: implement TFD_TIMER_CANCEL_ON_SET to detect clock changes +Networking +Improvements +* [#16940](https://github.com/apache/nuttx/pull/16940) net: Hardware Checksum Offload Support for NuttX Network Stack +* [#17431](https://github.com/apache/nuttx/pull/17431) net/pkt: Add some feature support +* [#17435](https://github.com/apache/nuttx/pull/17435) net/can: add write buffer to support nonblock send +* [#17436](https://github.com/apache/nuttx/pull/17436) net/netdev/netdev_register.c: skip mld_devinit if Nic can not support mld +* [#17440](https://github.com/apache/nuttx/pull/17440) net/utils/net_bufpool: add lock to struct net_bufpool_s and bufpool_navail +* [#17451](https://github.com/apache/nuttx/pull/17451) net: replace critical_section with spinlock +* [#17452](https://github.com/apache/nuttx/pull/17452) net: add vlan support +* [#17465](https://github.com/apache/nuttx/pull/17465) netdev_upperhalf: convert Kconfig to variable +* [#17483](https://github.com/apache/nuttx/pull/17483) net/pkt: add SOCK_DGRAM support +* [#17519](https://github.com/apache/nuttx/pull/17519) net: Check listening connections when selecting ports +* [#17520](https://github.com/apache/nuttx/pull/17520) net/pkt: Fixed error handling for unsupported types +* [#17521](https://github.com/apache/nuttx/pull/17521) net/socket: Fixed network card name does not end with \0 when binding the device issue +* [#17526](https://github.com/apache/nuttx/pull/17526) net/tcp: modify txavail to be sent directly in the current thread +* [#17551](https://github.com/apache/nuttx/pull/17551) net/packet: add PACKET__MEMBERSHIP support +* [#17553](https://github.com/apache/nuttx/pull/17553) net/netlink: add RT_TABLE_LOCAL definition for mqttc5 build +* [#17555](https://github.com/apache/nuttx/pull/17555) net/tcp: add TCP_CORK definition +* [#17585](https://github.com/apache/nuttx/pull/17585) net/netdev: allow stack to send/receive when running +* [#17587](https://github.com/apache/nuttx/pull/17587) net/igmp: mod check of IGMP_SCHEDMSG from assert to error log +* [#17588](https://github.com/apache/nuttx/pull/17588) net/tcp: modify the return value when dev is down in tcp_pollsetup +* [#17589](https://github.com/apache/nuttx/pull/17589) net: update check condition from IFF_UP to IFF_RUNNING in the network sending process +* [#17590](https://github.com/apache/nuttx/pull/17590) net/tcp: resolve reconnection issues when connection failed due to rejection +* [#17603](https://github.com/apache/nuttx/pull/17603) net/tcp: improve TCP retransmission mechanisms for better reliability +* [#17607](https://github.com/apache/nuttx/pull/17607) net/pkt: fix DHCP transmission failure by updating d_sndlen/d_len lengths +* [#17652](https://github.com/apache/nuttx/pull/17652) net/wireless: fix compile warning issue for wireless +* [#17655](https://github.com/apache/nuttx/pull/17655) netpkt: Introduction to using netpkt example +* [#17656](https://github.com/apache/nuttx/pull/17656) net/ethernet: ARP can be configured on interface +* [#17657](https://github.com/apache/nuttx/pull/17657) netlib: Introduction to IP conflict detection functions +* [#17658](https://github.com/apache/nuttx/pull/17658) net/icmp: check the checksum field when receive icmp message +* [#17659](https://github.com/apache/nuttx/pull/17659) net/ethernet: remove no use remove excess code +* [#17660](https://github.com/apache/nuttx/pull/17660) netdev_upperhalf: add direct rx mode +* [#17661](https://github.com/apache/nuttx/pull/17661) net/can: fix the typo and compile error +* [#17662](https://github.com/apache/nuttx/pull/17662) net/icmp: Return -ENOPROTOOPT for SOL_SOCKET to avoid misleading logs +* [#17663](https://github.com/apache/nuttx/pull/17663) net/net_initialize: remove the empty functions that are not needed +* [#17667](https://github.com/apache/nuttx/pull/17667) net/can: can protocol uses a separate buffer to cache can data +* [#17669](https://github.com/apache/nuttx/pull/17669) netlib: Add IOB statistics interface description +* [#17672](https://github.com/apache/nuttx/pull/17672) net/ipfrag: fix ip fragment assert when iob not enough +* [#17673](https://github.com/apache/nuttx/pull/17673) net/bufpool: fix typo +* [#17674](https://github.com/apache/nuttx/pull/17674) net/icmp: check src ip for icmp request message +* [#17676](https://github.com/apache/nuttx/pull/17676) net/tcp: add kconfig to support retransmission at a fixed time +* [#17677](https://github.com/apache/nuttx/pull/17677) net/vlan: add some macro for vlan +* [#17678](https://github.com/apache/nuttx/pull/17678) net/tcp: add support for the CLOSE_WAIT state +* [#17679](https://github.com/apache/nuttx/pull/17679) nuttx/net: Expose the net_ipv6addr_maskcmp interface to user-mode calls +* [#17686](https://github.com/apache/nuttx/pull/17686) net/ipv4: Send ICMP Destination Unreachable for unknown protocol +* [#17687](https://github.com/apache/nuttx/pull/17687) net/ipv4: Drop a ipv4 packet with total length bigger than the actual transmitted data +* [#17688](https://github.com/apache/nuttx/pull/17688) net/arp: support ARP entry learned on gratuitous ARP response +* [#17689](https://github.com/apache/nuttx/pull/17689) net/icmp: Support icmp timestamp request +* [#17691](https://github.com/apache/nuttx/pull/17691) net/tcp: tcp header seq check +* [#17692](https://github.com/apache/nuttx/pull/17692) net: decouple the impact of net_lock between network cards +* [#17693](https://github.com/apache/nuttx/pull/17693) net/ethernet: fix compilation issues for inet_sockif.c +* [#17695](https://github.com/apache/nuttx/pull/17695) net/vlan: make a judgment before calling fuction +* [#17698](https://github.com/apache/nuttx/pull/17698) net/udp: Validate UDP length field against actual packet size +* [#17699](https://github.com/apache/nuttx/pull/17699) net/udp: Support zero-length UDP datagrams +* [#17700](https://github.com/apache/nuttx/pull/17700) net/ethernet: change struct ifreq to consistent with Linux +* [#17701](https://github.com/apache/nuttx/pull/17701) net/devif: fix poll issue when ifdown +* [#17702](https://github.com/apache/nuttx/pull/17702) net/arp: dont learn arp information if interface is noarp +* [#17705](https://github.com/apache/nuttx/pull/17705) net/ioctl: add a socket interface for ioctl +* [#17707](https://github.com/apache/nuttx/pull/17707) net/tcp: support recv packet in the TCP_FIN_WAIT_1/2 state +* [#17709](https://github.com/apache/nuttx/pull/17709) net/tcp: remove SYN_RCVD state conn by listener created when free listener +* [#17710](https://github.com/apache/nuttx/pull/17710) net/tcp: send reset when retransmitted number greater than TCP_MAXRTX +* [#17711](https://github.com/apache/nuttx/pull/17711) net/tcp: support OTW ack seq check +* [#17712](https://github.com/apache/nuttx/pull/17712) net/arp: support arp request limit +* [#17713](https://github.com/apache/nuttx/pull/17713) net/tcp: discard fin packet in LISTEN state +* [#17714](https://github.com/apache/nuttx/pull/17714) net/tcp: fix tcp conn lock leak when port in use in tcp_selectport +* [#17715](https://github.com/apache/nuttx/pull/17715) net/tcp: fix conn->work use after free in worker queue list +* [#17716](https://github.com/apache/nuttx/pull/17716) net/ipv6: Drop IP packet shorter than length in IP header +* [#17729](https://github.com/apache/nuttx/pull/17729) net/arp: Skip ARP request if ip address is invalid +* [#17730](https://github.com/apache/nuttx/pull/17730) net/neighbor: Skip Neighbor request if ip address is invalid at ipv6 +* [#17732](https://github.com/apache/nuttx/pull/17732) net/netlink: replace net_lock with netlink_lock +* [#17733](https://github.com/apache/nuttx/pull/17733) net/local: replace net_lock with local_lock +* [#17734](https://github.com/apache/nuttx/pull/17734) net/usrsock: replace net_lock with usrsock_lock +* [#17735](https://github.com/apache/nuttx/pull/17735) net_sockif.c: add ip level s|getsockopt support in SOCK_CTRL +* [#17743](https://github.com/apache/nuttx/pull/17743) net/can: fix poll setup to properly find and use free pollfd slots +* [#17745](https://github.com/apache/nuttx/pull/17745) net/local: simplify file descriptor passing using shared filep references +* [#17754](https://github.com/apache/nuttx/pull/17754) net/devif_poll: only call the corresponding xxx_poll when there is data to be sent +* [#17775](https://github.com/apache/nuttx/pull/17775) net can: modify the return value of can_datahandler API. +* [#17785](https://github.com/apache/nuttx/pull/17785) net/udp: fix udp message cannot be sent to the network card +* [#17806](https://github.com/apache/nuttx/pull/17806) net/netdev: Fix best prefix in findby +* [#17819](https://github.com/apache/nuttx/pull/17819) net/route: need clear old cached route info when do reset cache +* [#17858](https://github.com/apache/nuttx/pull/17858) net: make the sendmsg param type consistent with posix specification +* [#17869](https://github.com/apache/nuttx/pull/17869) net/icmpv6: fix crash when ipv6 address modified during autoconfig +* [#17877](https://github.com/apache/nuttx/pull/17877) net/usrsock: Fix EPIPE loop by clearing POLLIN on remote close +* [#17878](https://github.com/apache/nuttx/pull/17878) net: Support no-lto option for the network build. +* [#17887](https://github.com/apache/nuttx/pull/17887) netinet/in.h: Rename imr_interface to imr_address in struct ip_mreqn. +* [#17890](https://github.com/apache/nuttx/pull/17890) net/icmp: Fix devif_loopback dead loop when unrecognized ICMP packet +* [#17895](https://github.com/apache/nuttx/pull/17895) net/route/ramroute: replace prealloc with netpool +* [#17896](https://github.com/apache/nuttx/pull/17896) net/neighbor: fix compilation with CONFIG_NET_ICMPv6_NO_STACK +* [#17907](https://github.com/apache/nuttx/pull/17907) net/can: allow errmask to be set to CAN_ERR_FLAG +* [#17917](https://github.com/apache/nuttx/pull/17917) net/ipv4: check whether the length of the ipv4 option is correct +* [#17919](https://github.com/apache/nuttx/pull/17919) net/netdev: correct the ioctl command validation logic +* [#18011](https://github.com/apache/nuttx/pull/18011) net: limit TCP and UDP send/recv buffer usage with throttled IOB +* [#18056](https://github.com/apache/nuttx/pull/18056) net/bluetooth: fix rmutex deadlock +* [#18247](https://github.com/apache/nuttx/pull/18247) net/netdev: a valid netdev for ipv4 should have ipv4 addr configured +* [#18249](https://github.com/apache/nuttx/pull/18249) netdev_driver: add carrier_on to xxx_ifup where carrier_on is absent +* [#18258](https://github.com/apache/nuttx/pull/18258) net/rpmsg: Modify error handling to rpmsg socket +* [#18386](https://github.com/apache/nuttx/pull/18386) net/utils: add union name for tasking compiler compatibility +Unsorted +* [#17432](https://github.com/apache/nuttx/pull/17432) icmp/icmp6: Fix some functional errors +* [#17434](https://github.com/apache/nuttx/pull/17434) select: fix too small timeout will be counted as 0 +* [#17445](https://github.com/apache/nuttx/pull/17445) misc C++ related fixes +* [#17449](https://github.com/apache/nuttx/pull/17449) Improve the robustness of env & binfmt code +* [#17457](https://github.com/apache/nuttx/pull/17457) Fix clang fortify issue +* [#17458](https://github.com/apache/nuttx/pull/17458) binfmt/elf: fix issue that the file is not closed after opening +* [#17461](https://github.com/apache/nuttx/pull/17461) usbhost: cdcacm exit wq after copy all received data +* [#17467](https://github.com/apache/nuttx/pull/17467) usbdev CDCACM optimization +* [#17469](https://github.com/apache/nuttx/pull/17469) sim usb enhancement +* [#17472](https://github.com/apache/nuttx/pull/17472) compiler: redefine float and double when disable float compiling +* [#17475](https://github.com/apache/nuttx/pull/17475) espressif: add support for flash encryption +* [#17476](https://github.com/apache/nuttx/pull/17476) 3-wire for ili9341 +* [#17478](https://github.com/apache/nuttx/pull/17478) eeprom/spi_xx25xx: Add IOCTL to set Block Protect +* [#17490](https://github.com/apache/nuttx/pull/17490) risc-v/litex: For vexriscv_smp, match default FDT address set by upstream opensbi. +* [#17492](https://github.com/apache/nuttx/pull/17492) usbdev: replace critical_section with spinlock +* [#17494](https://github.com/apache/nuttx/pull/17494) risc-v/litex: For vexriscv, point docs at linux CPU variant instead of secure. +* [#17496](https://github.com/apache/nuttx/pull/17496) usbhost: replace critical_section with spinlock +* [#17509](https://github.com/apache/nuttx/pull/17509) bugfix:the inode may have been removed by other core in SMP +* [#17515](https://github.com/apache/nuttx/pull/17515) rp2040,rp23xx,rp23xx-rv: allow up to 32 PIO instructions +* [#17518](https://github.com/apache/nuttx/pull/17518) timers/oneshot: Fix converted tv_nsec > NSEC_PER_SEC. +* [#17522](https://github.com/apache/nuttx/pull/17522) mtd/at25ee: Use eeprom/spi_xx25xx internally +* [#17561](https://github.com/apache/nuttx/pull/17561) openamp: upgrade the OpenAMP and Libmetal to the last released version v2025.10 +* [#17591](https://github.com/apache/nuttx/pull/17591) espressif: improve esp-hal-3rdparty handling +* [#17647](https://github.com/apache/nuttx/pull/17647) LoopTask: Sim loop task refactor wdt thread process loop event +* [#17651](https://github.com/apache/nuttx/pull/17651) defconfig: Change the default gateway address +* [#17653](https://github.com/apache/nuttx/pull/17653) cmocka/defconfig: Update defconfigs to include cmocka application +* [#17665](https://github.com/apache/nuttx/pull/17665) paho_mqtt: Add paho_mqtt repository description file +* [#17670](https://github.com/apache/nuttx/pull/17670) arp_poll: skip arp_out when arp_send flow +* [#17671](https://github.com/apache/nuttx/pull/17671) mld: free all mld group when netdev unregister +* [#17682](https://github.com/apache/nuttx/pull/17682) com/can: Attempt to release invalid resources when sender is full +* [#17683](https://github.com/apache/nuttx/pull/17683) tcp_reset: Modify RST packet responses to comply with RFC 793. +* [#17694](https://github.com/apache/nuttx/pull/17694) nuttx/can: in trunk support to Send message cancel mechanism. +* [#17696](https://github.com/apache/nuttx/pull/17696) risc-v/litex: Implement up_flush_dcache_all when CONFIG_ARCH_DCACHE is defined. +* [#17719](https://github.com/apache/nuttx/pull/17719) Sim/gpiochip: sim gpiochip support nuttx access host gpiochip +* [#17725](https://github.com/apache/nuttx/pull/17725) risc-v/litex: Add 64-bit S-mode vexiiriscv support for litex. +* [#17728](https://github.com/apache/nuttx/pull/17728) initial support for automated testing with NTFC +* [#17737](https://github.com/apache/nuttx/pull/17737) Add esp32c6 coremark and esp32s3 ostest defconfig +* [#17749](https://github.com/apache/nuttx/pull/17749) ARP table improvement +* [#17753](https://github.com/apache/nuttx/pull/17753) xtensa/esp32s3: fix dcache flush error in up_flush_dcache +* [#17755](https://github.com/apache/nuttx/pull/17755) utils.h: add conn_dev_sem_timedwait interface to simplify code logic +* [#17757](https://github.com/apache/nuttx/pull/17757) esp32s3: Remove redundant I2S include directive +* [#17761](https://github.com/apache/nuttx/pull/17761) Rpmsg: rpmsg services should be properly destroyed after calling rpmsg_device_destroy() +* [#17765](https://github.com/apache/nuttx/pull/17765) virtio/virtio-gpu: fbmem should transfer to pa +* [#17766](https://github.com/apache/nuttx/pull/17766) Migrate the rest of citest configurations to NTFC +* [#17770](https://github.com/apache/nuttx/pull/17770) [Kconfig] Fix Kconfig style +* [#17773](https://github.com/apache/nuttx/pull/17773) compiler: Add PRAGMA and unroll_loop. +* [#17777](https://github.com/apache/nuttx/pull/17777) virtio-gpu: support vsync and double fb +* [#17792](https://github.com/apache/nuttx/pull/17792) risc-v/litex: Update docs for vexriscv invalidate and no-op flush. +* [#17800](https://github.com/apache/nuttx/pull/17800) timer: rename tick_settimeouot to tick_settimeout +* [#17801](https://github.com/apache/nuttx/pull/17801) timer: add timer operation support +* [#17804](https://github.com/apache/nuttx/pull/17804) lin: adjust the LIN flag +* [#17807](https://github.com/apache/nuttx/pull/17807) Rpmsg test: add rpmsg test service to test the rpmsg apis +* [#17808](https://github.com/apache/nuttx/pull/17808) Rpmsg port uart: add low power support for rpmsg port uart +* [#17820](https://github.com/apache/nuttx/pull/17820) style: Fix case statement formatting in power management callbacks. +* [#17829](https://github.com/apache/nuttx/pull/17829) mtd/nvs: optimize nvs module +* [#17835](https://github.com/apache/nuttx/pull/17835) if_ether.h: add the definition of ETH_P_TSN +* [#17859](https://github.com/apache/nuttx/pull/17859) ghs: move the -fmacro-prefix-map compile option to compiler specific +* [#17860](https://github.com/apache/nuttx/pull/17860) arm64_head.S: fix the asm code build error +* [#17861](https://github.com/apache/nuttx/pull/17861) signal: add default sigaction for SIGURG +* [#17863](https://github.com/apache/nuttx/pull/17863) ghs: fix the UsageFault:INVSTATE error triggered by exception_common +* [#17875](https://github.com/apache/nuttx/pull/17875) sim: Pass through unknown sockopt to system. +* [#17884](https://github.com/apache/nuttx/pull/17884) stdio.h: Update TMP_MAX definition to match Linux +* [#17888](https://github.com/apache/nuttx/pull/17888) tcp_timer.c: send TCP_RST when keepalive timeout +* [#17899](https://github.com/apache/nuttx/pull/17899) tcp_input.c: standardize the processing of urgent data +* [#17900](https://github.com/apache/nuttx/pull/17900) sim: replace wdog with work queue in periodic work to avoid deadlock +* [#17901](https://github.com/apache/nuttx/pull/17901) libm: prevent atanf() yielding NaN for high inputs values. +* [#17902](https://github.com/apache/nuttx/pull/17902) ipfrag: use netdev_iob_replace_l2 to replace d_iob +* [#17905](https://github.com/apache/nuttx/pull/17905) Tricore sched +* [#17909](https://github.com/apache/nuttx/pull/17909) Rpmsg rtc fixes +* [#17916](https://github.com/apache/nuttx/pull/17916) ghs: update the compile option to recommended options +* [#17918](https://github.com/apache/nuttx/pull/17918) Ltp linux kernel completement sys wait impl +* [#17920](https://github.com/apache/nuttx/pull/17920) sys/resouce: add RLIM_NLIMITS definition +* [#17924](https://github.com/apache/nuttx/pull/17924) posix_test: fix the ltp project link error +* [#17925](https://github.com/apache/nuttx/pull/17925) Rpmsg signals: rpmsg router support get the rpmsg signals +* [#17926](https://github.com/apache/nuttx/pull/17926) lpcxpresso-lpc54628/netnsh: enable CONFIG_NET_SOCKOPTS to adapt icmpv6 changes +* [#17929](https://github.com/apache/nuttx/pull/17929) sys/types.h: Fixed the conflict issue with the "OK" constant definition +* [#17930](https://github.com/apache/nuttx/pull/17930) ulimit: add ulimit implementation +* [#17931](https://github.com/apache/nuttx/pull/17931) pthead: change the pthread_equal implementation from macro to function +* [#17933](https://github.com/apache/nuttx/pull/17933) limits: add _POSIX_PTHREAD_ constant for pthread management +* [#17934](https://github.com/apache/nuttx/pull/17934) pthread: reorganized the locations of pthread-related functions and constants +* [#17937](https://github.com/apache/nuttx/pull/17937) fpathconf: add _POSIX_PRIO_IO definition to comply with PSE52 standard +* [#17938](https://github.com/apache/nuttx/pull/17938) Tricore trap dump register +* [#17939](https://github.com/apache/nuttx/pull/17939) notifiy: remove critical section +* [#17946](https://github.com/apache/nuttx/pull/17946) Arm64 backtrace +* [#17947](https://github.com/apache/nuttx/pull/17947) arm64: add the interrupt status in the syscall +* [#17950](https://github.com/apache/nuttx/pull/17950) ctucanfd: increase rwcnt bitfield width and fix structure alignment +* [#17954](https://github.com/apache/nuttx/pull/17954) binfmt: refactor loadable module cleanup mechanism +* [#17960](https://github.com/apache/nuttx/pull/17960) arm64: add missing REG_SCTLR_EL1 initialization in signal processing +* [#17962](https://github.com/apache/nuttx/pull/17962) arm64: fix FIQ mask initialization in task state +* [#17963](https://github.com/apache/nuttx/pull/17963) arm: support AMP mode with GIC SGI inter-core interrupts +* [#17966](https://github.com/apache/nuttx/pull/17966) arm64: When returning from a system call, regs[REG_SP_EL0] will overw… +* [#17967](https://github.com/apache/nuttx/pull/17967) arm64: g_mpu_region need support SMP +* [#17970](https://github.com/apache/nuttx/pull/17970) kinetis/enet: Set carrier on/off on ifup/ifdown +* [#17972](https://github.com/apache/nuttx/pull/17972) tricore/csrm: bringup cpucs in tricore +* [#17976](https://github.com/apache/nuttx/pull/17976) imx95-m7: Fix Kconfig for flexcan typo +* [#17977](https://github.com/apache/nuttx/pull/17977) arm64: fix compile failed +* [#17982](https://github.com/apache/nuttx/pull/17982) armv7-a/arm_addrenv_pgmap.c: add up_addrenv_find_page and up_addrenv_… +* [#17983](https://github.com/apache/nuttx/pull/17983) arm64: fix stack pointer initialization when CONFIG_STACK_COLORATION … +* [#17998](https://github.com/apache/nuttx/pull/17998) arm64: add mpu_addrenv.c empty implementation and change arm64_addren… +* [#17999](https://github.com/apache/nuttx/pull/17999) arm64/toolchain: fix compile warnning +* [#18004](https://github.com/apache/nuttx/pull/18004) simwifi: Fix compilation warning +* [#18017](https://github.com/apache/nuttx/pull/18017) Kconfig: Add ALLOW_CUSTOM_PERMISSIVE_COMPONENTS license option +* [#18044](https://github.com/apache/nuttx/pull/18044) rpmsg/rpmsg_virtio: add rpmsg virtio common pm support +* [#18045](https://github.com/apache/nuttx/pull/18045) irq: rename STACK_ALIGNMENT to STACKFRAME_ALIGN for clarity +* [#18049](https://github.com/apache/nuttx/pull/18049) spinlock: add and optimize recursive spinlock interface for multi-core support +* [#18050](https://github.com/apache/nuttx/pull/18050) sim: it is not necessary to call restore_critical_section in irq +* [#18051](https://github.com/apache/nuttx/pull/18051) x86_64: remove unnecessary restore_critical_section call in interrupt handler +* [#18052](https://github.com/apache/nuttx/pull/18052) semaphore: remove redundant leave_critical_section in sem_trywait_slow +* [#18055](https://github.com/apache/nuttx/pull/18055) stm32: disable UART up_putc when semihosting +* [#18101](https://github.com/apache/nuttx/pull/18101) arm64: add protected mode support and SMP improvements +* [#18104](https://github.com/apache/nuttx/pull/18104) notifier: prevent DEBUGASSERT recursion during system startup +* [#18113](https://github.com/apache/nuttx/pull/18113) Revert "net: limit TCP and UDP send/recv buffer usage with throttled IOB +* [#18115](https://github.com/apache/nuttx/pull/18115) note/noteram: add FIONREAD ioctl to report unread buffer size +* [#18119](https://github.com/apache/nuttx/pull/18119) trace: add mark and printf support +* [#18120](https://github.com/apache/nuttx/pull/18120) Modify the Kconfig name of the mtdconfig module +* [#18126](https://github.com/apache/nuttx/pull/18126) note/ram: support multiple noterams to dump data when panic occurs +* [#18139](https://github.com/apache/nuttx/pull/18139) pthread: Move condition variable implementation to userspace +* [#18142](https://github.com/apache/nuttx/pull/18142) trace: Clean up macro formatting in trace.h +* [#18145](https://github.com/apache/nuttx/pull/18145) tricore: Enable SYSCALL_HOOKS architecture capability +* [#18148](https://github.com/apache/nuttx/pull/18148) spinlock: Add try-lock variants for recursive spinlock +* [#18150](https://github.com/apache/nuttx/pull/18150) nuttx: add profiling support and documentation +* [#18155](https://github.com/apache/nuttx/pull/18155) clock: Optimize performance counter infrastructure with userspace access and multi-architecture support +* [#18176](https://github.com/apache/nuttx/pull/18176) syscall: add sched_note_event_ip syscall for instrumentation dump +* [#18179](https://github.com/apache/nuttx/pull/18179) note: add NOTE_DUMP_BINARY support for binary log dumping +* [#18207](https://github.com/apache/nuttx/pull/18207) sem_rw: Consolidate return statements in down_write_trylock() for MISRA HIS compliance +* [#18218](https://github.com/apache/nuttx/pull/18218) mps:fix AN524 Kconfig symbol (MPS3, not MPS2) +* [#18219](https://github.com/apache/nuttx/pull/18219) sem_rw: Multiple code quality improvements for MISRA HIS compliance +* [#18222](https://github.com/apache/nuttx/pull/18222) sem_waitirq: Consolidate return statements for MISRA HIS compliance +* [#18225](https://github.com/apache/nuttx/pull/18225) mtdconfig/nvs: some optimizations to the nvs module +* [#18226](https://github.com/apache/nuttx/pull/18226) virtio/virtio-pci: improve PCI transport with INTX fallback and 64-bit support +* [#18228](https://github.com/apache/nuttx/pull/18228) sem_post: Consolidate return statements for MISRA HIS compliance +* [#18242](https://github.com/apache/nuttx/pull/18242) Fix UBSAN undefined behavior in semaphore mutex helper macro +* [#18243](https://github.com/apache/nuttx/pull/18243) protect: move us_heap to userspace_data_s +* [#18260](https://github.com/apache/nuttx/pull/18260) ipforward: Add IFF_NOSRC_FORWARD and IFF_NODST_FORWARD flags. +* [#18262](https://github.com/apache/nuttx/pull/18262) kernel/build: Fix the protected build +* [#18267](https://github.com/apache/nuttx/pull/18267) Fix duplicate symbol errors in stack check implementation +* [#18269](https://github.com/apache/nuttx/pull/18269) Fix SPI DMA bug with null txbuffer on ESP32S3 +* [#18274](https://github.com/apache/nuttx/pull/18274) tls_getinfo.c: tls_get_info needs to be compiled in most cases. +* [#18287](https://github.com/apache/nuttx/pull/18287) rp23xx/rp23xx-rv: Fix GPIO interrupt handler for RP2350B variant. +* [#18312](https://github.com/apache/nuttx/pull/18312) kconfig: Fix Kconfig style +* [#18318](https://github.com/apache/nuttx/pull/18318) toolchain/clang: improve clang toolchain +* [#18341](https://github.com/apache/nuttx/pull/18341) arm64: Add kmalloc header for arch timer +* [#18348](https://github.com/apache/nuttx/pull/18348) audio: upper half enhancement +* [#18352](https://github.com/apache/nuttx/pull/18352) [BUG FIX] rpmsg_virtio/rptun: support fallback cpuname when VIRTIO_RPMSG_F_CPUNAME not set +* [#18362](https://github.com/apache/nuttx/pull/18362) lcd/ili9341: Improve putrun's checks +* [#18369](https://github.com/apache/nuttx/pull/18369) video/v4l2: fix leaks and out of bounds bugs in v4l2 +* [#18387](https://github.com/apache/nuttx/pull/18387) lzf: prevent lzf header struct optimization +* [#18395](https://github.com/apache/nuttx/pull/18395) pynuttx: missing `mm_initialize` +* [#18401](https://github.com/apache/nuttx/pull/18401) Makefile: Remove make depend files by make distclean +* [#18405](https://github.com/apache/nuttx/pull/18405) imxrt/lpspi: Fix correct LPSPI DMA transfer size for 16-bit +* [#18425](https://github.com/apache/nuttx/pull/18425) xtensa/esp32: Fix HMAC-SHA when a long key is used +* [#18428](https://github.com/apache/nuttx/pull/18428) rndis.c: move ifup in setconfig to the work queue +* [#18441](https://github.com/apache/nuttx/pull/18441) codeowners: Shorten file by using wildcards +* [#18447](https://github.com/apache/nuttx/pull/18447) video/imgdata: fix IMGDATA_SET_BUF macro int-conversion warning +* [#18463](https://github.com/apache/nuttx/pull/18463) wireless/cc1101: Add Kconfig option to bypass strict version check +* [#18473](https://github.com/apache/nuttx/pull/18473) wireless/nrf24l01: Implement common RF IOCTLs and fix missing register reads. +* [#18478](https://github.com/apache/nuttx/pull/18478) nxgdb: change the symbol g_statenames to nxsched_get_stateinfo::g_statename +Compatibility Concerns +* [#18083](https://github.com/apache/nuttx/pull/18083) !sched: Fix MISRA-C violations +This pull request consists of a series of commits primarily focused on improving code quality, enhancing type safety, addressing + compilation warnings, and ensuring compliance with MISRA-C coding standards across various subsystems of the NuttX operating system. +Impact + Users (Application Developers): The changes are largely internal and should not affect the functional behavior or the public + POSIX API for applications (e.g., timer_create, sem_wait, clock_gettime). The primary user-facing impact is increased code + reliability and stability due to stricter type checking and error handling. + Code Quality and Maintenance: By addressing MISRA-C violations and eliminating compiler warnings, the codebase becomes more portable, + predictable, and easier to maintain. The refactoring in the timer subsystem (removing early returns, simplifying logic) improves + readability and reduces the risk of latent bugs. + Compatibility: The modifications maintain backward source compatibility. However, developers who directly relied on the internal + nxclock_settime() symbol will need to adapt, as it has been removed. + Documentation: No direct impact on external documentation. The inline comments within the code are updated to reflect some of the logic changes. + Security: While not a direct security patch, the overall hardening (e.g., stricter input validation) contributes to the system's + robustness against potential misuse. + +* [#18398](https://github.com/apache/nuttx/pull/18398) !boards: Align naming of Kconfig options for interpreters +Aligns the Kconfig option naming for interpreters. Part of twin PR apache/nuttx-apps#3403 which should be merged first. + +BREAKING CHANGE: + All configurations using CONFIG_INTERPRETER_* options will no longer compile due to missing symbol errors. + The fix is very quick: any configurations using this options should add a trailing S following INTERPRETER in the affected Kconfig variables. + I believe ./tools/refresh.sh should also be capable of doing this automatically. diff --git a/README.md b/README.md index e56807dfe2251..3ec5eba255e7d 100644 --- a/README.md +++ b/README.md @@ -3,11 +3,9 @@

![POSIX Badge](https://img.shields.io/badge/POSIX-Compliant-brightgreen?style=flat&label=POSIX) -[![License](https://img.shields.io/badge/License-Apache%202.0-blue -)](https://nuttx.apache.org/docs/latest/introduction/licensing.html) +[![License](https://img.shields.io/badge/License-Apache%202.0-blue)](https://nuttx.apache.org/docs/latest/introduction/licensing.html) ![Issues Tracking Badge](https://img.shields.io/badge/issue_track-github-blue?style=flat&label=Issue%20Tracking) -[![Contributors](https://img.shields.io/github/contributors/apache/nuttx -)](https://github.com/apache/nuttx/graphs/contributors) +[![Contributors](https://img.shields.io/github/contributors/apache/nuttx)](https://github.com/apache/nuttx/graphs/contributors) [![GitHub Build Badge](https://github.com/apache/nuttx/workflows/Build/badge.svg)](https://github.com/apache/nuttx/actions/workflows/build.yml) [![Documentation Badge](https://github.com/apache/nuttx/workflows/Build%20Documentation/badge.svg)](https://nuttx.apache.org/docs/latest/index.html) diff --git a/arch/arm/src/cxd56xx/cxd56_dmac.c b/arch/arm/src/cxd56xx/cxd56_dmac.c index 22d931cd3b18f..3d7b111782da3 100644 --- a/arch/arm/src/cxd56xx/cxd56_dmac.c +++ b/arch/arm/src/cxd56xx/cxd56_dmac.c @@ -313,13 +313,13 @@ static int ch2dmac(int ch) { switch (ch) { - case 0: case 1: + case 0 ... 1: return 1; - case 2: case 3: case 4: case 5: case 6: /* APP IDMAC */ + case 2 ... 6: /* APP IDMAC */ return 3; - case 7: case 8: /* APP SKDMAC */ + case 7 ... 8: /* APP SKDMAC */ return 2; - default: + default: return 0; } } @@ -330,9 +330,12 @@ static struct dmac_register_map *get_device(int ch) switch (id) { - case 1: return (struct dmac_register_map *)DMAC1_REG_BASE; - case 2: return (struct dmac_register_map *)DMAC2_REG_BASE; - case 3: return (struct dmac_register_map *)DMAC3_REG_BASE; + case 1: + return (struct dmac_register_map *)DMAC1_REG_BASE; + case 2: + return (struct dmac_register_map *)DMAC2_REG_BASE; + case 3: + return (struct dmac_register_map *)DMAC3_REG_BASE; } return NULL; @@ -366,13 +369,13 @@ static int get_pmid(int ch) { switch (ch) { - case 0: case 1: + case 0 ... 1: return PM_APP_ADMAC; - case 2: case 3: case 4: case 5: case 6: + case 2 ... 6: return PM_APP_IDMAC; - case 7: case 8: + case 7 ... 8: return PM_APP_SKDMAC; - default: + default: break; /* may not comes here */ } @@ -941,7 +944,11 @@ void cxd56_rxdmasetup(DMA_HANDLE handle, uintptr_t paddr, uintptr_t maddr, CXD56_DMAC_BSIZE4, CXD56_DMAC_BSIZE4, /* Dest / Src burst size (fixed) */ CXD56_DMAC_MAX_SIZE); - dst += CXD56_DMAC_MAX_SIZE; + if (di) + { + dst += CXD56_DMAC_MAX_SIZE; + } + rest -= CXD56_DMAC_MAX_SIZE; } @@ -1012,7 +1019,11 @@ void cxd56_txdmasetup(DMA_HANDLE handle, uintptr_t paddr, uintptr_t maddr, CXD56_DMAC_BSIZE1, CXD56_DMAC_BSIZE1, /* Dest / Src burst size (fixed) */ CXD56_DMAC_MAX_SIZE); - src += CXD56_DMAC_MAX_SIZE; + if (si) + { + src += CXD56_DMAC_MAX_SIZE; + } + rest -= CXD56_DMAC_MAX_SIZE; } diff --git a/arch/arm/src/rp23xx/CMakeLists.txt b/arch/arm/src/rp23xx/CMakeLists.txt index 1b54235cc6084..6289f3e4e9b97 100644 --- a/arch/arm/src/rp23xx/CMakeLists.txt +++ b/arch/arm/src/rp23xx/CMakeLists.txt @@ -85,4 +85,8 @@ if(CONFIG_WATCHDOG) list(APPEND SRCS rp23xx_wdt.c) endif() +if(CONFIG_IEEE80211_INFINEON_CYW43439) + list(APPEND SRCS rp23xx_cyw43439.c) +endif() + target_sources(arch PRIVATE ${SRCS}) diff --git a/arch/arm/src/rp23xx/Make.defs b/arch/arm/src/rp23xx/Make.defs index 9a94796a0d921..28fca272cec68 100644 --- a/arch/arm/src/rp23xx/Make.defs +++ b/arch/arm/src/rp23xx/Make.defs @@ -88,3 +88,7 @@ endif ifeq ($(CONFIG_WATCHDOG),y) CHIP_CSRCS += rp23xx_wdt.c endif + +ifeq ($(CONFIG_IEEE80211_INFINEON_CYW43439),y) +CHIP_CSRCS += rp23xx_cyw43439.c +endif diff --git a/arch/arm/src/rp23xx/rp23xx_cyw43439.c b/arch/arm/src/rp23xx/rp23xx_cyw43439.c new file mode 100644 index 0000000000000..a441473875d62 --- /dev/null +++ b/arch/arm/src/rp23xx/rp23xx_cyw43439.c @@ -0,0 +1,879 @@ +/**************************************************************************** + * arch/arm/src/rp23xx/rp23xx_cyw43439.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include "rp23xx_cyw43439.h" +#include "rp23xx_pio.h" +#include "rp23xx_pio_instructions.h" + +#ifdef CONFIG_NDEBUG +# define PRINT_GSPI(block) +#else +void bcmf_hexdump(uint8_t *data, unsigned int len, unsigned long offset); +bool g_print_gspi = false; +# define PRINT_GSPI(block) if (g_print_gspi) { block } +#endif + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define GSPI_CLOCK_FREQ 31250000 /* Hz (Max: 50MHz) */ + +#define PIO_WRAP_TARGET 0 +#define PIO_WRAP 5 + +#define TX_FIFO_SIZE 4 + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +typedef struct dma_info_s +{ + sem_t sem; + uint8_t status; +} dma_info_t; + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/* This is the PIO program to write and then read from the data pin. + * + * The X register is the output bit count register. It should be set + * to one less than the total number of BITS to be transmitted. + * + * The Y register is the input bit count register. It too must be set + * to one less than the total number of bits to be read. + * + * The PIO's state machine is set up to auto-pull data from the input + * fifo whenever the output shift register is empty. This happens at + * the start and every 32 bits thereafter. + * + * The state machine also auto-pushes whenever we have a full 32 bits + * in the input shift register. To make sure we receive all the data, + * we need to make sure that the read bit count is a multiple of 32. + * (Y = 32*N - 1 for some integer N) + */ + +static const uint16_t cyw_program_instructions[] = +{ + 0x6001, /* 0: out pins, 1 side 0 # Write one bit */ + 0x1040, /* 1: jmp x--, 0 side 1 # Loop until write count is zero */ + 0xe080, /* 2: set pindirs, 0 side 0 # Make data pin an input */ + 0xb042, /* 3: nop side 1 # Keep clock in sync */ + 0x4001, /* 4: in pins, 1 side 0 # Read 1 bit */ + 0x1084, /* 5: jmp y--, 4 side 1 # Loop until read count is zero */ +}; + +static const rp23xx_pio_program_t pio_program = +{ + .instructions = cyw_program_instructions, + .length = 6, /* Six, count 'em, six. */ + .origin = -1, /* Put it wherever it fits */ +}; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: dma_complete + * + * Description: + * Called on completion of the DMA transfer. + * + * Input Parameters: + * handle - handle to our DMA channel + * status - status of the transfer + * arg - Pointer to dma info structure. + * + ****************************************************************************/ + +static void dma_complete(DMA_HANDLE handle, uint8_t status, void *arg) +{ + dma_info_t *dma_info = arg; + + /* Remember the status and post the dma complete event. */ + + dma_info->status = status; + nxsem_post(&(dma_info->sem)); +} + +/**************************************************************************** + * Name: my_init + * + * Description: + * Connect to and initialize the cyw43439. + * + ****************************************************************************/ + +static int my_init(gspi_dev_t *gspi) +{ + rp23xx_gspi_t *rp_io = (rp23xx_gspi_t *)(gspi->io_dev); + + uint32_t divisor; + irqstate_t flags; + rp23xx_pio_sm_config config = + { + 0 + }; + + /* Make sure the cyw43439 chip is deselected, and off. + * so we know it is reset + */ + + rp23xx_gpio_put(rp_io->gpio_select, true); /* deselect */ + rp23xx_gpio_put(rp_io->gpio_on, false); /* power off */ + + /* Pull the data line low so that we initialise to gSPI mode */ + + rp23xx_gpio_init(rp_io->gpio_data); + rp23xx_gpio_setdir(rp_io->gpio_data, true); + rp23xx_gpio_put(rp_io->gpio_data, false); + + nxsched_usleep(50000); /* Leave off for at least 50ms. */ + + rp23xx_gpio_put(rp_io->gpio_on, true); /* power on */ + + nxsched_usleep(50000); /* Wait a bit to let the power come up. */ + + /* Don't let anyone else grab a PIO while we are doing so. */ + + flags = enter_critical_section(); + + /* Find a PIO instance and load program. */ + + for (rp_io->pio = 0; rp_io->pio < RP23XX_PIO_NUM; ++rp_io->pio) + { + /* Try to claim a state machine. */ + + rp_io->pio_sm = rp23xx_pio_claim_unused_sm(rp_io->pio, false); + + /* If we did not get one try the next pio block, if any. */ + + if (rp_io->pio_sm < 0) continue; + + /* See if we have space in this block to load our program. */ + + if (rp23xx_pio_can_add_program(rp_io->pio, &pio_program)) + { + /* Great! load the program and exit the pio choice loop. */ + + rp_io->pio_location = rp23xx_pio_add_program(rp_io->pio, + &pio_program); + + break; + } + + /* Oops -- no room at the inn! Release sm and try next pio. */ + + rp23xx_pio_sm_unclaim(rp_io->pio, rp_io->pio_sm); + } + + if (rp_io->pio >= RP23XX_PIO_NUM) + { + leave_critical_section(flags); + return -ENOMEM; + } + + leave_critical_section(flags); + + /* ==== Configure the PIO State Machine ==== */ + + /* Configure pins that are used by PIO. */ + + rp23xx_pio_gpio_init(rp_io->pio, rp_io->gpio_data); + rp23xx_pio_gpio_init(rp_io->pio, rp_io->gpio_clock); + + rp23xx_gpio_set_input_hysteresis_enabled(rp_io->gpio_data, true); + + rp23xx_gpio_set_slew_fast(rp_io->gpio_clock, true); + rp23xx_gpio_set_drive_strength(rp_io->gpio_clock, + RP23XX_PADS_BANK0_GPIO_DRIVE_12MA); + + /* Set the clock divisor as appropriate for our system clock + * speed, so the pio clock runs the requested bit clock rate. + */ + + divisor = ((uint64_t)BOARD_SYS_FREQ << 8) / (2 * GSPI_CLOCK_FREQ); + + rp23xx_sm_config_set_clkdiv_int_frac(&config, + divisor >> 8, + divisor & 0xff); + + /* Set the wrap points as required by the program. */ + + rp23xx_sm_config_set_wrap(&config, + rp_io->pio_location + PIO_WRAP_TARGET, + rp_io->pio_location + PIO_WRAP); + + /* set to shift left, 32 bits, with autopull/push */ + + rp23xx_sm_config_set_in_shift(&config, false, true, 32); + rp23xx_sm_config_set_out_shift(&config, false, true, 32); + + /* Configure a single mandatory side-set pin. */ + + rp23xx_sm_config_set_sideset(&config, 1, false, false); + + /* Configure our GPIO clock pin as side-set output. */ + + rp23xx_sm_config_set_sideset_pins(&config, rp_io->gpio_clock); + + /* Configure out GPIO data pin as an OUT pin, SET pin, and IN pin */ + + rp23xx_sm_config_set_out_pins(&config, rp_io->gpio_data, 1); + rp23xx_sm_config_set_set_pins(&config, rp_io->gpio_data, 1); + rp23xx_sm_config_set_in_pins (&config, rp_io->gpio_data); + + /* Load the configuration into the state machine. */ + + rp23xx_pio_sm_init(rp_io->pio, + rp_io->pio_sm, + rp_io->pio_location, + &config); + + /* Disable the input synchronizers on the data pin */ + + rp23xx_pio_set_input_sync_bypass(rp_io->pio, rp_io->gpio_data, true); + + wlinfo("finished\n"); + + return OK; +} + +/**************************************************************************** + * Name: my_set_isr + * + * Description: + * Setup the data line interrupt service routine. + * + ****************************************************************************/ + +static int my_set_isr(gspi_dev_t *gspi, + xcpt_t thread_isr, + void *thread_isr_arg) +{ + rp23xx_gspi_t *rp_io = (rp23xx_gspi_t *)(gspi->io_dev); + + /* Set up, but do not enable, interrupt service for the data pin */ + + rp23xx_gpio_irq_attach(rp_io->gpio_intr, + RP23XX_GPIO_INTR_LEVEL_HIGH, + thread_isr, + thread_isr_arg); + + wlinfo("attached\n"); + + return OK; +} + +/**************************************************************************** + * Name: my_interrupt_enable + * + * Description: + * Setup the data line isr. + * + ****************************************************************************/ + +static int my_interrupt_enable(gspi_dev_t *gspi, + bool enable) +{ + rp23xx_gspi_t *rp_io = (rp23xx_gspi_t *)(gspi->io_dev); + static int disable_count = 0; + + if (enable) + { + if (--disable_count <= 0) rp23xx_gpio_enable_irq(rp_io->gpio_intr); + } + else + { + rp23xx_gpio_disable_irq(rp_io->gpio_intr); + ++disable_count; + } + + return OK; +} + +/**************************************************************************** + * Name: my_deinit + * + * Description: + * Disconnect from cyw43439 and cleanup. + * + ****************************************************************************/ + +static int my_deinit(gspi_dev_t *gspi) +{ + rp23xx_gspi_t *rp_io = (rp23xx_gspi_t *)(gspi->io_dev); + + rp23xx_gpio_irq_attach(rp_io->gpio_data, + RP23XX_GPIO_INTR_EDGE_LOW, + NULL, + NULL); + + rp23xx_pio_sm_set_enabled(rp_io->pio, rp_io->pio_sm, false); + rp23xx_pio_remove_program(rp_io->pio, &pio_program, rp_io->pio_location); + rp23xx_pio_sm_unclaim(rp_io->pio, rp_io->pio_sm); + + /* Turn the power off to the cyw43439. */ + + rp23xx_gpio_put(rp_io->gpio_on, false); + + return OK; +} + +/**************************************************************************** + * Name: my_write + * + * Description: + * write data to the cyw43439 + * + ****************************************************************************/ + +static int my_write(struct gspi_dev_s *gspi, + bool increment, + enum gspi_cmd_func_e function, + uint32_t address, + uint16_t length, + const uint32_t *data) +{ + rp23xx_gspi_t *rp_io = (rp23xx_gspi_t *)(gspi->io_dev); + dma_info_t dma_info; + DMA_HANDLE xfer_dma = rp23xx_dmachannel(); + uint32_t command = (0x1 << 31) + | ((increment ? 1 : 0) << 30) + | ((function & 0x3) << 28) + | ((address & 0x1ffff) << 11) + | (length & 0x7ff); + + dma_config_t dma_config = + { + .size = RP23XX_DMA_SIZE_WORD, + .noincr = false, + .dreq = rp23xx_pio_get_dreq(rp_io->pio, + rp_io->pio_sm, + true), + }; + + PRINT_GSPI( + printf("------ cmd: 0x%08lx [W %d %d 0x%05lX %d]\n", command, + increment, + function, + address, + length); + bcmf_hexdump((void *)data, length, (uint32_t)data); + ) + + /* Claim the exclusive lock */ + + nxmutex_lock(&gspi->lock); + + /* Reset the PIO state machine just to be sure. */ + + rp23xx_pio_sm_set_enabled(rp_io->pio, rp_io->pio_sm, false); + + rp23xx_pio_sm_clear_fifos(rp_io->pio, rp_io->pio_sm); + + rp23xx_pio_sm_restart(rp_io->pio, rp_io->pio_sm); + + rp23xx_pio_sm_clkdiv_restart(rp_io->pio, rp_io->pio_sm); + + rp23xx_pio_sm_exec(rp_io->pio, + rp_io->pio_sm, + pio_encode_jmp(rp_io->pio_location)); + + /* Set the PIO X and Y registers. + * + * We load X (the TX bit length) with one less than the number of + * bits to transmit to the chip. This length includes the 32-bit + * command word and all the 32-bit data words. Since the length + * parameter is a byte count we round up just to be sure. + * + * We load Y (the RX bit length) with zero as we're not reading + * any data. + * + * This is slightly magical. The way we load the X is to first + * push the the number of bits to transmit onto the transmit fifo. + * Then we force the PIO state machine to execute the instruction + * "out x, 32" which transfers the word from the output shift + * register (OSR) to the X register. When this instruction executes + * the PIO will notice that the OSR is empty, so will automatically + * pull a value (the one we just added) from the input fifo. + * + * Loading the Y works the same way. + */ + + rp23xx_pio_sm_put(rp_io->pio, rp_io->pio_sm, 32 * ((length + 3) / 4) + 31); + rp23xx_pio_sm_exec(rp_io->pio, rp_io->pio_sm, pio_encode_out(pio_x, 32)); + + rp23xx_pio_sm_put(rp_io->pio, rp_io->pio_sm, 0); + rp23xx_pio_sm_exec(rp_io->pio, rp_io->pio_sm, pio_encode_out(pio_y, 32)); + + /* Disable interrupts so data won't trigger interrupt. */ + + my_interrupt_enable(gspi, false); + + /* Make sure the clock and data pins direction set to output. */ + + rp23xx_pio_sm_set_pindirs_with_mask(rp_io->pio, + rp_io->pio_sm, + (1 << rp_io->gpio_data) + | (1 << rp_io->gpio_clock), + (1 << rp_io->gpio_data) + | (1 << rp_io->gpio_clock)); + + /* Make sure there is nothing in the fifos before starting DMA. */ + + rp23xx_pio_sm_clear_fifos(rp_io->pio, rp_io->pio_sm); + + /* Load the command into the transmit fifo. */ + + if (function == gspi_f0_bus_rev16) + { + __asm ("rev16 %0, %0" : "+l" (command) : :); + } + + __asm ("rev %0, %0" : "+l" (command) : :); + + putreg32(command, RP23XX_PIO_TXF(rp_io->pio, rp_io->pio_sm)); + + /* Initialize and start the transmit DMA. It will + * keep adding data to the TX_FIFO until all data is sent. + */ + + nxsem_init(&dma_info.sem, 0, 0); + + rp23xx_dmastop(xfer_dma); + + rp23xx_txdmasetup(xfer_dma, + (uintptr_t) RP23XX_PIO_TXF(rp_io->pio, + rp_io->pio_sm), + (uintptr_t) data, + (length + 3) & 0xfffffffc, + dma_config); + + modifyreg32(rp23xx_dma_register(xfer_dma, + RP23XX_DMA_CTRL_TRIG_OFFSET), + RP23XX_DMA_CTRL_TRIG_BSWAP, + RP23XX_DMA_CTRL_TRIG_BSWAP); + + rp23xx_dmastart(xfer_dma, dma_complete, &dma_info); + + /* Assert gpio_select by pulling line low */ + + rp23xx_gpio_put(rp_io->gpio_select, false); + UP_DMB(); + + /* Enable the state machine. This starts the pio program running */ + + rp23xx_pio_sm_set_enabled(rp_io->pio, rp_io->pio_sm, true); + + /* Wait for transfer to complete */ + + nxsem_wait(&dma_info.sem); + + /* At this point all the data has been queued but my not have all been + * sent. We know that the PIO program will make the data line an input + * once all the data is sent so we'll check for this. + * + * NOTE (RP2350 port): the RP2040 read this via the OEFROMPERI status + * bit. That bit does not exist on RP2350; the GPIO_STATUS register + * exposes OETOPAD (the output enable presented to the pad, after any + * register override). With the default OEOVER (drive from peripheral) + * the two are equivalent for our purposes -- the bit is set while the + * PIO is still driving the data pin as an output. + */ + + while (getreg32(RP23XX_IO_BANK0_GPIO_STATUS(rp_io->gpio_data)) + & RP23XX_IO_BANK0_GPIO_STATUS_OETOPAD) + { + /* Just busy wait -- testing indicates a worst case of + * 20 loops (100 instructions). + */ + } + + /* Un-assert select by pulling line high. */ + + UP_DMB(); + rp23xx_gpio_put(rp_io->gpio_select, true); + + /* Free the DMA controller */ + + rp23xx_dmafree(xfer_dma); + nxsem_destroy(&dma_info.sem); + + /* Disable the PIO */ + + rp23xx_pio_sm_set_enabled(rp_io->pio, rp_io->pio_sm, false); + + /* At this point the data pin is input so it should have been + * pulled high by rp23xx's gpio pullup. + */ + + my_interrupt_enable(gspi, true); + + /* Release the exclusive lock */ + + nxmutex_unlock(&gspi->lock); + return dma_info.status; +} + +/**************************************************************************** + * Name: my_read + * + * Description: + * read data to the cyw43439 + * + ****************************************************************************/ + +static int my_read(struct gspi_dev_s *gspi, + bool increment, + enum gspi_cmd_func_e function, + uint32_t address, + uint16_t length, + uint32_t *buffer) +{ + rp23xx_gspi_t *rp_io = (rp23xx_gspi_t *)(gspi->io_dev); + dma_info_t dma_info; + DMA_HANDLE xfer_dma = rp23xx_dmachannel(); + DMA_HANDLE ctrl_dma = rp23xx_dmachannel(); + uint32_t temp_word; + uint32_t bit_length; + uint32_t command = ((increment ? 1 : 0) << 30) + | ((function & 0x3) << 28) + | ((address & 0x1ffff) << 11) + | (length & 0x7ff); + + uint32_t pacing = rp23xx_pio_get_dreq(rp_io->pio, + rp_io->pio_sm, + false); + + dma_control_block_t ctrl_blks[] = + { + /* For F1 transfers we read 1 word that we throw away */ + + { + rp23xx_dma_ctrl_blk_ctrl(ctrl_dma, + RP23XX_DMA_SIZE_WORD, + pacing, + 0), + (uintptr_t) RP23XX_PIO_RXF(rp_io->pio, rp_io->pio_sm), + (uintptr_t) &temp_word, + 1, + }, + + /* Read requested data into output buffer */ + + { + rp23xx_dma_ctrl_blk_ctrl(ctrl_dma, + RP23XX_DMA_SIZE_WORD, + pacing, + RP23XX_DMA_CTRL_TRIG_INCR_WRITE + | RP23XX_DMA_CTRL_TRIG_BSWAP), + (uintptr_t) RP23XX_PIO_RXF(rp_io->pio, rp_io->pio_sm), + (uintptr_t) buffer, + (length + 3) / 4, + }, + + RP23XX_DMA_CTRL_BLOCK_END + }; + + PRINT_GSPI( + printf("------ cmd: 0x%08lx [R %d %d 0x%05lX %d]\n", command, + increment, + function, + address, + length); + ) + + /* Claim the exclusive lock */ + + nxmutex_lock(&gspi->lock); + + /* Reset the PIO state machine just to be sure. */ + + rp23xx_pio_sm_set_enabled(rp_io->pio, rp_io->pio_sm, false); + + rp23xx_pio_sm_clear_fifos(rp_io->pio, rp_io->pio_sm); + + rp23xx_pio_sm_restart(rp_io->pio, rp_io->pio_sm); + + rp23xx_pio_sm_clkdiv_restart(rp_io->pio, rp_io->pio_sm); + + rp23xx_pio_sm_exec(rp_io->pio, + rp_io->pio_sm, + pio_encode_jmp(rp_io->pio_location)); + + /* Set the PIO X and Y registers. + * + * We load X (the TX bit length) with one less than the number of + * bits to transmit to the chip. Since we only send the 32-bit command + * word we set X to 31. + * + * We load Y with the number of bits to read. This is based on the + * byte count in "length" which we round up to a 32-bit boundary so the + * pio program will be sure to autopush the final data to the output fifo. + * + * This is slightly magical. The way we load the X is to first + * push the the number of bits to transmit onto the transmit fifo. + * Then we force the PIO state machine to execute the instruction + * "out x, 32" which transfers the word from the output shift + * register (OSR) to the X register. When this instruction executes + * the PIO will notice that the OSR is empty, so will automatically + * pull a value (the one we just added) from the input fifo. + * + * Loading the Y works the same way. + */ + + rp23xx_pio_sm_put(rp_io->pio, rp_io->pio_sm, 31); + rp23xx_pio_sm_exec(rp_io->pio, rp_io->pio_sm, pio_encode_out(pio_x, 32)); + + /* RX bit length is 32 bits for each 4 bytes requested. */ + + bit_length = 32 * ((length + 3) / 4); + + /* For F1 reads add 32 bits for delay */ + + if (function == gspi_f1_backplane) + { + bit_length += 32; + } + + rp23xx_pio_sm_put(rp_io->pio, rp_io->pio_sm, bit_length); + rp23xx_pio_sm_exec(rp_io->pio, rp_io->pio_sm, pio_encode_out(pio_y, 32)); + + /* Disable interrupts so data won't trigger interrupt. */ + + my_interrupt_enable(gspi, false); + + /* Make sure the clock and data pins direction set to output. */ + + rp23xx_pio_sm_set_pindirs_with_mask(rp_io->pio, + rp_io->pio_sm, + (1 << rp_io->gpio_data) + | (1 << rp_io->gpio_clock), + (1 << rp_io->gpio_data) + | (1 << rp_io->gpio_clock)); + + /* Make sure there is nothing in the fifos before starting DMA. */ + + rp23xx_pio_sm_clear_fifos(rp_io->pio, rp_io->pio_sm); + + /* Load the command into the transmit fifo. */ + + if (function == gspi_f0_bus_rev16) + { + __asm ("rev16 %0, %0" : "+l" (command) : :); + } + + __asm ("rev %0, %0" : "+l" (command) : :); + + putreg32(command, RP23XX_PIO_TXF(rp_io->pio, rp_io->pio_sm)); + + /* Initialize and start the control DMA. It will + * use the xfer_dma to transfer data from the chip. + */ + + nxsem_init(&dma_info.sem, 0, 0); + + rp23xx_dmastop(ctrl_dma); + rp23xx_dmastop(xfer_dma); + + /* Check the function bits if the command word to see if + * this is an F1 read. If it is we throw away the first + * four bytes read as this is a delay word. + */ + + rp23xx_ctrl_dmasetup(ctrl_dma, + xfer_dma, + &ctrl_blks[function == 1 ? 0 : 1], + dma_complete, + &dma_info); + + rp23xx_dmastart(ctrl_dma, NULL, NULL); + + /* Assert gpio_select by pulling line low */ + + rp23xx_gpio_put(rp_io->gpio_select, false); + UP_DMB(); + + /* Enable the state machine. This starts the pio program running */ + + rp23xx_pio_sm_set_enabled(rp_io->pio, rp_io->pio_sm, true); + + /* Wait for transfer to complete */ + + nxsem_wait(&dma_info.sem); + + PRINT_GSPI( + bcmf_hexdump((void *)buffer, length, (uint32_t)buffer); + ) + + /* Un-assert select by pulling line high. */ + + UP_DMB(); + rp23xx_gpio_put(rp_io->gpio_select, true); + + /* Free the DMA controllers */ + + rp23xx_dmafree(ctrl_dma); + rp23xx_dmafree(xfer_dma); + + nxsem_destroy(&dma_info.sem); + + /* Disable the PIO */ + + rp23xx_pio_sm_set_enabled(rp_io->pio, rp_io->pio_sm, false); + + /* At this point the data pin is input so it should have been + * pulled high by rp23xx's gpio pullup. + */ + + my_interrupt_enable(gspi, true); + + /* Release the exclusive lock */ + + nxmutex_unlock(&gspi->lock); + return dma_info.status; +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: rp23xx_cyw_setup + * + * Description: + * Initialize the cyw43439 private data and PIO communication. + * + ****************************************************************************/ + +gspi_dev_t *rp23xx_cyw_setup(uint8_t gpio_on, + uint8_t gpio_select, + uint8_t gpio_data, + uint8_t gpio_clock, + uint8_t gpio_intr) +{ + gspi_dev_t *gspi; + rp23xx_gspi_t *rp_io; + int err; + + wlinfo("entered.\n"); + + gspi = kmm_zalloc(sizeof(gspi_dev_t)); + + if (gspi == NULL) + { + set_errno(ENOMEM); + return NULL; + } + + rp_io = kmm_zalloc(sizeof(rp23xx_gspi_t)); + + if (rp_io == NULL) + { + kmm_free(gspi); + set_errno(ENOMEM); + return NULL; + } + + gspi->init = my_init; + gspi->deinit = my_deinit; + gspi->set_isr = my_set_isr; + gspi->interrupt_enable = my_interrupt_enable; + gspi->write = my_write; + gspi->read = my_read; + gspi->io_dev = rp_io; + + rp_io->gpio_on = gpio_on; + rp_io->gpio_select = gpio_select; + rp_io->gpio_data = gpio_data; + rp_io->gpio_clock = gpio_clock; + rp_io->gpio_intr = gpio_intr; + + nxmutex_init(&gspi->lock); + + /* Initialize the cyw43439 power-on and chip select lines. */ + + rp23xx_gpio_init(gpio_on); + rp23xx_gpio_setdir(gpio_on, true); + rp23xx_gpio_put(gpio_on, false); /* set low to turn wifi chip off */ + + rp23xx_gpio_init(gpio_select); + rp23xx_gpio_setdir(gpio_select, true); + rp23xx_gpio_put(gpio_select, true); /* set high to deselect chip */ + + err = bcmf_gspi_initialize(gspi); + + if (err != OK) + { + kmm_free(gspi); + kmm_free(rp_io); + + set_errno(err); + return NULL; + } + + wlinfo("setup complete. gspi = 0x%p\n", gspi); + + return gspi; +} + +/**************************************************************************** + * Name: rp23xx_cyw_remove + * + * Description: + * Deinitialize the cyw43439 PIO communication. + * + ****************************************************************************/ + +void rp23xx_cyw_remove(gspi_dev_t *gspi) +{ + /* gspi_deregister((gspi_dev_t *)gspi); */ +} + +/**************************************************************************** + * Name: bcmf_board_etheraddr + ****************************************************************************/ + +bool bcmf_board_etheraddr(struct ether_addr *ethaddr) +{ + return false; +} diff --git a/arch/arm/src/rp23xx/rp23xx_cyw43439.h b/arch/arm/src/rp23xx/rp23xx_cyw43439.h new file mode 100644 index 0000000000000..76cda33e32937 --- /dev/null +++ b/arch/arm/src/rp23xx/rp23xx_cyw43439.h @@ -0,0 +1,117 @@ +/**************************************************************************** + * arch/arm/src/rp23xx/rp23xx_cyw43439.h + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __ARCH_ARM_SRC_RP23XX_RP23XX_CYW43439_H +#define __ARCH_ARM_SRC_RP23XX_RP23XX_CYW43439_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +#include + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +typedef struct rp23xx_gspi_s +{ + uint32_t pio; /* The pio instance we are using. */ + uint32_t pio_sm; /* The state machine we are using. */ + uint32_t pio_location; /* the program location in the pio. */ + uint8_t gpio_on; /* Set high to power chip on */ + uint8_t gpio_select; /* Pull low to select chip */ + uint8_t gpio_data; /* Data line -- idle high */ + uint8_t gpio_clock; /* Clock line -- idle low */ + uint8_t gpio_intr; /* May be shared with data */ +} rp23xx_gspi_t; + +typedef struct cyw_pio_program_s +{ + const uint16_t *instructions; + uint8_t length; + int8_t origin; /* required instruction memory origin or -1 */ +} cyw_pio_program_t; + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: rp23xx_cyw_setup + * + * Description: + * Initialize the cyw43439 device. + * + * Returns: + * A pointer to the cyw43439 device + * + ****************************************************************************/ + +gspi_dev_t *rp23xx_cyw_setup(uint8_t gpio_on, + uint8_t gpio_select, + uint8_t gpio_data, + uint8_t gpio_clock, + uint8_t gpio_intr); + +/**************************************************************************** + * Name: rp23xx_cyw_remove + * + * Description: + * Deinitialize the cyw43439 device. + * + * Parameters: + * A pointer (as returned by rp23xx_cyw_setup) to the device to remove. + * + ****************************************************************************/ + +void rp23xx_cyw_remove(gspi_dev_t *dev); + +#undef EXTERN +#if defined(__cplusplus) +} +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* __ARCH_ARM_SRC_RP23XX_RP23XX_CYW43439_H */ diff --git a/arch/arm/src/sam34/sam_gpioirq.c b/arch/arm/src/sam34/sam_gpioirq.c index b5e303af093df..42ee4c2c85e03 100644 --- a/arch/arm/src/sam34/sam_gpioirq.c +++ b/arch/arm/src/sam34/sam_gpioirq.c @@ -82,7 +82,7 @@ static inline uint32_t sam_gpiobase(gpio_pinset_t pinset) { int port = (pinset & GPIO_PORT_MASK) >> GPIO_PORT_SHIFT; - return SAM_PION_BASE(port >> GPIO_PORT_SHIFT); + return SAM_PION_BASE(port); } /**************************************************************************** diff --git a/arch/arm/src/samv7/sam_gpioirq.c b/arch/arm/src/samv7/sam_gpioirq.c index efbda6ab6bf9b..1cfd11ed6305a 100644 --- a/arch/arm/src/samv7/sam_gpioirq.c +++ b/arch/arm/src/samv7/sam_gpioirq.c @@ -71,7 +71,7 @@ static inline uint32_t sam_gpiobase(gpio_pinset_t pinset) { int port = (pinset & GPIO_PORT_MASK) >> GPIO_PORT_SHIFT; - return SAM_PION_BASE(port >> GPIO_PORT_SHIFT); + return SAM_PION_BASE(port); } /**************************************************************************** diff --git a/arch/arm/src/stm32h5/stm32_adc.c b/arch/arm/src/stm32h5/stm32_adc.c index b44d778a4749e..d0b69e53beb7e 100644 --- a/arch/arm/src/stm32h5/stm32_adc.c +++ b/arch/arm/src/stm32h5/stm32_adc.c @@ -1069,7 +1069,10 @@ static void adc_oversample(struct adc_dev_s *dev) (priv->ovsr << ADC_CFGR2_OVSR_SHIFT) | (priv->ovss << ADC_CFGR2_OVSS_SHIFT); - setbits |= priv->trovs; + if (priv->trovs) + { + setbits |= ADC_CFGR2_TROVS; + } adc_modifyreg(priv, STM32_ADC_CFGR2_OFFSET, clrbits, setbits); } @@ -1811,7 +1814,8 @@ static int adc_ioctl(struct adc_dev_s *dev, int cmd, unsigned long arg) /* Set the watchdog threshold register */ - regval = ((arg << ADC_TR1_HT1_SHIFT) & ADC_TR1_HT1_MASK); + regval &= ~ADC_TR1_HT1_MASK; + regval |= ((arg << ADC_TR1_HT1_SHIFT) & ADC_TR1_HT1_MASK); adc_putreg(priv, STM32_ADC_TR1_OFFSET, regval); /* Ensure analog watchdog is enabled */ @@ -1845,7 +1849,8 @@ static int adc_ioctl(struct adc_dev_s *dev, int cmd, unsigned long arg) /* Set the watchdog threshold register */ - regval = ((arg << ADC_TR1_LT1_SHIFT) & ADC_TR1_LT1_MASK); + regval &= ~ADC_TR1_LT1_MASK; + regval |= ((arg << ADC_TR1_LT1_SHIFT) & ADC_TR1_LT1_MASK); adc_putreg(priv, STM32_ADC_TR1_OFFSET, regval); /* Ensure analog watchdog is enabled */ diff --git a/arch/arm64/include/bcm2711/chip.h b/arch/arm64/include/bcm2711/chip.h index 6b2eafe486d19..5aa9117bf6073 100644 --- a/arch/arm64/include/bcm2711/chip.h +++ b/arch/arm64/include/bcm2711/chip.h @@ -75,6 +75,8 @@ #if defined(CONFIG_RPI4B_RAM_4GB) || defined(CONFIG_RPI4B_RAM_8GB) #define CONFIG_RAMBANK1_SIZE GB(4) - MB(64) +#elif defined(CONFIG_RPI4B_RAM_2GB) +#define CONFIG_RAMBANK1_SIZE GB(2) - MB(64) #endif /* defined(CONFIG_RPI4B_RAM_4GB) || defined(CONFIG_RPI4B_RAM_8GB) */ /* The 8GB version begins to use a second RAM bank. diff --git a/arch/arm64/src/bcm2711/bcm2711_gpio.c b/arch/arm64/src/bcm2711/bcm2711_gpio.c index a53a03b902e27..94a4a95f1805f 100644 --- a/arch/arm64/src/bcm2711/bcm2711_gpio.c +++ b/arch/arm64/src/bcm2711/bcm2711_gpio.c @@ -380,22 +380,22 @@ void bcm2711_gpio_set_func(uint32_t gpio, enum bcm2711_gpio_func_e func) value = (g_fsel_map[func] << ((gpio - 10) * 3)); modreg32(value, value, BCM_GPIO_GPFSEL1); } - else if (gpio <= 29 && gpio > 20) + else if (gpio <= 29 && gpio > 19) { value = (g_fsel_map[func] << ((gpio - 20) * 3)); modreg32(value, value, BCM_GPIO_GPFSEL2); } - else if (gpio <= 39 && gpio > 30) + else if (gpio <= 39 && gpio > 29) { value = (g_fsel_map[func] << ((gpio - 30) * 3)); modreg32(value, value, BCM_GPIO_GPFSEL3); } - else if (gpio <= 49 && gpio > 40) + else if (gpio <= 49 && gpio > 39) { value = (g_fsel_map[func] << ((gpio - 40) * 3)); modreg32(value, value, BCM_GPIO_GPFSEL4); } - else if (gpio <= 57 && gpio > 50) + else if (gpio <= 57 && gpio > 49) { value = (g_fsel_map[func] << ((gpio - 50) * 3)); modreg32(value, value, BCM_GPIO_GPFSEL5); @@ -418,15 +418,8 @@ void bcm2711_gpio_set_func(uint32_t gpio, enum bcm2711_gpio_func_e func) void bcm2711_gpio_pin_set(uint32_t gpio, bool set) { DEBUGASSERT(gpio < BCM_GPIO_NUM); - - if (set) - { - bcm2711_gpio_help_set(gpio, BCM_GPIO_GPSET0, BCM_GPIO_GPSET0, true); - } - else - { - bcm2711_gpio_help_set(gpio, BCM_GPIO_GPCLR0, BCM_GPIO_GPCLR0, true); - } + bcm2711_gpio_help_set(gpio, BCM_GPIO_GPSET0, BCM_GPIO_GPSET1, set); + bcm2711_gpio_help_set(gpio, BCM_GPIO_GPCLR0, BCM_GPIO_GPCLR1, !set); } /**************************************************************************** diff --git a/arch/arm64/src/common/arm64_fatal.c b/arch/arm64/src/common/arm64_fatal.c index e9c23e2dee619..5f39e23ed4462 100644 --- a/arch/arm64/src/common/arm64_fatal.c +++ b/arch/arm64/src/common/arm64_fatal.c @@ -477,6 +477,112 @@ static int arm64_el1_exception_handler(uint64_t esr, return ret; } +static void arm64_get_exception_info(uint64_t el, uint64_t *esr, + uint64_t *far, uint64_t *elr, + const char **el_str) +{ + switch (el) + { + case MODE_EL1: + { + if (el_str != NULL) + { + *el_str = "MODE_EL1"; + } + + if (esr != NULL) + { + *esr = read_sysreg(esr_el1); + } + + if (far != NULL) + { + *far = read_sysreg(far_el1); + } + + if (elr != NULL) + { + *elr = read_sysreg(elr_el1); + } + break; + } + + case MODE_EL2: + { + if (el_str != NULL) + { + *el_str = "MODE_EL2"; + } + + if (esr != NULL) + { + *esr = read_sysreg(esr_el2); + } + + if (far != NULL) + { + *far = read_sysreg(far_el2); + } + + if (elr != NULL) + { + *elr = read_sysreg(elr_el2); + } + break; + } + +#ifdef CONFIG_ARCH_HAVE_EL3 + case MODE_EL3: + { + if (el_str != NULL) + { + *el_str = "MODE_EL3"; + } + + if (esr != NULL) + { + *esr = read_sysreg(esr_el3); + } + + if (far != NULL) + { + *far = read_sysreg(far_el3); + } + + if (elr != NULL) + { + *elr = read_sysreg(elr_el3); + } + break; + } +#endif + + default: + { + if (el_str != NULL) + { + *el_str = "Unknown"; + } + + if (esr != NULL) + { + *esr = 0; + } + + if (far != NULL) + { + *far = 0; + } + + if (elr != NULL) + { + *elr = 0; + } + break; + } + } +} + static int arm64_exception_handler(uint64_t *regs) { uint64_t el; @@ -487,50 +593,13 @@ static int arm64_exception_handler(uint64_t *regs) int ret = -EINVAL; el = arm64_current_el(); + arm64_get_exception_info(el, &esr, &far, &elr, &el_str); - switch (el) - { - case MODE_EL1: - { - el_str = "MODE_EL1"; - esr = read_sysreg(esr_el1); - far = read_sysreg(far_el1); - elr = read_sysreg(elr_el1); - ret = arm64_el1_exception_handler(esr, regs); - break; - } - - case MODE_EL2: + if (el == MODE_EL1) { - el_str = "MODE_EL2"; - esr = read_sysreg(esr_el2); - far = read_sysreg(far_el2); - elr = read_sysreg(elr_el2); - break; + ret = arm64_el1_exception_handler(esr, regs); } -#ifdef CONFIG_ARCH_HAVE_EL3 - case MODE_EL3: - { - el_str = "MODE_EL3"; - esr = read_sysreg(esr_el3); - far = read_sysreg(far_el3); - elr = read_sysreg(elr_el3); - break; - } - -#endif - default: - { - el_str = "Unknown"; - - /* Just to keep the compiler happy */ - - esr = elr = far = 0; - break; - } - } - if (ret != 0) { serr("CurrentEL: %s\n", el_str); @@ -567,9 +636,47 @@ uint64_t *arm64_fatal_handler(uint64_t *regs) if (ret != 0) { - /* The fatal is not handled, print error and hung */ + if (((tcb->flags & TCB_FLAG_TTYPE_MASK) != TCB_FLAG_TTYPE_KERNEL) && + ((tcb->flags & TCB_FLAG_SYSCALL) == 0) && + ((regs[REG_SPSR] & SPSR_MODE_MASK) == SPSR_MODE_EL0T)) + { + uint64_t esr; + const char *reason; + const char *desc; + + arm64_get_exception_info(arm64_current_el(), &esr, NULL, + NULL, NULL); + + reason = esr_get_class_string(esr); + if (reason == NULL) + { + reason = "Unknown/Uncategorized"; + } + + desc = esr_get_desc_string(esr); + if (desc == NULL) + { + desc = ""; + } + + _alert("PANIC: Unhandled user exception in PID %d: %s\n", + tcb->pid, get_task_name(tcb)); + _alert("Reason: %s - %s\n", reason, desc); + up_dump_register(regs); + + tcb->flags |= TCB_FLAG_FORCED_CANCEL; + + regs[REG_ELR] = (uint64_t) _exit; + regs[REG_X0] = SIGSEGV; + regs[REG_SPSR] &= ~SPSR_MODE_MASK; + regs[REG_SPSR] |= SPSR_MODE_EL1H; + } + else + { + /* The fatal is not handled, print error and hung */ - PANIC_WITH_REGS("panic", regs); + PANIC_WITH_REGS("panic", regs); + } } /* Clear irq flag */ diff --git a/boards/Kconfig b/boards/Kconfig index 0e96b908b667f..245d8e0595efc 100644 --- a/boards/Kconfig +++ b/boards/Kconfig @@ -2137,6 +2137,15 @@ config ARCH_BOARD_RASPBERRYPI_PICO_2 ---help--- This is a port to the Raspberry Pi Pico 2 board. +config ARCH_BOARD_RASPBERRYPI_PICO_2_W + bool "Raspberry Pi Pico 2 W board" + depends on ARCH_CHIP_RP23XX + select ARCH_HAVE_LEDS + ---help--- + This is a port to the Raspberry Pi Pico 2 W board. It adds support + for the onboard Infineon CYW43439 Wi-Fi device, driven over a + PIO-based gSPI bus (see arch/arm/src/rp23xx/rp23xx_cyw43439.c). + config ARCH_BOARD_RASPBERRYPI_PICO_2_RV bool "Raspberry Pi Pico 2 board RISC-V (not Pico, not W)" depends on ARCH_CHIP_RP23XX_RV @@ -3754,6 +3763,7 @@ config ARCH_BOARD default "adafruit-qt-py-rp2040" if ARCH_BOARD_ADAFRUIT_QT_PY_RP2040 default "waveshare-rp2040-lcd-1.28" if ARCH_BOARD_WAVESHARE_RP2040_LCD_1_28 default "raspberrypi-pico-2" if ARCH_BOARD_RASPBERRYPI_PICO_2 + default "raspberrypi-pico-2-w" if ARCH_BOARD_RASPBERRYPI_PICO_2_W default "raspberrypi-pico-2-rv" if ARCH_BOARD_RASPBERRYPI_PICO_2_RV default "xiao-rp2350" if ARCH_BOARD_XIAO_RP2350 default "pimoroni-pico-2-plus" if ARCH_BOARD_PIMORONI_PICO_2_PLUS @@ -4258,6 +4268,9 @@ endif if ARCH_BOARD_RASPBERRYPI_PICO_2 source "boards/arm/rp23xx/raspberrypi-pico-2/Kconfig" endif +if ARCH_BOARD_RASPBERRYPI_PICO_2_W +source "boards/arm/rp23xx/raspberrypi-pico-2-w/Kconfig" +endif if ARCH_BOARD_XIAO_RP2350 source "boards/arm/rp23xx/xiao-rp2350/Kconfig" endif diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/CMakeLists.txt b/boards/arm/rp23xx/raspberrypi-pico-2-w/CMakeLists.txt new file mode 100644 index 0000000000000..2fcb33e653ed9 --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/CMakeLists.txt @@ -0,0 +1,40 @@ +# ############################################################################## +# boards/arm/rp23xx/raspberrypi-pico-2-w/CMakeLists.txt +# +# SPDX-License-Identifier: Apache-2.0 +# +# Licensed to the Apache Software Foundation (ASF) under one or more contributor +# license agreements. See the NOTICE file distributed with this work for +# additional information regarding copyright ownership. The ASF licenses this +# file to you under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# ############################################################################## + +add_subdirectory(src) + +add_custom_target( + nuttx_post_build + DEPENDS nuttx + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMENT "Regenerate nuttx.uf2") + +# The uf2 command to convert ELF/BIN to UF2 +add_custom_command( + TARGET nuttx_post_build + POST_BUILD + COMMAND picotool ARGS uf2 convert --quiet -t elf nuttx nuttx.uf2 + COMMAND_EXPAND_LISTS + COMMAND ${CMAKE_COMMAND} -E echo "nuttx.uf2" >> + ${CMAKE_BINARY_DIR}/nuttx.manifest + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} + COMMENT "Regenerate nuttx.uf2") diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/Kconfig b/boards/arm/rp23xx/raspberrypi-pico-2-w/Kconfig new file mode 100644 index 0000000000000..5eeb2e8df5150 --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/Kconfig @@ -0,0 +1,42 @@ +# +# For a description of the syntax of this configuration file, +# see the file kconfig-language.txt in the NuttX tools repository. +# + +if ARCH_BOARD_RASPBERRYPI_PICO_2_W + +menuconfig RP23XX_INFINEON_CYW43439 + bool "Has Infineon cyw43439 WiFi chip" + depends on IEEE80211_INFINEON_CYW43439 + default y + ---help--- + The Raspberry Pi Pico 2 W has an onboard Infineon CYW43439 WiFi chip + connected to the RP2350 via a PIO-based gSPI interface. + +endif + +if RP23XX_INFINEON_CYW43439 + +config CYW43439_FIRMWARE_BIN_PATH + string "Path to Infineon 43439 firmware file" + default "${PICO_SDK_PATH}/lib/cyw43-driver/firmware/43439A0-7.95.49.00.combined" + ---help--- + This should be a path to a file containing both the cyw43439 firmware and + the CLB blob. The firmware should be padded to a 256 byte boundary and + then the CLM blob should be appended. + + If this file is updated, check the CYW43439_FIRMWARE_LEN below to make sure + it reflects the un-padded length of the firmware part. + +config CYW43439_FIRMWARE_LEN + int "Infineon 43439 firmware length (bytes)" + default 224190 + ---help--- + This is the length of just the base firmware in the firmware file specified + by the "Path to Infineon 43439 firmware file" configuration option. + + This length does not include the length of any padding nor the length of + the appended clm_blob. If a clm_blob is present in the firmware file, this + length will be less than the length of the whole file. + +endif diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/configs/telnet/defconfig b/boards/arm/rp23xx/raspberrypi-pico-2-w/configs/telnet/defconfig new file mode 100644 index 0000000000000..8575fff632d33 --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/configs/telnet/defconfig @@ -0,0 +1,92 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +# CONFIG_LIBC_LONG_LONG is not set +# CONFIG_NSH_ARGCAT is not set +# CONFIG_NSH_CMDOPT_HEXDUMP is not set +# CONFIG_NSH_DISABLE_DATE is not set +# CONFIG_NSH_DISABLE_LOSMART is not set +# CONFIG_STANDARD_SERIAL is not set +CONFIG_ALLOW_BSD_COMPONENTS=y +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD="raspberrypi-pico-2-w" +CONFIG_ARCH_BOARD_COMMON=y +CONFIG_ARCH_BOARD_RASPBERRYPI_PICO_2_W=y +CONFIG_ARCH_CHIP="rp23xx" +CONFIG_ARCH_CHIP_RP23XX=y +CONFIG_ARCH_INTERRUPTSTACK=2048 +CONFIG_ARCH_RAMVECTORS=y +CONFIG_ARCH_STACKDUMP=y +CONFIG_BOARDCTL_RESET=y +CONFIG_BOARD_LOOPSPERMSEC=10450 +CONFIG_BUILTIN=y +CONFIG_DEBUG_FULLOPT=y +CONFIG_DEBUG_SYMBOLS=y +CONFIG_DISABLE_POSIX_TIMERS=y +CONFIG_DRIVERS_IEEE80211=y +CONFIG_DRIVERS_WIRELESS=y +CONFIG_EXAMPLES_HELLO=y +CONFIG_FS_PROCFS=y +CONFIG_FS_PROCFS_REGISTER=y +CONFIG_IEEE80211_BROADCOM_DEFAULT_COUNTRY="XX" +CONFIG_IEEE80211_BROADCOM_DMABUF_ALIGNMENT=16 +CONFIG_IEEE80211_BROADCOM_FRAME_POOL_SIZE=32 +CONFIG_IEEE80211_BROADCOM_FULLMAC_GSPI=y +CONFIG_IEEE80211_INFINEON_CYW43439=y +CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_IOB_NBUFFERS=196 +CONFIG_IOB_NCHAINS=24 +CONFIG_LIBC_FLOATINGPOINT=y +CONFIG_NDEBUG=y +CONFIG_NET=y +CONFIG_NETDB_DNSCLIENT=y +CONFIG_NETDB_DNSCLIENT_RECV_TIMEOUT=3 +CONFIG_NETDEV_LATEINIT=y +CONFIG_NETDEV_WIRELESS_IOCTL=y +CONFIG_NETINIT_DHCPC=y +CONFIG_NETINIT_DNS=y +CONFIG_NETINIT_DNSIPADDR=0x08080808 +CONFIG_NETINIT_WAPI_PASSPHRASE="-ssid-passphrase-" +CONFIG_NETINIT_WAPI_SSID="-my-ssid-" +CONFIG_NETUTILS_TELNETD=y +CONFIG_NET_BROADCAST=y +CONFIG_NET_ICMP_SOCKET=y +CONFIG_NET_LOOPBACK=y +CONFIG_NET_LOOPBACK_PKTSIZE=1024 +CONFIG_NET_TCP=y +CONFIG_NET_TCP_DELAYED_ACK=y +CONFIG_NET_UDP=y +CONFIG_NSH_ARCHINIT=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_READLINE=y +CONFIG_RAM_SIZE=532480 +CONFIG_RAM_START=0x20000000 +CONFIG_READLINE_CMD_HISTORY=y +CONFIG_RP23XX_INFINEON_CYW43439=y +CONFIG_RR_INTERVAL=200 +CONFIG_SCHED_HPWORK=y +CONFIG_SCHED_LPWORK=y +CONFIG_SCHED_WAITPID=y +CONFIG_START_DAY=9 +CONFIG_START_MONTH=2 +CONFIG_START_YEAR=2021 +CONFIG_SYSLOG_BUFFER=y +CONFIG_SYSLOG_INTBUFFER=y +CONFIG_SYSLOG_INTBUFSIZE=2048 +CONFIG_SYSLOG_PROCESSID=y +CONFIG_SYSTEM_DHCPC_RENEW=y +CONFIG_SYSTEM_NSH=y +CONFIG_SYSTEM_PING=y +CONFIG_SYSTEM_TELNET_CLIENT=y +CONFIG_TESTING_GETPRIME=y +CONFIG_TESTING_OSTEST=y +CONFIG_TTY_SIGINT=y +CONFIG_TTY_SIGTSTP=y +CONFIG_UART0_SERIAL_CONSOLE=y +CONFIG_WIRELESS_WAPI=y +CONFIG_WIRELESS_WAPI_CMDTOOL=y +CONFIG_WQUEUE_NOTIFIER=y diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/include/board.h b/boards/arm/rp23xx/raspberrypi-pico-2-w/include/board.h new file mode 100644 index 0000000000000..37c8afc1d392c --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/include/board.h @@ -0,0 +1,169 @@ +/**************************************************************************** + * boards/arm/rp23xx/raspberrypi-pico-2-w/include/board.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __BOARDS_ARM_RP23XX_RASPBERRYPI_PICO_2_INCLUDE_BOARD_H +#define __BOARDS_ARM_RP23XX_RASPBERRYPI_PICO_2_INCLUDE_BOARD_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include "rp23xx_i2cdev.h" +#include "rp23xx_spidev.h" +#include "rp23xx_i2sdev.h" +#include "rp23xx_spisd.h" + +#ifndef __ASSEMBLY__ +# include +#endif + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* Clocking *****************************************************************/ + +#define MHZ 1000000 + +#define BOARD_XOSC_FREQ (12 * MHZ) +#define BOARD_XOSC_STARTUPDELAY 1 +#define BOARD_PLL_SYS_FREQ (150 * MHZ) +#define BOARD_PLL_USB_FREQ (48 * MHZ) + +#define BOARD_REF_FREQ (12 * MHZ) +#define BOARD_SYS_FREQ (150 * MHZ) +#define BOARD_PERI_FREQ (150 * MHZ) +#define BOARD_USB_FREQ (48 * MHZ) +#define BOARD_ADC_FREQ (48 * MHZ) +#define BOARD_HSTX_FREQ (150 * MHZ) + +#define BOARD_UART_BASEFREQ BOARD_PERI_FREQ + +#define BOARD_TICK_CLOCK (1 * MHZ) + +/* definitions for pico-sdk */ + +/* GPIO definitions *********************************************************/ + +#define BOARD_GPIO_LED_PIN 25 +#define BOARD_NGPIOOUT 1 +#define BOARD_NGPIOIN 1 +#define BOARD_NGPIOINT 1 + +/* LED definitions **********************************************************/ + +/* If CONFIG_ARCH_LEDS is not defined, then the user can control the LEDs + * in any way. The following definitions are used to access individual LEDs. + */ + +/* LED index values for use with board_userled() */ + +#define BOARD_LED1 0 +#define BOARD_NLEDS 1 + +#define BOARD_LED_GREEN BOARD_LED1 + +/* LED bits for use with board_userled_all() */ + +#define BOARD_LED1_BIT (1 << BOARD_LED1) + +/* This LED is not used by the board port unless CONFIG_ARCH_LEDS is + * defined. In that case, the usage by the board port is defined in + * include/board.h and src/rp23xx_autoleds.c. The LED is used to encode + * OS-related events as follows: + * + * -------------------- ----------------------------- ------ + * SYMBOL Meaning LED + * -------------------- ----------------------------- ------ + */ + +#define LED_STARTED 0 /* NuttX has been started OFF */ +#define LED_HEAPALLOCATE 0 /* Heap has been allocated OFF */ +#define LED_IRQSENABLED 0 /* Interrupts enabled OFF */ +#define LED_STACKCREATED 1 /* Idle stack created ON */ +#define LED_INIRQ 2 /* In an interrupt N/C */ +#define LED_SIGNAL 2 /* In a signal handler N/C */ +#define LED_ASSERTION 2 /* An assertion failed N/C */ +#define LED_PANIC 3 /* The system has crashed FLASH */ +#undef LED_IDLE /* Not used */ + +/* Thus if the LED is statically on, NuttX has successfully booted and is, + * apparently, running normally. If the LED is flashing at approximately + * 2Hz, then a fatal error has been detected and the system has halted. + */ + +/* BUTTON definitions *******************************************************/ + +#define NUM_BUTTONS 0 + +#define BUTTON_USER1 0 +#define BUTTON_USER2 1 +#define BUTTON_USER1_BIT (1 << BUTTON_USER1) +#define BUTTON_USER2_BIT (1 << BUTTON_USER2) + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: rp23xx_boardearlyinitialize + * + * Description: + * + ****************************************************************************/ + +void rp23xx_boardearlyinitialize(void); + +/**************************************************************************** + * Name: rp23xx_boardinitialize + * + * Description: + * + ****************************************************************************/ + +void rp23xx_boardinitialize(void); + +#undef EXTERN +#if defined(__cplusplus) +} +#endif +#endif /* __ASSEMBLY__ */ +#endif /* __BOARDS_ARM_RP23XX_RASPBERRYPI_PICO_2_INCLUDE_BOARD_H */ diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/include/rp23xx_i2cdev.h b/boards/arm/rp23xx/raspberrypi-pico-2-w/include/rp23xx_i2cdev.h new file mode 100644 index 0000000000000..bf8a179935228 --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/include/rp23xx_i2cdev.h @@ -0,0 +1,72 @@ +/**************************************************************************** + * boards/arm/rp23xx/raspberrypi-pico-2-w/include/rp23xx_i2cdev.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __BOARDS_ARM_RP23XX_RASPBERRYPI_PICO_2_INCLUDE_RP23XX_I2CDEV_H +#define __BOARDS_ARM_RP23XX_RASPBERRYPI_PICO_2_INCLUDE_RP23XX_I2CDEV_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: board_i2cdev_initialize + * + * Description: + * Initialize i2c driver and register the /dev/i2c device. + * + ****************************************************************************/ + +#ifdef CONFIG_RP23XX_I2C_DRIVER +int board_i2cdev_initialize(int bus); +#endif + +#undef EXTERN +#if defined(__cplusplus) +} +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* __BOARDS_ARM_RP23XX_RASPBERRYPI_PICO_2_INCLUDE_RP23XX_I2CDEV_H */ diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/include/rp23xx_i2sdev.h b/boards/arm/rp23xx/raspberrypi-pico-2-w/include/rp23xx_i2sdev.h new file mode 100644 index 0000000000000..41d68d519c019 --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/include/rp23xx_i2sdev.h @@ -0,0 +1,72 @@ +/**************************************************************************** + * boards/arm/rp23xx/raspberrypi-pico-2-w/include/rp23xx_i2sdev.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __BOARDS_ARM_RP23XX_RASPBERRYPI_PICO_2_INCLUDE_RP23XX_I2SDEV_H +#define __BOARDS_ARM_RP23XX_RASPBERRYPI_PICO_2_INCLUDE_RP23XX_I2SDEV_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: board_i2sdev_initialize + * + * Description: + * Initialize i2s driver and register the /dev/audio/pcm0 device. + * + ****************************************************************************/ + +#ifdef CONFIG_RP23XX_I2S +int board_i2sdev_initialize(int bus); +#endif + +#undef EXTERN +#if defined(__cplusplus) +} +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* __BOARDS_ARM_RP23XX_RASPBERRYPI_PICO_2_INCLUDE_RP23XX_I2SDEV_H */ diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/include/rp23xx_spidev.h b/boards/arm/rp23xx/raspberrypi-pico-2-w/include/rp23xx_spidev.h new file mode 100644 index 0000000000000..df4c73eae1731 --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/include/rp23xx_spidev.h @@ -0,0 +1,69 @@ +/**************************************************************************** + * boards/arm/rp23xx/raspberrypi-pico-2-w/include/rp23xx_spidev.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __BOARDS_ARM_RP23XX_RASPBERRYPI_PICO_2_INCLUDE_RP23XX_SPIDEV_H +#define __BOARDS_ARM_RP23XX_RASPBERRYPI_PICO_2_INCLUDE_RP23XX_SPIDEV_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: board_spidev_initialize + * + * Description: + * Initialize spi driver and register the /dev/spi device. + * + ****************************************************************************/ + +int board_spidev_initialize(int bus); + +#undef EXTERN +#if defined(__cplusplus) +} +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* __BOARDS_ARM_RP23XX_RASPBERRYPI_PICO_2_INCLUDE_RP23XX_SPIDEV_H */ diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/include/rp23xx_spisd.h b/boards/arm/rp23xx/raspberrypi-pico-2-w/include/rp23xx_spisd.h new file mode 100644 index 0000000000000..1f71de10ee91f --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/include/rp23xx_spisd.h @@ -0,0 +1,83 @@ +/**************************************************************************** + * boards/arm/rp23xx/raspberrypi-pico-2-w/include/rp23xx_spisd.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __BOARDS_ARM_RP23XX_RASPBERRYPI_PICO_2_INCLUDE_RP23XX_SPISD_H +#define __BOARDS_ARM_RP23XX_RASPBERRYPI_PICO_2_INCLUDE_RP23XX_SPISD_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/**************************************************************************** + * Public Types + ****************************************************************************/ + +#ifndef __ASSEMBLY__ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#undef EXTERN +#if defined(__cplusplus) +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: board_spisd_initialize + * + * Description: + * Initialize the SPI-based SD card. + * + ****************************************************************************/ + +#ifdef CONFIG_RP23XX_SPISD +int board_spisd_initialize(int minor, int bus); +#endif + +/**************************************************************************** + * Name: board_spisd_status + * + * Description: + * Get the status whether SD Card is present or not. + * + ****************************************************************************/ + +#ifdef CONFIG_RP23XX_SPISD +uint8_t board_spisd_status(struct spi_dev_s *dev, uint32_t devid); +#endif + +#undef EXTERN +#if defined(__cplusplus) +} +#endif + +#endif /* __ASSEMBLY__ */ +#endif /* __BOARDS_ARM_RP23XX_RASPBERRYPI_PICO_2_INCLUDE_RP23XX_SPISD_H */ diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/scripts/Make.defs b/boards/arm/rp23xx/raspberrypi-pico-2-w/scripts/Make.defs new file mode 100644 index 0000000000000..cf214e955c780 --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/scripts/Make.defs @@ -0,0 +1,47 @@ +############################################################################ +# boards/arm/rp23xx/raspberrypi-pico-2-w/scripts/Make.defs +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +include $(TOPDIR)/.config +include $(TOPDIR)/tools/Config.mk +include $(TOPDIR)/tools/rp23xx/Config.mk +include $(TOPDIR)/arch/arm/src/armv8-m/Toolchain.defs + +ifeq ($(CONFIG_BOOT_RUNFROMFLASH),y) + LDSCRIPT = memmap_default.ld +else ifeq ($(CONFIG_BOOT_COPYTORAM),y) + LDSCRIPT = memmap_copy_to_ram.ld +else + LDSCRIPT = memmap_no_flash.ld +endif + +ARCHSCRIPT += $(BOARD_DIR)$(DELIM)scripts$(DELIM)$(LDSCRIPT) + +ARCHPICFLAGS = -fpic -msingle-pic-base -mpic-register=r10 + +CFLAGS := $(ARCHCFLAGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe +CPICFLAGS = $(ARCHPICFLAGS) $(CFLAGS) +CXXFLAGS := $(ARCHCXXFLAGS) $(ARCHOPTIMIZATION) $(ARCHCPUFLAGS) $(ARCHXXINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) -pipe +CXXPICFLAGS = $(ARCHPICFLAGS) $(CXXFLAGS) +CPPFLAGS := $(ARCHINCLUDES) $(ARCHDEFINES) $(EXTRAFLAGS) +AFLAGS := $(CFLAGS) -D__ASSEMBLY__ + +NXFLATLDFLAGS1 = -r -d -warn-common +NXFLATLDFLAGS2 = $(NXFLATLDFLAGS1) -T$(TOPDIR)/binfmt/libnxflat/gnu-nxflat-pcrel.ld -no-check-sections +LDNXFLATFLAGS = -e main -s 2048 diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/scripts/memmap_copy_to_ram.ld b/boards/arm/rp23xx/raspberrypi-pico-2-w/scripts/memmap_copy_to_ram.ld new file mode 100644 index 0000000000000..db52cb5543507 --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/scripts/memmap_copy_to_ram.ld @@ -0,0 +1,331 @@ +/**************************************************************************** + * boards/arm/rp23xx/raspberrypi-pico-2-w/scripts/memmap_copy_to_ram.ld + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/* Based on GCC ARM embedded samples. + Defines the following symbols for use by code: + __exidx_start + __exidx_end + __etext + __data_start__ + __preinit_array_start + __preinit_array_end + __init_array_start + __init_array_end + __fini_array_start + __fini_array_end + __data_end__ + __bss_start__ + __bss_end__ + __end__ + end + __HeapLimit + __StackLimit + __StackTop + __stack (== StackTop) +*/ + +MEMORY +{ + FLASH(rx) : ORIGIN = 0x10000000, LENGTH = 4096k + RAM(rwx) : ORIGIN = 0x20000000, LENGTH = 512k + SCRATCH_X(rwx) : ORIGIN = 0x20080000, LENGTH = 4k + SCRATCH_Y(rwx) : ORIGIN = 0x20081000, LENGTH = 4k +} + +ENTRY(_entry_point) + +SECTIONS +{ + /* Second stage bootloader is prepended to the image. It must be 256 bytes big + and checksummed. It is usually built by the boot_stage2 target + in the Raspberry Pi Pico SDK + */ + + .flash_begin : { + __flash_binary_start = .; + } > FLASH + + /* The bootrom will enter the image at the point indicated in your + IMAGE_DEF, which is usually the reset handler of your vector table. + + The debugger will use the ELF entry point, which is the _entry_point + symbol, and in our case is *different from the bootrom's entry point.* + This is used to go back through the bootrom on debugger launches only, + to perform the same initial flash setup that would be performed on a + cold boot. + */ + + .flashtext : { + __logical_binary_start = .; + KEEP (*(.vectors)) + KEEP (*(.binary_info_header)) + __binary_info_header_end = .; + KEEP (*(.embedded_block)) + __embedded_block_end = .; + KEEP (*(.reset)) + . = ALIGN(4); + } > FLASH + + /* Note the boot2 section is optional, and should be discarded if there is + no reference to it *inside* the binary, as it is not called by the + bootrom. (The bootrom performs a simple best-effort XIP setup and + leaves it to the binary to do anything more sophisticated.) However + there is still a size limit of 256 bytes, to ensure the boot2 can be + stored in boot RAM. + + Really this is a "XIP setup function" -- the name boot2 is historic and + refers to its dual-purpose on RP2040, where it also handled vectoring + from the bootrom into the user image. + */ + + .boot2 : { + __boot2_start__ = .; + *(.boot2) + __boot2_end__ = .; + } > FLASH + + ASSERT(__boot2_end__ - __boot2_start__ <= 256, + "ERROR: Pico second stage bootloader must be no more than 256 bytes in size") + + .rodata : { + /* segments not marked as .flashdata are instead pulled into .data (in RAM) to avoid accidental flash accesses */ + *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.flashdata*))) + . = ALIGN(4); + } > FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + /* Machine inspectable binary information */ + . = ALIGN(4); + __binary_info_start = .; + .binary_info : + { + KEEP(*(.binary_info.keep.*)) + *(.binary_info.*) + } > FLASH + __binary_info_end = .; + . = ALIGN(4); + + /* Vector table goes first in RAM, to avoid large alignment hole */ + .ram_vector_table (NOLOAD): { + *(.ram_vector_table) + } > RAM + + .uninitialized_data (NOLOAD): { + . = ALIGN(4); + *(.uninitialized_data*) + } > RAM + + .text : { + __ram_text_start__ = .; + *(.init) + *(.text*) + *(.fini) + /* Pull all c'tors into .text */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + /* Followed by destructors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.eh_frame*) + . = ALIGN(4); + __ram_text_end__ = .; + } > RAM AT> FLASH + __ram_text_source__ = LOADADDR(.text); + . = ALIGN(4); + + .data : { + __data_start__ = .; + *(vtable) + + *(.time_critical*) + + . = ALIGN(4); + *(.rodata*) + *(.srodata*) + . = ALIGN(4); + + *(.data*) + *(.sdata*) + + . = ALIGN(4); + *(.after_data.*) + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__mutex_array_start = .); + KEEP(*(SORT(.mutex_array.*))) + KEEP(*(.mutex_array)) + PROVIDE_HIDDEN (__mutex_array_end = .); + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(SORT(.preinit_array.*))) + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + *(SORT(.fini_array.*)) + *(.fini_array) + PROVIDE_HIDDEN (__fini_array_end = .); + + *(.jcr) + . = ALIGN(4); + } > RAM AT> FLASH + + .tdata : { + . = ALIGN(4); + *(.tdata .tdata.* .gnu.linkonce.td.*) + /* All data end */ + __tdata_end = .; + } > RAM AT> FLASH + PROVIDE(__data_end__ = .); + + /* __etext is (for backwards compatibility) the name of the .data init source pointer (...) */ + __etext = LOADADDR(.data); + + .tbss (NOLOAD) : { + . = ALIGN(4); + __bss_start__ = .; + __tls_base = .; + *(.tbss .tbss.* .gnu.linkonce.tb.*) + *(.tcommon) + + __tls_end = .; + } > RAM + + .bss : { + . = ALIGN(4); + __tbss_end = .; + + *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.bss*))) + *(COMMON) + PROVIDE(__global_pointer$ = . + 2K); + *(.sbss*) + . = ALIGN(4); + __bss_end__ = .; + } > RAM + + .heap (NOLOAD): + { + __end__ = .; + end = __end__; + KEEP(*(.heap*)) + } > RAM + /* historically on GCC sbrk was growing past __HeapLimit to __StackLimit, however + to be more compatible, we now set __HeapLimit explicitly to where the end of the heap is */ + __HeapLimit = ORIGIN(RAM) + LENGTH(RAM); + + + /* Start and end symbols must be word-aligned */ + .scratch_x : { + __scratch_x_start__ = .; + *(.scratch_x.*) + . = ALIGN(4); + __scratch_x_end__ = .; + } > SCRATCH_X AT > FLASH + __scratch_x_source__ = LOADADDR(.scratch_x); + + .scratch_y : { + __scratch_y_start__ = .; + *(.scratch_y.*) + . = ALIGN(4); + __scratch_y_end__ = .; + } > SCRATCH_Y AT > FLASH + __scratch_y_source__ = LOADADDR(.scratch_y); + + /* .stack*_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later + * + * stack1 section may be empty/missing if platform_launch_core1 is not used */ + + /* by default we put core 0 stack at the end of scratch Y, so that if core 1 + * stack is not used then all of SCRATCH_X is free. + */ + .stack1_dummy (NOLOAD): + { + *(.stack1*) + } > SCRATCH_X + .stack_dummy (NOLOAD): + { + KEEP(*(.stack*)) + } > SCRATCH_Y + + .flash_end : { + KEEP(*(.embedded_end_block*)) + PROVIDE(__flash_binary_end = .); + } > FLASH =0xaa + + /* stack limit is poorly named, but historically is maximum heap ptr */ + __StackLimit = ORIGIN(RAM) + LENGTH(RAM); + __StackOneTop = ORIGIN(SCRATCH_X) + LENGTH(SCRATCH_X); + __StackTop = ORIGIN(SCRATCH_Y) + LENGTH(SCRATCH_Y); + __StackOneBottom = __StackOneTop - SIZEOF(.stack1_dummy); + __StackBottom = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* picolibc and LLVM */ + PROVIDE (__heap_start = __end__); + PROVIDE (__heap_end = __HeapLimit); + PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) ); + PROVIDE( __tls_size_align = (__tls_size + __tls_align - 1) & ~(__tls_align - 1)); + PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) ); + + /* llvm-libc */ + PROVIDE (_end = __end__); + PROVIDE (__llvm_libc_heap_limit = __HeapLimit); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed") + + ASSERT( __binary_info_header_end - __logical_binary_start <= 1024, "Binary info must be in first 1024 bytes of the binary") + ASSERT( __embedded_block_end - __logical_binary_start <= 4096, "Embedded block must be in first 4096 bytes of the binary") + + /* todo assert on extra code */ +} diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/scripts/memmap_default.ld b/boards/arm/rp23xx/raspberrypi-pico-2-w/scripts/memmap_default.ld new file mode 100644 index 0000000000000..07328ad23c211 --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/scripts/memmap_default.ld @@ -0,0 +1,343 @@ +/**************************************************************************** + * boards/arm/rp23xx/raspberrypi-pico-2-w/scripts/memmap_default.ld + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/* Based on GCC ARM embedded samples. + Defines the following symbols for use by code: + __exidx_start + __exidx_end + __etext + __data_start__ + __preinit_array_start + __preinit_array_end + __init_array_start + __init_array_end + __fini_array_start + __fini_array_end + __data_end__ + __bss_start__ + __bss_end__ + __end__ + end + __HeapLimit + __StackLimit + __StackTop + __stack (== StackTop) +*/ + +MEMORY +{ + FLASH(rx) : ORIGIN = 0x10000000, LENGTH = 4096k + RAM(rwx) : ORIGIN = 0x20000000, LENGTH = 512k + SCRATCH_X(rwx) : ORIGIN = 0x20080000, LENGTH = 4k + SCRATCH_Y(rwx) : ORIGIN = 0x20081000, LENGTH = 4k +} + +ENTRY(_entry_point) + +SECTIONS +{ + .flash_begin : { + __flash_binary_start = .; + } > FLASH + + /* The bootrom will enter the image at the point indicated in your + IMAGE_DEF, which is usually the reset handler of your vector table. + + The debugger will use the ELF entry point, which is the _entry_point + symbol, and in our case is *different from the bootrom's entry point.* + This is used to go back through the bootrom on debugger launches only, + to perform the same initial flash setup that would be performed on a + cold boot. + */ + + .text : { + __logical_binary_start = .; + _stext = ABSOLUTE(.); + + KEEP (*(.vectors)) + + LONG(0xffffded3) + LONG(0x10210142) + LONG(0x000001ff) + LONG(0x00000000) + LONG(0xab123579) + + KEEP (*(.binary_info_header)) + __binary_info_header_end = .; + KEEP (*(.embedded_block)) + __embedded_block_end = .; + KEEP (*(.reset)) + /* TODO revisit this now memset/memcpy/float in ROM */ + /* bit of a hack right now to exclude all floating point and time critical (e.g. memset, memcpy) code from + * FLASH ... we will include any thing excluded here in .data below by default */ + *(.init) + *libgcc.a:cmse_nonsecure_call.o + *(EXCLUDE_FILE(*libgcc.a: *libc.a:*lib_a-mem*.o *libm.a:) .text*) + *(.fini) + /* Pull all c'tors into .text */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + /* Followed by destructors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(SORT(.preinit_array.*))) + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + *(SORT(.fini_array.*)) + *(.fini_array) + PROVIDE_HIDDEN (__fini_array_end = .); + + *(.eh_frame*) + . = ALIGN(4); + _etext = ABSOLUTE(.); + } > FLASH + + /* Note the boot2 section is optional, and should be discarded if there is + no reference to it *inside* the binary, as it is not called by the + bootrom. (The bootrom performs a simple best-effort XIP setup and + leaves it to the binary to do anything more sophisticated.) However + there is still a size limit of 256 bytes, to ensure the boot2 can be + stored in boot RAM. + + Really this is a "XIP setup function" -- the name boot2 is historic and + refers to its dual-purpose on RP2040, where it also handled vectoring + from the bootrom into the user image. + */ + + .boot2 : { + __boot2_start__ = .; + *(.boot2) + __boot2_end__ = .; + } > FLASH + + ASSERT(__boot2_end__ - __boot2_start__ <= 256, + "ERROR: Pico second stage bootloader must be no more than 256 bytes in size") + + .rodata : { + *(EXCLUDE_FILE(*libgcc.a: *libc.a:*lib_a-mem*.o *libm.a:) .rodata*) + *(.srodata*) + . = ALIGN(4); + *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.flashdata*))) + . = ALIGN(4); + } > FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > FLASH + __exidx_end = .; + + /* Machine inspectable binary information */ + . = ALIGN(4); + __binary_info_start = .; + .binary_info : + { + KEEP(*(.binary_info.keep.*)) + *(.binary_info.*) + } > FLASH + _eronly = ABSOLUTE(.); + __binary_info_end = .; + . = ALIGN(4); + + .ram_vector_table (NOLOAD): { + *(.ram_vector_table) + } > RAM + + .uninitialized_data (NOLOAD): { + . = ALIGN(4); + *(.uninitialized_data*) + } > RAM + + .data : { + __data_start__ = .; + _sdata = ABSOLUTE(.); + + *(vtable) + + *(.time_critical*) + + /* remaining .text and .rodata; i.e. stuff we exclude above because we want it in RAM */ + *(.text*) + . = ALIGN(4); + *(.rodata*) + . = ALIGN(4); + + *(.data*) + *(.sdata*) + + . = ALIGN(4); + *(.after_data.*) + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__mutex_array_start = .); + KEEP(*(SORT(.mutex_array.*))) + KEEP(*(.mutex_array)) + PROVIDE_HIDDEN (__mutex_array_end = .); + + *(.jcr) + . = ALIGN(4); + _edata = ABSOLUTE(.); + } > RAM AT> FLASH + + .tdata : { + _stdata = ABSOLUTE(.); + . = ALIGN(4); + *(.tdata .tdata.* .gnu.linkonce.td.*) + /* All data end */ + __tdata_end = .; + _etdata = ABSOLUTE(.); + } > RAM AT> FLASH + PROVIDE(__data_end__ = .); + + /* __etext is (for backwards compatibility) the name of the .data init source pointer (...) */ + __etext = LOADADDR(.data); + + .tbss (NOLOAD) : { + _stbss = ABSOLUTE(.); + . = ALIGN(4); + __bss_start__ = .; + _sbss = ABSOLUTE(.); + __tls_base = .; + *(.tbss .tbss.* .gnu.linkonce.tb.*) + *(.tcommon) + + __tls_end = .; + _etbss = ABSOLUTE(.); + } > RAM + + .bss (NOLOAD) : { + . = ALIGN(4); + __tbss_end = .; + + *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.bss*))) + *(COMMON) + PROVIDE(__global_pointer$ = . + 2K); + *(.sbss*) + . = ALIGN(4); + __bss_end__ = .; + _ebss = ABSOLUTE(.); + } > RAM + + .heap (NOLOAD): + { + __end__ = .; + end = __end__; + KEEP(*(.heap*)) + } > RAM + /* historically on GCC sbrk was growing past __HeapLimit to __StackLimit, however + to be more compatible, we now set __HeapLimit explicitly to where the end of the heap is */ + __HeapLimit = ORIGIN(RAM) + LENGTH(RAM); + + /* Start and end symbols must be word-aligned */ + .scratch_x : { + __scratch_x_start__ = .; + *(.scratch_x.*) + . = ALIGN(4); + __scratch_x_end__ = .; + } > SCRATCH_X AT > FLASH + __scratch_x_source__ = LOADADDR(.scratch_x); + + .scratch_y : { + __scratch_y_start__ = .; + *(.scratch_y.*) + . = ALIGN(4); + __scratch_y_end__ = .; + } > SCRATCH_Y AT > FLASH + __scratch_y_source__ = LOADADDR(.scratch_y); + + /* .stack*_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later + * + * stack1 section may be empty/missing if platform_launch_core1 is not used */ + + /* by default we put core 0 stack at the end of scratch Y, so that if core 1 + * stack is not used then all of SCRATCH_X is free. + */ + .stack1_dummy (NOLOAD): + { + *(.stack1*) + } > SCRATCH_X + .stack_dummy (NOLOAD): + { + KEEP(*(.stack*)) + } > SCRATCH_Y + + .flash_end : { + KEEP(*(.embedded_end_block*)) + PROVIDE(__flash_binary_end = .); + } > FLASH =0xaa + + /* stack limit is poorly named, but historically is maximum heap ptr */ + __StackLimit = ORIGIN(RAM) + LENGTH(RAM); + __StackOneTop = ORIGIN(SCRATCH_X) + LENGTH(SCRATCH_X); + __StackTop = ORIGIN(SCRATCH_Y) + LENGTH(SCRATCH_Y); + __StackOneBottom = __StackOneTop - SIZEOF(.stack1_dummy); + __StackBottom = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* picolibc and LLVM */ + PROVIDE (__heap_start = __end__); + PROVIDE (__heap_end = __HeapLimit); + PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) ); + PROVIDE( __tls_size_align = (__tls_size + __tls_align - 1) & ~(__tls_align - 1)); + PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) ); + + /* llvm-libc */ + PROVIDE (_end = __end__); + PROVIDE (__llvm_libc_heap_limit = __HeapLimit); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed") + + ASSERT( __binary_info_header_end - __logical_binary_start <= 1024, "Binary info must be in first 1024 bytes of the binary") + ASSERT( __embedded_block_end - __logical_binary_start <= 4096, "Embedded block must be in first 4096 bytes of the binary") + + /* todo assert on extra code */ +} diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/scripts/memmap_no_flash.ld b/boards/arm/rp23xx/raspberrypi-pico-2-w/scripts/memmap_no_flash.ld new file mode 100644 index 0000000000000..0900fb9e61b9f --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/scripts/memmap_no_flash.ld @@ -0,0 +1,284 @@ +/**************************************************************************** + * boards/arm/rp23xx/raspberrypi-pico-2-w/scripts/memmap_no_flash.ld + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/* Based on GCC ARM embedded samples. + Defines the following symbols for use by code: + __exidx_start + __exidx_end + __etext + __data_start__ + __preinit_array_start + __preinit_array_end + __init_array_start + __init_array_end + __fini_array_start + __fini_array_end + __data_end__ + __bss_start__ + __bss_end__ + __end__ + end + __HeapLimit + __StackLimit + __StackTop + __stack (== StackTop) +*/ + +MEMORY +{ + RAM(rwx) : ORIGIN = 0x20000000, LENGTH = 512k + SCRATCH_X(rwx) : ORIGIN = 0x20080000, LENGTH = 4k + SCRATCH_Y(rwx) : ORIGIN = 0x20081000, LENGTH = 4k +} + +ENTRY(_entry_point) + +SECTIONS +{ + /* Note unlike RP2040, we start the image with a vector table even for + NO_FLASH builds. On Arm, the bootrom expects a VT at the start of the + image by default; on RISC-V, the default is to enter the image at its + lowest address, so an IMAGEDEF item is required to specify the + nondefault entry point. */ + + .text : { + __logical_binary_start = .; + _stext = ABSOLUTE(.); + /* Vectors require 512-byte alignment on v8-M when >48 IRQs are used, + so we would waste RAM if the vector table were not at the + start. */ + KEEP (*(.vectors)) + KEEP (*(.binary_info_header)) + __binary_info_header_end = .; + KEEP (*(.embedded_block)) + __embedded_block_end = .; + __reset_start = .; + KEEP (*(.reset)) + __reset_end = .; + *(.time_critical*) + *(.text*) + . = ALIGN(4); + *(.init) + *(.fini) + /* Pull all c'tors into .text */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + /* Followed by destructors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.eh_frame*) + } > RAM + + .rodata : { + . = ALIGN(4); + *(.rodata*) + *(.srodata*) + . = ALIGN(4); + *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.flashdata*))) + . = ALIGN(4); + } > RAM + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > RAM + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > RAM + __exidx_end = .; + + /* Machine inspectable binary information */ + . = ALIGN(4); + __binary_info_start = .; + .binary_info : + { + KEEP(*(.binary_info.keep.*)) + *(.binary_info.*) + } > RAM + __binary_info_end = .; + . = ALIGN(4); + + .data : { + __data_start__ = .; + *(vtable) + *(.data*) + *(.sdata*) + + . = ALIGN(4); + *(.after_data.*) + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__mutex_array_start = .); + KEEP(*(SORT(.mutex_array.*))) + KEEP(*(.mutex_array)) + PROVIDE_HIDDEN (__mutex_array_end = .); + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(SORT(.preinit_array.*))) + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + *(SORT(.fini_array.*)) + *(.fini_array) + PROVIDE_HIDDEN (__fini_array_end = .); + + *(.jcr) + . = ALIGN(4); + } > RAM + + .tdata : { + . = ALIGN(4); + *(.tdata .tdata.* .gnu.linkonce.td.*) + /* All data end */ + __tdata_end = .; + } > RAM + PROVIDE(__data_end__ = .); + + .uninitialized_data (NOLOAD): { + . = ALIGN(4); + *(.uninitialized_data*) + } > RAM + /* __etext is (for backwards compatibility) the name of the .data init source pointer (...) */ + __etext = LOADADDR(.data); + _etext = LOADADDR(.data); + + + .tbss (NOLOAD) : { + . = ALIGN(4); + __bss_start__ = .; + _stbss = ABSOLUTE(.); + __tls_base = .; + *(.tbss .tbss.* .gnu.linkonce.tb.*) + *(.tcommon) + + __tls_end = .; + _etbss = ABSOLUTE(.); + } > RAM + + .bss (NOLOAD) : { + . = ALIGN(4); + _sbss = ABSOLUTE(.); + __tbss_end = .; + + *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.bss*))) + *(COMMON) + PROVIDE(__global_pointer$ = . + 2K); + *(.sbss*) + . = ALIGN(4); + __bss_end__ = .; + _ebss = ABSOLUTE(.); + } > RAM + + .heap (NOLOAD): + { + __end__ = .; + end = __end__; + KEEP(*(.heap*)) + } > RAM + /* historically on GCC sbrk was growing past __HeapLimit to __StackLimit, however + to be more compatible, we now set __HeapLimit explicitly to where the end of the heap is */ + __HeapLimit = ORIGIN(RAM) + LENGTH(RAM); + + /* Start and end symbols must be word-aligned */ + .scratch_x : { + __scratch_x_start__ = .; + *(.scratch_x.*) + . = ALIGN(4); + __scratch_x_end__ = .; + } > SCRATCH_X + __scratch_x_source__ = LOADADDR(.scratch_x); + + .scratch_y : { + __scratch_y_start__ = .; + *(.scratch_y.*) + . = ALIGN(4); + __scratch_y_end__ = .; + } > SCRATCH_Y + __scratch_y_source__ = LOADADDR(.scratch_y); + + /* .stack*_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later + * + * stack1 section may be empty/missing if platform_launch_core1 is not used */ + + /* by default we put core 0 stack at the end of scratch Y, so that if core 1 + * stack is not used then all of SCRATCH_X is free. + */ + .stack1_dummy (NOLOAD): + { + *(.stack1*) + } > SCRATCH_X + .stack_dummy (NOLOAD): + { + KEEP(*(.stack*)) + } > SCRATCH_Y + + /* stack limit is poorly named, but historically is maximum heap ptr */ + __StackLimit = ORIGIN(RAM) + LENGTH(RAM); + __StackOneTop = ORIGIN(SCRATCH_X) + LENGTH(SCRATCH_X); + __StackTop = ORIGIN(SCRATCH_Y) + LENGTH(SCRATCH_Y); + __StackOneBottom = __StackOneTop - SIZEOF(.stack1_dummy); + __StackBottom = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* picolibc and LLVM */ + PROVIDE (__heap_start = __end__); + PROVIDE (__heap_end = __HeapLimit); + PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) ); + PROVIDE( __tls_size_align = (__tls_size + __tls_align - 1) & ~(__tls_align - 1)); + PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) ); + + /* llvm-libc */ + PROVIDE (_end = __end__); + PROVIDE (__llvm_libc_heap_limit = __HeapLimit); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed") + + ASSERT( __binary_info_header_end - __logical_binary_start <= 1024, "Binary info must be in first 1024 bytes of the binary") + ASSERT( __embedded_block_end - __logical_binary_start <= 4096, "Embedded block must be in first 4096 bytes of the binary") + + /* todo assert on extra code */ +} diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/src/CMakeLists.txt b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/CMakeLists.txt new file mode 100644 index 0000000000000..7f459ff9cef63 --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/CMakeLists.txt @@ -0,0 +1,57 @@ +# ############################################################################## +# boards/arm/rp23xx/raspberrypi-pico-2-w/src/CMakeLists.txt +# +# Licensed to the Apache Software Foundation (ASF) under one or more contributor +# license agreements. See the NOTICE file distributed with this work for +# additional information regarding copyright ownership. The ASF licenses this +# file to you under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# ############################################################################## + +set(SRCS rp23xx_boardinitialize.c rp23xx_bringup.c) + +if(CONFIG_DEV_GPIO) + list(APPEND SRCS rp23xx_gpio.c) +endif() + +if(CONFIG_ARCH_LEDS) + list(APPEND SRCS rp23xx_autoleds.c) +else() + list(APPEND SRCS rp23xx_userleds.c) +endif() + +if(CONFIG_ARCH_BUTTONS) + list(APPEND SRCS rp23xx_buttons.c) +endif() + +if(CONFIG_BOARDCTL) + list(APPEND SRCS rp23xx_appinit.c) +endif() + +target_sources(board PRIVATE ${SRCS}) + +if(CONFIG_BOOT_RUNFROMFLASH) + set_property(GLOBAL PROPERTY LD_SCRIPT + "${NUTTX_BOARD_DIR}/scripts/memmap_default.ld") +elseif(CONFIG_BOOT_COPYTORAM) + set_property( + GLOBAL PROPERTY LD_SCRIPT + "${NUTTX_BOARD_DIR}/scripts/memmap_copy_to_ram.ld") +else() + set_property(GLOBAL PROPERTY LD_SCRIPT + "${NUTTX_BOARD_DIR}/scripts/memmap_no_flash.ld") +endif() + +if(CONFIG_ETC_ROMFS) + # TODO: etc/init.d/rc.sysinit etc/init.d/rcS +endif() diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/src/Make.defs b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/Make.defs new file mode 100644 index 0000000000000..0e9cfaf8184a1 --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/Make.defs @@ -0,0 +1,95 @@ +############################################################################ +# boards/arm/rp23xx/raspberrypi-pico-2-w/src/Make.defs +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. The +# ASF licenses this file to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance with the +# License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +############################################################################ + +include $(TOPDIR)/Make.defs + +CSRCS = rp23xx_boardinitialize.c +CSRCS += rp23xx_appinit.c +CSRCS += rp23xx_bringup.c + +ifeq ($(CONFIG_DEV_GPIO),y) +CSRCS += rp23xx_gpio.c +endif + +ifeq ($(CONFIG_ARCH_LEDS),y) +CSRCS += rp23xx_autoleds.c +else +CSRCS += rp23xx_userleds.c +endif + +ifeq ($(CONFIG_ARCH_BUTTONS),y) + CSRCS += rp23xx_buttons.c +endif + +ifeq ($(CONFIG_ETC_ROMFS),y) + RCSRCS = etc/init.d/rc.sysinit etc/init.d/rcS +endif + +CSRCS += rp23xx_firmware.c + +DEPPATH += --dep-path board +VPATH += :board +CFLAGS += ${INCDIR_PREFIX}$(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board$(DELIM)board + +############################################################################ +# The rules below copy the cyw43439 blob from the pico-sdk. The firmware +# source path is configured via CONFIG_CYW43439_FIRMWARE_BIN_PATH. +############################################################################ + +ifeq ($(CONFIG_IEEE80211_INFINEON_CYW43439),y) + +# When CONFIG_ARCH_BOARD_COMMON is selected, the libboard build runs from +# the common board directory and reaches these board-specific sources via +# the "board" symlink (arch/arm/src/board/board -> this src dir). The +# firmware blob is therefore generated alongside rp23xx_firmware.c so that +# the assembler's ".incbin" (which searches the source file's directory) +# can find it, and the object is made to depend on it so generation always +# runs before the compile. + +FIRMWARE = board$(DELIM)cyw43439.firmware.image + +# --- If PICO_SDK_PATH is not defined set a dummy path. -------------------- +# See comment below. + +ifeq ($(PICO_SDK_PATH),) + PICO_SDK_PATH = /tmp +endif + +FIRMWARE_SRC := $(patsubst "%",%,$(CONFIG_CYW43439_FIRMWARE_BIN_PATH)) + +# --- If the firmware source does not exist create a dummy file. ----------- +# NuttX built with the cyw43439 driver will not run successfully +# when built with this dummy file. The sole purpose of adding +# this dummy is so the build (and GitHub's validation tests) will +# not fail when the real firmware blob is not present. + +$(FIRMWARE_SRC): + mkdir -p `dirname $(FIRMWARE_SRC)` + echo "dummy" >$(FIRMWARE_SRC) + +$(FIRMWARE): $(FIRMWARE_SRC) + $(call CATFILE, $(FIRMWARE), $(FIRMWARE_SRC)) + +rp23xx_firmware$(OBJEXT): $(FIRMWARE) + +distclean:: + $(call DELFILE, board$(DELIM)cyw43439.firmware.image) + +endif diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/src/etc/init.d/rc.sysinit b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/etc/init.d/rc.sysinit new file mode 100644 index 0000000000000..08bd5e859c096 --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/etc/init.d/rc.sysinit @@ -0,0 +1,23 @@ +/**************************************************************************** + * boards/arm/rp23xx/raspberrypi-pico-2/src/etc/init.d/rc.sysinit + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#include diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/src/etc/init.d/rcS b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/etc/init.d/rcS new file mode 100644 index 0000000000000..7eb0115571682 --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/etc/init.d/rcS @@ -0,0 +1,24 @@ +/**************************************************************************** + * boards/arm/rp23xx/raspberrypi-pico-2/src/etc/init.d/rcS + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#include + diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_appinit.c b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_appinit.c new file mode 100644 index 0000000000000..bea44c62dd2c8 --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_appinit.c @@ -0,0 +1,76 @@ +/**************************************************************************** + * boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_appinit.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include "rp23xx_pico.h" + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_app_initialize + * + * Description: + * Perform application specific initialization. This function is never + * called directly from application code, but only indirectly via the + * (non-standard) boardctl() interface using the command BOARDIOC_INIT. + * + * Input Parameters: + * arg - The boardctl() argument is passed to the board_app_initialize() + * implementation without modification. The argument has no + * meaning to NuttX; the meaning of the argument is a contract + * between the board-specific initialization logic and the + * matching application logic. The value could be such things as a + * mode enumeration value, a set of DIP switch switch settings, a + * pointer to configuration data read from a file or serial FLASH, + * or whatever you would like to do with it. Every implementation + * should accept zero/NULL as a default configuration. + * + * Returned Value: + * Zero (OK) is returned on success; a negated errno value is returned on + * any failure to indicate the nature of the failure. + * + ****************************************************************************/ + +int board_app_initialize(uintptr_t arg) +{ +#ifdef CONFIG_BOARD_LATE_INITIALIZE + /* Board initialization already performed by board_late_initialize() */ + + return OK; +#else + /* Perform board-specific initialization */ + + return rp23xx_bringup(); +#endif +} diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_autoleds.c b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_autoleds.c new file mode 100644 index 0000000000000..cbe1ae50e60e8 --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_autoleds.c @@ -0,0 +1,165 @@ +/**************************************************************************** + * boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_autoleds.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/* There are four LED status indicators located on the EVK Board. The + * functions of these LEDs include: + * + * - Main Power Supply(D3) + * Green: DC 5V main supply is normal. + * Red: J2 input voltage is over 5.6V. + * Off: The board is not powered. + * - Reset RED LED(D15) + * - OpenSDA LED(D16) + * - USER LED(D18) + * + * Only a single LED, D18, is under software control. + * + * This LED is not used by the board port unless CONFIG_ARCH_LEDS is + * defined. In that case, the usage by the board port is defined in + * include/board.h and src/rp23xx_autoleds.c. The LED is used to encode + * OS-related events as follows: + * + * -------------------- ----------------------- ------ + * SYMBOL Meaning LED + * -------------------- ----------------------- ------ + * + * LED_STARTED 0 NuttX has been started OFF + * LED_HEAPALLOCATE 0 Heap has been allocated OFF + * LED_IRQSENABLED 0 Interrupts enabled OFF + * LED_STACKCREATED 1 Idle stack created ON + * LED_INIRQ 2 In an interrupt N/C + * LED_SIGNAL 2 In a signal handler N/C + * LED_ASSERTION 2 An assertion failed N/C + * LED_PANIC 3 The system has crashed FLASH + * LED_IDLE Not used + * + * Thus if the LED is statically on, NuttX has successfully booted and is, + * apparently, running normally. If the LED is flashing at approximately + * 2Hz, then a fatal error has been detected and the system has halted. + */ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include + +#include "rp23xx_gpio.h" + +#include "rp23xx_pico.h" + +#ifdef CONFIG_ARCH_LEDS + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: rp23xx_autoled_initialize + * + * Description: + * Initialize NuttX-controlled LED logic + * + * Input Parameters: + * None + * + * Returned Value: + * None + * + ****************************************************************************/ + +void board_autoled_initialize(void) +{ + /* Configure LED GPIO for output */ + + rp23xx_gpio_init(GPIO_LED1); + rp23xx_gpio_setdir(GPIO_LED1, true); +} + +/**************************************************************************** + * Name: board_autoled_on + * + * Description: + * Turn on the "logical" LED state + * + * Input Parameters: + * led - Identifies the "logical" LED state (see definitions in + * include/board.h) + * + * Returned Value: + * None + * + ****************************************************************************/ + +void board_autoled_on(int led) +{ + bool ledon = true; + + switch (led) + { + case 0: /* LED Off */ + ledon = false; + break; + + case 2: /* LED No change */ + return; + + case 1: /* LED On */ + case 3: /* LED On */ + break; + } + + rp23xx_gpio_put(GPIO_LED1, ledon); /* High illuminates */ +} + +/**************************************************************************** + * Name: board_autoled_off + * + * Description: + * Turn off the "logical" LED state + * + * Input Parameters: + * led - Identifies the "logical" LED state (see definitions in + * include/board.h) + * + * Returned Value: + * None + * + ****************************************************************************/ + +void board_autoled_off(int led) +{ + switch (led) + { + case 0: /* LED Off */ + case 1: /* LED Off */ + case 3: /* LED Off */ + break; + + case 2: /* LED No change */ + return; + } + + rp23xx_gpio_put(GPIO_LED1, false); /* High illuminates */ +} + +#endif /* CONFIG_ARCH_LEDS */ diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_boardinitialize.c b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_boardinitialize.c new file mode 100644 index 0000000000000..1d720f5526a97 --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_boardinitialize.c @@ -0,0 +1,94 @@ +/**************************************************************************** + * boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_boardinitialize.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include + +#include +#include + +#include "rp23xx_gpio.h" + +#ifdef CONFIG_RP23XX_PSRAM +#include "rp23xx_psram.h" +#endif + +#ifdef CONFIG_ARCH_BOARD_COMMON +#include "rp23xx_common_initialize.h" +#endif /* CONFIG_ARCH_BOARD_COMMON */ + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: rp23xx_boardearlyinitialize + * + * Description: + * + ****************************************************************************/ + +void rp23xx_boardearlyinitialize(void) +{ + #ifdef CONFIG_ARCH_BOARD_COMMON + rp23xx_common_earlyinitialize(); + #endif + + /* --- Place any board specific early initialization here --- */ + + /* Set board LED pin */ + + rp23xx_gpio_init(BOARD_GPIO_LED_PIN); + rp23xx_gpio_setdir(BOARD_GPIO_LED_PIN, true); + rp23xx_gpio_put(BOARD_GPIO_LED_PIN, true); +} + +/**************************************************************************** + * Name: rp23xx_boardinitialize + * + * Description: + * + ****************************************************************************/ + +void rp23xx_boardinitialize(void) +{ + #ifdef CONFIG_ARCH_BOARD_COMMON + rp23xx_common_initialize(); + #endif + + #ifdef CONFIG_RP23XX_PSRAM + rp23xx_psramconfig(); + #endif + + /* --- Place any board specific initialization here --- */ +} diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_bringup.c b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_bringup.c new file mode 100644 index 0000000000000..d8455f40201c4 --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_bringup.c @@ -0,0 +1,151 @@ +/**************************************************************************** + * boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_bringup.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include + +#include + +#include + +#include + +#include "rp23xx_pico.h" + +#ifdef CONFIG_ARCH_BOARD_COMMON +#include "rp23xx_common_bringup.h" +#endif /* CONFIG_ARCH_BOARD_COMMON */ + +#ifdef CONFIG_USERLED +# include +#endif + +#ifdef CONFIG_RP23XX_INFINEON_CYW43439 +#include "rp23xx_cyw43439.h" +#endif + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#ifdef CONFIG_RP23XX_INFINEON_CYW43439 + +/* CYW43439 wireless host-interface GPIO assignments. + * + * These match the Raspberry Pi Pico W (RP2040) wiring, which the Pico 2 W + * carries over unchanged so that existing CYW43 software keeps working. + * The data line is bidirectional (single-wire gSPI), so it is also used as + * the host-wake interrupt line. + * + * VERIFY: Pico 2 W datasheet -- confirm these GPIO numbers against the + * official Raspberry Pi Pico 2 W datasheet / schematic before relying on a + * hardware bring-up. + */ + +# define CYW43439_POWER_ON_GPIO 23 /* WL_ON - power/enable */ +# define CYW43439_CHIP_SELECT_GPIO 25 /* WL_CS - chip select (active 0) */ +# define CYW43439_DATA_GPIO 24 /* WL_D - bidirectional gSPI data */ +# define CYW43439_CLOCK_GPIO 29 /* WL_CLK - gSPI clock */ + +#endif + +/**************************************************************************** + * Global Data + ****************************************************************************/ + +#ifdef CONFIG_RP23XX_INFINEON_CYW43439 +gspi_dev_t *g_cyw43439 = NULL; +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: rp23xx_bringup + ****************************************************************************/ + +int rp23xx_bringup(void) +{ + int ret = OK; + +#ifdef CONFIG_ARCH_BOARD_COMMON + + ret = rp23xx_common_bringup(); + if (ret < 0) + { + return ret; + } + +#endif /* CONFIG_ARCH_BOARD_COMMON */ + + /* --- Place any board specific bringup code here --- */ + +#ifdef CONFIG_USERLED + /* Register the LED driver */ + + ret = userled_lower_initialize("/dev/userleds"); + if (ret < 0) + { + syslog(LOG_ERR, \ + "ERROR: userled_lower_initialize() failed: %d\n", ret); + } +#endif + +#ifdef CONFIG_INPUT_BUTTONS + /* Register the BUTTON driver */ + + ret = btn_lower_initialize("/dev/buttons"); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: btn_lower_initialize() failed: %d\n", ret); + } +#endif + +#ifdef CONFIG_RP23XX_INFINEON_CYW43439 + /* Initialize the cyw43439 (onboard WiFi chip) over PIO-based gSPI. */ + + g_cyw43439 = rp23xx_cyw_setup(CYW43439_POWER_ON_GPIO, + CYW43439_CHIP_SELECT_GPIO, + CYW43439_DATA_GPIO, + CYW43439_CLOCK_GPIO, + CYW43439_DATA_GPIO); + + if (g_cyw43439 == NULL) + { + ret = errno; + + syslog(LOG_ERR, + "Failed to initialize cyw43439 (WiFi chip): %d\n", + ret); + + return ret; + } +#endif + + return ret; +} diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_buttons.c b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_buttons.c new file mode 100644 index 0000000000000..b984c6458e5fc --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_buttons.c @@ -0,0 +1,177 @@ +/**************************************************************************** + * boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_buttons.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include + +#include +#include +#include + +#include "rp23xx_gpio.h" +#include "rp23xx_pico.h" + +#if defined(CONFIG_ARCH_BUTTONS) + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#if defined(CONFIG_INPUT_BUTTONS) && !defined(CONFIG_ARCH_IRQBUTTONS) +# error "The NuttX Buttons Driver depends on IRQ support to work!\n" +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/* Pin configuration for external raspberrypi-pico-2 buttons. */ + +static const uint32_t g_buttons[NUM_BUTTONS] = +{ + GPIO_BTN_USER1, GPIO_BTN_USER2 +}; + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_button_initialize + * + * Description: + * board_button_initialize() must be called to initialize button resources. + * After that, board_buttons() may be called to collect the current state + * of all buttons or board_button_irq() may be called to register button + * interrupt handlers. + * + ****************************************************************************/ + +uint32_t board_button_initialize(void) +{ + int i; + + /* Configure the GPIO pins as inputs. And we will use interrupts */ + + for (i = 0; i < NUM_BUTTONS; i++) + { + /* Initialize input pin */ + + rp23xx_gpio_init(g_buttons[i]); + + /* pull-up = false : pull-down = false */ + + rp23xx_gpio_set_pulls(g_buttons[i], false, false); + } + + return NUM_BUTTONS; +} + +/**************************************************************************** + * Name: board_buttons + ****************************************************************************/ + +uint32_t board_buttons(void) +{ + uint32_t ret = 0; + int i; + + /* Check that state of each key */ + + for (i = 0; i < NUM_BUTTONS; i++) + { + /* A LOW value means that the key is pressed. */ + + bool released = rp23xx_gpio_get(g_buttons[i]); + + /* Accumulate the set of depressed (not released) keys */ + + if (!released) + { + ret |= (1 << i); + } + } + + return ret; +} + +/**************************************************************************** + * Button support. + * + * Description: + * board_button_initialize() must be called to initialize button resources. + * After that, board_buttons() may be called to collect the current state + * of all buttons or board_button_irq() may be called to register button + * interrupt handlers. + * + * After board_button_initialize() has been called, board_buttons() may be + * called to collect the state of all buttons. board_buttons() returns + * an 32-bit bit set with each bit associated with a button. See the + * BUTTON_*_BIT definitions in board.h for the meaning of each bit. + * + * board_button_irq() may be called to register an interrupt handler that + * will be called when a button is depressed or released. The ID value is + * a button enumeration value that uniquely identifies a button resource. + * See the BUTTON_* definitions in board.h for the meaning of enumeration + * value. + * + ****************************************************************************/ + +#ifdef CONFIG_ARCH_IRQBUTTONS +int board_button_irq(int id, xcpt_t irqhandler, void *arg) +{ + int ret = -EINVAL; + + /* The following should be atomic */ + + if (id >= MIN_IRQBUTTON && id <= MAX_IRQBUTTON) + { + /* Make sure the interrupt is disabled */ + + rp23xx_gpio_disable_irq(g_buttons[id]); + + /* Attach the interrupt handler */ + + ret = rp23xx_gpio_irq_attach(g_buttons[id], + RP23XX_GPIO_INTR_EDGE_LOW, + irqhandler, + arg); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: irq_attach() failed: %d\n", ret); + return ret; + } + + /* Enable interruption for this pin */ + + rp23xx_gpio_enable_irq(g_buttons[id]); + } + + return ret; +} +#endif + +#endif /* CONFIG_ARCH_BUTTONS */ diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_firmware.c b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_firmware.c new file mode 100644 index 0000000000000..3389f67f59384 --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_firmware.c @@ -0,0 +1,160 @@ +/**************************************************************************** + * boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_firmware.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define _STR(x) #x +#define STR(x) _STR(x) + +#define ROUNDED_FIRMWARE_LEN ((CONFIG_CYW43439_FIRMWARE_LEN + 0xff) & ~0xff) + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#ifdef CONFIG_IEEE80211_INFINEON_CYW43439 + +/**************************************************************************** + * Character array of NVRAM image + * Generated from cyw943439wlpth_rev1_0.txt + * $ Copyright Broadcom Corporation $ + ****************************************************************************/ + +const uint8_t g_cyw43439_nvram_image[] __attribute__((aligned(4))) = + "NVRAMRev=$Rev$" "\x00" + "manfid=0x2d0" "\x00" + "prodid=0x0727" "\x00" + "vendid=0x14e4" "\x00" + "devid=0x43e2" "\x00" + "boardtype=0x0887" "\x00" + "boardrev=0x1100" "\x00" + "boardnum=22" "\x00" + "macaddr=00:A0:50:b5:59:5e" "\x00" + "sromrev=11" "\x00" + "boardflags=0x00404001" "\x00" + "boardflags3=0x04000000" "\x00" + "xtalfreq=37400" "\x00" + "nocrc=1" "\x00" + "ag0=255" "\x00" + "aa2g=1" "\x00" + "ccode=ALL" "\x00" + "pa0itssit=0x20" "\x00" + "extpagain2g=0" "\x00" + "pa2ga0=-168,6649,-778" "\x00" + "AvVmid_c0=0x0,0xc8" "\x00" + "cckpwroffset0=5" "\x00" + "maxp2ga0=84" "\x00" + "txpwrbckof=6" "\x00" + "cckbw202gpo=0" "\x00" + "legofdmbw202gpo=0x66111111" "\x00" + "mcsbw202gpo=0x77711111" "\x00" + "propbw202gpo=0xdd" "\x00" + "ofdmdigfilttype=18" "\x00" + "ofdmdigfilttypebe=18" "\x00" + "papdmode=1" "\x00" + "papdvalidtest=1" "\x00" + "pacalidx2g=45" "\x00" + "papdepsoffset=-30" "\x00" + "papdendidx=58" "\x00" + "ltecxmux=0" "\x00" + "ltecxpadnum=0x0102" "\x00" + "ltecxfnsel=0x44" "\x00" + "ltecxgcigpio=0x01" "\x00" + "il0macaddr=00:90:4c:c5:12:38" "\x00" + "wl0id=0x431b" "\x00" + "deadman_to=0xffffffff" "\x00" + "muxenab=0x100" "\x00" + "spurconfig=0x3" "\x00" + "glitch_based_crsmin=1" "\x00" + "btc_mode=1" "\x00" + "\x00\x00"; + +const unsigned int g_cyw43439_nvram_len = sizeof(g_cyw43439_nvram_image); + +/**************************************************************************** + * Include the firmware blob. This assembly code defines the global + * symbol g_cyw43439_firmware_image as the address of this included + * blob. This is similar in effect to the C statement: + * const uint8_t g_cyw43439_firmware_image[] = {...}; + * const uint8_t ng_cyw43439_clm_blob_image[] = {...}; + ****************************************************************************/ + +/* These are defined as array because the symbols name an actual address + * not a pointer to an address. This is not one of the many cases where + * pointers and arrays are interchangeable in C. + */ + +extern const uint8_t g_cyw43439_firmware_image[]; +extern const uint8_t g_cyw43439_clm_blob_image[]; +extern const unsigned int g_cyw43439_clm_blob_len; + +/* This assembly code does the following: + * - Force 16-byte alignment + * - Defines g_cyw43439_firmware_image as a location in memory + * - Copies the firmware image file data to that location. + * - Defines g_cyw43439_firmware_end as the location directly beyond + * that data. + * - Defines g_cyw43439_clm_blob_image as a location within that + * data where the clm_blob begins. + * - Force 4-byte alignment + * - Allocates an integer named g_cyw43439_clm_blob_len that + * contains the length of the clm_blob. + */ + +__asm__("\n .balign 16" + "\n .globl g_cyw43439_firmware_image" + "\n .globl g_cyw43439_clm_blob_image" + "\n .globl g_cyw43439_clm_blob_len" + "\n g_cyw43439_firmware_image:" + "\n .incbin \"cyw43439.firmware.image\"" + "\n firmware_end:" + "\n g_cyw43439_clm_blob_image=g_cyw43439_firmware_image+" + STR(ROUNDED_FIRMWARE_LEN) + "\n .balign 4" + "\n g_cyw43439_clm_blob_len:" + "\n .word firmware_end-g_cyw43439_clm_blob_image" + "\n"); + +/**************************************************************************** + * Other CYW43439 Firmware global definitions + ****************************************************************************/ + +#ifndef CONFIG_IEEE80211_BROADCOM_FWFILES + +const unsigned int g_cyw43439_firmware_len = CONFIG_CYW43439_FIRMWARE_LEN; + +#endif /* CONFIG_IEEE80211_BROADCOM_FWFILES */ + +#endif /* CONFIG_IEEE80211_INFINEON_CYW43439 */ + +/**************************************************************************** + * Private Functions + ****************************************************************************/ diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_gpio.c b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_gpio.c new file mode 100644 index 0000000000000..cc6b3810ca39e --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_gpio.c @@ -0,0 +1,392 @@ +/**************************************************************************** + * boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_gpio.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include + +#include "arm_internal.h" +#include "chip.h" +#include "rp23xx_gpio.h" + +#if defined(CONFIG_DEV_GPIO) && !defined(CONFIG_GPIO_LOWER_HALF) + +/* Output pins. GPIO25 is onboard LED any other outputs could be used. + */ + +#define GPIO_OUT1 25 + +/* Input pins. + */ + +#define GPIO_IN1 6 + +/* Interrupt pins. + */ + +#define GPIO_IRQPIN1 14 + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +struct rp23xxgpio_dev_s +{ + struct gpio_dev_s gpio; + uint8_t id; +}; + +struct rp23xxgpint_dev_s +{ + struct rp23xxgpio_dev_s rp23xxgpio; + pin_interrupt_t callback; +}; + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +#if BOARD_NGPIOOUT > 0 +static int gpout_read(struct gpio_dev_s *dev, bool *value); +static int gpout_write(struct gpio_dev_s *dev, bool value); +#endif + +#if BOARD_NGPIOIN > 0 +static int gpin_read(struct gpio_dev_s *dev, bool *value); +#endif + +#if BOARD_NGPIOINT > 0 +static int gpint_read(struct gpio_dev_s *dev, bool *value); +static int gpint_attach(struct gpio_dev_s *dev, + pin_interrupt_t callback); +static int gpint_enable(struct gpio_dev_s *dev, bool enable); +#endif + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +#if BOARD_NGPIOOUT > 0 +static const struct gpio_operations_s gpout_ops = +{ + .go_read = gpout_read, + .go_write = gpout_write, + .go_attach = NULL, + .go_enable = NULL, +}; + +/* This array maps the GPIO pins used as OUTPUT */ + +static const uint32_t g_gpiooutputs[BOARD_NGPIOOUT] = +{ + GPIO_OUT1 +}; + +static struct rp23xxgpio_dev_s g_gpout[BOARD_NGPIOOUT]; +#endif + +#if BOARD_NGPIOIN > 0 +static const struct gpio_operations_s gpin_ops = +{ + .go_read = gpin_read, + .go_write = NULL, + .go_attach = NULL, + .go_enable = NULL, +}; + +/* This array maps the GPIO pins used as INTERRUPT INPUTS */ + +static const uint32_t g_gpioinputs[BOARD_NGPIOIN] = +{ + GPIO_IN1 +}; + +static struct rp23xxgpio_dev_s g_gpin[BOARD_NGPIOIN]; +#endif + +#if BOARD_NGPIOINT > 0 +static const struct gpio_operations_s gpint_ops = +{ + .go_read = gpint_read, + .go_write = NULL, + .go_attach = gpint_attach, + .go_enable = gpint_enable, +}; + +/* This array maps the GPIO pins used as INTERRUPT INPUTS */ + +static const uint32_t g_gpiointinputs[BOARD_NGPIOINT] = +{ + GPIO_IRQPIN1, +}; + +static struct rp23xxgpint_dev_s g_gpint[BOARD_NGPIOINT]; +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: gpout_read + ****************************************************************************/ + +#if BOARD_NGPIOOUT > 0 +static int gpout_read(struct gpio_dev_s *dev, bool *value) +{ + struct rp23xxgpio_dev_s *rp23xxgpio = + (struct rp23xxgpio_dev_s *)dev; + + DEBUGASSERT(rp23xxgpio != NULL && value != NULL); + DEBUGASSERT(rp23xxgpio->id < BOARD_NGPIOOUT); + gpioinfo("Reading...\n"); + + *value = rp23xx_gpio_get(g_gpiooutputs[rp23xxgpio->id]); + return OK; +} + +/**************************************************************************** + * Name: gpout_write + ****************************************************************************/ + +static int gpout_write(struct gpio_dev_s *dev, bool value) +{ + struct rp23xxgpio_dev_s *rp23xxgpio = + (struct rp23xxgpio_dev_s *)dev; + + DEBUGASSERT(rp23xxgpio != NULL); + DEBUGASSERT(rp23xxgpio->id < BOARD_NGPIOOUT); + gpioinfo("Writing %d\n", (int)value); + + rp23xx_gpio_put(g_gpiooutputs[rp23xxgpio->id], value); + return OK; +} +#endif + +/**************************************************************************** + * Name: gpin_read + ****************************************************************************/ + +#if BOARD_NGPIOIN > 0 +static int gpin_read(struct gpio_dev_s *dev, bool *value) +{ + struct rp23xxgpio_dev_s *rp23xxgpio = + (struct rp23xxgpio_dev_s *)dev; + + DEBUGASSERT(rp23xxgpio != NULL && value != NULL); + DEBUGASSERT(rp23xxgpio->id < BOARD_NGPIOIN); + gpioinfo("Reading... pin %d\n", (int)g_gpioinputs[rp23xxgpio->id]); + + *value = rp23xx_gpio_get(g_gpioinputs[rp23xxgpio->id]); + return OK; +} +#endif + +/**************************************************************************** + * Name: rp23xxgpio_interrupt + ****************************************************************************/ + +#if BOARD_NGPIOINT > 0 +static int rp23xxgpio_interrupt(int irq, void *context, void *arg) +{ + struct rp23xxgpint_dev_s *rp23xxgpint = + (struct rp23xxgpint_dev_s *)arg; + + DEBUGASSERT(rp23xxgpint != NULL && rp23xxgpint->callback != NULL); + gpioinfo("Interrupt! callback=%p\n", rp23xxgpint->callback); + + rp23xxgpint->callback(&rp23xxgpint->rp23xxgpio.gpio, + rp23xxgpint->rp23xxgpio.id); + return OK; +} + +/**************************************************************************** + * Name: gpint_read + ****************************************************************************/ + +static int gpint_read(struct gpio_dev_s *dev, bool *value) +{ + struct rp23xxgpint_dev_s *rp23xxgpint = + (struct rp23xxgpint_dev_s *)dev; + + DEBUGASSERT(rp23xxgpint != NULL && value != NULL); + DEBUGASSERT(rp23xxgpint->rp23xxgpio.id < BOARD_NGPIOINT); + gpioinfo("Reading int pin...\n"); + + *value = rp23xx_gpio_get(g_gpiointinputs[rp23xxgpint->rp23xxgpio.id]); + return OK; +} + +/**************************************************************************** + * Name: gpint_attach + ****************************************************************************/ + +static int gpint_attach(struct gpio_dev_s *dev, + pin_interrupt_t callback) +{ + struct rp23xxgpint_dev_s *rp23xxgpint = + (struct rp23xxgpint_dev_s *)dev; + int irq = g_gpiointinputs[rp23xxgpint->rp23xxgpio.id]; + int ret; + + gpioinfo("Attaching the callback\n"); + + /* Make sure the interrupt is disabled */ + + rp23xx_gpio_disable_irq(irq); + ret = rp23xx_gpio_irq_attach(irq, + RP23XX_GPIO_INTR_EDGE_LOW, + rp23xxgpio_interrupt, + &g_gpint[rp23xxgpint->rp23xxgpio.id]); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: gpint_attach() failed: %d\n", ret); + return ret; + } + + gpioinfo("Attach %p\n", callback); + rp23xxgpint->callback = callback; + return OK; +} + +/**************************************************************************** + * Name: gpint_enable + ****************************************************************************/ + +static int gpint_enable(struct gpio_dev_s *dev, bool enable) +{ + struct rp23xxgpint_dev_s *rp23xxgpint = + (struct rp23xxgpint_dev_s *)dev; + int irq = g_gpiointinputs[rp23xxgpint->rp23xxgpio.id]; + + if (enable) + { + if (rp23xxgpint->callback != NULL) + { + gpioinfo("Enabling the interrupt\n"); + + /* Configure the interrupt for rising edge */ + + rp23xx_gpio_enable_irq(irq); + } + } + else + { + gpioinfo("Disable the interrupt\n"); + rp23xx_gpio_disable_irq(irq); + } + + return OK; +} +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: rp23xx_dev_gpio_init + ****************************************************************************/ + +int rp23xx_dev_gpio_init(void) +{ + int i; + int pincount = 0; + +#if BOARD_NGPIOOUT > 0 + for (i = 0; i < BOARD_NGPIOOUT; i++) + { + /* Setup and register the GPIO pin */ + + g_gpout[i].gpio.gp_pintype = GPIO_OUTPUT_PIN; + g_gpout[i].gpio.gp_ops = &gpout_ops; + g_gpout[i].id = i; + gpio_pin_register(&g_gpout[i].gpio, g_gpiooutputs[i]); + + /* Configure the pins that will be used as output */ + + rp23xx_gpio_init(g_gpiooutputs[i]); + rp23xx_gpio_setdir(g_gpiooutputs[i], true); + rp23xx_gpio_put(g_gpiooutputs[i], false); + + pincount++; + } +#endif + + pincount = 0; + +#if BOARD_NGPIOIN > 0 + for (i = 0; i < BOARD_NGPIOIN; i++) + { + /* Setup and register the GPIO pin */ + + g_gpin[i].gpio.gp_pintype = GPIO_INPUT_PIN; + g_gpin[i].gpio.gp_ops = &gpin_ops; + g_gpin[i].id = i; + gpio_pin_register(&g_gpin[i].gpio, g_gpioinputs[i]); + + /* Configure the pins that will be used as INPUT */ + + rp23xx_gpio_init(g_gpioinputs[i]); + + pincount++; + } +#endif + + pincount = 0; + +#if BOARD_NGPIOINT > 0 + for (i = 0; i < BOARD_NGPIOINT; i++) + { + /* Setup and register the GPIO pin */ + + g_gpint[i].rp23xxgpio.gpio.gp_pintype = GPIO_INTERRUPT_PIN; + g_gpint[i].rp23xxgpio.gpio.gp_ops = &gpint_ops; + g_gpint[i].rp23xxgpio.id = i; + gpio_pin_register(&g_gpint[i].rp23xxgpio.gpio, g_gpiointinputs[i]); + + /* Configure the pins that will be used as interrupt input */ + + rp23xx_gpio_init(g_gpiointinputs[i]); + + /* pull-up = false : pull-down = true */ + + rp23xx_gpio_set_pulls(g_gpiointinputs[i], false, true); + + pincount++; + } +#endif + + return OK; +} +#endif /* CONFIG_DEV_GPIO && !CONFIG_GPIO_LOWER_HALF */ diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_pico.h b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_pico.h new file mode 100644 index 0000000000000..65bf3393709c8 --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_pico.h @@ -0,0 +1,53 @@ +/**************************************************************************** + * boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_pico.h + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +#ifndef __BOARDS_ARM_RP23XX_RASPBERRYPI_PICO_2_SRC_RP23XX_PICO_H +#define __BOARDS_ARM_RP23XX_RASPBERRYPI_PICO_2_SRC_RP23XX_PICO_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +/* LEDs */ + +#define GPIO_LED1 25 /* The board's LED is connected to this pin */ + +/* Buttons */ + +/* Buttons GPIO pins definition */ + +#define GPIO_BTN_USER1 16 +#define GPIO_BTN_USER2 17 + +/* Buttons IRQ definitions */ + +#define MIN_IRQBUTTON BUTTON_USER1 +#define MAX_IRQBUTTON BUTTON_USER2 +#define NUM_IRQBUTTONS (BUTTON_USER1 - BUTTON_USER2 + 1) + +int rp23xx_bringup(void); + +#if defined(CONFIG_DEV_GPIO) && !defined(CONFIG_ARCH_BOARD_COMMON) +int rp23xx_dev_gpio_init(void); +#endif + +#endif /* __BOARDS_ARM_RP23XX_RASPBERRYPI_PICO_2_SRC_RP23XX_PICO_H */ diff --git a/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_userleds.c b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_userleds.c new file mode 100644 index 0000000000000..7e95de4917fcb --- /dev/null +++ b/boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_userleds.c @@ -0,0 +1,214 @@ +/**************************************************************************** + * boards/arm/rp23xx/raspberrypi-pico-2-w/src/rp23xx_userleds.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include + +#include +#include +#include + +#include "chip.h" +#include "rp23xx_gpio.h" + +#include "rp23xx_pico.h" + +#ifndef CONFIG_ARCH_LEDS + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/* This array maps an LED number to GPIO pin configuration */ + +static uint32_t g_ledcfg[BOARD_NLEDS] = +{ + GPIO_LED1, +}; + +/**************************************************************************** + * Private Function Protototypes + ****************************************************************************/ + +/* LED Power Management */ + +#ifdef CONFIG_PM +static void led_pm_notify(struct pm_callback_s *cb, int domain, + enum pm_state_e pmstate); +static int led_pm_prepare(struct pm_callback_s *cb, int domain, + enum pm_state_e pmstate); +#endif + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +#ifdef CONFIG_PM +static struct pm_callback_s g_ledscb = +{ + .notify = led_pm_notify, + .prepare = led_pm_prepare, +}; +#endif + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: led_pm_notify + * + * Description: + * Notify the driver of new power state. This callback is called after + * all drivers have had the opportunity to prepare for the new power state. + * + ****************************************************************************/ + +#ifdef CONFIG_PM +static void led_pm_notify(struct pm_callback_s *cb, int domain, + enum pm_state_e pmstate) +{ + switch (pmstate) + { + case PM_NORMAL: + { + /* Restore normal LEDs operation */ + + board_userled(BOARD_LED, true); + } + break; + + case PM_IDLE: + { + /* Entering IDLE mode - Turn leds off */ + + board_userled(BOARD_LED, false); + } + break; + + case PM_STANDBY: + { + /* Entering STANDBY mode - Logic for PM_STANDBY goes here */ + } + break; + + case PM_SLEEP: + { + /* Entering SLEEP mode - Logic for PM_SLEEP goes here */ + } + break; + + default: + { + /* Should not get here */ + } + break; + } +} +#endif + +/**************************************************************************** + * Name: led_pm_prepare + * + * Description: + * Request the driver to prepare for a new power state. This is a warning + * that the system is about to enter into a new power state. The driver + * should begin whatever operations that may be required to enter power + * state. The driver may abort the state change mode by returning a + * non-zero value from the callback function. + * + ****************************************************************************/ + +#ifdef CONFIG_PM +static int led_pm_prepare(struct pm_callback_s *cb, int domain, + enum pm_state_e pmstate) +{ + /* No preparation to change power modes is required by the LEDs driver. + * We always accept the state change by returning OK. + */ + + return OK; +} +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: board_userled_initialize + ****************************************************************************/ + +uint32_t board_userled_initialize(void) +{ + /* Configure LED GPIO for output */ + + rp23xx_gpio_init(GPIO_LED1); + rp23xx_gpio_setdir(GPIO_LED1, true); + + return BOARD_NLEDS; +} + +/**************************************************************************** + * Name: board_userled + ****************************************************************************/ + +void board_userled(int led, bool ledon) +{ + if ((unsigned)led < BOARD_NLEDS) + { + rp23xx_gpio_put(g_ledcfg[led], ledon); + } +} + +/**************************************************************************** + * Name: board_userled_all + ****************************************************************************/ + +void board_userled_all(uint32_t ledset) +{ + rp23xx_gpio_put(GPIO_LED1, (ledset & BOARD_LED1_BIT)); +} + +/**************************************************************************** + * Name: rp23xx_led_pminitialize + ****************************************************************************/ + +#ifdef CONFIG_PM +void rp23xx_led_pminitialize(void) +{ + /* Register to receive power management callbacks */ + + int ret = pm_register(&g_ledscb); + if (ret != OK) + { + board_autoled_on(LED_ASSERTION); + } +} +#endif /* CONFIG_PM */ + +#endif /* !CONFIG_ARCH_LEDS */ diff --git a/boards/arm/stm32f0l0g0/nucleo-c071rb/include/board.h b/boards/arm/stm32f0l0g0/nucleo-c071rb/include/board.h index 8a07bebea84f9..3821efe426e77 100644 --- a/boards/arm/stm32f0l0g0/nucleo-c071rb/include/board.h +++ b/boards/arm/stm32f0l0g0/nucleo-c071rb/include/board.h @@ -139,12 +139,12 @@ /* USART */ /* USART1 at arduino D0/D1: - * USART1_RX - PB6 - * USART1_TX - PB7 + * USART1_RX - PB7 + * USART1_TX - PB6 */ -#define GPIO_USART1_RX (GPIO_USART2_RX_2|GPIO_SPEED_HIGH) /* PB6 */ -#define GPIO_USART1_TX (GPIO_USART2_TX_2|GPIO_SPEED_HIGH) /* PB7 */ +#define GPIO_USART1_RX (GPIO_USART1_RX_2|GPIO_SPEED_HIGH) /* PB7 */ +#define GPIO_USART1_TX (GPIO_USART1_TX_2|GPIO_SPEED_HIGH) /* PB6 */ /* USART1 RS485_DIR - PA8 (arduino D7) * (compatible with RS485 Waveshare shield) diff --git a/boards/arm/stm32f0l0g0/nucleo-c092rc/include/board.h b/boards/arm/stm32f0l0g0/nucleo-c092rc/include/board.h index 167d4fc74ac27..553377235cb26 100644 --- a/boards/arm/stm32f0l0g0/nucleo-c092rc/include/board.h +++ b/boards/arm/stm32f0l0g0/nucleo-c092rc/include/board.h @@ -144,12 +144,12 @@ /* USART */ /* USART1 at arduino D0/D1: - * USART1_RX - PB6 - * USART1_TX - PB7 + * USART1_RX - PB7 + * USART1_TX - PB6 */ -#define GPIO_USART1_RX (GPIO_USART2_RX_2|GPIO_SPEED_HIGH) /* PB6 */ -#define GPIO_USART1_TX (GPIO_USART2_TX_2|GPIO_SPEED_HIGH) /* PB7 */ +#define GPIO_USART1_RX (GPIO_USART1_RX_2|GPIO_SPEED_HIGH) /* PB7 */ +#define GPIO_USART1_TX (GPIO_USART1_TX_2|GPIO_SPEED_HIGH) /* PB6 */ /* USART1 RS485_DIR - PA8 (arduino D7) * (compatible with RS485 Waveshare shield) diff --git a/boards/arm/stm32l4/nucleo-l476rg/src/stm32_bringup.c b/boards/arm/stm32l4/nucleo-l476rg/src/stm32_bringup.c index 0f565664c16af..01fd1b277c483 100644 --- a/boards/arm/stm32l4/nucleo-l476rg/src/stm32_bringup.c +++ b/boards/arm/stm32l4/nucleo-l476rg/src/stm32_bringup.c @@ -57,6 +57,10 @@ #include "stm32_bmp280.h" #endif +#ifdef CONFIG_USERLED +# include +#endif + #ifdef CONFIG_SENSORS_MPU9250 #include "stm32_mpu9250.h" #endif @@ -247,6 +251,16 @@ int stm32_bringup(void) } #endif +#ifdef CONFIG_USERLED + /* Register the LED driver */ + + ret = userled_lower_initialize("/dev/userleds"); + if (ret < 0) + { + syslog(LOG_ERR, "ERROR: userled_lower_initialize() failed: %d\n", ret); + } +#endif + #ifdef CONFIG_PWM /* Initialize PWM and register the PWM device. */ diff --git a/boards/risc-v/esp32c6/esp32c6-devkitc/configs/efuse/defconfig b/boards/risc-v/esp32c6/esp32c6-devkitc/configs/efuse/defconfig index 9c387edc9bffa..c8a34cde8692e 100644 --- a/boards/risc-v/esp32c6/esp32c6-devkitc/configs/efuse/defconfig +++ b/boards/risc-v/esp32c6/esp32c6-devkitc/configs/efuse/defconfig @@ -25,6 +25,7 @@ CONFIG_ESPRESSIF_EFUSE=y CONFIG_FS_PROCFS=y CONFIG_IDLETHREAD_STACKSIZE=2048 CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INIT_STACKSIZE=4096 CONFIG_INTELHEX_BINARY=y CONFIG_LIBC_PERROR_STDOUT=y CONFIG_LIBC_STRERROR=y diff --git a/boards/risc-v/esp32h2/esp32h2-devkit/configs/efuse/defconfig b/boards/risc-v/esp32h2/esp32h2-devkit/configs/efuse/defconfig index ddc6d5199ae28..3310cd804d071 100644 --- a/boards/risc-v/esp32h2/esp32h2-devkit/configs/efuse/defconfig +++ b/boards/risc-v/esp32h2/esp32h2-devkit/configs/efuse/defconfig @@ -24,6 +24,7 @@ CONFIG_ESPRESSIF_EFUSE=y CONFIG_FS_PROCFS=y CONFIG_IDLETHREAD_STACKSIZE=2048 CONFIG_INIT_ENTRYPOINT="nsh_main" +CONFIG_INIT_STACKSIZE=4096 CONFIG_INTELHEX_BINARY=y CONFIG_LIBC_PERROR_STDOUT=y CONFIG_LIBC_STRERROR=y diff --git a/boards/xtensa/esp32s3/common/src/esp32s3_lan9250.c b/boards/xtensa/esp32s3/common/src/esp32s3_lan9250.c index 3accb752fce1a..5eeae968f45bb 100644 --- a/boards/xtensa/esp32s3/common/src/esp32s3_lan9250.c +++ b/boards/xtensa/esp32s3/common/src/esp32s3_lan9250.c @@ -188,8 +188,8 @@ static int lan9250_getmac(const struct lan9250_lower_s *lower, uint8_t *mac) { int fd; int ret; -#ifndef CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES_FOUR int i; +#ifndef CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES_FOUR uint8_t tmp; #endif @@ -227,6 +227,11 @@ static int lan9250_getmac(const struct lan9250_lower_s *lower, uint8_t *mac) close(fd); + for (i = 0; i < 6; i++) + { + mac[i] = mac[5 - i]; + } + #ifdef CONFIG_ESP32S3_UNIVERSAL_MAC_ADDRESSES_FOUR mac[5] += 3; #else diff --git a/boards/xtensa/esp32s3/esp32s3-box/src/esp32s3_bringup.c b/boards/xtensa/esp32s3/esp32s3-box/src/esp32s3_bringup.c index 812ed1a5e3f4c..3a69d4614aa0a 100644 --- a/boards/xtensa/esp32s3/esp32s3-box/src/esp32s3_bringup.c +++ b/boards/xtensa/esp32s3/esp32s3-box/src/esp32s3_bringup.c @@ -42,7 +42,7 @@ # include "esp32s3_board_tim.h" #endif -#ifdef CONFIG_ESPRESSIF_WLAN +#ifdef CONFIG_ESPRESSIF_WIFI # include "esp32s3_board_wlan.h" #endif @@ -211,7 +211,7 @@ int esp32s3_bringup(void) } #endif -#ifdef CONFIG_ESPRESSIF_WLAN +#ifdef CONFIG_ESPRESSIF_WIFI ret = board_wlan_init(); if (ret < 0) { diff --git a/boards/xtensa/esp32s3/esp32s3-eye/src/esp32s3_bringup.c b/boards/xtensa/esp32s3/esp32s3-eye/src/esp32s3_bringup.c index 8c314a47ad096..40119eac62e90 100644 --- a/boards/xtensa/esp32s3/esp32s3-eye/src/esp32s3_bringup.c +++ b/boards/xtensa/esp32s3/esp32s3-eye/src/esp32s3_bringup.c @@ -42,7 +42,7 @@ # include "esp32s3_board_tim.h" #endif -#ifdef CONFIG_ESPRESSIF_WLAN +#ifdef CONFIG_ESPRESSIF_WIFI # include "esp32s3_board_wlan.h" #endif @@ -202,7 +202,7 @@ int esp32s3_bringup(void) } #endif -#ifdef CONFIG_ESPRESSIF_WLAN +#ifdef CONFIG_ESPRESSIF_WIFI ret = board_wlan_init(); if (ret < 0) { diff --git a/boards/xtensa/esp32s3/esp32s3-korvo-2/src/esp32s3_bringup.c b/boards/xtensa/esp32s3/esp32s3-korvo-2/src/esp32s3_bringup.c index 775d9ba449660..b080752c9aaed 100644 --- a/boards/xtensa/esp32s3/esp32s3-korvo-2/src/esp32s3_bringup.c +++ b/boards/xtensa/esp32s3/esp32s3-korvo-2/src/esp32s3_bringup.c @@ -45,7 +45,7 @@ # include "esp32s3_board_tim.h" #endif -#ifdef CONFIG_ESPRESSIF_WLAN +#ifdef CONFIG_ESPRESSIF_WIFI # include "esp32s3_board_wlan.h" #endif @@ -412,7 +412,7 @@ int esp32s3_bringup(void) } #endif -#ifdef CONFIG_ESPRESSIF_WLAN +#ifdef CONFIG_ESPRESSIF_WIFI ret = board_wlan_init(); if (ret < 0) { diff --git a/boards/xtensa/esp32s3/esp32s3-lcd-ev/src/esp32s3_bringup.c b/boards/xtensa/esp32s3/esp32s3-lcd-ev/src/esp32s3_bringup.c index b0fe87d41b4f0..3de427b45c91b 100644 --- a/boards/xtensa/esp32s3/esp32s3-lcd-ev/src/esp32s3_bringup.c +++ b/boards/xtensa/esp32s3/esp32s3-lcd-ev/src/esp32s3_bringup.c @@ -45,7 +45,7 @@ # include "esp32s3_board_tim.h" #endif -#ifdef CONFIG_ESPRESSIF_WLAN +#ifdef CONFIG_ESPRESSIF_WIFI # include "esp32s3_board_wlan.h" #endif @@ -304,7 +304,7 @@ int esp32s3_bringup(void) } #endif -#ifdef CONFIG_ESPRESSIF_WLAN +#ifdef CONFIG_ESPRESSIF_WIFI ret = board_wlan_init(); if (ret < 0) { diff --git a/boards/xtensa/esp32s3/lckfb-szpi-esp32s3/src/esp32s3_bringup.c b/boards/xtensa/esp32s3/lckfb-szpi-esp32s3/src/esp32s3_bringup.c index 9d7c84e35b051..4028d883b681c 100644 --- a/boards/xtensa/esp32s3/lckfb-szpi-esp32s3/src/esp32s3_bringup.c +++ b/boards/xtensa/esp32s3/lckfb-szpi-esp32s3/src/esp32s3_bringup.c @@ -45,7 +45,7 @@ # include "esp32s3_board_tim.h" #endif -#ifdef CONFIG_ESPRESSIF_WLAN +#ifdef CONFIG_ESPRESSIF_WIFI # include "esp32s3_board_wlan.h" #endif @@ -402,7 +402,7 @@ int esp32s3_bringup(void) } #endif -#ifdef CONFIG_ESPRESSIF_WLAN +#ifdef CONFIG_ESPRESSIF_WIFI ret = board_wlan_init(); if (ret < 0) { diff --git a/drivers/mtd/w25.c b/drivers/mtd/w25.c index 0a025183c7d90..831145baa7165 100644 --- a/drivers/mtd/w25.c +++ b/drivers/mtd/w25.c @@ -255,6 +255,7 @@ struct w25_dev_s /* Helpers */ +static inline void w25_purdid(FAR struct w25_dev_s *priv); static void w25_lock(FAR struct spi_dev_s *spi); static inline void w25_unlock(FAR struct spi_dev_s *spi); static inline int w25_readid(FAR struct w25_dev_s *priv); @@ -326,6 +327,18 @@ static ssize_t w25_write(FAR struct mtd_dev_s *dev, * Private Functions ****************************************************************************/ +/**************************************************************************** + * Name: w25_purdid + ****************************************************************************/ + +static inline void w25_purdid(FAR struct w25_dev_s *priv) +{ + SPI_SELECT(priv->spi, SPIDEV_FLASH(0), true); + SPI_SEND(priv->spi, W25_PURDID); + SPI_SELECT(priv->spi, SPIDEV_FLASH(0), false); + nxsched_usleep(20); +} + /**************************************************************************** * Name: w25_lock ****************************************************************************/ @@ -386,6 +399,10 @@ static inline int w25_readid(struct w25_dev_s *priv) w25_lock(priv->spi); + /* Make sure the device is not in power down mode */ + + w25_purdid(priv); + /* Wait for any preceding write or erase operation to complete. */ w25_waitwritecomplete(priv); diff --git a/drivers/net/telnet.c b/drivers/net/telnet.c index e492517f344dc..6cd92ebf8b213 100644 --- a/drivers/net/telnet.c +++ b/drivers/net/telnet.c @@ -107,8 +107,8 @@ enum telnet_state_e STATE_DO, STATE_DONT, STATE_SB, - STATE_SB_NAWS, - STATE_SE + STATE_SB_DATA, + STATE_SB_NAWS }; /* This structure describes the internal state of the driver */ @@ -118,6 +118,7 @@ struct telnet_dev_s uint8_t td_state; /* (See telnet_state_e) */ uint8_t td_crefs; /* The number of open references to the session */ uint8_t td_minor; /* Minor device number */ + bool td_sb_iac; /* Saw IAC within sub-negotiation payload */ uint16_t td_offset; /* Offset to the valid, pending bytes in the rxbuffer */ uint16_t td_pending; /* Number of valid, pending bytes in the rxbuffer */ #ifdef CONFIG_TELNET_SUPPORT_NAWS @@ -209,9 +210,9 @@ static const struct file_operations g_factory_fops = factory_ioctl, /* ioctl */ }; -/* This is an global data set of all of all active Telnet drivers. This - * additional logic in included to handle killing of task via control - * characters received via Telenet (via Ctrl-C SIGINT, in particular). +/* This is a global data set of all active Telnet drivers. This + * additional logic is included to handle killing tasks via control + * characters received via Telnet (via Ctrl-C SIGINT, in particular). */ static struct telnet_dev_s *g_telnet_clients[CONFIG_TELNET_MAXLCLIENTS]; @@ -372,16 +373,17 @@ static ssize_t telnet_receive(FAR struct telnet_dev_s *priv, priv->td_state = STATE_DONT; break; -#ifdef CONFIG_TELNET_SUPPORT_NAWS case TELNET_SB: priv->td_state = STATE_SB; + priv->td_sb_iac = false; +#ifdef CONFIG_TELNET_SUPPORT_NAWS priv->td_sb_count = 0; +#endif break; case TELNET_SE: priv->td_state = STATE_NORMAL; break; -#endif default: priv->td_state = STATE_NORMAL; @@ -458,25 +460,58 @@ static ssize_t telnet_receive(FAR struct telnet_dev_s *priv, } break; -#ifdef CONFIG_TELNET_SUPPORT_NAWS - /* Handle Telnet Sub negotiation request */ + /* Handle Telnet sub-negotiation requests. */ case STATE_SB: switch (ch) { +#ifdef CONFIG_TELNET_SUPPORT_NAWS case TELNET_NAWS: priv->td_state = STATE_SB_NAWS; break; +#endif default: - priv->td_state = STATE_NORMAL; + priv->td_state = STATE_SB_DATA; break; } break; + /* Ignore unsupported sub-negotiation payload until IAC SE. */ + + case STATE_SB_DATA: + if (priv->td_sb_iac) + { + priv->td_sb_iac = false; + if (ch == TELNET_SE) + { + priv->td_state = STATE_NORMAL; + } + } + else if (ch == TELNET_IAC) + { + priv->td_sb_iac = true; + } + break; + +#ifdef CONFIG_TELNET_SUPPORT_NAWS /* Handle NAWS sub-option negotiation */ case STATE_SB_NAWS: + if (priv->td_sb_iac) + { + priv->td_sb_iac = false; + if (ch == TELNET_SE) + { + priv->td_state = STATE_NORMAL; + break; + } + } + else if (ch == TELNET_IAC) + { + priv->td_sb_iac = true; + break; + } /* Update cols / rows based on received byte count */ @@ -500,11 +535,11 @@ static ssize_t telnet_receive(FAR struct telnet_dev_s *priv, break; } - /* Increment SB count and switch to NORMAL when complete */ + /* Increment SB count and keep discarding until IAC SE. */ if (++priv->td_sb_count == 4) { - priv->td_state = STATE_NORMAL; + priv->td_state = STATE_SB_DATA; } break; diff --git a/drivers/serial/uart_rpmsg.c b/drivers/serial/uart_rpmsg.c index 12205c232af1b..2fc7d273f3854 100644 --- a/drivers/serial/uart_rpmsg.c +++ b/drivers/serial/uart_rpmsg.c @@ -458,12 +458,10 @@ int uart_rpmsg_init(FAR const char *cpuname, FAR const char *devname, UART_RPMSG_DEV_PREFIX, devname); uart_register(name, dev); - #ifdef CONFIG_RPMSG_UART_CONSOLE if (dev->isconsole) { uart_register(UART_RPMSG_DEV_CONSOLE, dev); } - #endif return 0; } diff --git a/drivers/serial/uart_rpmsg_raw.c b/drivers/serial/uart_rpmsg_raw.c index a658b3f61d303..8e40b2b960064 100644 --- a/drivers/serial/uart_rpmsg_raw.c +++ b/drivers/serial/uart_rpmsg_raw.c @@ -369,12 +369,10 @@ int uart_rpmsg_raw_init(FAR const char *cpuname, FAR const char *devname, UART_RPMSG_DEV_PREFIX, devname); uart_register(name, dev); -#ifdef CONFIG_RPMSG_UART_RAW_CONSOLE if (dev->isconsole) { uart_register(UART_RPMSG_DEV_CONSOLE, dev); } -#endif return 0; } diff --git a/libs/libbuiltin/libgcc/gcov.c b/libs/libbuiltin/libgcc/gcov.c index 02d41d71325e5..c73aa620b2301 100644 --- a/libs/libbuiltin/libgcc/gcov.c +++ b/libs/libbuiltin/libgcc/gcov.c @@ -514,7 +514,7 @@ void __gcov_dump(void) _NX_CLOSE(fd); } - else if(S_ISDIR(state.st_mode)) + else if (S_ISDIR(state.st_mode)) { args.mkdir = gcov_mkdir; args.strip = atoi(getenv("GCOV_PREFIX_STRIP")); diff --git a/net/nat/nat.c b/net/nat/nat.c index 4ccc2d9700bd1..d8cf542b6677e 100644 --- a/net/nat/nat.c +++ b/net/nat/nat.c @@ -42,7 +42,7 @@ * Private Data ****************************************************************************/ -static mutex_t g_nat_lock = NXMUTEX_INITIALIZER; +static rmutex_t g_nat_lock = NXRMUTEX_INITIALIZER; /**************************************************************************** * Private Functions @@ -118,6 +118,7 @@ int nat_enable(FAR struct net_driver_s *dev) if (IFF_IS_NAT(dev->d_flags)) { nwarn("WARNING: NAT was already enabled for %s!\n", dev->d_ifname); + nat_unlock(); return -EEXIST; } @@ -418,7 +419,7 @@ uint32_t nat_expire_time(uint8_t protocol) void nat_lock(void) { - nxmutex_lock(&g_nat_lock); + nxrmutex_lock(&g_nat_lock); } /**************************************************************************** @@ -431,7 +432,7 @@ void nat_lock(void) void nat_unlock(void) { - nxmutex_unlock(&g_nat_lock); + nxrmutex_unlock(&g_nat_lock); } #endif /* CONFIG_NET_NAT */ diff --git a/net/netdev/netdev_ioctl.c b/net/netdev/netdev_ioctl.c index 3b7ccb27731b0..66d4b7ecc067d 100644 --- a/net/netdev/netdev_ioctl.c +++ b/net/netdev/netdev_ioctl.c @@ -579,7 +579,7 @@ static int netdev_cell_ioctl(FAR struct socket *psock, int cmd, FAR struct net_driver_s *dev = NULL; int ret = -ENOTTY; - ninfo("cmd: %d\n", cmd); + ninfo("cmd: 0x%04x\n", cmd); if (_CELLIOCVALID(cmd)) { @@ -827,7 +827,7 @@ static int netdev_ifr_ioctl(FAR struct socket *psock, int cmd, unsigned int idx = 0; int ret = OK; - ninfo("cmd: %d\n", cmd); + ninfo("cmd: 0x%04x\n", cmd); /* Execute commands that do not need ifr_name or lifr_name */ @@ -1378,7 +1378,7 @@ static int netdev_imsf_ioctl(FAR struct socket *psock, int cmd, FAR struct net_driver_s *dev; int ret = -EINVAL; - ninfo("cmd: %d\n", cmd); + ninfo("cmd: 0x%04x\n", cmd); /* Execute the command */ diff --git a/sched/clock/clock.h b/sched/clock/clock.h index a59ce4a8627df..71b80297b094f 100644 --- a/sched/clock/clock.h +++ b/sched/clock/clock.h @@ -70,15 +70,88 @@ extern spinlock_t g_basetime_lock; * Public Function Prototypes ****************************************************************************/ +/**************************************************************************** + * Name: clock_basetime + * + * Description: + * Get the initial time value from the best source available. + * + ****************************************************************************/ + int clock_basetime(FAR struct timespec *tp); +/**************************************************************************** + * Name: clock_initialize + * + * Description: + * Perform one-time initialization of the timing facilities. + * + ****************************************************************************/ + void clock_initialize(void); +/**************************************************************************** + * Name: clock_update_sched_ticks + * + * Description: + * Update the scheduler tick counter to a specific value. This function + * directly sets the system tick counter to the given value (rather than + * incrementing it), typically used for synchronizing or resetting the + * scheduler tick count to a known state. + * + * Input Parameters: + * ticks - The new value to set for the scheduler tick counter + * + * Returned Value: + * None + * + ****************************************************************************/ + +void clock_update_sched_ticks(clock_t ticks); + +/**************************************************************************** + * Name: clock_increase_sched_ticks + * + * Description: + * Increment the scheduler tick counter. This function should be called + * each time the real-time clock interrupt occurs, indicating the passage + * of one or more scheduling ticks. + * + * Input Parameters: + * ticks - The number of ticks to increment (typically 1) + * + * Returned Value: + * None + * + ****************************************************************************/ + void clock_increase_sched_ticks(clock_t ticks); +/**************************************************************************** + * Name: clock_get_sched_ticks + * + * Description: + * Return the current value of the scheduler tick counter. This counter + * only increases while the scheduler is running, and is independent of + * the real-time clock. + * + * Returned Value: + * The current number of scheduler ticks. + * + ****************************************************************************/ + clock_t clock_get_sched_ticks(void); #ifdef CONFIG_SCHED_CPULOAD_SYSCLK + +/**************************************************************************** + * Name: cpuload_init + * + * Description: + * Initialize the CPU load measurement logic. + * + ****************************************************************************/ + void cpuload_init(void); #endif diff --git a/sched/clock/clock_sched_ticks.c b/sched/clock/clock_sched_ticks.c index 353e4f3e0b1d4..282a51450f7c4 100644 --- a/sched/clock/clock_sched_ticks.c +++ b/sched/clock/clock_sched_ticks.c @@ -46,6 +46,34 @@ static seqcount_t g_system_tick_lock = SEQLOCK_INITIALIZER; * Public Functions ****************************************************************************/ +/**************************************************************************** + * Name: clock_update_sched_ticks + * + * Description: + * Update the scheduler tick counter to a specific value. This function + * directly sets the system tick counter to the given value (rather than + * incrementing it), typically used for synchronizing or resetting the + * scheduler tick count to a known state. + * + * Input Parameters: + * ticks - The new value to set for the scheduler tick counter + * + * Returned Value: + * None + * + ****************************************************************************/ + +void clock_update_sched_ticks(clock_t ticks) +{ + irqstate_t flags; + + /* Increment the per-tick scheduler counter */ + + flags = write_seqlock_irqsave(&g_system_tick_lock); + g_system_ticks = ticks; + write_sequnlock_irqrestore(&g_system_tick_lock, flags); +} + /**************************************************************************** * Name: clock_increase_sched_ticks * diff --git a/sched/group/group_foreachchild.c b/sched/group/group_foreachchild.c index 8b830837833c6..a0cf1f25458a8 100644 --- a/sched/group/group_foreachchild.c +++ b/sched/group/group_foreachchild.c @@ -64,7 +64,7 @@ int group_foreachchild(FAR struct task_group_s *group, { FAR sq_entry_t *curr; FAR sq_entry_t *next; - int ret; + int ret = OK; DEBUGASSERT(group); diff --git a/sched/sched/sched_critmonitor.c b/sched/sched/sched_critmonitor.c index 94c944b79c26f..c4c3f213e1f06 100644 --- a/sched/sched/sched_critmonitor.c +++ b/sched/sched/sched_critmonitor.c @@ -375,6 +375,7 @@ void nxsched_switch_critmon(FAR struct tcb_s *from, FAR struct tcb_s *to) #ifdef CONFIG_SCHED_CPULOAD_CRITMONITOR clock_t tick = elapsed * CLOCKS_PER_SEC / perf_getfreq(); nxsched_critmon_cpuload(from, current, tick); + to->run_start = current; #endif #if CONFIG_SCHED_CRITMONITOR_MAXTIME_THREAD >= 0 diff --git a/sched/sched/sched_processtickless.c b/sched/sched/sched_processtickless.c index 352d9f105bab2..8eea08ad9bdce 100644 --- a/sched/sched/sched_processtickless.c +++ b/sched/sched/sched_processtickless.c @@ -375,13 +375,17 @@ void nxsched_process_timer(void) { #ifdef CONFIG_HRTIMER uint64_t nsec = clock_systime_nsec(); + clock_t ticks = NSEC2TICK(nsec); + + clock_update_sched_ticks(ticks); + hrtimer_process(nsec); # if CONFIG_RR_INTERVAL > 0 /* Workaround for SCHED_RR, see the note. */ irqstate_t flags = enter_critical_section(); - nxsched_process_event(div_const(nsec, (uint32_t)NSEC_PER_TICK), true); + nxsched_process_event(ticks, true); leave_critical_section(flags); # endif @@ -397,6 +401,10 @@ void nxsched_process_timer(void) up_timer_gettick(&ticks); + /* Update sched ticks */ + + clock_update_sched_ticks(ticks); + #if CONFIG_RR_INTERVAL > 0 /* Workaround for SCHED_RR, see the note. */