Ejemplo n.º 1
0
/**
 * int oci_init(void)
 * 
 * @brief Initialize oci module.
 * 
 * @param None
 * 
 * @return USB_ERR_SUCCESS : If success \n
 *         USB_ERR_FAIL : If call fail \n
 * @remark 
 * 
 */
int oci_init(void) 
{ 
	otg_mem_set((void*)ch_enable, true, sizeof(bool)*16);
	ch_halt = false;

	if(oci_sys_init() == USB_ERR_SUCCESS)
	{
		if(oci_core_reset() == USB_ERR_SUCCESS)
		{
			oci_set_global_interrupt(false);
			return USB_ERR_SUCCESS;
		}
		else
		{
			//otg_dbg(OTG_DBG_OCI, "oci_core_reset() Fail\n");
			return USB_ERR_FAIL;	
		}
	}
	
	return USB_ERR_FAIL;
} 
int  	init_nonperio_stransfer(bool	f_is_standard_dev_req,
				td_t       *parent_td)
{


	parent_td->cur_stransfer.ed_desc_p 	= &parent_td->parent_ed_p->ed_desc;
	parent_td->cur_stransfer.ed_status_p 	= &parent_td->parent_ed_p->ed_status;
	parent_td->cur_stransfer.alloc_chnum	= CH_NONE;
	parent_td->cur_stransfer.parent_td		= (u32)parent_td;
	parent_td->cur_stransfer.stransfer_id 	= (u32)&parent_td->cur_stransfer;

	otg_mem_set(&(parent_td->cur_stransfer.hc_reg), 0, sizeof(hc_reg_t));

	parent_td->cur_stransfer.hc_reg.hc_int_msk.b.chhltd = 1;

	if(f_is_standard_dev_req)
	{
		parent_td->cur_stransfer.buf_size		=	USB_20_STAND_DEV_REQUEST_SIZE;
		parent_td->cur_stransfer.start_phy_buf_addr	= 	parent_td->standard_dev_req_info.phy_standard_dev_req_addr;
		parent_td->cur_stransfer.start_vir_buf_addr	=	parent_td->standard_dev_req_info.vir_standard_dev_req_addr;
	}
	else
	{
		parent_td->cur_stransfer.buf_size		=	(parent_td->buf_size>MAX_CH_TRANSFER_SIZE)
								?MAX_CH_TRANSFER_SIZE
								:parent_td->buf_size;

		parent_td->cur_stransfer.start_phy_buf_addr	= 	parent_td->phy_buf_addr;
		parent_td->cur_stransfer.start_vir_buf_addr	=	parent_td->vir_buf_addr;
	}

	parent_td->cur_stransfer.packet_cnt = calc_packet_cnt(parent_td->cur_stransfer.buf_size
								, parent_td->parent_ed_p->ed_desc.max_packet_size);

	return USB_ERR_SUCCESS;
}
Ejemplo n.º 3
0
/**
 * int root_hub_feature(const u8 port, 
 *		     const u16 type_req, 
 *		     const u16 feature,
 *		     void* buf)
 * 
 * @brief Get port change bitmap information 
 * 
 * @param [IN] port : port number
 *	   [IN] type_req : request type of hub feature as usb 2.0 spec
 *	   [IN] feature : hub feature as usb 2.0 spec
 *	   [OUT] status : buffer to store results
 * 
 * @return USB_ERR_SUCCESS : If success \n
 *         USB_ERR_FAIL : If call fail \n
 *
 * @remark 
 * 
 */
__inline__ int root_hub_feature(const u8 port, 
		     const u16 type_req, 
		     const u16 feature,
		     void *buf)
{
	int retval = USB_ERR_SUCCESS;
	usb_hub_descriptor_t *desc = NULL;
	u32 port_status = 0;
	hprt_t hprt = {.d32 = 0};

	switch (type_req) 
	{
	case ClearHubFeature:
		otg_dbg(OTG_DBG_ROOTHUB,"case ClearHubFeature\n");
		switch (feature) 
		{
			case C_HUB_LOCAL_POWER:
				otg_dbg(OTG_DBG_ROOTHUB,"case ClearHubFeature -C_HUB_LOCAL_POWER \n");
				break;
			case C_HUB_OVER_CURRENT:
				otg_dbg(OTG_DBG_ROOTHUB,"case ClearHubFeature -C_HUB_OVER_CURRENT \n");
				/* Nothing required here */
				break;
			default:
				retval = USB_ERR_FAIL;
		}
		break;
		
	case ClearPortFeature:
		otg_dbg(OTG_DBG_ROOTHUB,"case ClearPortFeature\n");
		switch (feature) 
		{
			case USB_PORT_FEAT_ENABLE:
				otg_dbg(OTG_DBG_ROOTHUB,"case ClearPortFeature -USB_PORT_FEAT_ENABLE \n");
				hprt.b.prtena = 1;
				update_reg_32(HPRT, hprt.d32);
				break;
				
			case USB_PORT_FEAT_SUSPEND:
				otg_dbg(OTG_DBG_ROOTHUB,"case ClearPortFeature -USB_PORT_FEAT_SUSPEND \n");
				bus_resume();
				break;
				
			case USB_PORT_FEAT_POWER:
				otg_dbg(OTG_DBG_ROOTHUB,"case ClearPortFeature -USB_PORT_FEAT_POWER \n");
				hprt.b.prtpwr = 1;
				clear_reg_32(HPRT, hprt.d32);
				break;
				
			case USB_PORT_FEAT_INDICATOR:
				otg_dbg(OTG_DBG_ROOTHUB,"case ClearPortFeature -USB_PORT_FEAT_INDICATOR \n");
				/* Port inidicator not supported */
				break;

			case USB_PORT_FEAT_C_CONNECTION:
				otg_dbg(OTG_DBG_ROOTHUB,"case ClearPortFeature -USB_PORT_FEAT_C_CONNECTION \n");
				/* Clears drivers internal connect status change
				 * flag */
				port_flag.b.port_connect_status_change = 0;
				break;
				
			case USB_PORT_FEAT_C_RESET:
				otg_dbg(OTG_DBG_ROOTHUB,"case ClearPortFeature -USB_PORT_FEAT_C_RESET \n");
				/* Clears the driver's internal Port Reset Change
				 * flag */
				port_flag.b.port_reset_change = 0;
				break;
				
			case USB_PORT_FEAT_C_ENABLE:
				otg_dbg(OTG_DBG_ROOTHUB,"case ClearPortFeature -USB_PORT_FEAT_C_ENABLE \n");
				/* Clears the driver's internal Port
				 * Enable/Disable Change flag */
				port_flag.b.port_enable_change = 0;
				break;
				
			case USB_PORT_FEAT_C_SUSPEND:
				otg_dbg(OTG_DBG_ROOTHUB,"case ClearPortFeature -USB_PORT_FEAT_C_SUSPEND \n");
				/* Clears the driver's internal Port Suspend
				 * Change flag, which is set when resume signaling on
				 * the host port is complete */
				port_flag.b.port_suspend_change = 0;
				break;
				
			case USB_PORT_FEAT_C_OVER_CURRENT:
				otg_dbg(OTG_DBG_ROOTHUB,"case ClearPortFeature -USB_PORT_FEAT_C_OVER_CURRENT \n");
				port_flag.b.port_over_current_change = 0;
				break;
				
			default:
				retval = USB_ERR_FAIL;
		}
		break;
		
	case GetHubDescriptor:
		otg_dbg(OTG_DBG_ROOTHUB,"case GetHubDescriptor\n");
		desc = (usb_hub_descriptor_t *)buf;
		desc->desc_length = 9;
		desc->desc_type = 0x29;
		desc->port_number = 1;
		desc->hub_characteristics = 0x08;
		desc->power_on_to_power_good = 1;
		desc->hub_control_current = 0;
		desc->bitmap[0] = 0;
		desc->bitmap[1] = 0xff;
		break;

	case GetHubStatus:
		otg_dbg(OTG_DBG_ROOTHUB,"case GetHubStatus\n");
		otg_mem_set(buf, 0, 4);
		break;

	case GetPortStatus:
		//otg_dbg(OTG_DBG_ROOTHUB_KH,"case GetPortStatus\n");
		

		if (port_flag.b.port_connect_status_change)
			port_status |= (1 << USB_PORT_FEAT_C_CONNECTION);

		if (port_flag.b.port_enable_change)
			port_status |= (1 << USB_PORT_FEAT_C_ENABLE);

		if (port_flag.b.port_suspend_change)
			port_status |= (1 << USB_PORT_FEAT_C_SUSPEND);

		if (port_flag.b.port_reset_change)
			port_status|= (1 << USB_PORT_FEAT_C_RESET);

		if (port_flag.b.port_over_current_change) 
			port_status |= (1 << USB_PORT_FEAT_C_OVER_CURRENT);
			

		if (!port_flag.b.port_connect_status) 
		{
			//
			// The port is disconnected, which means the core is
			// either in device mode or it soon will be. Just
			// return 0's for the remainder of the port status
			// since the port register can't be read if the core
			// is in device mode.
			
			 *((__le32*)buf) = cpu_to_le32(port_status);
			break;
		}
		
		
		hprt.d32 = read_reg_32(HPRT);

		if (hprt.b.prtconnsts) 
			port_status|= (1 << USB_PORT_FEAT_CONNECTION);

		if (hprt.b.prtena)
			port_status |= (1 << USB_PORT_FEAT_ENABLE);

		if (hprt.b.prtsusp)
			port_status |= (1 << USB_PORT_FEAT_SUSPEND);

		if (hprt.b.prtovrcurract)
			port_status |= (1 << USB_PORT_FEAT_OVER_CURRENT);

		if (hprt.b.prtrst)
			port_status |= (1 << USB_PORT_FEAT_RESET);

		if (hprt.b.prtpwr)
			port_status |= (1 << USB_PORT_FEAT_POWER);

		if (hprt.b.prtspd == 0)
			port_status |= (1 << USB_PORT_FEAT_HIGHSPEED);
		
		else if (hprt.b.prtspd == 2)
			port_status |= (1 << USB_PORT_FEAT_LOWSPEED);

		if (hprt.b.prttstctl)
			port_status |= (1 << USB_PORT_FEAT_TEST);

		*((__le32*)buf) = cpu_to_le32(port_status);
		break;
		
	case SetHubFeature:
		otg_dbg(OTG_DBG_ROOTHUB,"case SetHubFeature\n");
		/* No HUB features supported */
		break;
		
	case SetPortFeature:
		otg_dbg(OTG_DBG_ROOTHUB,"case SetPortFeature\n");
		if (!port_flag.b.port_connect_status) {
			/*
			 * The port is disconnected, which means the core is
			 * either in device mode or it soon will be. Just
			 * return without doing anything since the port
			 * register can't be written if the core is in device
			 * mode.
			 */
			break;
		}

		switch (feature) 
		{
			case USB_PORT_FEAT_SUSPEND:
				otg_dbg(OTG_DBG_ROOTHUB,"case SetPortFeature -USB_PORT_FEAT_SUSPEND \n");
				bus_suspend();
				break;
				
			case USB_PORT_FEAT_POWER:
				otg_dbg(OTG_DBG_ROOTHUB,"case SetPortFeature -USB_PORT_FEAT_POWER \n");
				hprt.d32 = read_reg_32(HPRT);		
				if(!hprt.b.prtpwr)
				{
					//hprt.d32 = 0;
					hprt.b.prtpwr = 1;
					write_reg_32(HPRT, hprt.d32);
				}
				break;

			case USB_PORT_FEAT_RESET:
				otg_dbg(OTG_DBG_ROOTHUB,"case SetPortFeature -USB_PORT_FEAT_RESET \n");
				retval = reset_and_enable_port(port);
				break;
				
			case USB_PORT_FEAT_INDICATOR:
				otg_dbg(OTG_DBG_ROOTHUB,"case USB_PORT_FEAT_INDICATOR\n");
				break;

			default : 
				retval = USB_ERR_FAIL;
				break;
		}		
		break;
	
	default:
		retval = USB_ERR_FAIL;
		otg_dbg(OTG_DBG_ROOTHUB,"root_hub_feature() Function Error\n");
		break;
	}
	if(retval != USB_ERR_SUCCESS)
		retval = USB_ERR_FAIL;
	return retval;
}

/**
 * void bus_suspend(void)
 * 
 * @brief Make suspend status when this platform support PM Mode
 * 
 * @param None
 * 
 * @return None
 *
 * @remark 
 * 
 */	
void bus_suspend(void)
{
	hprt_t	hprt;
	pcgcctl_t	pcgcctl;
	
	hprt.d32 = 0;
	pcgcctl.d32 = 0;

	hprt.b.prtsusp = 1;
	update_reg_32(HPRT, hprt.d32);

	pcgcctl.b.pwrclmp = 1;
	update_reg_32(PCGCCTL,pcgcctl.d32);
	udelay(1);

	pcgcctl.b.rstpdwnmodule = 1;
	update_reg_32(PCGCCTL,pcgcctl.d32);
	udelay(1);
	
	pcgcctl.b.stoppclk = 1;
	update_reg_32(PCGCCTL,pcgcctl.d32);
	udelay(1);
}