static void usbc_cosim_hif_attach(void) { usbc_core_t *pUsbCore = usbc_core_get_instance(); /* fake USB HW info for ESL COSIM */ hifusb_boot_info_t usb_boot_info; hifusb_get_boot_info(&usb_boot_info); usbc_esl_printf("Emulare USB speed change and reset...\n"); usbc_core_speed_change(pUsbCore, (usbc_usb_speed_e)usb_boot_info.usb_speed); // emulate speed change notify usbc_core_notify_speed_change((usbc_usb_speed_e)usb_boot_info.usb_speed); usbc_core_set_hif_configuration(); // emulate reset notify usbc_core_notify_state_reset(); usbc_esl_printf("Emulare HIF USB set address...\n"); /* emulate SetAddress */ usbc_core_set_usb_address(usb_boot_info.usb_addr & 0x7f); // set USB address usbc_esl_printf("Emulare USB set configuration...\n"); /* emulate SetConfig */ usbc_core_set_usb_configuration(usb_boot_info.usb_config_val); //set USB configuration, assume there is only one configuration in META mode }
/* usbcore: usbc_stack_checkin(USB_CLASS_NUM, NULL); usbclass: ex. usbc_stack_checkin(USB_CLASS_ACM1, XXX); */ void usbc_stack_checkin(usb_class_type_e class_type, usbc_node_reg_entry_t *reg_table) { usbc_class_init_func_t class_init; kal_uint32 idx_cfg, idx_class; kal_uint32 cfg_num; usb_cfg_param_t *cfg_param; usbc_device_descriptor_t *dev_desc; usbc_device_qualifier_descriptor_t *dev_qual_desc; usbc_configuration_descriptor_t *config_desc_p; usbc_core_t *usbc_inst; _CHECKIN_NODE(class_type, reg_table); if (_ALL_NODES_CHECKIN()) { usbc_trace_info(USBCORE_ALL_NODE_CHECKIN); usbc_inst = usbc_core_get_instance(); /* 1. hif init */ usbc_normal_hif_init(); // Check for META mode #if defined(__MTK_TARGET__) && defined(__MULTI_BOOT__) && !defined(__ESL_COSIM_HIF__) if( INT_BootMode() == MTK_FACTORY_MODE ) { usbc_inst->is_mode_meta = KAL_TRUE; usbc_inst->is_mode_meta_reused = usbc_normal_hif_is_meta_reused(); } else #endif { usbc_inst->is_mode_meta = usbc_inst->is_mode_meta_reused = KAL_FALSE; } /* 2. Reset usbcore resources/structures */ usbc_resource_reset(); usbc_core_clear_register(); usbc_core_clear_status(); /* 3. If Morphing is enabled, use WIN8 mode configuration If it is resulted from mode switch, use usbc_inst->mode */ usbc_inst->dev_param = (usb_dev_param_t*)usb_get_custom_func()->get_device_param_func(); if( !usbc_inst->is_mode_meta ) { #if defined (BTT_STANDALONE_MODE) usbc_inst->mode = USB_MODE_BTT_STANDALONE; #elif defined(__ESL_COSIM_HIF__) usbc_inst->mode = USB_MODE_ESL; #else if (!usbc_inst->is_mode_switch) { usbc_inst->morphing_enable = (custom_em_get_usb_cdrom_config() & 0x02)? KAL_TRUE:KAL_FALSE; // check for morphing enable if ( usbc_inst->morphing_enable ) { usbc_inst->mode = usbc_inst->dev_param->usb_mode[USB_OS_WIN8]; } else { if( (custom_em_get_usb_cdrom_config() & 0x01) == 0 ) { usbc_inst->mode = USB_MODE_MSD_ONLY; } else { usbc_inst->mode = USB_MODE_MT6290_DATACARD; } } } #endif } else { // set USB enumeration to USB_MODE_META if it is in meta mode usbc_inst->mode = USB_MODE_META; } cfg_num = usbc_inst->dev_param->mode_param[usbc_inst->mode].cfg_num; /* 4. Set device_descriptor */ dev_desc = (usbc_device_descriptor_t *)usbc_inst->descriptors.device; kal_mem_cpy(dev_desc, &usbc_default_device_descriptor, USBC_DEVICE_DESC_SIZE); dev_desc->bDeviceClass = usbc_inst->dev_param->mode_param[usbc_inst->mode].device_class; dev_desc->bDeviceSubClass = usbc_inst->dev_param->mode_param[usbc_inst->mode].device_sub_class; dev_desc->bDeviceProtocol = usbc_inst->dev_param->mode_param[usbc_inst->mode].device_protocol; dev_desc->idVendor = usbc_inst->dev_param->vendor_id; dev_desc->idProduct = usbc_inst->dev_param->mode_param[usbc_inst->mode].product_id; dev_desc->bcdDevice = usbc_inst->dev_param->bcd_device; dev_desc->bNumConfigurations = usbc_inst->dev_param->mode_param[usbc_inst->mode].cfg_num; dev_qual_desc = &usbc_inst->device_qualifier_descriptor; dev_qual_desc->bLength = 0x0A; dev_qual_desc->bDescriptorType = USBC_DT_DEVICE_QUALIFIER; dev_qual_desc->bcdUSB = dev_desc->bcdUSB; dev_qual_desc->bDeviceClass = dev_desc->bDeviceClass; dev_qual_desc->bDeviceSubClass = dev_desc->bDeviceSubClass; dev_qual_desc->bDeviceProtocol = dev_desc->bDeviceProtocol; dev_qual_desc->bMaxPacketSize0 = dev_desc->bMaxPacketSize0; dev_qual_desc->bNumConfigurations = dev_desc->bNumConfigurations; /* 5. Store device string - language/manufacturere/product/serialnum */ usbc_get_string_number((void*)usb_language_string); dev_desc->iManufacturer = usbc_get_string_number((void*)usbc_inst->dev_param->manufacture_string); dev_desc->iProduct = usbc_get_string_number((void*)usbc_inst->dev_param->product_string); // Update serial number by reading the IMEI from NVRAM #ifdef __PRODUCTION_RELEASE__ dev_desc->iSerialNumber = usbc_core_set_serial_number()? usbc_get_string_number((void*)usbc_inst->dev_param->serial_number):0x00; #else /* under construction !*/ #endif /* 6. Call init function of each usb class for all configurations */ for (idx_cfg = 0; idx_cfg < cfg_num; idx_cfg++) { cfg_param = &usbc_inst->dev_param->mode_param[usbc_inst->mode].cfg_param[idx_cfg]; for (idx_class = 0; idx_class < cfg_param->class_num; idx_class++) { class_init = _get_class_init_func(cfg_param->class_type[idx_class]); if (class_init) { usbc_trace_info(USBCORE_ALL_NODE_CHECKIN_INIT_CLASS_START, cfg_param->class_type[idx_class]); class_init( idx_class, usbc_inst->mode, idx_cfg, cfg_param->class_ctxt[idx_class], cfg_param->bulk_double_fifo_bitmap[idx_class]); usbc_trace_info(USBCORE_ALL_NODE_CHECKIN_INIT_CLASS_END, cfg_param->class_type[idx_class]); } else { EXT_ASSERT(KAL_FALSE, 1, 0, 0); } } } if( !usbc_inst->is_mode_meta_reused ) { /* 7. Construct configuration descriptor */ _usbc_construct_config_descriptor(usbc_inst); /* 8. Update descriptors for META (non-reuse COM) */ if(usbc_inst->is_mode_meta) { dev_desc->idProduct = 0x7101; } /* 9. Set configuration and connect to hif */ usbc_normal_hif_disconnect(); usbc_core_set_hif_configuration(); usbc_normal_hif_connect(); } else { /* 7. Construct configuration descriptor */ usbc_inst->resource_iad_number[0] = 0; // Discard IAD if it is in META mode _usbc_construct_config_descriptor(usbc_inst); // construct configuration descriptor /* 8. Update descriptors for META */ dev_desc->iSerialNumber = 0x00; // no serial number in BootROM/pre-loader's COM config_desc_p = (usbc_configuration_descriptor_t*)usbc_inst->descriptors.configuration[0]; // only one configuration in META mode config_desc_p->bmAttributes &= 0xdf; // the remote wakeup is not capable in BootROM/Pre-loader COM config_desc_p->bMaxPower = 0xc8; // the max power of BootROM/Preloader COM's confiuration is 400mA usbc_inst->u3ConfMaxPower = (U3_CONF_BMAXPOWER_META / USBC_USB30_POWER_DESC_UINT); // the max power is 400mA in USB 3.0 /* 9. Enqueue and prepare for fake enumeration */ usbc_meta_hif_factory(); // set function pointers of USB driver to META state usbc_core_set_hif_configuration(); usbc_normal_hif_meta_attach(); } } }