/* ************************************************************************************************************ * * 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 ; }
/* ************************************************************************************************************ * * 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 ; }
/* ************************************************************************************************************ * * 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; }