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

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

?? dma1.c

?? ppcboot2.0 華恒光盤里帶的BOOTLOADER
?? C
?? 第 1 頁 / 共 2 頁
字號:
/************************************************************ * * copyright @ Motorola, 1999 * * App. API * * App. API are the APIs Kernel provides for the application * level program * ************************************************************/#include "dma_export.h"#include "dma.h"/* Define a macro to use an optional application-layer print function, if * one was passed to the library during initialization.  If there was no * function pointer passed, this protects against referencing a NULL pointer. * Also define The global variable that holds the passed pointer. */#define PRINT if ( app_print ) app_printstatic int (*app_print)(char *,...);/* Set by call to get_eumbbar during DMA_Initialize. * This could be globally available to the library, but there is * an advantage to passing it as a parameter: it is already in a register * and doesn't have to be loaded from memory.  Also, that is the way the * library was already implemented and I don't want to change it without * a more detailed analysis. * It is being set as a global variable during initialization to hide it from * the DINK application layer, because it is Kahlua-specific.  I think that * get_eumbbar, load_runtime_reg, and store_runtime_reg should be defined in * a Kahlua-specific library dealing with the embedded utilities memory block. * Right now, get_eumbbar is defined in dink32/kahlua.s.  The other two are * defined in dink32/drivers/i2c/i2c2.s, drivers/dma/dma2.s, etc. */static unsigned int Global_eumbbar = 0;extern unsigned int get_eumbbar();extern unsigned int load_runtime_reg( unsigned int eumbbar, unsigned int reg );#pragma Alias( load_runtime_reg, "load_runtime_reg" );extern void store_runtime_reg( unsigned int eumbbar, unsigned int reg, unsigned int val );#pragma Alias( store_runtime_reg, "store_runtime_reg" );unsigned int dma_reg_tb[][14] = {	/* local DMA registers */	{      /* DMA_0_MR   */  0x00001100,      /* DMA_0_SR   */  0x00001104,      /* DMA_0_CDAR */  0x00001108,      /* DMA_0_SAR  */  0x00001110,      /* DMA_0_DAR  */  0x00001118,      /* DMA_0_BCR  */  0x00001120,      /* DMA_0_NDAR */  0x00001124,      /* DMA_1_MR   */  0x00001200,      /* DMA_1_SR   */  0x00001204,      /* DMA_1_CDAR */  0x00001208,      /* DMA_1_SAR  */  0x00001210,      /* DMA_1_DAR  */  0x00001218,      /* DMA_1_BCR  */  0x00001220,      /* DMA_1_NDAR */  0x00001224,	},	/* remote DMA registers */	{      /* DMA_0_MR   */  0x00000100,      /* DMA_0_SR   */  0x00000104,      /* DMA_0_CDAR */  0x00000108,      /* DMA_0_SAR  */  0x00000110,      /* DMA_0_DAR  */  0x00000118,      /* DMA_0_BCR  */  0x00000120,      /* DMA_0_NDAR */  0x00000124,      /* DMA_1_MR   */  0x00000200,      /* DMA_1_SR   */  0x00000204,      /* DMA_1_CDAR */  0x00000208,      /* DMA_1_SAR  */  0x00000210,      /* DMA_1_DAR  */  0x00000218,      /* DMA_1_BCR  */  0x00000220,      /* DMA_1_NDAR */  0x00000224,	},};/* API functions *//*  Initialize DMA unit with the following: *  optional pointer to application layer print function * *  These parameters may be added: *  ??? *  Interrupt enables, modes, etc. are set for each transfer. * *  This function must be called before DMA unit can be used. */externDMA_Status DMA_Initialize( int (*p)(char *,...)){  DMAStatus status;  /* establish the pointer, if there is one, to the application's "printf" */  app_print = p;  /* If this is the first call, get the embedded utilities memory block   * base address.  I'm not sure what to do about error handling here:   * if a non-zero value is returned, accept it.   */  if ( Global_eumbbar == 0)     Global_eumbbar = get_eumbbar();  if ( Global_eumbbar == 0)  {    PRINT( "DMA_Initialize: can't find EUMBBAR\n" );    return DMA_ERROR;  }  return DMA_SUCCESS;}/* Perform the DMA transfer, only direct mode is currently implemented. * At this point, I think it would be better to define a different * function for chaining mode. * Also, I'm not sure if it is appropriate to have the "generic" API * accept snoop and int_steer parameters.  The DINK user interface allows * them, so for now I'll leave them. * * int_steer controls DMA interrupt steering to PCI or local processor * type is the type of transfer: M2M, M2P, P2M, P2P * source is the source address of the data * dest is the destination address of the data * len is the length of data to transfer * channel is the DMA channel to use for the transfer * snoop is the snoop enable control */extern DMA_Status DMA_direct_transfer( DMA_INTERRUPT_STEER int_steer,                                       DMA_TRANSFER_TYPE type,                                       unsigned int source,                                       unsigned int dest,                                       unsigned int len,                                       DMA_CHANNEL channel,                                       DMA_SNOOP_MODE snoop){    DMA_MR md;    DMA_CDAR cdar;    /* it's inappropriate for curr to be a struct, but I'll leave it */    DMA_CURR curr;    DMAStatus stat;	/* The rest of this code was moved from device.c test_dma to here.	 * It needs to be cleaned up and validated, but at least it is removed	 * from the application and API.  Most of the mode is left hard coded.	 * This should be changed after the final API is defined and the user	 * application has a way to control the transfer.	 *	 */	if ( DMA_Get_Mode( LOCAL, Global_eumbbar, channel, &md ) != DMASUCCESS )	{		return DMA_ERROR;	}	md.irqs = int_steer;	md.pde = 0;	md.dahts = 3; /* 8 - byte */	md.sahts = 3; /* 8 - byte */	md.dahe = 0;	md.sahe = 0;	md.prc = 0;	/* if steering interrupts to local processor, use polling mode */	if ( int_steer == DMA_INT_STEER_PCI )	{		md.eie = 1;		md.eotie = 1;	} else {		md.eie = 0;		md.eotie = 0;	}	md.dl = 0;	md.ctm = 1;   /* direct mode */    md.cc = 0;	/* validate the length range */	if (len > 0x3ffffff )	{		PRINT( "dev DMA: length of transfer too large: %d\n", len );		return DMA_ERROR;	}	/* inappropriate to use a struct, but leave as is for now */	curr.src_addr = source;	curr.dest_addr = dest;	curr.byte_cnt = len;	(void)DMA_Poke_Desp( LOCAL, Global_eumbbar, channel, &cdar );	cdar.snen = snoop;	cdar.ctt = type;	if ( ( stat = DMA_Bld_Desp( LOCAL, Global_eumbbar, channel, cdar ))			!= DMASUCCESS ||		 ( stat = DMA_Bld_Curr( LOCAL, Global_eumbbar, channel, curr ))			!= DMASUCCESS ||	     ( stat = DMA_Set_Mode( LOCAL, Global_eumbbar, channel, md ))			!= DMASUCCESS ||		 ( stat = DMA_Start( LOCAL, Global_eumbbar, channel ))			!= DMASUCCESS )	{		if ( stat == DMACHNBUSY )		{			PRINT( "dev DMA: channel %d busy.\n", channel );		}		else		{			PRINT( "dev DMA: invalid channel request.\n", channel );		}		return DMA_ERROR;	}/* Since we are interested at the DMA performace right now,   we are going to do as less as possible to burden the   603e core.   if you have epic enabled or don't care the return from   DMA operation, you can just return SUCCESS.   if you don't have epic enabled and care the DMA result,   you can use the polling method below.   Note: I'll attempt to activate the code for handling polling. */#if 0	/* if steering interrupt to local processor, let it handle results */	if ( int_steer == DMA_INT_STEER_LOCAL )	{	    return DMA_SUCCESS;	}	/* polling since interrupt goes to PCI */	do	{		stat = DMA_ISR( Global_eumbbar, channel, dma_error_func,			dma_error_func, dma_error_func, dma_error_func );	}	while ( stat == DMANOEVENT );#endif    return DMA_SUCCESS;}/* DMA library internal functions *//** * Note: * * In all following functions, the host (KAHLUA) processor has a * choice of accessing on board local DMA (LOCAL), * or DMA on a distributed KAHLUA (REMOTE). In either case, * the caller shall pass the configured embedded utility memory * block base address relative to the DMA. If LOCAL DMA is used, * this parameter shall be EUMBBAR, if REMOTE is used, the * parameter shall be the corresponding PCSRBAR. **//************************************************************** * function: DMA_Get_Stat * * description: return the content of status register of *              the given DMA channel * *              if error, reserved0 field all 1s. **************************************************************/staticDMAStatus DMA_Get_Stat( LOCATION host, unsigned int eumbbar, unsigned int channel, DMA_SR *stat ){    unsigned int tmp;   if ( channel != 0 && channel != 1 || stat == 0 )   {       return DMAINVALID;   }    tmp = load_runtime_reg( eumbbar, dma_reg_tb[host][channel*NUM_DMA_REG+DMA_SR_REG] );#ifdef DMADBG0   PRINT( "%s(%d): %s DMA %d (0x%08x) stat = 0x%08x\n", __FILE__, __LINE__,		  ( host == LOCAL ? "local" : "remote" ), channel, dma_reg_tb[host][channel*NUM_DMA_REG+DMA_SR_REG], tmp );#endif	 stat->reserved0 = ( tmp & 0xffffff00 ) >> 8;	 stat->lme       = ( tmp & 0x00000080 ) >> 7;	 stat->reserved1 = ( tmp & 0x00000060 ) >> 5;	 stat->pe        = ( tmp & 0x00000010 ) >> 4;	 stat->reserved2 = ( tmp & 0x00000008 ) >> 3;	 stat->cb        = ( tmp & 0x00000004 ) >> 2;	 stat->eosi      = ( tmp & 0x00000002 ) >> 1;	 stat->eocai     = ( tmp & 0x00000001 );   return DMASUCCESS;}/************************************************************** * function: DMA_Get_Mode * * description: return the content of mode register of the *              given DMA channel * *              if error, return DMAINVALID, otherwise return *              DMASUCCESS **************************************************************/staticDMAStatus DMA_Get_Mode( LOCATION host, unsigned eumbbar, unsigned int channel, DMA_MR *mode ){    unsigned int tmp;   if ( channel != 0 && channel != 1 || mode == 0 )   {     return DMAINVALID;   }    tmp = load_runtime_reg( eumbbar, dma_reg_tb[host][channel*NUM_DMA_REG+DMA_MR_REG] );#ifdef DMADBG0   PRINT( "%s(%d): %s DMA %d (0x%08x) mode = 0x%08x\n", __FILE__, __LINE__,		  ( host == LOCAL ? "local" : "remote" ), channel, dma_reg_tb[host][channel*NUM_DMA_REG+DMA_MR_REG], tmp );#endif	 mode->reserved0 = (tmp & 0xfff00000) >> 20;	 mode->irqs      = (tmp & 0x00080000) >> 19;	 mode->pde       = (tmp & 0x00040000) >> 18;	 mode->dahts     = (tmp & 0x00030000) >> 16;     mode->sahts     = (tmp & 0x0000c000) >> 14;	 mode->dahe      = (tmp & 0x00002000) >> 13;	 mode->sahe      = (tmp & 0x00001000) >> 12;	 mode->prc       = (tmp & 0x00000c00) >> 10;	 mode->reserved1 = (tmp & 0x00000200) >> 9;	 mode->eie       = (tmp & 0x00000100) >> 8;	 mode->eotie     = (tmp & 0x00000080) >> 7;	 mode->reserved2 = (tmp & 0x00000070) >> 4;	 mode->dl        = (tmp & 0x00000008) >> 3;	 mode->ctm       = (tmp & 0x00000004) >> 2;	 mode->cc        = (tmp & 0x00000002) >> 1;	 mode->cs        = (tmp & 0x00000001);   return DMASUCCESS;}/************************************************************** * function: DMA_Set_Mode * * description: Set a new mode to a given DMA channel * * note: It is not a good idea of changing the DMA mode during *       the middle of a transaction. **************************************************************/staticDMAStatus DMA_Set_Mode( LOCATION host, unsigned eumbbar, unsigned int channel, DMA_MR mode ){    unsigned int tmp;   if ( channel != 0 && channel != 1 )   {	   return DMAINVALID;   }   tmp = ( mode.reserved0 & 0xfff ) << 20;   tmp |= ( ( mode.irqs  & 0x1 ) << 19);   tmp |= ( ( mode.pde   & 0x1 ) << 18 );   tmp |= ( ( mode.dahts & 0x3 ) << 16 );   tmp |= ( ( mode.sahts & 0x3 ) << 14 );   tmp |= ( ( mode.dahe  & 0x1 ) << 13 );   tmp |= ( ( mode.sahe  & 0x1 ) << 12 );   tmp |= ( ( mode.prc   & 0x3 ) << 10 );   tmp |= ( ( mode.reserved1 & 0x1 ) << 9 );   tmp |= ( ( mode.eie   & 0x1 ) << 8 );   tmp |= ( ( mode.eotie & 0x1 ) << 7 );   tmp |= ( ( mode.reserved2 & 0x7 ) << 4 );   tmp |= ( ( mode.dl    & 0x1 ) << 3 );   tmp |= ( ( mode.ctm   & 0x1 ) << 2 );   tmp |= ( ( mode.cc    & 0x1 ) << 1 ) ;   tmp |= ( mode.cs    & 0x1 );   store_runtime_reg( eumbbar, dma_reg_tb[host][channel*NUM_DMA_REG + DMA_MR_REG], tmp );   return DMASUCCESS;}/************************************************************ * function: DMA_Start * * description: start a given DMA channel transaction *              return DMASUCCESS if success otherwise return *              DMAStatus value * * note: this function will clear DMA_MR(CC) first, then *       set DMA_MR(CC). ***********************************************************/staticDMAStatus DMA_Start( LOCATION host, unsigned int eumbbar, unsigned int channel ){   DMA_SR stat;   unsigned int mode;   if ( channel != 0 && channel != 1 )   {	   return DMAINVALID;   }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色诱亚洲精品久久久久久| 色综合夜色一区| 国产精品夜夜爽| 久久99精品久久久久久动态图| 狠狠狠色丁香婷婷综合久久五月| 国产成人av网站| 丰满少妇久久久久久久 | 精品国产免费人成在线观看| 国产午夜亚洲精品羞羞网站| 亚洲一二三四在线| 国产乱人伦偷精品视频不卡| 欧美视频一区在线观看| 精品毛片乱码1区2区3区| 亚洲欧美色图小说| 国产精品一区二区91| 欧美日精品一区视频| 国产午夜亚洲精品午夜鲁丝片 | 国产黄色精品视频| 色婷婷精品久久二区二区蜜臀av| 欧美日韩精品三区| 亚洲欧美怡红院| 蜜桃传媒麻豆第一区在线观看| 成人午夜免费视频| 日韩欧美国产高清| 自拍av一区二区三区| 久久99国产乱子伦精品免费| 欧美中文字幕不卡| 日韩毛片在线免费观看| 国产美女一区二区三区| 欧美日韩精品免费观看视频| 日韩一区欧美一区| 国内精品国产三级国产a久久| 欧美精品aⅴ在线视频| 美女www一区二区| 成人黄色国产精品网站大全在线免费观看| 欧美日韩一区不卡| 亚洲一区二区视频| 欧美影院精品一区| 一区二区三区四区激情| av一区二区三区在线| 久久伊人蜜桃av一区二区| 精品夜夜嗨av一区二区三区| www日韩大片| 国产福利不卡视频| 欧美国产日韩在线观看| 国产v日产∨综合v精品视频| 国产农村妇女毛片精品久久麻豆| 国产麻豆成人精品| 国产精品久久久久久福利一牛影视| 成人综合在线观看| 亚洲精品少妇30p| 欧美剧在线免费观看网站| 日韩激情一二三区| 久久亚洲影视婷婷| www.久久精品| 亚洲国产aⅴ成人精品无吗| 制服丝袜亚洲播放| 激情综合网最新| 亚洲视频一区在线| 欧美一区二区三区四区久久| 国产精品一区二区不卡| 亚洲欧洲日韩一区二区三区| 欧美三级三级三级爽爽爽| 蜜桃av一区二区三区| 欧美国产1区2区| 欧美性猛片aaaaaaa做受| 免费看日韩a级影片| 国产精品全国免费观看高清| 欧美日韩黄视频| 国产大陆精品国产| 亚洲福利视频三区| 国产嫩草影院久久久久| 欧美精品 日韩| 丁香六月久久综合狠狠色| 亚洲电影第三页| 国产网站一区二区三区| 欧美亚洲动漫制服丝袜| 国产乱码精品一区二区三区av| 亚洲美女免费视频| 2021国产精品久久精品| 欧美日韩视频一区二区| 福利电影一区二区三区| 日韩电影在线看| 亚洲色图制服诱惑| 久久―日本道色综合久久 | 天天做天天摸天天爽国产一区 | 中文字幕在线不卡国产视频| 6080yy午夜一二三区久久| 99久精品国产| 激情丁香综合五月| 日日夜夜免费精品| 亚洲国产精品久久久男人的天堂| 欧美国产激情二区三区| 久久在线观看免费| 日韩欧美三级在线| 欧美日韩国产片| 在线观看国产日韩| 色域天天综合网| 97精品国产露脸对白| 国产精品一级在线| 国产一区二区三区视频在线播放| 亚洲成av人片一区二区三区| 亚洲欧美日韩国产成人精品影院| 久久久精品综合| 久久精品网站免费观看| 久久久噜噜噜久久中文字幕色伊伊| 欧美欧美午夜aⅴ在线观看| 色婷婷国产精品| 91麻豆免费在线观看| 99免费精品视频| www.欧美日韩| 99国产精品久久久久| 成人av在线资源网站| 不卡的av在线| 91视频国产观看| 91丨九色丨黑人外教| 91麻豆swag| 91啪九色porn原创视频在线观看| 成人激情小说乱人伦| 成人美女在线观看| 91一区二区在线| 成人午夜激情在线| hitomi一区二区三区精品| 91尤物视频在线观看| 色综合久久中文字幕综合网| 成人av电影免费观看| 99精品视频一区二区三区| 色一情一乱一乱一91av| 欧美日韩免费视频| 欧美一级搡bbbb搡bbbb| 日韩精品一区二区三区老鸭窝| 欧美电视剧免费观看| 久久精品在线免费观看| 中文字幕免费不卡| 一区二区激情视频| 日韩1区2区3区| 黑人精品欧美一区二区蜜桃| 九色综合狠狠综合久久| 国内不卡的二区三区中文字幕 | 精品久久久久一区| 中文幕一区二区三区久久蜜桃| 国产精品看片你懂得| 亚洲风情在线资源站| 激情欧美一区二区| 99国产精品久久| 日本一区二区三区在线观看| 国产精品久久久久影院亚瑟| 亚洲成人一区二区| 美美哒免费高清在线观看视频一区二区 | 亚洲影院久久精品| 免费看黄色91| 波多野结衣在线aⅴ中文字幕不卡| 在线一区二区观看| 久久午夜羞羞影院免费观看| 亚洲人精品午夜| 久久精品国产精品亚洲红杏| aa级大片欧美| 欧美一区二区三区系列电影| 国产欧美一区二区精品忘忧草| 亚洲一区二区三区在线播放| 麻豆高清免费国产一区| 97aⅴ精品视频一二三区| 欧美一区二区三区视频| 亚洲欧美一区二区三区国产精品 | 国产一区二区伦理片| 色美美综合视频| 久久奇米777| 亚洲午夜精品在线| 福利电影一区二区| 欧美成人福利视频| 亚洲成人一区在线| 91丝袜美腿高跟国产极品老师| 欧美成人精品福利| 亚洲午夜一区二区三区| 成人动漫中文字幕| 欧美成人午夜电影| 天涯成人国产亚洲精品一区av| av色综合久久天堂av综合| 日韩欧美色综合网站| 亚洲1区2区3区4区| 色久综合一二码| 国产日产亚洲精品系列| 久久精品99久久久| 在线播放视频一区| 一区二区三区四区不卡在线| 成人免费不卡视频| 国产欧美中文在线| 韩国精品一区二区| 精品国产亚洲在线| 免费看黄色91| 日韩视频一区二区三区| 亚洲第一激情av| 欧美色偷偷大香| 亚洲电影中文字幕在线观看| 91污片在线观看| 亚洲色图欧洲色图婷婷| 91视频国产观看| 亚洲精品亚洲人成人网在线播放| 91丨九色丨尤物| 一区二区三区四区精品在线视频|