Beispiel #1
0
/*************************************************************************
* 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();
        }

    }
}