62 lines
1.5 KiB
C
62 lines
1.5 KiB
C
#include "icc.h"
|
|
|
|
#include "stm32h7xx_hal.h"
|
|
|
|
ICC_SharedData sharedData __attribute__((section(".icc_section")));
|
|
|
|
__weak void icc_recv_cb() {
|
|
return;
|
|
}
|
|
|
|
void icc_wait_for_M7_bootup() {
|
|
// enable HSEM clock
|
|
__HAL_RCC_HSEM_CLK_ENABLE();
|
|
|
|
// activate notification for this core (CM4)
|
|
HAL_HSEM_ActivateNotification(__HAL_HSEM_SEMID_TO_MASK(ICC_WAKEUP_SEMID));
|
|
|
|
// stop the core and wait for wake up signal from the M7 core
|
|
HAL_PWREx_ClearPendingEvent();
|
|
HAL_PWREx_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFE, PWR_D2_DOMAIN);
|
|
|
|
// -----
|
|
// WAIT
|
|
// -----
|
|
|
|
__HAL_HSEM_CLEAR_FLAG(__HAL_HSEM_SEMID_TO_MASK(ICC_WAKEUP_SEMID));
|
|
|
|
// deactivate notification on wake up semaphore
|
|
HAL_HSEM_DeactivateNotification(__HAL_HSEM_SEMID_TO_MASK(ICC_WAKEUP_SEMID));
|
|
}
|
|
|
|
void icc_open_pipe() {
|
|
HAL_HSEM_ActivateNotification(__HAL_HSEM_SEMID_TO_MASK(ICC_FOURBOUND_SEMID));
|
|
HAL_NVIC_SetPriority(HSEM2_IRQn, 0x7, 0);
|
|
HAL_NVIC_EnableIRQ(HSEM2_IRQn);
|
|
}
|
|
|
|
void HAL_HSEM_FreeCallback(uint32_t SemMask) {
|
|
icc_recv_cb();
|
|
//usb_cdc_write("IRQ\r\n", 5);
|
|
HAL_HSEM_ActivateNotification(__HAL_HSEM_SEMID_TO_MASK(ICC_FOURBOUND_SEMID));
|
|
}
|
|
|
|
void HSEM2_IRQHandler() {
|
|
HAL_HSEM_IRQHandler();
|
|
}
|
|
|
|
void icc_notify() {
|
|
if (HAL_HSEM_FastTake(ICC_SEVENBOUND_SEMID) == HAL_OK) {
|
|
HAL_HSEM_Release(ICC_SEVENBOUND_SEMID, 0);
|
|
}
|
|
}
|
|
|
|
// ---------------
|
|
|
|
ICCQueue * icc_get_outbound_pipe() {
|
|
return &(sharedData.sevenBound);
|
|
}
|
|
|
|
ICCQueue * icc_get_inbound_pipe() {
|
|
return &(sharedData.fourBound);
|
|
} |