/*---------------------------------------------------------------------------*/ uint8_t rf_core_stop_rat(void) { rfc_CMD_SYNC_STOP_RAT_t cmd_stop; uint32_t cmd_status; rf_core_init_radio_op((rfc_radioOp_t *)&cmd_stop, sizeof(cmd_stop), CMD_SYNC_STOP_RAT); int ret = rf_core_send_cmd((uint32_t)&cmd_stop, &cmd_status); if(ret != RF_CORE_CMD_OK) { PRINTF("rf_core_get_rat_rtc_offset: SYNC_STOP_RAT fail, ret %d CMDSTA=0x%08lx\n", ret, cmd_status); return ret; } /* Wait until done */ ret = rf_core_wait_cmd_done(&cmd_stop); if(ret != RF_CORE_CMD_OK) { PRINTF("rf_core_cmd_ok: SYNC_STOP_RAT wait, CMDSTA=0x%08lx, status=0x%04x\n", cmd_status, cmd_stop.status); return ret; } if(!rat_offset_known) { /* save the offset, but only if this is the first time */ rat_offset_known = true; rat_offset = cmd_stop.rat0; } return RF_CORE_CMD_OK; }
/*---------------------------------------------------------------------------*/ uint8_t rf_core_start_rat(void) { uint32_t cmd_status; rfc_CMD_SYNC_START_RAT_t cmd_start; /* Start radio timer (RAT) */ rf_core_init_radio_op((rfc_radioOp_t *)&cmd_start, sizeof(cmd_start), CMD_SYNC_START_RAT); /* copy the value and send back */ cmd_start.rat0 = rat_offset; if(rf_core_send_cmd((uint32_t)&cmd_start, &cmd_status) != RF_CORE_CMD_OK) { PRINTF("rf_core_get_rat_rtc_offset: SYNC_START_RAT fail, CMDSTA=0x%08lx\n", cmd_status); return RF_CORE_CMD_ERROR; } /* Wait until done (?) */ if(rf_core_wait_cmd_done(&cmd_start) != RF_CORE_CMD_OK) { PRINTF("rf_core_cmd_ok: SYNC_START_RAT wait, CMDSTA=0x%08lx, status=0x%04x\n", cmd_status, cmd_start.status); return RF_CORE_CMD_ERROR; } return RF_CORE_CMD_OK; }
/*---------------------------------------------------------------------------*/ uint8_t rf_core_start_rat() { uint32_t cmd_status; /* Start radio timer (RAT) */ if(rf_core_send_cmd(CMDR_DIR_CMD(CMD_START_RAT), &cmd_status) != RF_CORE_CMD_OK) { PRINTF("rf_core_apply_patches: START_RAT fail, CMDSTA=0x%08lx\n", cmd_status); return RF_CORE_CMD_ERROR; } return RF_CORE_CMD_OK; }
/*---------------------------------------------------------------------------*/ int rf_core_power_up() { uint32_t cmd_status; bool interrupts_disabled = ti_lib_int_master_disable(); ti_lib_int_pend_clear(INT_RF_CPE0); ti_lib_int_pend_clear(INT_RF_CPE1); ti_lib_int_disable(INT_RF_CPE0); ti_lib_int_disable(INT_RF_CPE1); /* Enable RF Core power domain */ ti_lib_prcm_power_domain_on(PRCM_DOMAIN_RFCORE); while(ti_lib_prcm_power_domain_status(PRCM_DOMAIN_RFCORE) != PRCM_DOMAIN_POWER_ON); ti_lib_prcm_domain_enable(PRCM_DOMAIN_RFCORE); ti_lib_prcm_load_set(); while(!ti_lib_prcm_load_get()); while(!rf_core_is_accessible()) { PRINTF("rf_core_power_up: Not ready\n"); } HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIFG) = 0x0; HWREG(RFC_DBELL_NONBUF_BASE + RFC_DBELL_O_RFCPEIEN) = 0x0; ti_lib_int_enable(INT_RF_CPE0); ti_lib_int_enable(INT_RF_CPE1); if(!interrupts_disabled) { ti_lib_int_master_enable(); } /* Let CPE boot */ HWREG(RFC_PWR_NONBUF_BASE + RFC_PWR_O_PWMCLKEN) = RF_CORE_CLOCKS_MASK; /* Send ping (to verify RFCore is ready and alive) */ if(rf_core_send_cmd(CMDR_DIR_CMD(CMD_PING), &cmd_status) != RF_CORE_CMD_OK) { PRINTF("rf_core_power_up: CMD_PING fail, CMDSTA=0x%08lx\n", cmd_status); return RF_CORE_CMD_ERROR; } return RF_CORE_CMD_OK; }
/*---------------------------------------------------------------------------*/ static int fs_powerdown(void) { rfc_CMD_FS_POWERDOWN_t cmd; uint32_t cmd_status; rf_core_init_radio_op((rfc_radioOp_t *)&cmd, sizeof(cmd), CMD_FS_POWERDOWN); if(rf_core_send_cmd((uint32_t)&cmd, &cmd_status) != RF_CORE_CMD_OK) { PRINTF("fs_powerdown: CMDSTA=0x%08lx\n", cmd_status); return RF_CORE_CMD_ERROR; } if(rf_core_wait_cmd_done(&cmd) != RF_CORE_CMD_OK) { PRINTF("fs_powerdown: CMDSTA=0x%08lx, status=0x%04x\n", cmd_status, cmd.status); return RF_CORE_CMD_ERROR; } return RF_CORE_CMD_OK; }