亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? udc.c

?? 君正早期ucos系統(只有早期的才不沒有打包成庫),MPLAYER,文件系統,圖片解碼,瀏覽,電子書,錄音,想學ucos,識貨的人就下吧 russblock fmradio explore set
?? C
?? 第 1 頁 / 共 2 頁
字號:
/********************** BEGIN LICENSE BLOCK ************************************ * * JZ4740  mobile_tv  Project  V1.0.0 * INGENIC CONFIDENTIAL--NOT FOR DISTRIBUTION IN SOURCE CODE FORM * Copyright (c) Ingenic Semiconductor Co. Ltd 2005. All rights reserved. *  * This file, and the files included with this file, is distributed and made  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.  *  * http://www.ingenic.cn  * ********************** END LICENSE BLOCK ************************************** * *  Author:  <dsqiu@ingenic.cn>  <jgao@ingenic.cn>  * *  Create:   2008-06-26, by dsqiu *             *  Maintain: 2008-06-26, by jgao *             * ******************************************************************************* */#include <ucos_ii.h>#include <jz4740.h>#include <bsp.h>#include "usb.h"#include "udc.h"#include "udcbus.h"#include "threadprio.h"#ifdef USE_MIDWARE#include "midware.h"#endif#define EP1_INTR_BIT 2#define EP_FIFO_NOEMPTY 2#define GPIO_UDC_DETE GPIO_UDC_DETE_PIN#define IRQ_GPIO_UDC_DETE (IRQ_GPIO_0 + GPIO_UDC_DETE)#define MAX_CABLE_DETE  3#define CABLE_DETE_TIME  500                //wait time in ms#define CABLE_CONNECTED          0#define CABLE_DISCONNECT         1#define DEBUGMSG 0#if DEBUGMSG#define dprintf printf#else#undef  dprintf#define dprintf(x...)#endif#define IS_CACHE(x) (x < 0xa0000000)#ifdef USE_MIDWAREvolatile static MIDSRC udcsrc;volatile static MIDSRCDTA res;volatile static u32 udcid;volatile static u32 cable_stat;volatile static u32 protocool_stat;static u8 err;#endiftypedef struct{	unsigned char ep;	unsigned char state;	unsigned short fifosize;		unsigned int curlen;	unsigned int totallen;	unsigned int data_addr;	unsigned int fifo_addr;}EPSTATE,*PEPSTATE;#define CPU_READ     0#define CPU_WRITE     1#define DMA_READ     2#define DMA_WRITE     3#define WRITE_FINISH  4#define READ_FINISH  5#define TXFIFOEP0 USB_FIFO_EP0EPSTATE epstat[3] = {	{0x00, 0,0,0,0,0,TXFIFOEP0 + 0},	{0x81, 0,0,0,0,0,TXFIFOEP0 + 4},	{0x01, 0,0,0,0,0,TXFIFOEP0 + 4}};#define GetEpState(x) (&epstat[x])static OS_EVENT *udcEvent;u8 USB_Version;volatile static unsigned char udc_irq_type = 0;//void (*tx_done)(void) = NULL;#define UDC_TASK_PRIO	UDC_THREAD_PRIO  //7#define UDC_TASK_STK_SIZE	1024 * 2static OS_STK udcTaskStack[UDC_TASK_STK_SIZE];#define PHYADDR(x) (x & 0x1fffffff)static void dma_receieve_data(PEPSTATE pep){	unsigned int size;	size = pep->totallen - (pep->totallen % pep->fifosize);	if(IS_CACHE(pep->data_addr))		dma_cache_wback_inv(pep->data_addr, pep->totallen);	//IntrOutMask = 0x0;			jz_writel(USB_REG_ADDR2,PHYADDR(pep->data_addr));	jz_writel(USB_REG_COUNT2,size);	jz_writel(USB_REG_CNTL2,0x001d);	jz_writeb(USB_REG_INDEX,1);		usb_setw(USB_REG_OUTCSR,0xa000);	//printf("dma receive %x\n",size);    	pep->curlen = size;		}static void dma_send_data(PEPSTATE pep){	  unsigned int size;	  	  size = pep->totallen - (pep->totallen % pep->fifosize);	  	  if(IS_CACHE(pep->data_addr))		  dma_cache_wback_inv(pep->data_addr, size);	  jz_writel(USB_REG_ADDR1,PHYADDR(pep->data_addr));	  jz_writel(USB_REG_COUNT1,size);//fifosize[ep]);	  jz_writel(USB_REG_CNTL1,0x001f);	  jz_writeb(USB_REG_INDEX, 1);	  usb_setw(USB_REG_INCSR,0x9400);	  	  //printf("dma send %x\n",size);	  pep->curlen = size;}static inline void dma_send_data_Finish(){	jz_writel(USB_REG_CNTL1,0x0);	jz_writeb(USB_REG_INDEX,1);	usb_clearw(USB_REG_INCSR,0x9400);	}static void dma_receieve_data_finish(){	dprintf("\n Disable DMA!");		jz_writel(USB_REG_CNTL2,0x0);	jz_writeb(USB_REG_INDEX,1);	usb_clearw(USB_REG_OUTCSR,0xa000);}void disable_device(unsigned int handle);static void udc_reset(unsigned int handle){//	PUDC_BUS pBus = (PUDC_BUS) handle;	u8 byte;	PEPSTATE pep;		//data init		//ep0state = USB_EP0_IDLE;//	IntrOutMask = 0x2;	// __cpm_stop_udc();	/* Enable the USB PHY */	//REG_CPM_SCR |= CPM_SCR_USBPHY_ENABLE;	/* Disable interrupts */	jz_writew(USB_REG_INTRINE,0);	jz_writew(USB_REG_INTROUTE, 0);	jz_writeb(USB_REG_INTRUSBE, 0);	jz_writeb(USB_REG_FADDR,0);//jz_writeb(USB_REG_POWER,0x60);   //High speed	jz_writeb(USB_REG_INDEX,0);	jz_writeb(USB_REG_CSR0,0xc0);	jz_writeb(USB_REG_INDEX,1);	jz_writew(USB_REG_INCSR,0x2048);	jz_writew(USB_REG_INMAXP,512);		jz_writeb(USB_REG_INDEX,1);	jz_writew(USB_REG_OUTCSR,0x0090);	jz_writew(USB_REG_OUTMAXP,512);	byte = jz_readb(USB_REG_POWER);	dprintf("REG_POWER: %02x\r\n",byte);	epstat[0].fifosize = 64;		if(epstat[1].state != WRITE_FINISH)		jz_readw(USB_REG_INTRIN);	if(epstat[2].state != READ_FINISH)		jz_readw(USB_REG_INTROUT);		epstat[0].state = 0;	epstat[1].state = WRITE_FINISH;	epstat[2].state = READ_FINISH;	epstat[0].curlen = 0;	epstat[1].curlen = 0;	epstat[2].curlen = 0;	epstat[0].totallen = 0;	epstat[1].totallen = 0;	epstat[2].totallen = 0;		if ((byte & 0x10)==0) 	{		jz_writeb(USB_REG_INDEX,1);		jz_writew(USB_REG_INMAXP,64);		jz_writew(USB_REG_INCSR,0x2048);		jz_writeb(USB_REG_INDEX,1);		jz_writew(USB_REG_OUTMAXP,64);		jz_writew(USB_REG_OUTCSR,0x0090);		USB_Version=USB_FS;		//fifosize[1]=64;      		epstat[1].fifosize = 64;		epstat[2].fifosize = 64;		printf("usb1.1\n");			}	else	{		jz_writeb(USB_REG_INDEX,1);		jz_writew(USB_REG_INMAXP,512);		jz_writew(USB_REG_INCSR,0x2048);		jz_writeb(USB_REG_INDEX,1);		jz_writew(USB_REG_OUTMAXP,512);		jz_writew(USB_REG_OUTCSR,0x0090);		USB_Version=USB_HS;		epstat[1].fifosize = 512;		epstat[2].fifosize = 512;		printf("usb2.0\n");			}//DMA USE	jz_writel(USB_REG_CNTL1,0);		jz_writel(USB_REG_ADDR1,0);	jz_writel(USB_REG_COUNT1,0);//fifosize[ep]);	jz_writel(USB_REG_CNTL2,0);	jz_writel(USB_REG_ADDR2,0);	jz_writel(USB_REG_COUNT2,0);//fifosize[ep]);	jz_readb(USB_REG_INTR); // clear dma interrupt	jz_writew(USB_REG_INTRINE,0x1);   //enable ep0 intr	jz_writeb(USB_REG_INTRUSBE,0x6);//	disable_device();	}static void udc_read_fifo(PEPSTATE pep, int size){	unsigned int *ptr = (unsigned int *)(pep->data_addr + pep->curlen);	unsigned int fifo = pep->fifo_addr;	unsigned char *c;	int s = size / 4;	unsigned int x;	if(((unsigned int )ptr & 3) == 0)	{		while(s--)			*ptr++ = REG32(fifo);				}	else	{		while(s--)		{			x = REG32(fifo);			*ptr++ = (x >> 0)& 0x0ff;			*ptr++ = (x >> 8)  & 0x0ff;			*ptr++ = (x >> 16) & 0x0ff;			*ptr++ = (x >> 24) & 0xff;		}	}		s = size & 3;	c = (unsigned char *)ptr;	while(s--)		*c++ = REG8(fifo);	pep->curlen += size;		#if 0	c = (unsigned char *)(pep->data_addr + pep->curlen - size);	dprintf("recv:(%d)", size);	for (s=0;s<size;s++) {		if (s % 16 == 0)			dprintf("\n");		dprintf(" %02x", *(c+s));	}	dprintf("\n");#endif}static void udc_write_fifo(PEPSTATE pep, int size){	unsigned int *d = (unsigned int *)(pep->data_addr + pep->curlen);	unsigned int fifo = pep->fifo_addr;	u8 *c;	int s, q;#if 0	unsigned char *ptr =(unsigned char *)d;		dprintf("send:fifo(%x) = (%d)",fifo, size);	for (s=0;s<size;s++) {		if (s % 16 == 0)			dprintf("\n");		dprintf(" %02x", ptr[s]);	}	dprintf("\n");#endif		if (size > 0) {		s = size >> 2;		while (s--)			REG32(fifo) = *d++;		q = size & 3;		if (q) {			c = (u8 *)d;			while (q--)				REG8(fifo) = *c++;		}	} 	pep->curlen += size;}void ep0_handler(unsigned int handle){    PEPSTATE pep = GetEpState(0);	unsigned char byCSR0;/* Read CSR0 */	jz_writeb(USB_REG_INDEX, 0);	byCSR0 = jz_readb(USB_REG_CSR0);   //	printf("EP0 CSR = %x\n",byCSR0);    if(byCSR0 == 0)		return;	/* Check for SentStall    if sendtall is set ,clear the sendstall bit*/	if (byCSR0 & USB_CSR0_SENTSTALL) 	{		jz_writeb(USB_REG_CSR0, (byCSR0 & ~USB_CSR0_SENDSTALL));		pep->state = CPU_READ;				printf("\nSentstall!");		return;	}/* Check for SetupEnd */	if (byCSR0 & USB_CSR0_SETUPEND) 	{		jz_writeb(USB_REG_CSR0, (byCSR0 | USB_CSR0_SVDSETUPEND));		pep->state = CPU_READ;		printf("\nSetupend!");		//return;	}/* Call relevant routines for endpoint 0 state */	if (pep->state == CPU_READ) 	{		if (byCSR0 & USB_CSR0_OUTPKTRDY)   //There are datas in fifo		{            USB_DeviceRequest dreq;			            *(unsigned int *) &dreq =  REG32(pep->fifo_addr);			*(unsigned int *) ((unsigned int)&dreq + 4)=  REG32(pep->fifo_addr);								dprintf("\nbmRequestType:%02x\nbRequest:%02x\n"					"wValue:%04x\nwIndex:%04x\n"					"wLength:%04x\n",					dreq.bmRequestType,					dreq.bRequest,					dreq.wValue,					dreq.wIndex,					dreq.wLength);			if ( dreq.bRequest == SET_CONFIGURATION )				protocool_stat = CABLE_CONNECTED;			if ( dreq.bRequest == SET_ADDRESS || dreq.bRequest == SET_CONFIGURATION || dreq.bRequest == CLEAR_FEATURE )				usb_setb(USB_REG_CSR0, 0x40 | USB_CSR0_DATAEND);//clear OUTRD bit and DATAEND			else				usb_setb(USB_REG_CSR0, 0x40);//clear OUTRD bit			BusNotify(handle,UDC_SETUP_PKG_FINISH,(unsigned char *)&dreq,8);		}		else 		{			dprintf("0:R DATA\n");					}			}		if (pep->state == CPU_WRITE) 	{		int sendsize;		sendsize = pep->totallen - pep->curlen;//		printf("send size = %d\r\n",sendsize);				if (sendsize < 64) 		{			udc_write_fifo(pep,sendsize);			pep->curlen = pep->totallen;			usb_setb(USB_REG_CSR0, USB_CSR0_INPKTRDY | USB_CSR0_DATAEND);			pep->state = CPU_READ;					} else 		{			if(sendsize)			{				udc_write_fifo(pep, 64);				usb_setb(USB_REG_CSR0, USB_CSR0_INPKTRDY);				pep->curlen += 64;							}else				pep->state = CPU_READ;					}	}//	printf("pep state = %d %d\r\n",CPU_WRITE,pep->state);	return;}void ep_in_handler(unsigned int handle,PEPSTATE pep){	unsigned int size;   		//fifo = fifoaddr[EP];	size = pep->totallen - pep->curlen;//	printf("pep->totallen = %d size = %d \n",pep->totallen,size);	if(size == 0)	{				pep->state = WRITE_FINISH;		usb_clearw(USB_REG_INTRINE,EP1_INTR_BIT);  // close ep1 in intr		BusNotify(handle,UDC_PROTAL_SEND_FINISH,(unsigned char *)pep->data_addr,pep->curlen);//		printf("Send finish \n");		return;			}		if(size < pep->fifosize)	{		udc_write_fifo(pep,size);	}else		udc_write_fifo(pep,pep->fifosize);	usb_setb(USB_REG_INCSR, USB_INCSR_INPKTRDY);	}void ep_out_handler(unsigned int handle,PEPSTATE pep){    unsigned int size;		jz_writeb(USB_REG_INDEX, 1);	size = jz_readw(USB_REG_OUTCOUNT);	 	udc_read_fifo(pep, size);	usb_clearb(USB_REG_OUTCSR,USB_OUTCSR_OUTPKTRDY);	pep->state = CPU_READ;	dprintf("EPOUT: totallen = %d curlen = %d",pep->totallen,pep->curlen);		if(pep->totallen == pep->curlen)	{		pep->state = READ_FINISH;		usb_clearw(USB_REG_INTROUTE,EP1_INTR_BIT);		BusNotify(handle,UDC_PROTAL_RECEIVE_FINISH,			  (unsigned char *)pep->data_addr,pep->curlen);					}		//	USB_HandleUFICmd();	dprintf("\nEPOUT_handle return!");}static int check_gpio(u32 pin){	int i ,j  = 0,k = 0;	for ( i = 0 ; i < 10 ; i ++ )	{		OSTimeDly(1);		if (__gpio_get_pin(pin))			j ++;		else k ++;	}		if ( j >= k ) return 1;	else return 0;}void udc_intrb_handler(unsigned int handle,unsigned char val){	unsigned char byte;		if (val & USB_INTR_RESET) 	{		printf("UDC reset intrupt!\r\n");  		if ( protocool_stat == CABLE_DISCONNECT && 		     cable_stat == CABLE_CONNECTED )		{			printf("USB cable insert! \n");			cable_stat = CABLE_CONNECTED;			udcsrc.Src = SRC_UDC;			udcsrc.Event = EVENT_USB_IN;			OSQPost(udcsrc.CurEvent1 , (void *)&udcid);			OSSemPost(udcsrc.CurEvent);			if ( res.Val == 1 )  //|| res.Val == 0xffff) //up layer said yes!			{//				protocool_stat = CABLE_CONNECTED;//				BusNotify((unsigned int)pBus,stat,0,0);				;			}			else           //up layer said no!			{				protocool_stat = CABLE_DISCONNECT;				//jz_writeb(USB_REG_POWER,0x00);   //High speed					disable_device(0);				printf("As power cable insert! \n");				return;							}		}		udc_reset(handle);				byte = jz_readb(USB_REG_POWER);		//dprintf("REG_POWER: %02x\r\n",byte);		if ((byte&0x10) ==0 ) 		{			BusNotify(handle,UDC_FULLSPEED,0,0);		}else			BusNotify(handle,UDC_HIGHSPEED,0,0);		// enable USB Suspend interrupt				byte = jz_readb(USB_REG_INTRUSBE);		jz_writeb(USB_REG_INTRUSBE,byte | USB_INTR_SUSPEND);      		BusNotify(handle,UDC_RESET,0,0);			}	if(val & USB_INTR_SUSPEND)	{		BusNotify(handle,UDC_SUSPEND,0,0);				byte = jz_readb(USB_REG_INTRUSBE);		jz_writeb(USB_REG_INTRUSBE,(byte & (~USB_INTR_SUSPEND) & 7));		printf("udc suspend %x\n",byte);#ifdef USE_MIDWARE		if ( protocool_stat == CABLE_CONNECTED )		{			printf("USB uninstall ! %d \n",protocool_stat);			udcsrc.Src = SRC_UDC;			udcsrc.Event = EVENT_UNINSTALL;			protocool_stat = CABLE_DISCONNECT;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕免费观看一区| 3d动漫精品啪啪| 狠狠久久亚洲欧美| 婷婷中文字幕综合| 亚洲电影在线播放| 亚洲韩国一区二区三区| 亚洲免费观看高清| 亚洲一区二区三区爽爽爽爽爽 | 26uuu国产日韩综合| 麻豆精品一区二区综合av| 日日夜夜免费精品视频| 日韩国产欧美一区二区三区| 五月天久久比比资源色| 蜜桃视频在线观看一区二区| 精品一区二区三区在线观看| 福利电影一区二区三区| 99视频在线观看一区三区| 色狠狠色狠狠综合| 欧美老年两性高潮| 日韩欧美不卡在线观看视频| 久久精品一区四区| 最新久久zyz资源站| 亚洲一区二区精品久久av| 人人狠狠综合久久亚洲| 国产成人亚洲精品青草天美| 成人毛片视频在线观看| 欧美中文字幕亚洲一区二区va在线| 欧美精品一二三四| 热久久国产精品| 蜜臀av一区二区在线观看| 国产一区免费电影| 色综合网站在线| 日韩欧美一级特黄在线播放| 国产精品免费看片| 日韩一区欧美二区| av成人免费在线观看| 欧美一区二区三区系列电影| 国产精品乱码一区二三区小蝌蚪| 午夜欧美2019年伦理| 国产精品一区二区三区四区| 欧美性极品少妇| 国产女人水真多18毛片18精品视频 | 亚洲一区二区五区| 国产在线视视频有精品| 一本色道亚洲精品aⅴ| 精品女同一区二区| 一级日本不卡的影视| 国产精品综合一区二区三区| 欧美性感一类影片在线播放| 国产精品视频你懂的| 久久超级碰视频| 欧美性大战久久久| 综合色天天鬼久久鬼色| 国产真实乱对白精彩久久| 欧美肥胖老妇做爰| 亚洲精品日韩一| 成人av电影观看| 久久久99久久| 经典一区二区三区| 日韩一区国产二区欧美三区| 亚洲韩国一区二区三区| 欧美在线免费播放| 亚洲免费观看高清在线观看| 波多野结衣欧美| 国产精品理论片在线观看| 国产二区国产一区在线观看| 精品剧情v国产在线观看在线| 三级在线观看一区二区| 欧美日韩精品一区二区天天拍小说 | 欧美一区二区三区四区久久| 亚洲影院在线观看| 91久久精品一区二区二区| 日韩一区中文字幕| 99视频一区二区三区| 亚洲色图在线看| 色天使色偷偷av一区二区| 国产精品超碰97尤物18| heyzo一本久久综合| 中文在线一区二区| 91婷婷韩国欧美一区二区| 亚洲情趣在线观看| 91国偷自产一区二区开放时间 | 国产精品天天看| 99天天综合性| 亚洲高清视频中文字幕| 91精品国产黑色紧身裤美女| 日欧美一区二区| 精品视频全国免费看| 欧美在线观看视频一区二区| 国产精品夫妻自拍| 91香蕉视频在线| 亚洲精品欧美专区| 91福利资源站| 奇米亚洲午夜久久精品| 日韩一区二区精品| 国产一区二区中文字幕| 国产精品久久久久永久免费观看| 色欲综合视频天天天| 亚洲高清一区二区三区| 精品乱人伦小说| 99久久综合精品| 无码av免费一区二区三区试看| 日韩视频国产视频| 丁香激情综合国产| 亚洲国产精品一区二区www| 日韩一区二区免费电影| 国产91精品在线观看| 一区二区三区四区不卡视频| 日韩欧美在线网站| 99在线热播精品免费| 日韩精品亚洲一区二区三区免费| 久久―日本道色综合久久| 91黄色激情网站| 国产精品亚洲第一| 亚洲国产欧美日韩另类综合| 久久女同精品一区二区| 欧美亚洲一区二区三区四区| 国产一区二区在线看| 亚洲午夜影视影院在线观看| 亚洲精品在线一区二区| 91福利在线看| 国产成人av自拍| 日韩av一级片| 亚洲人成在线播放网站岛国| 精品国产免费视频| 欧美午夜电影网| 成人精品免费视频| 麻豆成人91精品二区三区| 亚洲免费观看高清| 中文字幕乱码久久午夜不卡| 91.成人天堂一区| 91黄色在线观看| 99亚偷拍自图区亚洲| 国产精品综合视频| 另类综合日韩欧美亚洲| 亚洲国产精品视频| 亚洲乱码一区二区三区在线观看| 欧美mv和日韩mv的网站| 51精品国自产在线| 欧美日韩在线观看一区二区 | 欧美日韩中文字幕一区| 成人综合日日夜夜| 国产黄色91视频| 国产一区美女在线| 久久成人av少妇免费| 视频一区在线播放| 日韩精彩视频在线观看| 一区二区三区四区在线| 亚洲欧美日韩一区二区 | 亚洲国产欧美在线人成| 亚洲免费在线视频一区 二区| 国产精品午夜电影| 欧美国产一区在线| 国产欧美日韩三级| 中文字幕成人av| 中文字幕av一区 二区| 国产精品美女一区二区| 国产精品美女久久久久久2018 | 91麻豆精东视频| 91视视频在线观看入口直接观看www | 天堂久久一区二区三区| 亚洲成人1区2区| 午夜久久久久久| 蜜臀a∨国产成人精品| 久久成人综合网| 国产成人av自拍| 91看片淫黄大片一级在线观看| 色综合天天在线| 欧美日韩精品一区视频| 日韩午夜三级在线| 久久青草国产手机看片福利盒子 | 欧美色网站导航| 欧美一区二区三区四区视频| 精品国产网站在线观看| 一区精品在线播放| 亚洲一区在线视频观看| 人人精品人人爱| 成人免费高清在线| 91国偷自产一区二区开放时间 | 一区二区三区毛片| 日韩av在线播放中文字幕| 激情综合五月婷婷| 91在线视频免费观看| 在线不卡一区二区| 国产欧美一区二区精品性色| 亚洲精品国产无天堂网2021| 日韩在线播放一区二区| 丰满亚洲少妇av| 欧美日韩免费在线视频| 久久久激情视频| 亚洲电影你懂得| 成人毛片在线观看| 欧美人狂配大交3d怪物一区| 91小视频免费观看| 欧美性视频一区二区三区| 精品国产伦一区二区三区免费 | 欧美激情一区在线观看| 亚洲综合区在线| 国产**成人网毛片九色| 在线观看日产精品|