/************************************************************************* * FUNCTION * Drv_query_boot_mode * * DESCRIPTION * Return boot mode. * * PARAMETERS * * RETURNS * FACTORY_BOOT, NORMAL_BOOT and USBMS_BOOT * * GLOBALS AFFECTED * *************************************************************************/ boot_mode_type Drv_query_boot_mode(void) { #ifdef __MULTI_BOOT__ #ifdef __USB_ENABLE__ PW_CTRL_IS_USB_BOOT CtrlVal; DCL_HANDLE handle; #endif /* __USB_ENABLE__ */ if( INT_BootMode() == MTK_FACTORY_MODE ) return FACTORY_BOOT; #ifdef __USB_ENABLE__ handle=DclPW_Open(DCL_PW, FLAGS_NONE); DclPW_Control(handle, PW_CMD_IS_USB_BOOT,(DCL_CTRL_DATA_T *)&CtrlVal); DclPW_Close(handle); if(CtrlVal.val == KAL_TRUE ) return USBMS_BOOT; #endif /* __USB_ENABLE__ */ #endif /* __MULTI_BOOT__ */ return NORMAL_BOOT; }
/* 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(); } } }