Esempio n. 1
0
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;
}
Esempio n. 2
0
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);
	}
}