⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mass_storage.c

📁 君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图片解码,浏览,电子书,录音,想学ucos,识货的人就下吧 russblock fmradio explore set
💻 C
📖 第 1 页 / 共 3 页
字号:
		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 + -