?? mass_storage.c
字號:
sense[2] = 0x02; sense[12] = 0x3a; iscardin = 1; } else { sense[2] = 0x06; sense[12] = 0x28; iscardin = 0; } pBus->StartTransfer(handle,pipe[1].ep,(unsigned char *)sense,sizeof(sense)); return 1; }static inline unsigned int Handle_UFI_READ_CAPACITY(unsigned handle){ PUDC_BUS pBus = (PUDC_BUS)handle; DEVINFO devinfo; PUDC_LUN pdev = pDev[cbw.bCBWLUN]; static u32 resp[2]; pdev->GetDevInfo((unsigned int)pdev,&devinfo); resp[0] = swap32(devinfo.partsize-1); /* last sector */ resp[1] = swap32(512); /* sector size */ if ( !(pdev->CheckDevState(handle)) ) { csw.dCSWDataResidue = cbw.dCBWDataXferLength; csw.bCSWStatus = CSWSTATUS_FAILED; //if sd out,shall send stall!! pBus->StartTransfer(handle,0xff,(unsigned char *)resp, sizeof(resp)); return 0; } else { pBus->StartTransfer(handle,pipe[1].ep,(unsigned char *)resp, sizeof(resp)); } return 1; }static inline unsigned int Handle_CSW(unsigned int handle){ PUDC_BUS pBus = (PUDC_BUS)handle; PUDC_LUN pdev = pDev[cbw.bCBWLUN]; pBus->StartTransfer(handle,pipe[1].ep,(unsigned char *)&csw, sizeof(CSW)); return 1; }static inline unsigned int Handle_UFI_TEST_UNIT_READY(unsigned int handle){ PUDC_BUS pBus = (PUDC_BUS)handle; PUDC_LUN pdev = pDev[cbw.bCBWLUN]; if ( cbw.bCBWLUN > 0 ) { if ( iscardin == 0 ) { if ( !(pdev->CheckDevState(handle)) ) { csw.bCSWStatus = CSWSTATUS_FAILED; } } else csw.bCSWStatus = iscardin; } else csw.bCSWStatus = CSWSTATUS_GOOD; Handle_CSW(handle); mass_state = SENDED_CSW; if(pdev->FlushDev) pdev->FlushDev(handle); return 1;}static inline unsigned int Handle_UFI_READ_10(unsigned handle){ PUDC_BUS pBus = (PUDC_BUS)handle; PUDC_LUN pdev = pDev[cbw.bCBWLUN]; unsigned int sectors; g_start_sector = ((unsigned int)cbw.CBWCB[2] << 24) | ((unsigned int)cbw.CBWCB[3] << 16) | ((unsigned int)cbw.CBWCB[4] << 8) | (unsigned int) cbw.CBWCB[5]; g_nr_sectors = ((unsigned short)cbw.CBWCB[7] << 8) | (unsigned short)cbw.CBWCB[8]; sectors = UDC_FRAME_SIZE / g_sector_size; if(sectors > g_nr_sectors) sectors = g_nr_sectors; #ifdef MUTI_THREAD massbuf = (unsigned char *)((unsigned int)massBuf0 | 0xa0000000); dprintf("read g_start_sector = %x\n g_nr_sectors = %x sectors = %x\n",g_start_sector,g_nr_sectors,sectors); OSSemPend(sem_device, 0, &err);#endif pdev->ReadDevSector((unsigned int)pdev,massbuf_ptr,g_start_sector,sectors);#ifdef MUTI_THREAD OSSemPost(sem_device);#endif pBus->StartTransfer(handle,pipe[1].ep, (unsigned char *)massbuf_ptr, sectors * g_sector_size); g_start_sector += sectors; g_nr_sectors -= sectors; mass_state = SEND_DATA; return 1; }static inline unsigned int Handle_UFI_WRITE_10(unsigned handle){ PUDC_BUS pBus = (PUDC_BUS)handle; PUDC_LUN pdev = pDev[cbw.bCBWLUN]; unsigned int sendcount; unsigned int sectors; g_start_sector = ((u32)cbw.CBWCB[2] << 24) | ((u32)cbw.CBWCB[3] << 16) | ((u32)cbw.CBWCB[4] << 8) | (u32)cbw.CBWCB[5]; g_nr_sectors = ((u16)cbw.CBWCB[7] << 8) | (u16)cbw.CBWCB[8]; sendcount = g_nr_sectors * g_sector_size; sectors = g_nr_sectors; if(sendcount > UDC_FRAME_SIZE) { sendcount = UDC_FRAME_SIZE; sectors = sendcount / g_sector_size; } dprintf("write s:%x n:%x c:%x\n", g_start_sector, g_nr_sectors,sectors);#ifdef MUTI_THREAD if ( udc_trigger == 1 ) { massbuf = (unsigned char *)((unsigned int)massBuf1 | 0xa0000000); OSSemPend(sem_buf1, 0, &err); } else { massbuf = (unsigned char *)((unsigned int)massBuf0 | 0xa0000000); OSSemPend(sem_buf0, 0, &err); }// printf("get here? \n");#endif pBus->StartTransfer(handle,pipe[2].ep, massbuf_ptr,sendcount); if(g_nr_sectors) mass_state = RECEIVE_DATA; else { mass_state = SENDED_CSW; Handle_CSW(handle); } return 1; }static inline unsigned int Handle_UFI_READ_FORMAT_CAPACITY(unsigned handle){ PUDC_BUS pBus = (PUDC_BUS)handle; DEVINFO devinfo; PUDC_LUN pdev = pDev[cbw.bCBWLUN]; READ_FORMAT_CAPACITY_DATA readfcd; if(pdev->CheckDevState(handle) == 0) { csw.dCSWDataResidue = cbw.dCBWDataXferLength; csw.bCSWStatus = CSWSTATUS_FAILED; pBus->StartTransfer(handle,0xff,0, 0); return 0; } #if 0 csw.dCSWDataResidue = cbw.dCBWDataXferLength; csw.bCSWStatus = CSWSTATUS_FAILED; //if sd out,shall send stall!! pBus->StartTransfer(handle,0xff,0, 0); return 0;#endif memset(&readfcd,0,sizeof(readfcd)); readfcd.CapacityListLen = 0x8; //M by yliu pdev->GetDevInfo((unsigned int)pdev,&devinfo); readfcd.CapacityData[0].Blocks = devinfo.partsize-1; readfcd.CapacityData[0].BlockLen = devinfo.sectorsize; readfcd.CurMaxCapacity.Blocks = devinfo.partsize-1; g_sector_size = devinfo.sectorsize; readfcd.CurMaxCapacity.BlockLen = g_sector_size; readfcd.CurMaxCapacity.BlockLen = (readfcd.CurMaxCapacity.BlockLen << 8) | 0x2; int size = cbw.bCBWCBLength; if(size > sizeof(READ_FORMAT_CAPACITY_DATA)) size = sizeof(READ_FORMAT_CAPACITY_DATA); csw.bCSWStatus = CSWSTATUS_GOOD; csw.dCSWDataResidue = 0x0; csw.dCSWTag = cbw.dCBWTag; pBus->StartTransfer(handle,pipe[1].ep,(u8 *) &readfcd, cbw.dCBWDataXferLength); return 1; }static inline unsigned int Handle_UFI_MODE_SENSE_6(unsigned handle){ PUDC_BUS pBus = (PUDC_BUS)handle; static unsigned char sensedata[8] = { 0x00,0x06, // lenght 0x00, // default media 0x00, // bit 7 is write protect 0x00,0x00,0x00,0x00 //reserved }; pBus->StartTransfer(handle,pipe[1].ep,sensedata, sizeof(sensedata)); return 1;}static inline unsigned int USB_HandleCBW(unsigned int handle){ if (cbw.dCBWSignature != CBWSIGNATURE) return 0; csw.dCSWSignature = CSWSIGNATURE; csw.bCSWStatus = CSWSTATUS_GOOD; csw.dCSWTag = cbw.dCBWTag; csw.dCSWDataResidue = 0;// if (cbw.bCBWLUN != 0 || (cbw.CBWCB[1] & 0xe0 ) != 0 )// printf("AAAAAAAAAAAAA %d \n",cbw.bCBWLUN); //printf("cbw.Signature:%08x\n", cbw.dCBWSignature); //printf("cbw.dCBWTag:%08x\n", cbw.dCBWTag); //printf("cbw.dCBWDataXferLength:%x\n", cbw.dCBWDataXferLength); //printf("cbw.bmCBWFlags:%08x\n", cbw.bmCBWFlags); //printf("cbw.bCBWLUN:%d\n", cbw.bCBWLUN); //printf("cbw.bCBWCBLength:%d\n", cbw.bCBWCBLength); //printf("cbw.CBWCB[0]:%02x\n", cbw.CBWCB[0]); mass_state = SENDING_CSW; switch (cbw.CBWCB[0]) { case UFI_INQUIRY: Handle_UFI_INQUIRY(handle); break; case UFI_REQUEST_SENSE: Handle_UFI_REQUEST_SENSE(handle); break; case UFI_READ_CAPACITY: if ( !Handle_UFI_READ_CAPACITY(handle)) { Handle_CSW(handle); mass_state = SENDED_CSW; csw.bCSWStatus = CSWSTATUS_GOOD; } break; case UFI_READ_10: Handle_UFI_READ_10(handle); break; case UFI_WRITE_10: case UFI_WRITE_AND_VERIFY: dprintf("UFI_WRITE_10\r\n"); Handle_UFI_WRITE_10(handle); break; case UFI_READ_FORMAT_CAPACITY: if(!Handle_UFI_READ_FORMAT_CAPACITY(handle)) { Handle_CSW(handle); mass_state = SENDED_CSW; csw.bCSWStatus = CSWSTATUS_GOOD; } // Handle_CSW(handle);// mass_state = SENDED_CSW; break; case UFI_MODE_SENSE_10: case UFI_MODE_SENSE_6: Handle_UFI_MODE_SENSE_6(handle); break; case UFI_TEST_UNIT_READY: Handle_UFI_TEST_UNIT_READY(handle); break; default: Handle_CSW(handle); mass_state = SENDED_CSW; break; }}static unsigned int mass_detect(unsigned int handle,unsigned int stat){ PUDC_BUS pBus = (PUDC_BUS)handle; unsigned char i; // udc gpio detect insert dprintf("mass_detect udc_device_state = %x\n",udc_device_state); if(stat == UDC_JUDGE) { if((udc_device_state & UDC_HW_CONNECT) == 0) { pBus->EnableDevice(handle); udc_device_state |= UDC_HW_CONNECT; } }else if(stat == UDC_REMOVE) //udc gpio detect remove { if(udc_device_state & UDC_HW_CONNECT) { pBus->DisableDevice(handle); udc_device_state &= ~UDC_HW_CONNECT; } if(udc_device_state & UDC_SW_CONNECT) { for(i = 0;i < curLunCount; i++) { if(pDev[i]) pDev[i]->DeinitDev((unsigned int)pDev[i]); } udc_device_state &= ~UDC_SW_CONNECT; } } else return 0; return 1; }static unsigned int mass_reset(unsigned int handle){ PUDC_BUS pBus = (PUDC_BUS)handle; unsigned char ret = 1, i = 0; printf("mass reset \r\n"); init_thread();#ifdef MUTI_THREAD unsigned char err; OSSemPend(sem_device,0,&err);#endif pBus->InitEndpointSuppost(handle,&(pipe[0].ep),pipe[0].ep_type,&(pipe[0].max_pkg)); pBus->InitEndpointSuppost(handle,&(pipe[1].ep),pipe[1].ep_type,&(pipe[1].max_pkg)); pBus->InitEndpointSuppost(handle,&(pipe[2].ep),pipe[2].ep_type,&(pipe[2].max_pkg)); devDesc.bMaxPacketSize0 = pipe[0].max_pkg; confDesc.endpoint_descriptor[0].bEndpointAddress = pipe[1].ep; confDesc.endpoint_descriptor[0].wMaxPacketSize = pipe[1].max_pkg; confDesc.endpoint_descriptor[1].bEndpointAddress = pipe[2].ep; confDesc.endpoint_descriptor[1].wMaxPacketSize = pipe[2].max_pkg;#ifndef MUTI_THREAD massbuf_ptr = (unsigned char *)((unsigned int)massBuf_ptr | 0xa0000000);#else// udc_trigger = 0;// mass_trigger = 0;/* sem_buf0 = OSSemCreate(1); sem_buf1 = OSSemCreate(1); sem_mass = OSSemCreate(0); sem_device = OSSemCreate(1);*/#endif if(curLunCount == 0) return; ret = curLunCount; if(ret) { for(i = 0;i < curLunCount; i++) { if(pDev[i]) pDev[i]->InitDev((unsigned int)pDev[i]); } devDesc.iSerialNumber = 3; } udc_device_state |= UDC_SW_CONNECT; mass_state = RECEIVE_CBW; pBus->StartTransfer(handle,pipe[2].ep,(unsigned char *)&cbw,sizeof(cbw)); dprintf("iSerialNumber = %d\n",devDesc.iSerialNumber);#if MUTI_THREAD OSSemPost(sem_device);#endif return (unsigned int )ret; }static unsigned int mass_suspend(unsigned int handle){ unsigned char i; printf("mass_suspend!\n"); deinit_thread(); if(udc_device_state & UDC_SW_CONNECT) { for(i = 0;i < curLunCount; i++) if(pDev[i]) pDev[i]->DeinitDev((unsigned int)pDev[i]); udc_device_state &= ~UDC_SW_CONNECT; } return 1;}static unsigned int set_udc_speed(unsigned stat){ switch(stat) { case UDC_HIGHSPEED: printf("UDC HIGHSPEED\r\n"); break; case UDC_FULLSPEED: printf("UDC FULLSPEED\r\n"); break; } return 1;}static inline void get_dev_descriptor(unsigned int handle,USB_DeviceRequest *dreq){ PUDC_BUS pBus = (PUDC_BUS)handle; unsigned short size = dreq->wLength; if(size < sizeof(devDesc)) { devDesc.bLength = size; pBus->StartTransfer(handle,pipe[0].ep,(unsigned char *)&devDesc, size); } else { devDesc.bLength = sizeof(devDesc); pBus->StartTransfer(handle,pipe[0].ep,(unsigned char *)&devDesc, sizeof(devDesc)); } }static inline void get_dev_configuration(unsigned int handle,USB_DeviceRequest *dreq){ PUDC_BUS pBus = (PUDC_BUS)handle; switch (dreq->wLength) { case 9: pBus->StartTransfer(handle,pipe[0].ep, (unsigned char *)&confDesc, 9); break; case 8: pBus->StartTransfer(handle,pipe[0].ep, (unsigned char *)&confDesc, 8);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -