kal_bool usbc_cosim_core_task_init(void) { usbc_core_t* pUsbCore; kal_char usbc_class_mutex_name[50]; #ifdef IPCORE_NOT_PRESENT hmu_boot_init(); #endif usbc_set_op_mode(USBC_OP_MODE_NORMAL); kal_mem_set(usbc_core_get_instance(), 0, sizeof(usbc_core_t)); usbc_core_clear_register(); usbc_core_clear_status(); pUsbCore = usbc_core_get_instance(); // create enhance mutex sprintf(usbc_class_mutex_name, "USBC_CLASS_REMOTE_WK_MUTEX"); pUsbCore->usbc_class_remote_wk_mutex = kal_create_enh_mutex(usbc_class_mutex_name); sprintf(usbc_class_mutex_name, "USBC_CLASS_RENOTIFY_MUTEX"); pUsbCore->usbc_class_renotify_mutex = kal_create_enh_mutex(usbc_class_mutex_name); sprintf(usbc_class_mutex_name, "USBC_CLASS_FUNC_ACCESS_MUTEX"); pUsbCore->usbc_class_func_access_mutex = kal_create_enh_mutex(usbc_class_mutex_name); if ( NULL == pUsbCore->usbc_class_remote_wk_mutex || NULL == pUsbCore->usbc_class_renotify_mutex || NULL == pUsbCore->usbc_class_func_access_mutex ) { ASSERT(0); } // initial an evnet scheduler pUsbCore->usbc_es_wk_notify_g = evshed_create( "USBC_WK_NOTIFY", /* timer_name: event scheduler name */ MOD_USBCORE, /* dest_mod_id: system sends timeout message to this module when event scheduler timeout happens */ 0, /* fuzz */ 255); /* max_delay_ticks */ if (pUsbCore->usbc_es_wk_notify_g) { evshed_set_index(pUsbCore->usbc_es_wk_notify_g, USBC_WK_NOTIFY_INDEX); } else { ASSERT(0); } usbc_normal_hif_factory(); usbc_cosim_hif_factory(); usbc_stack_checkin(USB_CLASS_NUM, NULL); return KAL_TRUE; }
void usbc_mode_switch(usb_mode_e mode){ kal_uint32 idx; usbc_core_t* usbc_inst = usbc_core_get_instance(); usbc_class_reinit_func_t class_reinit; usbc_ind_t ind_to_enqueue; // Do mode switch immediately if it is not in HISR, or enqueue a mode switch event for USBCORE task if (!kal_if_hisr()) { #if 1 if (mode == USB_MODE_MSD_OSDRTY){ /* wait 3 second for OSD known issue */ kal_sleep_task(600); } #endif /* 1. set disconnect */ hifusb_set_disconnect(); usbc_empty_ind_queue(); /* 2. Set switch mode */ usbc_inst->is_mode_switch = KAL_TRUE; usbc_inst->mode = mode; /* 3. Send re-init callback to all usb class */ _SET_NODE_VALUE(0); usbc_stack_checkin(USB_CLASS_NUM, NULL); for (idx = 0; idx < USB_CLASS_NUM; idx++) { class_reinit = _get_class_reinit_func(idx); _SET_NODE_REG_TABLE(idx, NULL); if (class_reinit) { usbc_trace_info(USBCORE_ALL_NODE_CHECKIN_REINIT_CLASS_START, idx); class_reinit(KAL_TRUE); usbc_trace_info(USBCORE_ALL_NODE_CHECKIN_REINIT_CLASS_END, idx); } else { EXT_ASSERT(KAL_FALSE, 2, 0, 0); } } } else { ind_to_enqueue.type = USBC_IND_MODE_SWITCH; ind_to_enqueue.ext = 0; ind_to_enqueue.data = (kal_uint8)mode; usbc_enqueue_ind(&ind_to_enqueue); hmu_hifeg_set(HIF_DRV_EG_USBC_IND_EVENT); } }