Difference between revisions of "Multi-core"

From Wiki at Neela Nurseries
Jump to: navigation, search
m (NXP mailbox HAL files)
m (^ Build invocations and BOARD_ROOT setting)
 
(6 intermediate revisions by the same user not shown)
Line 32: Line 32:
  
 
</pre>
 
</pre>
 +
 +
<!-- comentario -->
 +
 +
== [[#top|^]] Build invocations and BOARD_ROOT setting ==
 +
 +
$ west build -b lpcxpresso55s69_cpu0 -t menuconfig -- -DBOARD_ROOT=../..
 +
 +
May need to adjust BOARD_ROOT when entering menuconfig interface from a second core project in a dual- or multi-core overarching project:
 +
 +
$ west build -b boardname_cpu1 -t menuconfig -- -DBOARD_ROOT=../../..
  
 
<!-- comentario -->
 
<!-- comentario -->
Line 46: Line 56:
  
 
  modules/hal/nxp/mcux/mcux-sdk/drivers/mailbox/fsl_mailbox.h
 
  modules/hal/nxp/mcux/mcux-sdk/drivers/mailbox/fsl_mailbox.h
 +
 +
Size of data block which mailbox can send:
 +
 +
<pre>
 +
$ grep -nr MCUX_IPM_DATA_REGS ./*
 +
./nexus-gateway-firmware/samples/ipm_mcux/build/zephyr/zephyr.lst:8385: return MCUX_IPM_DATA_REGS*sizeof(uint32_t);
 +
./nexus-gateway-firmware/samples/ipm_mcux/build/zephyr/zephyr.lst:8433: if (size > MCUX_IPM_DATA_REGS * sizeof(uint32_t)) {
 +
./nexus-gateway-firmware/samples/ipm_mcux/build/ipm_mcux_remote-prefix/src/ipm_mcux_remote-build/zephyr/zephyr.lst:6266: return MCUX_IPM_DATA_REGS*sizeof(uint32_t);
 +
./nexus-gateway-firmware/samples/ipm_mcux/build/ipm_mcux_remote-prefix/src/ipm_mcux_remote-build/zephyr/zephyr.lst:6314: if (size > MCUX_IPM_DATA_REGS * sizeof(uint32_t)) {
 +
./tags:6361980:MCUX_IPM_DATA_REGS zephyr/drivers/ipm/ipm_mcux.c 16;" d file:
 +
./zephyr/drivers/ipm/ipm_mcux.c:16:#define MCUX_IPM_DATA_REGS 1
 +
./zephyr/drivers/ipm/ipm_mcux.c:82: uint32_t data32[MCUX_IPM_DATA_REGS]; /* Until we change API
 +
./zephyr/drivers/ipm/ipm_mcux.c:94: if (size > MCUX_IPM_DATA_REGS * sizeof(uint32_t)) {
 +
./zephyr/drivers/ipm/ipm_mcux.c:117: return MCUX_IPM_DATA_REGS*sizeof(uint32_t);
 +
Binary file ./zephyr/drivers/ipm/.ipm_mcux.c.swp matches
 +
</pre>
 +
 +
 +
<pre>
 +
174 /**
 +
175  * @brief Return the maximum number of bytes possible in an outbound message.
 +
176  *
 +
177  * IPM implementations vary on the amount of data that can be sent in a
 +
178  * single message since the data payload is typically stored in registers.
 +
179  *
 +
180  * @param ipmdev Driver instance pointer.
 +
181  *
 +
182  * @return Maximum possible size of a message in bytes.
 +
183  */
 +
184 __syscall int ipm_max_data_size_get(const struct device *ipmdev);
 +
185
 +
186 static inline int z_impl_ipm_max_data_size_get(const struct device *ipmdev)
 +
187 {
 +
188        const struct ipm_driver_api *api =
 +
189                (const struct ipm_driver_api *)ipmdev->api;
 +
190
 +
191        return api->max_data_size_get(ipmdev);
 +
192 }
 +
</pre>
 +
 +
Following in-tree Zephyr driver shows all the MCUX mailbox API routine prototypes, with explanatory comments, and shows Zephyr's `z_impl_` convention of naming device API function wrappers with names that begin with this pattern:
 +
 +
zephyr/include/zephyr/drivers$ vi ipm.h
 +
 +
Some other processors have greater data sizes which can be passed via their mailboxes, as indicated in this file:
 +
 +
zephyr/drivers/ipm/Kconfig.imx
  
 
<!-- comentario -->
 
<!-- comentario -->

Latest revision as of 22:02, 21 December 2022

In Zephyr 3.2.0 see `zephyr/include/zephyr/drivers/ipm.h` for some starting points to understand inter-processor messaging.


One of two or three Zephyr 3.2.0 sample apps which touch on multi-core firmware design:

  • ./subsys/ipc/openamp/boards/lpcxpresso55s69_cpu0.overlay


^ Zephyr sys init run levels

Likely for another local article, excerpt from `zephyr/include/zephyr/init.h`:


 18 /*
 19  * System initialization levels. The PRE_KERNEL_1 and PRE_KERNEL_2 levels are
 20  * executed in the kernel's initialization context, which uses the interrupt
 21  * stack. The remaining levels are executed in the kernel's main task.
 22  */
 23 
 24 #define _SYS_INIT_LEVEL_PRE_KERNEL_1    0
 25 #define _SYS_INIT_LEVEL_PRE_KERNEL_2    1
 26 #define _SYS_INIT_LEVEL_POST_KERNEL     2
 27 #define _SYS_INIT_LEVEL_APPLICATION     3
 28 
 29 #ifdef CONFIG_SMP
 30 #define _SYS_INIT_LEVEL_SMP             4
 31 #endif


^ Build invocations and BOARD_ROOT setting

$ west build -b lpcxpresso55s69_cpu0 -t menuconfig -- -DBOARD_ROOT=../..

May need to adjust BOARD_ROOT when entering menuconfig interface from a second core project in a dual- or multi-core overarching project:

$ west build -b boardname_cpu1 -t menuconfig -- -DBOARD_ROOT=../../..


^ General MCU bring-up

NXP LPC55S69 system clock settings HAL source file:

$ vi ./hal/nxp/mcux/mcux-sdk/devices/LPC55S69/drivers/fsl_clock.h


^ NXP mailbox HAL files

modules/hal/nxp/mcux/mcux-sdk/drivers/mailbox/fsl_mailbox.h

Size of data block which mailbox can send:

$ grep -nr MCUX_IPM_DATA_REGS ./*
./nexus-gateway-firmware/samples/ipm_mcux/build/zephyr/zephyr.lst:8385:	return MCUX_IPM_DATA_REGS*sizeof(uint32_t);
./nexus-gateway-firmware/samples/ipm_mcux/build/zephyr/zephyr.lst:8433:	if (size > MCUX_IPM_DATA_REGS * sizeof(uint32_t)) {
./nexus-gateway-firmware/samples/ipm_mcux/build/ipm_mcux_remote-prefix/src/ipm_mcux_remote-build/zephyr/zephyr.lst:6266:	return MCUX_IPM_DATA_REGS*sizeof(uint32_t);
./nexus-gateway-firmware/samples/ipm_mcux/build/ipm_mcux_remote-prefix/src/ipm_mcux_remote-build/zephyr/zephyr.lst:6314:	if (size > MCUX_IPM_DATA_REGS * sizeof(uint32_t)) {
./tags:6361980:MCUX_IPM_DATA_REGS	zephyr/drivers/ipm/ipm_mcux.c	16;"	d	file:
./zephyr/drivers/ipm/ipm_mcux.c:16:#define MCUX_IPM_DATA_REGS 1
./zephyr/drivers/ipm/ipm_mcux.c:82:	uint32_t data32[MCUX_IPM_DATA_REGS]; /* Until we change API
./zephyr/drivers/ipm/ipm_mcux.c:94:	if (size > MCUX_IPM_DATA_REGS * sizeof(uint32_t)) {
./zephyr/drivers/ipm/ipm_mcux.c:117:	return MCUX_IPM_DATA_REGS*sizeof(uint32_t);
Binary file ./zephyr/drivers/ipm/.ipm_mcux.c.swp matches


174 /**
175  * @brief Return the maximum number of bytes possible in an outbound message.
176  *
177  * IPM implementations vary on the amount of data that can be sent in a
178  * single message since the data payload is typically stored in registers.
179  *
180  * @param ipmdev Driver instance pointer.
181  *
182  * @return Maximum possible size of a message in bytes.
183  */
184 __syscall int ipm_max_data_size_get(const struct device *ipmdev);
185 
186 static inline int z_impl_ipm_max_data_size_get(const struct device *ipmdev)
187 {
188         const struct ipm_driver_api *api =
189                 (const struct ipm_driver_api *)ipmdev->api;
190 
191         return api->max_data_size_get(ipmdev);
192 }

Following in-tree Zephyr driver shows all the MCUX mailbox API routine prototypes, with explanatory comments, and shows Zephyr's `z_impl_` convention of naming device API function wrappers with names that begin with this pattern:

zephyr/include/zephyr/drivers$ vi ipm.h

Some other processors have greater data sizes which can be passed via their mailboxes, as indicated in this file:

zephyr/drivers/ipm/Kconfig.imx