コード例 #1
0
/*
************************************************************************************************************
*
*                                             function
*
*    name          :
*
*    parmeters     :
*
*    return        :
*
*    note          :
*
*
************************************************************************************************************
*/
void sunxi_dma_init(void)
{
    int i;
    sunxi_dma_int_set *dma_int = (sunxi_dma_int_set *)SUNXI_DMA_BASE;

	dma_int->irq_en0 = 0;
	dma_int->irq_en1 = 0;

	dma_int->irq_pending0 = 0xffffffff;
	dma_int->irq_pending1 = 0xffffffff;

	memset((void *)dma_channal_source, 0, SUNXI_DMA_MAX * sizeof(struct sunxi_dma_source_t));

	for(i=0;i<SUNXI_DMA_MAX;i++)
	{
		dma_channal_source[i].used = 0;
		dma_channal_source[i].channal = (struct sunxi_dma_channal_set_t *)(SUNXI_DMA_BASE + i * SUNXI_DMA_CHANANL_SIZE + 0x100);
		dma_channal_source[i].config  = (sunxi_dma_start_t *)malloc_noncache(sizeof(sunxi_dma_start_t));
	}

	dma_int_count = 0;
	irq_install_handler(AW_IRQ_DMA, sunxi_dma_int_func, 0);

	return ;
}
コード例 #2
0
ファイル: sunxi_dma.c プロジェクト: Gucan/h3_lichee
/*
************************************************************************************************************
*
*                                             function
*
*    name          :
*
*    parmeters     :
*
*    return        :
*
*    note          :
*
*
************************************************************************************************************
*/
void sunxi_dma_init(void)
{
    int i;
    sunxi_dma_int_set *dma_int = (sunxi_dma_int_set *)SUNXI_DMA_BASE;

	dma_int->irq_en0 = 0;
	dma_int->irq_en1 = 0;

	dma_int->irq_pending0 = 0xffffffff;
	dma_int->irq_pending1 = 0xffffffff;

	memset((void *)dma_channal_source, 0, SUNXI_DMA_MAX * sizeof(struct sunxi_dma_source_t));

	for(i=0;i<SUNXI_DMA_MAX;i++)
	{
		dma_channal_source[i].used = 0;
		dma_channal_source[i].channal = (struct sunxi_dma_channal_set_t *)(SUNXI_DMA_BASE + i * SUNXI_DMA_CHANANL_SIZE + 0x100);
		dma_channal_source[i].config  = (sunxi_dma_start_t *)malloc_noncache(sizeof(sunxi_dma_start_t));
	}

	dma_int_count = 0;
	irq_install_handler(AW_IRQ_DMA, sunxi_dma_int_func, 0);

#if defined(CONFIG_ARCH_SUN8IW3P1)||defined(CONFIG_ARCH_SUN8IW5P1)||defined(CONFIG_ARCH_SUN8IW6P1)||defined(CONFIG_ARCH_SUN8IW8P1)
	{
		u32 reg_val;

        //auto MCLK gating  disable
        reg_val = *(volatile unsigned int *)(SUNXI_DMA_BASE + 0x20);
        reg_val &= ~7;
        reg_val |= 4;
        *(volatile unsigned int *)(SUNXI_DMA_BASE + 0x20) = reg_val;
	}
#endif
	return ;
}
コード例 #3
0
ファイル: usb_base_39.c プロジェクト: Gucan/h3_lichee
/*
************************************************************************************************************
*
*                                             function
*
*    name          :
*
*    parmeters     :
*
*    return        :
*
*    note          :   usb初始化动作,完成后,即可开启中断后,使用中断处理程序
*
*
************************************************************************************************************
*/
int sunxi_usb_init(int delaytime)
{
	if(sunxi_udev_active->state_init())
	{
		printf("sunxi usb err: fail to init usb device\n");

		return -1;
	}
	//预先关闭usb中断
	irq_disable(AW_IRQ_USB_OTG);
	//初始化 sunxi_udc用到的资源
    memset(&sunxi_udc_source, 0, sizeof(sunxi_udc_t));
    sunxi_udc_source.standard_reg = (struct usb_device_request *)malloc_noncache(sizeof(struct usb_device_request));
    if(!sunxi_udc_source.standard_reg)
    {
    	printf("sunxi usb err: fail to malloc memory for standard reg\n");

    	return -1;
    }
	//断开usb
	SUSB_Dev_ConectSwitch(USBC_DEVICE_SWITCH_OFF);
	SUBS_Dev_CoreReset();
	//预先关闭usb时钟
	usb_close_clock();
	//延时 delaytime ms
	__msdelay(delaytime);

	//假定usb运行在高速模式下
	sunxi_udc_source.address = 0;
	sunxi_udc_source.speed = USB_SPEED_HIGH;

	usb_mem_cfg.bulk_ep_max = HIGH_SPEED_EP_MAX_PACKET_SIZE;
	usb_mem_cfg.phy_out_ep = SUSB_Dev_Log_to_Physical_Ep(SUNXI_USB_BULK_OUT_EP_INDEX, 1);
	usb_mem_cfg.phy_in_ep = SUSB_Dev_Log_to_Physical_Ep(SUNXI_USB_BULK_IN_EP_INDEX, 0);
    usb_mem_cfg.ep0_maxpkt = 512;
	usb_mem_cfg.xfer_res = 0;

	memset(&sunxi_ubuf, 0, sizeof(sunxi_ubuf_t));
	//malloc memory for rx buffer
	sunxi_ubuf.rx_base_buffer = (uchar *)malloc(1024);
	if(!sunxi_ubuf.rx_base_buffer)
	{
		printf("sunxi usb err: fail to malloc memory for rx command buffer\n");

		goto __sunxi_usb_init_fail;
	}
	sunxi_ubuf.rx_req_buffer = sunxi_ubuf.rx_base_buffer;
	//open clock
	usb_open_clock();
	//Alloc Event Buffer
	if(__usb_prepare_mem())
	{
		printf("sunxi usb err : SUSB_Alloc_Event_Buffer failed\n");

	  	goto __sunxi_usb_init_fail;
	}
	//Setup Event Buffer
    SUSB_Event_Buffers_Setup(usb_mem_cfg.event_buf[0]);
    //Make sure that USB Disconnect
    SUSB_Dev_ConectSwitch(USBC_DEVICE_SWITCH_OFF);
	//设置为device模式
    SUSB_Force_Role(USBC_ID_TYPE_DEVICE);
    //Enable Phy
    SUSB_Dev_PHY_Config(1, USBC_TS_MODE_HS);
    //Config FIFO Size
    SUSB_Config_Dev_Size();
	//加强信号的驱动能力
    SUSB_EnhanceSignal();
	//Select Speed Mode: default high speed
#if defined(CONFIG_SUSB_1_1_DEVICE)
	 SUSB_Dev_ConfigTransferMode(USBC_TS_MODE_FS);
#elif defined(CONFIG_SUSB_2_0_DEVICE)
	 SUSB_Dev_ConfigTransferMode(USBC_TS_MODE_HS);
#elif defined(CONFIG_SUSB_3_0_DEVICE)
	 SUSB_Dev_ConfigTransferMode(USBC_TS_MODE_SS);
#else
#endif
    /* disable all interrupt */
	SUSB_Dev_Interrupt_Ctl(0);
    /* begin interrupt that need */
	SUSB_Dev_Interrupt_Ctl(SUSB_INTERRUPT_NO_SOF_EN);
    /*Issue a DEPSTARTCFG command for physical ep0*/
	if(SUSB_Ep_CMD_Implement(usb_mem_cfg, 0, 0, SUSB_DEPCMD_DEPSTARTCFG, 0))
	{
		printf("sunxi usb err: fail to Issue a DEPSTARTCFG command for physical ep0\n");
	  	goto __sunxi_usb_init_fail;
	}
	/*Issue DEPXFERCFG command for physical ep0 and ep1*/
    if(SUSB_Ep_CMD_Implement(usb_mem_cfg, 0, 0, SUSB_DEPCMD_SETEPCONFIG, 0))
	{
	  	printf("sunxi usb err: fail to Issue a DEPXFERCFG command for physical ep0\n");
	  	goto __sunxi_usb_init_fail;
	}
	if(SUSB_Ep_CMD_Implement(usb_mem_cfg, 0, 1, SUSB_DEPCMD_SETEPCONFIG, 0))
	{
	  	printf("sunxi usb err: fail to Issue a DEPXFERCFG command for physical ep1\n");
	  	goto __sunxi_usb_init_fail;
	}
	if(sunxi_udc_source.speed == USB_SPEED_SUPER)
	{
	 	usb_mem_cfg.ep0_maxpkt = 0x200;
	}
	else if(sunxi_udc_source.speed == USB_SPEED_HIGH)
	{
	 	usb_mem_cfg.ep0_maxpkt = 0x40;
	}
	else
	{
	 	usb_mem_cfg.ep0_maxpkt = 0x08;
	}
     /*Issue SUSB_DEPCMD_SETTRANSFRESOURCE command for physical ep 0&1*/
	 if(SUSB_Ep_CMD_Implement(usb_mem_cfg, 0, 0, SUSB_DEPCMD_SETTRANSFRESOURCE, 0))
	{
	  	printf("sunxi usb err: fail to Issue a DEPXFERCFG command for physical ep0\n");
	}
	if(SUSB_Ep_CMD_Implement(usb_mem_cfg, 0, 1, SUSB_DEPCMD_SETTRANSFRESOURCE, 0))
	{
	  	printf("sunxi usb err: fail to Issue a DEPXFERCFG command for physical ep0\n");
	}
	/*Enable Physical ep0 */
	SUSB_Dev_EnaDisa_Ep_Function(1, 0);
	/*Enable Physical ep1*/
	SUSB_Dev_EnaDisa_Ep_Function(1, 1);
	/*Start Device, softconnect begis*/
    SUSB_Dev_ConectSwitch(USBC_DEVICE_SWITCH_ON);
	/*Register Interrupt Handle */
	irq_install_handler(AW_IRQ_USB_OTG, sunxi_usb_irq, NULL);
	irq_enable(AW_IRQ_USB_OTG);

	return 0;

__sunxi_usb_init_fail:
	__usb_release_mem();

	return -1;
}