1 #include <linux/mu3d/hal/mu3d_hal_osal.h>
2 #define _DEV_USB_DRV_EXT_
3 #include <linux/mu3d/test_drv/mu3d_test_usb_drv.h>
4 #undef _DEV_USB_DRV_EXT_
5 #include <linux/mu3d/hal/mu3d_hal_hw.h>
6 #include <linux/mu3d/hal/mu3d_hal_qmu_drv.h>
7 #include <linux/mu3d/hal/mu3d_hal_usb_drv.h>
8 #include <linux/mu3d/test_drv/mu3d_test_qmu_drv.h>
10 static u64 mu3d_if_dmamask
= DMA_BIT_MASK(32);
11 static struct device mu3d_if_dev
= {
12 .dma_mask
= &mu3d_if_dmamask
,
13 .coherent_dma_mask
= DMA_BIT_MASK(32),
18 #include <mach/battery_common.h>
21 extern void BATTERY_SetUSBState(int usb_state
);
22 extern void wake_up_bat(void);
24 EP0_STATE g_ep0_state
= EP0_IDLE
;
25 DEV_UINT8
* g_dma_buffer
[2 * MAX_EP_NUM
+ 1];
26 dma_addr_t g_mu3d_dma_debug
;
27 static DEV_UINT8 bAddress_Offset
= 0;
28 DEV_UINT8
* loopback_buffer
;
29 extern DEV_UINT16 g_nirq
;
31 void u3d_sync_with_bat(int usb_state
)
33 printk("[U3D_T] u3d_sync_with_bat, usb_state is %d\n", usb_state
);
34 #ifndef CONFIG_MTK_FPGA
35 BATTERY_SetUSBState(usb_state
);
42 // USBIF, should change to ROME phone MTK vendor ID, product ID
43 DEV_UINT8 device_descriptor
[] =
53 0x8D, //0x0E8D , Mediatek
55 0x03, //0x0C03, STORAGE + ADB
66 DEV_UINT8 configuration_descriptor
[] =
75 0x80, //set to bus power and not remote wakeup , orig : 0xc0,
76 0xFA, // 0x32 : 100 mA , 0x60 : 192 mA , 0xfa : 500 mA
80 DEV_UINT8 interface_descriptor
[] =
94 DEV_UINT8 endpoint_descriptor_in
[] =
106 DEV_UINT8 endpoint_descriptor_out
[] =
118 DEV_UINT8 otg_descriptor
[] =
124 0x02 // bcdOTG version
128 DEV_UINT8 string_descriptor_0
[] =
137 DEV_UINT8 string_descriptor_1
[] =
160 DEV_UINT8 string_descriptor_2
[] =
207 DEV_UINT8 string_descriptor_3
[] =
245 DEV_UINT8 string_one
[] =
250 DEV_UINT8 string_zero
[] =
257 * u3d_init_ctrl - initialize ep0 ctrl req
260 void u3d_init_ctrl(void)
264 os_printk(K_ERR
, "%s\n", __func__
);
266 req
= mu3d_hal_get_req(0, USB_TX
);
267 req
->count
= USB_BUF_SIZE
;
275 * u3d_init - initialize mac & qmu/bmu
278 DEV_UINT8
*isrbuffer
;
279 DEV_UINT8
*isrbuffer1
;
280 DEV_UINT8
*isrbuffer2
;
282 void u3d_init_mem(void){
283 isrbuffer
= (DEV_UINT8
*)os_mem_alloc(10);
284 u3d_allocate_ep0_buffer();
288 #if (BUS_MODE==QMU_MODE)
289 printk("mu3d_hal_alloc_qmu_mem\n");
290 /* Initialize QMU GPD/BD memory. */
291 mu3d_hal_alloc_qmu_mem();
295 isrbuffer1
= (DEV_UINT8
*)os_mem_alloc(10);
296 os_printk(K_ERR
, "isrbuffer1: %p\n", isrbuffer1
);
298 isrbuffer2
= (DEV_UINT8
*)os_mem_alloc(10);
299 os_printk(K_ERR
, "isrbuffer2: %p\n", isrbuffer2
);
304 /* disable ip power down, disable U2/U3 ip power down */
305 // USBIF , in ROME real chip , we should disable VBUS_FRC_EN
306 //os_writel(U3D_MISC_CTRL, 0x0);
309 /* reset U3D all dev module. */
311 /* apply default register values */
314 /* register U3D ISR. */
315 mu3d_hal_initr_dis();
316 mu3d_hal_clear_intr() ;
318 /* register SSUSB_DEV_INT */
319 //USBIF isrbuffer = (DEV_UINT8 *)os_mem_alloc(10);
320 if(OS_R_OK
!= os_reg_isr((DEV_UINT16
)g_nirq
, u3d_inter_handler
, isrbuffer
)){
321 os_printk(K_ERR
,"Roll: Can't register IRQ %d\n", g_nirq
);
325 os_printk(K_DEBUG
,"Register IRQ %d\n", g_nirq
);
327 os_printk(K_DEBUG
,"USB Disable IRQ: %d\n", g_nirq
);
328 os_disableIrq(g_nirq
);
331 //USBIF u3d_allocate_ep0_buffer();
332 //USBIF u3d_alloc_req();
335 //USBIF# if (BUS_MODE==QMU_MODE)
336 //USBIF printk("mu3d_hal_alloc_qmu_mem\n");
337 /* Initialize QMU GPD/BD memory. */
338 //USBIF mu3d_hal_alloc_qmu_mem();
341 /* Initialize usb speed. */
342 mu3d_hal_set_speed(U3D_DFT_SPEED
);
343 /* Detect usb speed. */
344 //speed depends on host/cable/device; so speed chk is bypassed
345 //mu3d_hal_det_speed(U3D_DFT_SPEED, 0);
348 /* initialize usb ep0 & system */
350 u3d_initialize_drv();
351 #if (BUS_MODE==QMU_MODE)
352 /* Initialize QMU module. */
355 #ifdef POWER_SAVING_MODE
356 mu3d_hal_pdn_cg_en();
359 // USBIF , in ROME real chip , we should disable VBUS_FRC_EN
360 os_writel(U3D_MISC_CTRL
, 0);
363 // USBIF, in ROME real chip , this should be change to use polling vbus method or .... call back from PMIC
364 os_writel(FPGA_REG
, (os_readl(FPGA_REG
) &~ VBUS_MSK
) | VBUS_FALL_BIT
);
366 /* register SSUSB_VBUS_RISE_INT */
367 //USBIF isrbuffer1 = (DEV_UINT8 *)os_mem_alloc(10);
368 //USBIF os_printk(K_ERR, "isrbuffer1: %x\n", isrbuffer1);
370 if(ret
= os_reg_isr((DEV_UINT16
)VBUS_RISE_IRQ
, u3d_vbus_rise_handler
, isrbuffer1
)){
371 os_printk(K_ERR
,"Roll: Can't register IRQ %d, error code: %d\n", VBUS_RISE_IRQ
, ret
);
375 os_printk(K_DEBUG
,"Register IRQ %d\n", VBUS_RISE_IRQ
);
377 os_printk(K_DEBUG
,"USB Disable IRQ: %d\n", VBUS_RISE_IRQ
);
378 os_disableIrq(VBUS_RISE_IRQ
);
379 os_enableIrq(VBUS_RISE_IRQ
);
381 /* register SSUSB_VBUS_FALL_INT */
382 //USBIF isrbuffer2 = (DEV_UINT8 *)os_mem_alloc(10);
383 //USBIF os_printk(K_ERR, "isrbuffer2: %x\n", isrbuffer2);
385 if(ret
= os_reg_isr((DEV_UINT16
)VBUS_FALL_IRQ
, u3d_vbus_fall_handler
, isrbuffer2
)){
386 os_printk(K_ERR
,"Roll: Can't register IRQ %d, error code: %d\n", VBUS_FALL_IRQ
, ret
);
390 os_printk(K_DEBUG
,"Register IRQ %d\n", VBUS_FALL_IRQ
);
392 os_printk(K_DEBUG
,"USB Disable IRQ: %d\n", VBUS_FALL_IRQ
);
393 os_disableIrq(VBUS_FALL_IRQ
);
394 os_enableIrq(VBUS_FALL_IRQ
);
398 void u3d_deinit(void){
399 /* register U3D ISR. */
400 mu3d_hal_initr_dis();
401 mu3d_hal_clear_intr();
403 /* release SSUSB_DEV_INT */
404 os_disableIrq(g_nirq
);
405 os_free_isr((DEV_UINT16
)g_nirq
, isrbuffer
) ;
408 // KKKKK, in ROME real chip , this should be change to use polling vbus method or .... call back from PMIC
409 /* release EXT VBUS RISE INT */
410 os_disableIrq(VBUS_RISE_IRQ
);
411 os_free_isr((DEV_UINT16
)VBUS_RISE_IRQ
, isrbuffer1
) ;
412 /* release EXT VBUS FALL INT */
413 os_disableIrq(VBUS_FALL_IRQ
);
414 os_free_isr((DEV_UINT16
)VBUS_FALL_IRQ
, isrbuffer2
) ;
418 /* reset U3D all dev module. */
419 //mu3d_hal_rst_dev();
424 void u3d_irq_en(void){
425 os_printk(K_ERR
, "%s\n", __func__
);
426 os_writel(U3D_LV1IESR
, 0xFFFFFFFF);
427 os_enableIrq(g_nirq
);
431 static void u3d_free_dma0(void){
433 DEV_INT32 ep_index
, ep_num
;
434 struct USB_EP_SETTING
*ep_setting
;
436 os_writel(U3D_EP0DMACTRL
, 0);
437 os_writel(U3D_EP0DMASTRADDR
, 0);
438 os_writel(U3D_EP0DMATFRCOUNT
, 0);
439 ep_index
= ep_num
=0;
440 ep_setting
= &g_u3d_setting
.ep_setting
[ep_index
];
447 void u3d_power_mode(DEV_INT32 mode
, DEV_INT8 u1_value
, DEV_INT8 u2_value
, DEV_INT8 en_u1
, DEV_INT8 en_u2
){
451 printk("mode : 0x%08X\n",mode
);
452 printk("u1_value : 0x%08X\n",u1_value
);
453 printk("u2_value : 0x%08X\n",u2_value
);
454 printk("en_u1 : 0x%08X\n",en_u1
);
455 printk("en_u2 : 0x%08X\n",en_u2
);
457 if((mode
== 0)||(mode
== 4)){
458 os_writel(U3D_LINK_POWER_CONTROL
, 0);
461 //os_writel(U3D_LINK_POWER_CONTROL, os_readl(U3D_LINK_POWER_CONTROL) | LGO_U1);
462 os_writel(U3D_LINK_POWER_CONTROL
, os_readl(U3D_LINK_POWER_CONTROL
) & ~(SW_U1_REQUEST_ENABLE
| SW_U2_REQUEST_ENABLE
));
463 os_writel(U3D_LINK_POWER_CONTROL
, os_readl(U3D_LINK_POWER_CONTROL
) | SW_U1_REQUEST_ENABLE
);
464 temp
= os_readl(U3D_LINK_UX_INACT_TIMER
);
465 temp
&= ~U1_INACT_TIMEOUT_VALUE
;
467 os_writel(U3D_LINK_UX_INACT_TIMER
, temp
);
470 //os_writel(U3D_LINK_POWER_CONTROL, os_readl(U3D_LINK_POWER_CONTROL) | LGO_U2);
471 os_writel(U3D_LINK_POWER_CONTROL
, os_readl(U3D_LINK_POWER_CONTROL
) & ~(SW_U1_REQUEST_ENABLE
| SW_U2_REQUEST_ENABLE
));
472 os_writel(U3D_LINK_POWER_CONTROL
, os_readl(U3D_LINK_POWER_CONTROL
) | SW_U2_REQUEST_ENABLE
);
473 temp
= os_readl(U3D_LINK_UX_INACT_TIMER
);
474 temp
&= ~DEV_U2_INACT_TIMEOUT_VALUE
;
475 temp
|= (u2_value
<<16);
476 os_writel(U3D_LINK_UX_INACT_TIMER
, temp
);
482 os_writel(U3D_LINK_POWER_CONTROL
, os_readl(U3D_LINK_POWER_CONTROL
) & ~(SW_U1_REQUEST_ENABLE
| SW_U2_REQUEST_ENABLE
));
483 os_writel(U3D_LINK_POWER_CONTROL
, os_readl(U3D_LINK_POWER_CONTROL
) | SW_U1_REQUEST_ENABLE
);
484 temp
= os_readl(U3D_LINK_UX_INACT_TIMER
);
485 temp
&= ~U1_INACT_TIMEOUT_VALUE
;
487 os_writel(U3D_LINK_UX_INACT_TIMER
, temp
);
488 while(!((os_readl(U3D_LINK_STATE_MACHINE
)<SSM
)==STATE_U1_STATE
));
490 os_writel(U3D_LINK_UX_INACT_TIMER
, 0);
491 os_writel(U3D_LINK_POWER_CONTROL
, os_readl(U3D_LINK_POWER_CONTROL
) | UX_EXIT
);
492 while((os_readl(U3D_LINK_POWER_CONTROL
) & UX_EXIT
));
497 os_writel(U3D_LINK_POWER_CONTROL
, os_readl(U3D_LINK_POWER_CONTROL
) & ~(SW_U1_REQUEST_ENABLE
| SW_U2_REQUEST_ENABLE
));
498 os_writel(U3D_LINK_POWER_CONTROL
, os_readl(U3D_LINK_POWER_CONTROL
) | SW_U2_REQUEST_ENABLE
);
499 temp
= os_readl(U3D_LINK_UX_INACT_TIMER
);
500 temp
&= ~DEV_U2_INACT_TIMEOUT_VALUE
;
501 temp
|= (u2_value
<<16);
502 os_writel(U3D_LINK_UX_INACT_TIMER
, temp
);
503 while(!((os_readl(U3D_LINK_STATE_MACHINE
)<SSM
)==STATE_U2_STATE
));
505 os_writel(U3D_LINK_UX_INACT_TIMER
, 0);
506 os_writel(U3D_LINK_POWER_CONTROL
, os_readl(U3D_LINK_POWER_CONTROL
) | UX_EXIT
);
507 while((os_readl(U3D_LINK_POWER_CONTROL
) & UX_EXIT
));
511 os_writel(U3D_LINK_POWER_CONTROL
, os_readl(U3D_LINK_POWER_CONTROL
) | SW_U1_ACCEPT_ENABLE
| SW_U1_REQUEST_ENABLE
);
514 os_writel(U3D_LINK_POWER_CONTROL
, os_readl(U3D_LINK_POWER_CONTROL
) | SW_U2_ACCEPT_ENABLE
| SW_U2_REQUEST_ENABLE
);
518 os_writel(U3D_LINK_POWER_CONTROL
, os_readl(U3D_LINK_POWER_CONTROL
) | UX_EXIT
);
522 DEV_UINT8
u3d_transfer_complete(DEV_INT32 ep_num
, USB_DIR dir
){
523 DEV_INT32 ep_index
=0;
528 else if(dir
== USB_RX
){
529 ep_index
= ep_num
+ MAX_EP_NUM
;
535 return g_u3d_req
[ep_index
].complete
;
538 DEV_UINT8
req_complete(DEV_INT32 ep_num
, USB_DIR dir
){
539 struct USB_REQ
*req
= mu3d_hal_get_req(ep_num
, dir
);
551 * u3d_config_dma0 - config ep0 dma
554 static void u3d_config_dma0(DEV_INT32 burst_mode
, DEV_INT32 dir
, DEV_INT32 addr
, DEV_INT32 count
){
556 DEV_UINT32 usb_dma_cntl
= 0;
557 #if defined(USB_RISC_CACHE_ENABLED)
558 os_flushinvalidateDcache();
560 os_printk(K_DEBUG
, "u3d_config_dma0\n");
561 os_printk(K_DEBUG
, "DMA CTRL0 :%d\n", usb_dma_cntl
);
562 os_printk(K_DEBUG
, "addr: %x\n",addr
);
563 os_printk(K_DEBUG
, "count: %x\n",count
);
565 usb_dma_cntl
= ((dir
&0x1)<<1) | INTEN
;
566 os_writel(U3D_EP0DMACTRL
, usb_dma_cntl
);
567 os_writel(U3D_EP0DMASTRADDR
, addr
);
568 os_writel(U3D_EP0DMATFRCOUNT
, count
);
570 /*<Caution> DMA_OUTSTAND_NUM at U3D_EP0DMARLCOUNT should NOT clear to 0. If so, DMA does NOT work anymore.*/
571 os_writel(U3D_EP0DMARLCOUNT
, os_readl(U3D_EP0DMARLCOUNT
) | ((burst_mode
&0x3) << DMA_BURST_OFST
));
572 os_writel(U3D_EP0DMACTRL
, os_readl(U3D_EP0DMACTRL
)|DMA_EN
);
577 * u3d_ep0en - enable ep0 function
583 struct USB_EP_SETTING
*ep_setting
;
585 os_printk(K_ERR
, "%s\n", __func__
);
587 ep_setting
= &g_u3d_setting
.ep_setting
[0];
588 ep_setting
->transfer_type
= USB_CTRL
;
589 ep_setting
->dir
= USB_TX
;
590 ep_setting
->fifoaddr
= 0;
591 ep_setting
->enabled
= 1;
592 if((os_readl(U3D_DEVICE_CONF
) & SSUSB_DEV_SPEED
) == SSUSB_SPEED_SUPER
)
594 ep_setting
->fifosz
= 512;
595 ep_setting
->maxp
= 512;
599 ep_setting
->fifosz
= 64;
600 ep_setting
->maxp
= 64;
604 temp
= ep_setting
->maxp
;
609 temp
|= EP0_AUTOCLEAR
;
611 //leave this bit on so that EP0 flow can switch between PIO & DMA easily
612 //there is no EP0 DMA interrupt event under PIO mode
613 //temp |= ((g_ep0_mode == PIO_MODE) ? EP0_DMAREQEN : 0);
614 #if (EP0_BUS_MODE==DMA_MODE)
615 temp
|= EP0_DMAREQEN
;
617 os_writel(U3D_EP0CSR
, temp
);
619 //enable EP0 interrupts
620 os_setmsk(U3D_EPIESR
, (EP0ISR
| SETUPENDISR
));
626 void u3d_allocate_ep0_buffer(void)
628 g_dma_buffer
[0] = (DEV_UINT8
*)os_mem_alloc(USB_BUF_SIZE
);
631 void u3d_initialize_drv(void){
633 USB_SPEED speed
= g_u3d_setting
.speed
;
635 os_printk(K_ERR
, "%s\n", __func__
);
637 /* initialize ep fifo address*/
638 g_TxFIFOadd
= USB_TX_FIFO_START_ADDRESS
;
639 g_RxFIFOadd
= USB_RX_FIFO_START_ADDRESS
;
640 /* initialize ep0 state*/
641 g_ep0_state
= EP0_IDLE
;
642 /* initialize test setting and test status structures */
643 os_memset((DEV_UINT32
*)(&g_u3d_setting
), 0 , sizeof(struct USB_TEST_SETTING
));
644 g_u3d_setting
.speed
= speed
; /* reserve speed setting */
645 os_memset((DEV_UINT32
*)(&g_usb_status
), 0 , sizeof(struct USB_TEST_STATUS
));
647 for(i
= 0; i
< 2 * MAX_EP_NUM
+ 1; i
++){
648 os_memset((DEV_UINT32
*)(&g_u3d_req
[i
]), 0 , sizeof(struct USB_REQ
));
650 g_u3d_req
[0].buf
= g_dma_buffer
[0];
651 g_u3d_status
= READY
;
653 //enable system global interrupt
654 mu3d_hal_system_intr_en();
660 g_run_stress
= false;
661 g_insert_hwo
= false;
663 #if !defined(USB_RISC_CACHE_ENABLED)
668 void u3d_set_address(DEV_INT32 addr
){
670 os_writel(U3D_DEVICE_CONF
, (addr
<<DEV_ADDR_OFST
));
674 void u3d_rxep_dis(DEV_INT32 ep_num
){
675 os_writel(U3D_EPIECR
, os_readl(U3D_EPIECR
)|(BIT16
<< ep_num
));
679 * u3d_ep_start_transfer - epn start to transfer data, do not be used in qmu mode
680 *@args -arg1:ep number, arg2: dir
682 void u3d_ep_start_transfer(DEV_INT32 ep_num
, USB_DIR dir
){
684 DEV_INT32 ep_index
=0, length
, maxp
;
685 struct USB_EP_SETTING
*ep_setting
;
693 else if(dir
== USB_RX
){
694 ep_index
= ep_num
+ MAX_EP_NUM
;
700 ep_setting
= &g_u3d_setting
.ep_setting
[ep_index
];
701 req
= &g_u3d_req
[ep_index
];
703 if(ep_setting
->enabled
){
705 if((dir
== USB_TX
) && (ep_num
!= 0)){
707 os_writel(U3D_EPIESR
, os_readl(U3D_EPIESR
)|(BIT0
<< ep_num
));
711 #if (BUS_MODE==PIO_MODE)
712 bp
= req
->buf
+ req
->actual
;
714 maxp
= ep_setting
->maxp
;
716 if(req
->count
- req
->actual
> maxp
){
717 length
= ep_setting
->maxp
;
720 length
= req
->count
- req
->actual
;
722 req
->actual
+= length
;
724 need_zlp
= ((req
->actual
== req
->count
) && (!(req
->count
% maxp
)) && ep_num
!=0);
725 mu3d_hal_write_fifo(ep_num
, length
, bp
, maxp
);
727 /* Here is really tricky, need to print this log to pass EPn PIO loopback
728 * No time to figure out why. Sorry~
730 printk("zlp=%d\n",need_zlp
);
732 while(!(USB_ReadCsr32(U3D_TX1CSR0
, ep_num
) & TX_FIFOFULL
)) {
733 os_printk(K_ALET
, "send zlp\n");
734 mu3d_hal_write_fifo(ep_num
, 0, bp
, maxp
);
740 else if(dir
== USB_RX
){
743 req
->count
= USB_BUF_SIZE
;
744 os_writel(U3D_EPIESR
, os_readl(U3D_EPIESR
)|(BIT16
<< ep_num
));
750 os_printk(K_ALET
,"EP%d is not enabled\n", ep_num
);
758 DEV_UINT8
u3d_command(void){
759 return Request
->bCommand
;
762 void *u3d_req_buffer(void){
763 return AT_CMD
->buffer
;
766 void u3d_alloc_req(void){
767 Request
=(DEV_REQ
*)os_mem_alloc(sizeof(DEV_REQ
));
768 Request
->buffer
=(DEV_UINT8
*)os_mem_alloc(2048);
769 AT_CMD
=(DEV_AT_CMD
*)os_mem_alloc(sizeof(DEV_AT_CMD
));
770 AT_CMD
->buffer
=(DEV_UINT8
*)os_mem_alloc(2048);
774 DEV_UINT8
u3d_req_valid(void){
775 return Request
->bValid
;
778 void u3d_rst_request(void)
780 os_printk(K_ERR
, "%s\n", __func__
);
782 Request
->bmRequestType
=0;
790 void dev_power_mode(DEV_INT32 mode
, DEV_INT8 u1_value
, DEV_INT8 u2_value
, DEV_INT8 en_u1
, DEV_INT8 en_u2
){
791 u3d_power_mode(mode
,u1_value
,u2_value
,en_u1
, en_u2
);
794 void dev_send_one_packet(DEV_INT32 ep_tx
){
800 req
= mu3d_hal_get_req(ep_tx
, USB_TX
);
801 dma_buf
= g_loopback_buffer
[0];
802 req
->buf
= g_loopback_buffer
[0];
803 os_memset(req
->buf
, 0 , 1000000);
804 mapping
= dma_map_single(NULL
, dma_buf
,g_dma_buffer_size
, DMA_BIDIRECTIONAL
);
805 dma_sync_single_for_device(NULL
, mapping
, g_dma_buffer_size
, DMA_BIDIRECTIONAL
);
806 req
->dma_adr
= mapping
;
808 mu3d_hal_insert_transfer_gpd(ep_tx
,USB_TX
, req
->dma_adr
, req
->count
, true, true, false, false, 1024);
809 mu3d_hal_resume_qmu(ep_tx
, USB_TX
);
810 mapping
=req
->dma_adr
;
811 dma_sync_single_for_cpu(NULL
, mapping
, g_dma_buffer_size
, DMA_BIDIRECTIONAL
);
812 dma_unmap_single(NULL
, mapping
, g_dma_buffer_size
,DMA_BIDIRECTIONAL
);
815 void dev_send_erdy(DEV_INT8 opt
,DEV_INT32 ep_rx
, DEV_INT32 ep_tx
){
817 //send ERDY until LTSSM goes to U1/U2
818 while ((os_readl(U3D_LINK_STATE_MACHINE
)<SSM
) == STATE_U0_STATE
);
819 os_writel(U3D_USB3_SW_ERDY
, (ep_tx
<<2)|SW_SEND_ERDY
);
823 void dev_receive_ep0_test_packet(DEV_INT8 opt
){
828 spin_lock_irqsave(&_lock
, flags
);
829 os_writel(U3D_EP0CSR
, os_readl(U3D_EP0CSR
) & (~EP0_DMAREQEN
));
830 while(!(os_readl(U3D_EP0CSR
)&EP0_SETUPPKTRDY
));
831 mu3d_hal_read_fifo(0,g_u3d_req
[0].buf
);
833 os_writel(U3D_EP0CSR
,os_readl(U3D_EP0CSR
) | EP0_SETUPPKTRDY
| EP0_DATAEND
);
834 os_writel(U3D_EP0CSR
, os_readl(U3D_EP0CSR
) | EP0_DMAREQEN
); // protect for PIO mode
835 spin_unlock_irqrestore(&_lock
, flags
);
840 void dev_u1u2_en_cond(DEV_INT8 opt
,DEV_INT8 cond
,DEV_INT32 ep_rx
, DEV_INT32 ep_tx
){
842 struct USB_REQ
*treq
, *rreq
;
844 DEV_UINT32 temp
, maxp
;
845 DEV_UINT8
* dma_buf
,zlp
;
847 rreq
= mu3d_hal_get_req(ep_rx
, USB_RX
);
848 treq
= mu3d_hal_get_req(ep_tx
, USB_TX
);
849 dma_buf
= g_loopback_buffer
[0];
850 treq
->buf
=rreq
->buf
=g_loopback_buffer
[0];
851 os_memset(rreq
->buf
, 0 , 1000000);
852 mapping
= dma_map_single(NULL
, dma_buf
,g_dma_buffer_size
, DMA_BIDIRECTIONAL
);
853 dma_sync_single_for_device(NULL
, mapping
, g_dma_buffer_size
, DMA_BIDIRECTIONAL
);
854 treq
->dma_adr
=rreq
->dma_adr
=mapping
;
855 treq
->count
=rreq
->count
=0x1000;
856 zlp
= (USB_ReadCsr32(U3D_TX1CSR1
, ep_tx
) & TYPE_ISO
) ? false : true;
857 maxp
= USB_ReadCsr32(U3D_RX1CSR0
, ep_rx
) & RX_RXMAXPKTSZ
;
861 mu3d_hal_insert_transfer_gpd(ep_tx
,USB_TX
, treq
->dma_adr
,treq
->count
, true, true, false, zlp
, maxp
);
862 mu3d_hal_resume_qmu(ep_tx
, USB_TX
);
865 mu3d_hal_insert_transfer_gpd(ep_rx
,USB_RX
, rreq
->dma_adr
, rreq
->count
, true, true, false, zlp
, maxp
);
866 mu3d_hal_resume_qmu(ep_rx
, USB_RX
);
869 temp
= USB_ReadCsr32(U3D_TX1CSR0
, ep_tx
) & 0xFFFEFFFF;
870 USB_WriteCsr32(U3D_TX1CSR0
, ep_tx
, (temp
&~ TX_DMAREQEN
) | TX_AUTOSET
);
871 os_writel(U3D_QGCSR
, 0);
872 os_memset(treq
->buf
, 0xff , 1000000);
874 mu3d_hal_write_fifo_burst(ep_tx
,treq
->count
,treq
->buf
, maxp
);
877 mu3d_hal_stop_qmu(ep_tx
, USB_TX
);
878 while((os_readl(USB_QMU_TQCSR(ep_tx
)) & (QMU_Q_ACTIVE
)));
879 mu3d_hal_stop_qmu(ep_rx
, USB_RX
);
880 while((os_readl(USB_QMU_RQCSR(ep_rx
)) & (QMU_Q_ACTIVE
)));
882 mapping
=rreq
->dma_adr
;
883 dma_sync_single_for_cpu(NULL
, mapping
, g_dma_buffer_size
, DMA_BIDIRECTIONAL
);
884 dma_unmap_single(NULL
, mapping
, g_dma_buffer_size
,DMA_BIDIRECTIONAL
);
887 void dev_u1u2_en_ctrl(DEV_INT8 type
,DEV_INT8 u_num
,DEV_INT8 opt
,DEV_INT8 cond
,DEV_INT8 u1_value
, DEV_INT8 u2_value
){
889 DEV_INT32 temp
,ux_en_ctrl
,ux_base
;
891 os_printk(K_ALET
,"type :%d\n",type
);
892 os_printk(K_ALET
,"u_num :%d\n",u_num
);
893 os_printk(K_ALET
,"opt :%d\n",opt
);
894 os_printk(K_ALET
,"cond :%d\n",cond
);
895 os_printk(K_ALET
,"value1 :%d\n",u1_value
);
896 os_printk(K_ALET
,"value2 :%d\n",u2_value
);
899 ux_en_ctrl
= (u_num
== 1) ? U3D_MAC_U1_EN_CTRL
: U3D_MAC_U2_EN_CTRL
;
900 ux_base
= (type
== 2) ? 16 : 0;
903 temp
= (!cond
) ? cond
: EXIT_BY_ERDY_DIS
;
904 os_writel(ux_en_ctrl
, temp
);
907 temp
= (!cond
) ? cond
: 1<<(opt
+ux_base
-1);
908 os_writel(ux_en_ctrl
, temp
);
912 os_writel(ux_en_ctrl
, 1<<(opt
+ux_base
-1));
916 if(type
== 1){// request
919 os_writel(U3D_LINK_POWER_CONTROL
, SW_U1_REQUEST_ENABLE
);
922 os_writel(U3D_LINK_POWER_CONTROL
, SW_U2_REQUEST_ENABLE
);
924 temp
= os_readl(U3D_LINK_UX_INACT_TIMER
);
925 temp
&= ~(DEV_U2_INACT_TIMEOUT_VALUE
| U1_INACT_TIMEOUT_VALUE
);
926 temp
|= ((u1_value
)|(u2_value
<<16));
927 os_writel(U3D_LINK_UX_INACT_TIMER
, temp
);
929 if(type
== 2){// accept
931 os_writel(U3D_LINK_POWER_CONTROL
, SW_U1_ACCEPT_ENABLE
);
934 os_writel(U3D_LINK_POWER_CONTROL
, SW_U2_ACCEPT_ENABLE
);
938 os_writel(U3D_LINK_UX_INACT_TIMER
, 0);
939 os_writel(U3D_LINK_POWER_CONTROL
, 0);
940 os_writel(U3D_MAC_U1_EN_CTRL
, 0);
941 os_writel(U3D_MAC_U2_EN_CTRL
, 0);
945 #define STS_CHK_CLEAR 0
948 #define STS_CHK_U1_REJECT 3
949 #define STS_CHK_U2_REJECT 4
950 #define STS_CHK_HOT_RST 5
951 #define STS_CHK_WARM_RST 6
952 #define STS_CHK_FORCE_LINK_PM_ACPT 7
953 #define STS_CHK_RX_LEN_ERR 8
954 DEV_INT8
dev_stschk(DEV_INT8 type
, DEV_INT8 change
){
959 case STS_CHK_CLEAR
: //clear mode
962 if (!(os_readl(U3D_SSUSB_U3_CTRL_0P
) & SSUSB_U3_PORT_PDN
))
964 os_writel(U3D_USB3_U1_STATE_INFO
, CLR_USB3_U1_CNT
);
965 os_writel(U3D_USB3_U2_STATE_INFO
, CLR_USB3_U2_CNT
);
966 os_writel(U3D_USB3_U1_REJECT
, CLR_USB3_U1_REJECT_CNT
);
967 os_writel(U3D_USB3_U2_REJECT
, CLR_USB3_U2_REJECT_CNT
);
973 g_rx_len_err_cnt
= 0;
976 case STS_CHK_U1
: //U1
977 cnt
= os_readl(U3D_USB3_U1_STATE_INFO
)&USB3_U1_CNT
;
979 case STS_CHK_U2
: //U2
980 cnt
= os_readl(U3D_USB3_U2_STATE_INFO
)&USB3_U2_CNT
;
982 case STS_CHK_U1_REJECT
: //U1_reject
983 cnt
= os_readl(U3D_USB3_U1_REJECT
)&USB3_U1_REJECT_CNT
;
985 case STS_CHK_U2_REJECT
: //U2_reject
986 cnt
= os_readl(U3D_USB3_U2_REJECT
)&USB3_U2_REJECT_CNT
;
988 case STS_CHK_HOT_RST
: //hot reset
991 case STS_CHK_WARM_RST
: //warm reset
992 cnt
= g_warm_rst_cnt
;
994 case STS_CHK_FORCE_LINK_PM_ACPT
: //force link pm
995 cnt
= (os_readl(U3D_HOST_SET_PORT_CTRL
) & FORCE_LINK_PM_ACPT
) ? 1 : 0;
998 case STS_CHK_RX_LEN_ERR
: //RX length error
999 cnt
= g_rx_len_err_cnt
;
1004 //cnt should be greater than 0 if change is expected
1005 //cnt should be 0 if change is not expected
1006 os_printk(K_NOTICE
, "type: %d, change: %d, cnt: %x\n", type
, change
, cnt
);
1007 if ((change
&& cnt
) || (!change
&& !cnt
) || (type
== 0))
1008 return RET_SUCCESS
; //RET_SUCCESS
1010 return RET_FAIL
; //RET_FAIL
1013 void dev_lpm_config_dev(LPM_INFO
*lpm_info
){
1014 #define LPM_MODE_NORMAL 0
1015 #define LPM_MODE_FRC_REJECT 1
1016 #define LPM_MODE_FRC_ACCEPT 2
1017 #define LPM_MODE_FRC_TIMEOUT 3
1018 #define LPM_MODE_FRC_STALL 4
1019 #define LPM_MODE_HW_LPM 5
1020 #define LPM_RESUME_HOST 0
1021 #define LPM_RESUME_DEVICE_SW 1
1022 #define LPM_RESUME_DEVICE_HW 2
1023 #define LPM_RESUME_DEVICE_SW_2 3
1024 #define LPM_INACT_EP0 0
1025 #define LPM_INACT_TXQ 1
1026 #define LPM_INACT_RXQ 2
1027 #define LPM_INACT_BMU_TX 3
1028 #define LPM_INACT_BMU_RX 4
1032 os_printk(K_ALET
,"dev_lpm_config_dev\n");
1033 os_printk(K_ALET
,"lpm_mode: %d\n",lpm_info
->lpm_mode
);
1034 os_printk(K_ALET
,"wakeup: %d\n",lpm_info
->wakeup
);
1035 os_printk(K_ALET
,"beslck: %d\n",lpm_info
->beslck
);
1036 os_printk(K_ALET
,"beslck_u3: %d\n",lpm_info
->beslck_u3
);
1037 os_printk(K_ALET
,"besldck: %d\n",lpm_info
->besldck
);
1038 os_printk(K_ALET
,"cond: %d\n",lpm_info
->cond
);
1039 os_printk(K_ALET
,"cond_en: %d\n",lpm_info
->cond_en
);
1040 os_printk(K_ALET
,"\n");
1044 os_writel(U3D_POWER_MANAGEMENT
,
1045 (os_readl(U3D_POWER_MANAGEMENT
) &~ LPM_MODE
)
1046 | (((lpm_info
->lpm_mode
== LPM_MODE_HW_LPM
) ? LPM_MODE_NORMAL
: lpm_info
->lpm_mode
)<<8));
1049 os_writel(U3D_USB2_TEST_MODE
,
1050 (os_readl(U3D_USB2_TEST_MODE
) & ~(FIFO_ACCESS
| LPM_FORCE_STALL
))
1051 | ((lpm_info
->lpm_mode
== LPM_MODE_FRC_STALL
) ? LPM_FORCE_STALL
: 0));
1057 os_writel(U3D_POWER_MANAGEMENT
,
1058 (os_readl(U3D_POWER_MANAGEMENT
) &~ LPM_HRWE
)
1059 | ((lpm_info
->wakeup
== LPM_RESUME_DEVICE_HW
) ? LPM_HRWE
: 0));
1061 //enable HRWE by default; let RWE bit in LPM token decides if remote wakeup is enabled
1062 os_writel(U3D_POWER_MANAGEMENT
, os_readl(U3D_POWER_MANAGEMENT
) | LPM_HRWE
);
1065 os_writel(U3D_USB2_EPCTL_LPM
,
1066 ((lpm_info
->wakeup
== LPM_RESUME_DEVICE_HW
) ?
1067 (L1_EXIT_EP0_CHK
| L1_EXIT_EP_IN_CHK
| L1_EXIT_EP_OUT_CHK
) : 0));
1070 g_sw_rw
= (lpm_info
->wakeup
== LPM_RESUME_DEVICE_SW
) ? 1 : 0;
1071 //SW REMOTE WAKEUP TEST MODE, drive resume before entering suspend
1072 if (lpm_info
->wakeup
== LPM_RESUME_DEVICE_SW_2
)
1074 os_writel(U3D_POWER_MANAGEMENT
, os_readl(U3D_POWER_MANAGEMENT
) | RESUME
);
1077 g_hw_rw
= (lpm_info
->wakeup
== LPM_RESUME_DEVICE_HW
) ? 1 : 0;
1080 //BESLCK <= BESLCK_U3 <= BESLDCK
1081 dwTemp
= (((DEV_UINT32
)lpm_info
->beslck_u3
<<BESLCK_U3_OFST
) & BESLCK_U3
)
1082 | (((DEV_UINT32
)lpm_info
->beslck
<<BESLCK_OFST
) & BESLCK
)
1083 | (((DEV_UINT32
)lpm_info
->besldck
<<BESLDCK_OFST
) & BESLDCK
);
1084 os_writel(U3D_USB20_LPM_PARAMETER
, dwTemp
);
1087 os_writelmsk(U3D_POWER_MANAGEMENT
,
1088 (lpm_info
->beslck
&0x10) ? LPM_BESL_STALL
: 0, LPM_BESL_STALL
);
1089 os_writelmsk(U3D_POWER_MANAGEMENT
,
1090 (lpm_info
->besldck
&0x10) ? LPM_BESLD_STALL
: 0, LPM_BESLD_STALL
);
1093 //LPM INACTIVITY checker
1095 os_writel(U3D_MAC_U2_EN_CTRL
, ACCEPT_EP0_INACTIVE_CHK
);
1097 os_writel(U3D_MAC_U2_EN_CTRL
,
1098 (os_readl(U3D_MAC_U2_EN_CTRL
) & ~(0x1f<<16))
1099 | (lpm_info
->cond_en
? 1<<(lpm_info
->cond
+16) : 0));
1104 * reset_dev - device reset flow
1107 void reset_dev(USB_SPEED speed
, DEV_UINT8 det_speed
, DEV_UINT8 sw_rst
){
1111 os_disableIrq(g_nirq
);
1116 //reset or just disconnect IP
1124 mu3d_hal_ssusb_en();
1127 os_writel(U3D_USB3_CONFIG
, 0);
1129 mu3d_hal_u2dev_disconn();
1131 //make sure speed_chg_intr is cleared before enabling U2 or U3 port again
1132 os_writel(U3D_DEV_LINK_INTR_ENABLE
, 0);
1133 os_writel(U3D_DEV_LINK_INTR
, SSUSB_DEV_SPEED_CHG_INTR
);
1138 //disable IP/U2 MAC/U3 MAC power down
1139 mu3d_hal_ssusb_en();
1141 //apply default register values
1146 mu3d_hal_set_speed(speed
);
1147 //detect connect speed
1148 mu3d_hal_det_speed(speed
, det_speed
);
1153 * Don't enable interrupt at this moment.
1154 * Before enable interrput, We should finish all the setting
1157 u3d_initialize_drv();
1158 #if (BUS_MODE==QMU_MODE)
1160 mu3d_hal_init_qmu();
1164 #ifdef POWER_SAVING_MODE
1165 //power down unused port
1166 mu3d_hal_pdn_cg_en();
1174 * u3d_stall_status - return stall status
1178 DEV_UINT8
u3d_stall_status(void){
1179 DEV_UINT32 i
, tx_ep_num
, rx_ep_num
;
1183 tx_ep_num
= MAX_QMU_EP
;
1184 rx_ep_num
= MAX_QMU_EP
;
1186 tx_ep_num
= os_readl(U3D_CAP_EPINFO
) & CAP_TX_EP_NUM
;
1187 rx_ep_num
= (os_readl(U3D_CAP_EPINFO
) & CAP_RX_EP_NUM
) >> 8;
1191 for(i
=1; i
<=tx_ep_num
; i
++){
1192 if(USB_ReadCsr32(U3D_TX1CSR0
, i
) & TX_SENDSTALL
){
1195 if(USB_ReadCsr32(U3D_TX1CSR0
, i
) & TX_SENTSTALL
){
1199 for(i
=1; i
<=rx_ep_num
; i
++){
1200 if(USB_ReadCsr32(U3D_RX1CSR0
, i
) & RX_SENDSTALL
){
1203 if(USB_ReadCsr32(U3D_TX1CSR0
, i
) & RX_SENTSTALL
){
1213 * u3d_clear_stall_all - clear all stall
1216 void u3d_clear_stall_all(void){
1217 DEV_UINT32 i
, tx_ep_num
, rx_ep_num
, tx_q_num
, rx_q_num
;
1220 tx_q_num
= tx_ep_num
= MAX_QMU_EP
;
1221 rx_q_num
= rx_ep_num
= MAX_QMU_EP
;
1223 tx_q_num
= tx_ep_num
= os_readl(U3D_CAP_EPINFO
) & CAP_TX_EP_NUM
;
1224 rx_q_num
= rx_ep_num
= (os_readl(U3D_CAP_EPINFO
) & CAP_RX_EP_NUM
) >> 8;
1227 for(i
=1; i
<=tx_ep_num
; i
++){
1228 USB_WriteCsr32(U3D_TX1CSR0
, i
, USB_ReadCsr32(U3D_TX1CSR0
, i
) & ~TX_SENDSTALL
);
1229 USB_WriteCsr32(U3D_TX1CSR0
, i
, USB_ReadCsr32(U3D_TX1CSR0
, i
) | TX_SENTSTALL
);
1231 for(i
=1; i
<=rx_ep_num
; i
++){
1232 USB_WriteCsr32(U3D_RX1CSR0
, i
, USB_ReadCsr32(U3D_RX1CSR0
, i
) & ~RX_SENDSTALL
);
1233 USB_WriteCsr32(U3D_RX1CSR0
, i
, USB_ReadCsr32(U3D_RX1CSR0
, i
) | RX_SENTSTALL
);
1236 for(i
=1; i
<=tx_q_num
; i
++){
1238 mu3d_hal_flush_qmu(i
,USB_TX
);
1239 mu3d_hal_restart_qmu(i
,USB_TX
);
1241 for(i
=1; i
<=rx_q_num
; i
++){
1243 mu3d_hal_flush_qmu(i
,USB_RX
);
1244 mu3d_hal_restart_qmu(i
,USB_RX
);
1250 * u3d_stall_all - stall all epn
1254 void u3d_stall_all(void){
1255 DEV_UINT32 i
, tx_ep_num
, rx_ep_num
;
1258 tx_ep_num
= MAX_QMU_EP
;
1259 rx_ep_num
= MAX_QMU_EP
;
1261 tx_ep_num
= os_readl(U3D_CAP_EPINFO
) & CAP_TX_EP_NUM
;
1262 rx_ep_num
= (os_readl(U3D_CAP_EPINFO
) & CAP_RX_EP_NUM
) >> 8;
1265 for(i
=1; i
<=tx_ep_num
; i
++){
1266 USB_WriteCsr32(U3D_TX1CSR0
, i
, USB_ReadCsr32(U3D_TX1CSR0
, i
) | TX_SENDSTALL
);
1269 for(i
=1; i
<=rx_ep_num
; i
++){
1270 USB_WriteCsr32(U3D_RX1CSR0
, i
, USB_ReadCsr32(U3D_RX1CSR0
, i
) | RX_SENDSTALL
);
1276 * u3d_send_ep0_stall - send an ep0 stall
1280 void u3d_send_ep0_stall(void){
1283 //os_setmsk(U3D_EP_RST, EP0_RST);
1284 //os_clrmsk(U3D_EP_RST, EP0_RST);
1286 os_writel(U3D_EP0CSR
, os_readl(U3D_EP0CSR
) | EP0_SENDSTALL
);
1287 while(!(os_readl(U3D_EP0CSR
) & EP0_SENTSTALL
));
1288 os_writel(U3D_EP0CSR
, os_readl(U3D_EP0CSR
) | EP0_SENTSTALL
);
1292 void u3d_dev_loopback(DEV_INT32 ep_rx
,DEV_INT32 ep_tx
){
1293 struct USB_REQ
*treq
, *rreq
;
1295 rreq
= mu3d_hal_get_req(ep_rx
, USB_RX
);
1296 treq
= mu3d_hal_get_req(ep_tx
, USB_TX
);
1297 treq
->buf
= g_loopback_buffer
[0];
1298 rreq
->buf
= g_loopback_buffer
[0];
1299 /* epn rx enable. */
1300 u3d_ep_start_transfer(ep_rx
, USB_RX
);
1301 os_printk(K_DEBUG
,"RX start..\n");
1302 while(!req_complete(ep_rx
, USB_RX
));
1303 os_printk(K_DEBUG
,"RX complete!!\n");
1306 if(TransferLength
> gpd_buf_size
){
1307 treq
->count
= gpd_buf_size
;
1308 TransferLength
-= gpd_buf_size
;
1310 treq
->count
= TransferLength
;
1313 /* epn start to transmit data. */
1314 u3d_ep_start_transfer(ep_tx
, USB_TX
);
1315 os_printk(K_DEBUG
,"TX start..\n");
1316 while(!req_complete(ep_tx
, USB_TX
));
1317 treq
->buf
+=gpd_buf_size
;
1318 }while(TransferLength
>0);
1320 os_printk(K_DEBUG
,"TX complete!!\n");
1321 treq
->count
= rreq
->actual
=0;
1322 u3d_rxep_dis(ep_rx
);
1325 DEV_UINT8
u3d_device_halt(void){
1326 return g_device_halt
;
1329 void u3d_ep0_tx(void)
1331 DEV_INT32 count
, length
, maxp
;
1332 struct USB_EP_SETTING
*ep_setting
;
1333 struct USB_REQ
*req
;
1336 req
= &g_u3d_req
[0];
1337 ep_setting
= &g_u3d_setting
.ep_setting
[0];
1339 if (g_ep0_mode
== PIO_MODE
)
1341 bp
= req
->buf
+ req
->actual
;
1342 maxp
= ep_setting
->maxp
;
1344 if(req
->count
- req
->actual
> maxp
)
1345 length
= ep_setting
->maxp
;
1347 length
= req
->count
- req
->actual
;
1349 req
->actual
+= length
;
1350 count
= mu3d_hal_write_fifo(0, length
, bp
, maxp
);
1354 g_ep0_state
= EP0_IDLE
;
1360 os_printk(K_DEBUG
,"count :%d\n",count
);
1361 os_printk(K_DEBUG
,"ep_setting->maxp :%d\n",ep_setting
->maxp
);
1362 os_printk(K_DEBUG
,"needZLP :%d\n",g_u3d_req
[0].needZLP
);
1363 os_printk(K_DEBUG
,"U3D_EP0CSR :%x\n", os_readl(U3D_EP0CSR
));
1364 os_printk(K_DEBUG
,"g_u3d_req[0].actual :%x\n",g_u3d_req
[0].actual
);
1365 os_printk(K_DEBUG
,"g_u3d_req[0].count :%x\n",g_u3d_req
[0].count
);
1366 os_printk(K_DEBUG
,"req->count :%d\n",req
->count
);
1367 os_printk(K_DEBUG
,"req->actual :%d\n",req
->count
);
1371 req
= &g_u3d_req
[0];
1373 if(req
->complete
== 1)
1375 os_printk(K_ERR
,"1 completed!\r\n");
1380 os_printk(K_DEBUG
,"req->actual : %d\n",req
->actual
);
1381 os_printk(K_DEBUG
,"req->count : %d\n",req
->count
);
1382 req
->currentCount
= ((req
->count
- req
->actual
) > ep_setting
->maxp
) ? ep_setting
->maxp
: req
->count
- req
->actual
;
1384 if(req
->actual
>= req
->count
)
1386 os_writel(U3D_EP0CSR
, os_readl(U3D_EP0CSR
) | EP0_DATAEND
);
1387 os_printk(K_DEBUG
,"USB_EP0_DATAEND\r\n");
1389 g_ep0_state
= EP0_IDLE
;
1391 os_printk(K_ERR
, "2 completed\n");
1392 dma_sync_single_for_cpu(&mu3d_if_dev
, (dma_addr_t
)req
->dma_adr
, USB_BUF_SIZE
, DMA_BIDIRECTIONAL
);
1393 dma_unmap_single(&mu3d_if_dev
, req
->dma_adr
, USB_BUF_SIZE
, DMA_BIDIRECTIONAL
);
1394 os_printk(K_DEBUG
,"Dma han (02): EP[0] complete, send %d bytes\r\n", req
->actual
);
1398 os_printk(K_DEBUG
,"usb_config_dma 00\n");
1399 /* config ep0 tx dma channel */
1400 u3d_config_dma0(0, USB_TX
, (DEV_UINT32
)((u32
)req
->dma_adr
+ req
->actual
), req
->currentCount
);
1408 void u3d_ep0_rx(void)
1411 DEV_UINT8
*ptr2
=0, *bp
;
1413 struct USB_EP_SETTING
*ep_setting
;
1414 struct USB_REQ
*req
;
1416 os_printk(K_DEBUG
,"ep0 rx start !!\n");
1418 ep_setting
= &g_u3d_setting
.ep_setting
[0];
1420 if (g_ep0_mode
== PIO_MODE
)
1422 req
= &g_u3d_req
[0];
1423 bp
= req
->buf
+ req
->actual
;
1424 count
= mu3d_hal_read_fifo(0,bp
);
1425 req
->actual
+= count
;
1427 if(Request
->bRequest
==AT_CMD_SET
)
1429 os_printk(K_DEBUG
,"AT_CMD_SET\n");
1430 ptr1
=(DEV_UINT8
*)AT_CMD
;
1433 for(i
=0;i
<AT_CMD_SET_BUFFER_OFFSET
;i
++)
1435 *(ptr1
+i
)=*(ptr2
+i
);
1438 ptr1
= AT_CMD
->buffer
;
1441 for(i
=0;i
<(count
-AT_CMD_SET_BUFFER_OFFSET
);i
++)
1443 *(ptr1
+i
)=*(ptr2
+i
+AT_CMD_SET_BUFFER_OFFSET
);
1446 g_u3d_status
= BUSY
;
1449 if((count
< ep_setting
->maxp
)||(req
->actual
==req
->count
))
1451 os_writel(U3D_EP0CSR
, os_readl(U3D_EP0CSR
) | EP0_DATAEND
);
1452 g_ep0_state
= EP0_IDLE
;
1454 Request
->bCommand
=AT_CMD
->tsfun
;
1456 if(Request
->bRequest
!=AT_CTRL_TEST
) {
1457 os_printk(K_DEBUG
,"bValid=1\n");
1464 req
= &g_u3d_req
[0];
1465 req
->currentCount
= os_readl(U3D_RXCOUNT0
);
1466 os_printk(K_DEBUG
,"RxCount : %d\n",os_readl(U3D_RXCOUNT0
));
1468 if(req
->currentCount
== 0)
1475 /* config ep0 rx dma channel */
1476 u3d_config_dma0(0, USB_RX
, (DEV_UINT32
)((u32
)req
->dma_adr
+ req
->actual
), req
->currentCount
);
1483 DEV_UINT8
* u3d_fill_in_buffer(DEV_UINT8
*ptr
, DEV_UINT8 size
, DEV_UINT8
*array
)
1487 for (i
= 0; i
< size
; i
++)
1488 *(ptr
+i
) = *(array
+i
);
1493 void u3d_ep0_idle(void){
1496 struct USB_REQ
*req
;
1500 req
= mu3d_hal_get_req(0, USB_TX
);
1502 if(os_readl(U3D_RXCOUNT0
) == 0){
1503 os_printk(K_ERR
, "RXCOUNT == 0\n");
1507 if (g_ep0_mode
== PIO_MODE
)
1509 /* decode command */
1510 for(i
= 0; i
< 2; i
++)
1512 word
[i
] = os_readl(USB_FIFO(0));
1517 req
->currentCount
=os_readl(U3D_RXCOUNT0
);
1518 req
->buf
= g_dma_buffer
[0];
1520 mapping
= dma_map_single(&mu3d_if_dev
, req
->buf
, USB_BUF_SIZE
, DMA_BIDIRECTIONAL
);
1521 g_mu3d_dma_debug
= mapping
;
1522 dma_sync_single_for_device(&mu3d_if_dev
, mapping
, USB_BUF_SIZE
, DMA_BIDIRECTIONAL
);
1523 req
->dma_adr
= mapping
;
1524 u3d_config_dma0(0, USB_RX
, (u32
)req
->dma_adr
, req
->currentCount
);
1526 os_printk(K_DEBUG
, "dma move\n");
1531 Request
->bmRequestType
=(word
[0]&0x000000FF);
1532 Request
->bRequest
=(word
[0]&0x0000FF00)>>8;
1533 Request
->wValue
=((word
[0]&0x00FF0000)>>16)|((word
[0]&0xFF000000)>>16);
1534 Request
->wIndex
=(word
[1]&0x000000FF)|(word
[1]&0x0000FF00);
1535 Request
->wLength
=((word
[1]&0x00FF0000)>>16)|((word
[1]&0xFF000000)>>16);
1537 os_printk(K_INFO
,"Request->bmRequestType : %x \n",Request
->bmRequestType
);
1538 os_printk(K_INFO
,"Request->bRequest : %x \n",Request
->bRequest
);
1539 os_printk(K_INFO
,"Request->wValue : %x \n",Request
->wValue
);
1540 os_printk(K_INFO
,"Request->wIndex : %x \n",Request
->wIndex
);
1541 os_printk(K_INFO
,"Request->wLength : %x \n",Request
->wLength
);
1544 if (os_readl(U3D_EPISR
) & SETUPENDISR
) //SETUPEND
1546 os_printk(K_ERR
, "Abort this command because of SETUP\n");
1551 if(((Request
->bmRequestType
&USB_TYPE_MASK
)==USB_TYPE_STANDARD
)&&
1552 (Request
->bRequest
==USB_REQ_SET_ADDRESS
)){
1554 u3d_set_address(Request
->wValue
);
1555 os_writel(U3D_EP0CSR
,os_readl(U3D_EP0CSR
) | EP0_SETUPPKTRDY
| EP0_DATAEND
);
1560 if(((Request
->bmRequestType
&USB_TYPE_MASK
)==USB_TYPE_STANDARD
)&&
1561 ((Request
->bmRequestType
&USB_RECIP_MASK
)==USB_RECIP_ENDPOINT
)){
1563 if(Request
->bmRequestType
& USB_DIR_IN
){
1565 g_ep0_state
= EP0_TX
;
1566 os_writel(U3D_EP0CSR
,os_readl(U3D_EP0CSR
) | EP0_SETUPPKTRDY
| EP0_DPHTX
);
1568 if(Request
->bRequest
==USB_REQ_GET_STATUS
){
1569 ptr1
= req
->buf
= g_dma_buffer
[0];
1570 *ptr1
= u3d_stall_status();
1572 req
->count
= USB_STATUS_SIZE
;
1577 if(Request
->bRequest
==USB_REQ_EP0_IN_STALL
){
1578 g_ep0_state
= EP0_IDLE
;
1579 u3d_send_ep0_stall();
1584 if((Request
->bRequest
==USB_REQ_SET_FEATURE
) &&
1585 (Request
->wValue
==ENDPOINT_HALT
)){
1588 os_writel(U3D_EP0CSR
,os_readl(U3D_EP0CSR
) | EP0_SETUPPKTRDY
| EP0_DATAEND
);
1591 if((Request
->bRequest
==USB_REQ_CLEAR_FEATURE
) &&
1592 (Request
->wValue
==ENDPOINT_HALT
)){
1593 u3d_clear_stall_all();
1595 os_writel(U3D_EP0CSR
,os_readl(U3D_EP0CSR
) | EP0_SETUPPKTRDY
| EP0_DATAEND
);
1598 if((Request
->bRequest
==USB_REQ_EP0_STALL
) &&
1599 (Request
->wValue
==ENDPOINT_HALT
)){
1600 u3d_send_ep0_stall();
1603 if(Request
->bRequest
==USB_REQ_EP0_OUT_STALL
){
1604 os_writel(U3D_EP0CSR
,os_readl(U3D_EP0CSR
) | EP0_SETUPPKTRDY
);
1605 u3d_send_ep0_stall();
1612 if(Request
->bmRequestType
==0x00C0){
1613 g_ep0_state
= EP0_TX
;
1614 os_writel(U3D_EP0CSR
,os_readl(U3D_EP0CSR
) | EP0_SETUPPKTRDY
| EP0_DPHTX
);
1616 if(Request
->bRequest
==AT_CMD_ACK
){
1617 os_printk(K_DEBUG
, "AT_CMD_ACK valid=%x, %d\n", Request
->bValid
, g_u3d_status
);
1618 ptr1
= req
->buf
= g_dma_buffer
[0];
1621 *(ptr1
+2) = AT_CMD_ACK_DATA_LENGTH
&0xFF;
1622 *(ptr1
+3) = AT_CMD_ACK_DATA_LENGTH
>>8;
1623 *(ptr1
+4) = (!Request
->bValid
) ? READY
: BUSY
;
1625 *(ptr1
+6) = g_u3d_status
;
1628 req
->count
= AT_CMD_ACK_DATA_LENGTH
;
1633 else if(Request
->bRequest
==AT_CTRL_TEST
){
1634 os_printk(K_DEBUG
,"AT_CTRL_TEST\n");
1637 req
->buf
=loopback_buffer
;
1639 req
->buf
=g_loopback_buffer
[1];
1642 req
->count
= req
->actual
;
1647 os_printk(K_DEBUG
,"req->buf=%p\n",req
->buf
);
1649 else if(Request
->bRequest
==AT_PW_STS_CHK
)
1651 os_printk(K_DEBUG
, "AT_CMD_GET\n");
1653 ptr1
= req
->buf
= g_dma_buffer
[0];
1656 *(ptr1
+2) = AT_PW_STS_CHK_DATA_LENGTH
&0xFF;
1657 *(ptr1
+3) = AT_PW_STS_CHK_DATA_LENGTH
>>8;
1660 *(ptr1
+6) = dev_stschk(Request
->wIndex
, Request
->wValue
);
1663 req
->count
= AT_PW_STS_CHK_DATA_LENGTH
;
1669 os_printk(K_DEBUG
,"g_u3d_req[0].count: %x \n",g_u3d_req
[0].count
);
1671 else if(Request
->bmRequestType
==0x0040){
1672 g_ep0_state
= EP0_RX
;
1673 req
->buf
=g_loopback_buffer
[1];
1675 loopback_buffer
= g_loopback_buffer
[1]+(0x1000-(DEV_INT32
)(unsigned long)g_loopback_buffer
[1]%0x1000)-0x08+bAddress_Offset
;
1678 req
->buf
=loopback_buffer
;
1680 req
->buf
=g_loopback_buffer
[1];
1682 req
->count
= Request
->wLength
;
1686 os_writel(U3D_EP0CSR
,os_readl(U3D_EP0CSR
) | EP0_SETUPPKTRDY
);
1687 os_printk(K_DEBUG
,"EP0 RX\n");
1690 if(g_ep0_state
== EP0_IDLE
){ //no data phase
1692 g_u3d_req
[0].complete
= 1;
1694 else if(g_ep0_state
== EP0_TX
){//data phase in
1696 os_printk(K_DEBUG
,"u3d_ep0_tx 0 \n");
1703 void u3d_ep0_handler(void){
1704 //starts for EP0_IDLE for normal and abnormal case (SETUPEND)
1705 if (os_readl(U3D_EP0CSR
) & EP0_SETUPPKTRDY
){
1706 os_printk(K_DEBUG
, "EP0_IDLE\n");
1709 else if(g_ep0_state
== EP0_RX
){
1710 os_printk(K_DEBUG
, "EP0_IDLE RX\n");
1713 else if(g_ep0_state
== EP0_TX
){
1714 os_printk(K_DEBUG
, "EP0_IDLE TX\n");
1722 void u3d_epx_handler(DEV_INT32 ep_num
, USB_DIR dir
){
1724 DEV_INT32 ep_index
, maxp
, length
;
1725 #if (BUS_MODE!=QMU_MODE)
1729 struct USB_EP_SETTING
*ep_setting
;
1730 struct USB_REQ
*req
;
1732 os_printk(K_DEBUG
,"ep_num :%x\n",ep_num
);
1733 os_printk(K_DEBUG
,"dir :%x\n",dir
);
1737 ep_setting
= &g_u3d_setting
.ep_setting
[ep_index
];
1738 req
= &g_u3d_req
[ep_index
];
1739 maxp
= ep_setting
->maxp
;
1740 os_printk(K_DEBUG
,"g_u3d_req[%d].buf@0x%p\n", ep_index
, g_u3d_req
[ep_index
].buf
);
1741 #if (BUS_MODE==PIO_MODE)
1742 bp
= req
->buf
+ req
->actual
;
1743 length
= req
->count
- req
->actual
;
1745 if(req
->actual
== req
->count
){
1751 count
= mu3d_hal_write_fifo_burst(ep_num
,length
,bp
, maxp
);
1752 req
->actual
+= count
;
1754 if((req
->actual
== req
->count
)&&(!(req
->count
% maxp
))){
1755 mu3d_hal_write_fifo_burst(ep_num
,0,bp
, maxp
);
1761 else if(dir
== USB_RX
){
1763 ep_index
= ep_num
+ MAX_EP_NUM
;
1764 ep_setting
= &g_u3d_setting
.ep_setting
[ep_index
];
1765 req
= &g_u3d_req
[ep_index
];
1766 #if (BUS_MODE==PIO_MODE)
1767 bp
= req
->buf
+ req
->actual
;
1768 count
= mu3d_hal_read_fifo_burst(ep_num
,bp
);
1769 req
->actual
+= count
;
1771 if(req
->actual
==TransferLength
){
1783 * u3d_dma_handler - receive setup in idle state, data phase in(TX) in tx state, data phase out(RX) in rx state
1786 void u3d_dma_handler(DEV_INT32 DMAIntSts
){
1788 struct USB_REQ
*req
;
1789 DEV_INT32 ep_index
, ep_num
, i
, count
;
1793 struct USB_EP_SETTING
*ep_setting
;
1796 if (DMAIntSts
& EP0DMAISR
) {//ep0
1798 ep_index
= ep_num
= 0;
1799 ep_setting
= &g_u3d_setting
.ep_setting
[ep_index
];
1800 req
= &g_u3d_req
[ep_index
];
1801 count
= req
->currentCount
;
1802 dir
= (os_readl(U3D_EP0DMACTRL
)&DMA_DIR
)>>1;
1803 os_printk(K_DEBUG
,"req->actual :%d\n",req
->actual
);
1804 os_printk(K_DEBUG
,"req->currentCount :%d\n",req
->currentCount
);
1805 os_printk(K_DEBUG
,"ep_setting->maxp :%d\n",ep_setting
->maxp
);
1809 if((os_readl(U3D_EP0CSR
) & EP0_SETUPPKTRDY
) //SETUPEND case; restarts from EP0_IDLE
1810 || (g_ep0_state
== EP0_IDLE
)){
1811 os_printk(K_ERR
, "DMA EP0_IDLE\n");
1812 /* decode and handle ep0 setup packet*/
1813 mapping
=req
->dma_adr
;
1814 dma_sync_single_for_cpu(&mu3d_if_dev
, mapping
, USB_BUF_SIZE
, DMA_BIDIRECTIONAL
);
1815 dma_unmap_single(&mu3d_if_dev
, mapping
, USB_BUF_SIZE
,DMA_BIDIRECTIONAL
);
1817 Request
->bmRequestType
=*ptr1
;
1818 Request
->bRequest
=*(ptr1
+1);
1819 Request
->wValue
=*(ptr1
+2)|(*(ptr1
+3)<<8);
1820 Request
->wIndex
=*(ptr1
+4)|(*(ptr1
+5)<<8);
1821 Request
->wLength
=*(ptr1
+6)|(*(ptr1
+7)<<8);
1823 os_printk(K_DEBUG
, "DMA move done\n");
1824 os_printk(K_DEBUG
,"Request->bmRequestType : %x \n",Request
->bmRequestType
);
1825 os_printk(K_DEBUG
,"Request->bRequest : %x \n",Request
->bRequest
);
1826 os_printk(K_DEBUG
,"Request->wValue : %x \n",Request
->wValue
);
1827 os_printk(K_DEBUG
,"Request->wIndex : %x \n",Request
->wIndex
);
1828 os_printk(K_DEBUG
,"Request->wLength : %x \n",Request
->wLength
);
1831 if (os_readl(U3D_EPISR
) & SETUPENDISR
) //SETUPEND
1833 os_printk(K_ERR
, "Abort this command because of SETUP\n");
1838 if ((Request
->bmRequestType
& USB_TYPE_MASK
) == USB_TYPE_STANDARD
)
1841 if ((Request
->bmRequestType
& USB_RECIP_MASK
) == USB_RECIP_DEVICE
)
1844 if (Request
->bRequest
== USB_REQ_GET_STATUS
)
1846 printk("==DEV - USB_REQ_GET_STATUS==\n");
1847 ptr1
= req
->buf
= g_dma_buffer
[0];
1850 // USBIF OTG , HNP polling
1851 if (Request
->wIndex
== 0xf000)
1853 os_printk(K_ERR
, "g_otg_hnp_reqd = %d %s)\n", g_otg_hnp_reqd
, __func__
);
1856 ptr1
= u3d_fill_in_buffer(ptr1
, sizeof(string_one
), string_one
);
1858 ptr1
= u3d_fill_in_buffer(ptr1
, sizeof(string_zero
), string_zero
);
1861 req
->count
= ptr1
- req
->buf
;
1862 // os_printk(K_ERR, "length: %d\n", req->count);
1867 mapping
= dma_map_single(&mu3d_if_dev
, req
->buf
,USB_BUF_SIZE
, DMA_BIDIRECTIONAL
);
1868 dma_sync_single_for_device(&mu3d_if_dev
, mapping
, USB_BUF_SIZE
, DMA_BIDIRECTIONAL
);
1869 req
->dma_adr
=mapping
;
1871 g_ep0_state
= EP0_TX
;
1872 os_writel(U3D_EP0CSR
,os_readl(U3D_EP0CSR
) | EP0_SETUPPKTRDY
| EP0_DPHTX
);
1877 if (Request
->bRequest
== USB_REQ_CLEAR_FEATURE
)
1879 printk("==DEV - USB_REQ_CLEAR_FEATURE==\n");
1881 if (Request
->wValue
== 0x0003)
1883 g_ep0_state
= EP0_IDLE
;
1884 u3d_send_ep0_stall();
1889 if (Request
->bRequest
== USB_REQ_SET_FEATURE
)
1891 printk("==DEV - USB_REQ_SET_FEATURE==\n");
1892 printk("Request wValue = 0x%x, Request wIndex = 0x%x\n", Request
->wValue
, Request
->wIndex
);
1894 if (Request
->wValue
== 0x0002)
1897 if (Request
->wIndex
== 0x600)
1899 printk("== set g_otg_srp_reqd = 1 ==\n");
1902 os_printk(K_ERR
, "g_otg_srp_reqd = 1\n");
1904 else if (Request
->wIndex
== 0x700)
1906 printk("== set g_otg_hnp_reqd = 1 ==\n");
1910 os_printk(K_ERR
, "g_otg_hnp_reqd = 1 (%s)\n", __func__
);
1914 else if (Request
->wValue
== 0x0003)
1916 g_otg_b_hnp_enable
= 1;
1918 os_printk(K_ERR
, "set g_otg_b_hnp_enable = 1 (%s)\n", __func__
);
1921 os_writel(U3D_EP0CSR
,os_readl(U3D_EP0CSR
) | EP0_SETUPPKTRDY
| EP0_DATAEND
);
1927 if (Request
->bRequest
== USB_REQ_SET_ADDRESS
)
1929 u3d_sync_with_bat(USB_UNCONFIGURED
) ;
1930 printk("==DEV - USB_REQ_SET_ADDRESS==\n");
1936 /* set device address*/
1937 u3d_set_address(Request
->wValue
);
1939 os_printk(K_DEBUG
,"Device Address :%x\n",(os_readl(U3D_DEVICE_CONF
)>>DEV_ADDR_OFST
));
1940 os_writel(U3D_EP0CSR
,os_readl(U3D_EP0CSR
) | EP0_SETUPPKTRDY
| EP0_DATAEND
);
1944 if (Request
->bRequest
== USB_REQ_GET_DESCRIPTOR
)
1946 printk("==DEV - USB_REQ_GET_DESCRIPTOR==\n");
1947 ptr1
= req
->buf
= g_dma_buffer
[0];
1950 if (Request
->wValue
== 0x100)
1952 ptr1
= u3d_fill_in_buffer(ptr1
, sizeof(device_descriptor
), device_descriptor
);
1953 os_printk(K_ERR
, "device_descriptor\n");
1956 else if (Request
->wValue
== 0x200)
1958 if (Request
->wLength
== 9)
1960 ptr1
= u3d_fill_in_buffer(ptr1
, sizeof(configuration_descriptor
), configuration_descriptor
);
1961 os_printk(K_ERR
, "configuration_descriptor\n");
1966 ptr1
= u3d_fill_in_buffer(ptr1
, sizeof(configuration_descriptor
), configuration_descriptor
);
1968 ptr1
= u3d_fill_in_buffer(ptr1
, sizeof(otg_descriptor
), otg_descriptor
);
1970 ptr1
= u3d_fill_in_buffer(ptr1
, sizeof(interface_descriptor
), interface_descriptor
);
1972 ptr1
= u3d_fill_in_buffer(ptr1
, sizeof(endpoint_descriptor_in
), endpoint_descriptor_in
);
1974 ptr1
= u3d_fill_in_buffer(ptr1
, sizeof(endpoint_descriptor_out
), endpoint_descriptor_out
);
1975 os_printk(K_ERR
, "5 descriptors\n");
1979 else if ((Request
->wValue
& 0xff00) == 0x300)
1981 switch (Request
->wValue
& 0xff)
1984 ptr1
= u3d_fill_in_buffer(ptr1
, sizeof(string_descriptor_0
), string_descriptor_0
);
1987 ptr1
= u3d_fill_in_buffer(ptr1
, sizeof(string_descriptor_1
), string_descriptor_1
);
1990 ptr1
= u3d_fill_in_buffer(ptr1
, sizeof(string_descriptor_2
), string_descriptor_2
);
1993 ptr1
= u3d_fill_in_buffer(ptr1
, sizeof(string_descriptor_3
), string_descriptor_3
);
1998 else if (Request
->wValue
== 0x900)
2000 ptr1
= u3d_fill_in_buffer(ptr1
, sizeof(otg_descriptor
), otg_descriptor
);
2003 req
->count
= ptr1
- req
->buf
;
2004 // os_printk(K_ERR, "length: %d\n", req->count);
2009 mapping
= dma_map_single(&mu3d_if_dev
, req
->buf
,USB_BUF_SIZE
, DMA_BIDIRECTIONAL
);
2010 dma_sync_single_for_device(&mu3d_if_dev
, mapping
, USB_BUF_SIZE
, DMA_BIDIRECTIONAL
);
2011 req
->dma_adr
=mapping
;
2013 g_ep0_state
= EP0_TX
;
2014 os_writel(U3D_EP0CSR
,os_readl(U3D_EP0CSR
) | EP0_SETUPPKTRDY
| EP0_DPHTX
);
2018 if (Request
->bRequest
== USB_REQ_SET_CONFIGURATION
)
2020 printk("==DEV - USB_REQ_SET_CONFIGURATION==\n");
2025 printk("==DEV - USB_REQ_SET_CONFIGURATION== done, g_otg_config %d\n", g_otg_config
);
2027 os_writel(U3D_EP0CSR
,os_readl(U3D_EP0CSR
) | EP0_SETUPPKTRDY
| EP0_DATAEND
);
2030 u3d_sync_with_bat(USB_CONFIGURED
) ;
2036 if ((Request
->bmRequestType
& USB_RECIP_MASK
) == USB_RECIP_ENDPOINT
)
2038 if (Request
->bmRequestType
& USB_DIR_IN
)
2040 g_ep0_state
= EP0_TX
;
2041 os_writel(U3D_EP0CSR
,os_readl(U3D_EP0CSR
) | EP0_SETUPPKTRDY
| EP0_DPHTX
);
2043 if (Request
->bRequest
== USB_REQ_GET_STATUS
)
2045 printk("==EP - USB_REQ_GET_STATUS==\n");
2046 ptr1
= req
->buf
= g_dma_buffer
[0];
2047 *ptr1
= u3d_stall_status();
2049 req
->count
= USB_STATUS_SIZE
;
2053 mapping
= dma_map_single(&mu3d_if_dev
, req
->buf
,USB_BUF_SIZE
, DMA_BIDIRECTIONAL
);
2054 dma_sync_single_for_device(&mu3d_if_dev
, mapping
, USB_BUF_SIZE
, DMA_BIDIRECTIONAL
);
2055 req
->dma_adr
=mapping
;
2058 if (Request
->bRequest
== USB_REQ_EP0_IN_STALL
)
2060 printk("==EP - USB_REQ_EP0_IN_STALL==\n");
2061 g_ep0_state
= EP0_IDLE
;
2062 u3d_send_ep0_stall();
2067 if((Request
->bRequest
==USB_REQ_SET_FEATURE
) &&
2068 (Request
->wValue
== ENDPOINT_HALT
))
2070 printk("==EP - USB_REQ_SET_FEATURE to EP HALT==\n");
2073 os_writel(U3D_EP0CSR
,os_readl(U3D_EP0CSR
) | EP0_SETUPPKTRDY
| EP0_DATAEND
);
2076 if((Request
->bRequest
==USB_REQ_CLEAR_FEATURE
) &&
2077 (Request
->wValue
== ENDPOINT_HALT
))
2079 printk("==EP - USB_REQ_CLEAR_FEATURE to EP HALT==\n");
2080 u3d_clear_stall_all();
2082 os_writel(U3D_EP0CSR
,os_readl(U3D_EP0CSR
) | EP0_SETUPPKTRDY
| EP0_DATAEND
);
2085 if((Request
->bRequest
==USB_REQ_EP0_STALL
) &&
2086 (Request
->wValue
== ENDPOINT_HALT
))
2088 printk("==EP - USB_REQ_EP0_STALL to EP HALT==\n");
2089 u3d_send_ep0_stall();
2092 if (Request
->bRequest
== USB_REQ_EP0_OUT_STALL
)
2094 printk("==EP - USB_REQ_EP0_STALL==\n");
2095 os_writel(U3D_EP0CSR
,os_readl(U3D_EP0CSR
) | EP0_SETUPPKTRDY
);
2096 u3d_send_ep0_stall();
2103 if (Request
->bmRequestType
== USB_TYPE_VENDOR
)
2105 if (Request
->bmRequestType
& USB_DIR_IN
)
2107 os_printk(K_DEBUG
,"EP0_TX \n");
2108 g_ep0_state
= EP0_TX
;
2109 os_writel(U3D_EP0CSR
,os_readl(U3D_EP0CSR
)| EP0_SETUPPKTRDY
| EP0_DPHTX
);
2111 if (Request
->bRequest
== AT_CMD_ACK
)
2113 os_printk(K_DEBUG
,"AT_CMD_ACK valid: %x \n",Request
->bValid
);
2115 /* handle AT_CMD_ACK status*/
2116 ptr1
= req
->buf
= g_dma_buffer
[0];
2119 *(ptr1
+2) = AT_CMD_ACK_DATA_LENGTH
&0xFF;
2120 *(ptr1
+3) = AT_CMD_ACK_DATA_LENGTH
>>8;
2121 *(ptr1
+4) = (!Request
->bValid
) ? READY
: BUSY
;
2123 *(ptr1
+6) = g_u3d_status
;
2126 req
->count
= AT_CMD_ACK_DATA_LENGTH
;
2131 else if (Request
->bRequest
== AT_CTRL_TEST
)
2133 os_printk(K_DEBUG
,"AT_CTRL_TEST\n");
2135 /* handle AT_CTRL_TEST for unit test ctrl loopback*/
2137 req
->buf
=loopback_buffer
;
2139 req
->buf
=g_loopback_buffer
[1];
2142 req
->count
= req
->actual
;
2147 else if(Request
->bRequest
==AT_PW_STS_CHK
)
2149 os_printk(K_DEBUG
, "AT_CMD_GET\n");
2151 ptr1
= req
->buf
= g_dma_buffer
[0];
2154 *(ptr1
+2) = AT_PW_STS_CHK_DATA_LENGTH
&0xFF;
2155 *(ptr1
+3) = AT_PW_STS_CHK_DATA_LENGTH
>>8;
2158 *(ptr1
+6) = dev_stschk(Request
->wIndex
, Request
->wValue
);
2161 req
->count
= AT_PW_STS_CHK_DATA_LENGTH
;
2167 mapping
= dma_map_single(&mu3d_if_dev
, req
->buf
,USB_BUF_SIZE
, DMA_BIDIRECTIONAL
);
2168 dma_sync_single_for_device(&mu3d_if_dev
, mapping
, USB_BUF_SIZE
, DMA_BIDIRECTIONAL
);
2169 os_printk(K_INFO
,"mapping : 0x%p\n",(void *)(unsigned long)mapping
);
2170 req
->dma_adr
=mapping
;
2172 os_printk(K_DEBUG
,"g_u3d_req[0].count: %x \n",g_u3d_req
[0].count
);
2176 os_printk(K_DEBUG
,"EP0_RX \n");
2177 g_ep0_state
= EP0_RX
;
2180 loopback_buffer
= g_loopback_buffer
[1]+(0x1000-(DEV_INT32
)(unsigned long)g_loopback_buffer
[1]%0x1000)-0x08+bAddress_Offset
;
2183 req
->buf
=loopback_buffer
;
2185 req
->buf
=g_loopback_buffer
[1];
2188 req
->count
= Request
->wLength
;
2192 os_writel(U3D_EP0CSR
,os_readl(U3D_EP0CSR
) | EP0_SETUPPKTRDY
);
2194 mapping
= dma_map_single(&mu3d_if_dev
, req
->buf
,USB_BUF_SIZE
, DMA_BIDIRECTIONAL
);
2195 dma_sync_single_for_device(&mu3d_if_dev
, mapping
, USB_BUF_SIZE
, DMA_BIDIRECTIONAL
);
2196 os_printk(K_INFO
,"req->buf: %p, mapping : 0x%p\n", req
->buf
, (void *)(unsigned long)mapping
);
2197 req
->dma_adr
=mapping
;
2202 if(g_ep0_state
== EP0_IDLE
) //no data phase
2203 g_u3d_req
[0].complete
= 1;
2204 else if(g_ep0_state
== EP0_TX
) //data in
2209 else if(g_ep0_state
== EP0_RX
){
2210 /* handle data phase out(rx)*/
2211 os_printk(K_INFO
, "DMA EP0_RX\n");
2212 req
->actual
+= count
;
2213 os_printk(K_DEBUG
,"receive : %d\n",req
->actual
);
2215 if(Request
->bRequest
==AT_CMD_SET
){
2217 ptr1
=(DEV_UINT8
*)AT_CMD
;
2218 ptr2
=g_u3d_req
[0].buf
;
2219 for(i
=0;i
<AT_CMD_SET_BUFFER_OFFSET
;i
++){
2220 *(ptr1
+i
)=*(ptr2
+i
);
2222 ptr1
=AT_CMD
->buffer
;
2223 ptr2
=g_u3d_req
[0].buf
;
2224 for(i
=0;i
<(count
-AT_CMD_SET_BUFFER_OFFSET
);i
++){
2225 *(ptr1
+i
)=*(ptr2
+i
+AT_CMD_SET_BUFFER_OFFSET
);
2227 g_u3d_status
= BUSY
;
2230 os_writel(U3D_EP0CSR
, os_readl(U3D_EP0CSR
)|EP0_RXPKTRDY
);
2232 if((count
< ep_setting
->maxp
)||(req
->actual
==req
->count
)){
2234 os_writel(U3D_EP0CSR
, os_readl(U3D_EP0CSR
) | EP0_DATAEND
);
2236 g_ep0_state
= EP0_IDLE
;
2239 if(Request
->bRequest
!=AT_CTRL_TEST
){
2242 os_printk(K_DEBUG
,"bValid !!\n");
2243 Request
->bCommand
=AT_CMD
->tsfun
;
2244 dma_sync_single_for_cpu(&mu3d_if_dev
, req
->dma_adr
, USB_BUF_SIZE
, DMA_BIDIRECTIONAL
);
2245 dma_unmap_single(&mu3d_if_dev
, req
->dma_adr
, USB_BUF_SIZE
, DMA_BIDIRECTIONAL
);
2248 else if(g_ep0_state
== EP0_TX
){
2249 /* handle data phase in(tx)*/
2250 os_printk(K_INFO
, "DMA EP0_TX\n");
2251 req
->actual
+= req
->currentCount
;
2252 os_printk(K_DEBUG
,"req->actual :%d\n",req
->actual
);
2253 os_printk(K_DEBUG
,"req->currentCount :%d\n",req
->currentCount
);
2255 if(req
->currentCount
<ep_setting
->maxp
){
2256 os_writel(U3D_EP0CSR
, os_readl(U3D_EP0CSR
)| EP0_TXPKTRDY
);
2259 os_writel(U3D_EP0CSR
, os_readl(U3D_EP0CSR
)| EP0_TXPKTRDY
);
2269 void mt_usb_disconnect(void)
2271 os_printk(K_DEBUG
,"[MUSB] USB is ready for disconnect\n");
2273 os_printk(K_DEBUG
,"[MUSB] USB disconnect\n");
2275 EXPORT_SYMBOL_GPL(mt_usb_disconnect
);
2277 void mt_usb_connect(void)
2279 os_printk(K_DEBUG
,"[MUSB] USB is ready for connect\n");
2281 os_printk(K_DEBUG
,"[MUSB] USB connect\n");
2283 EXPORT_SYMBOL_GPL(mt_usb_connect
);