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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? i2c.c

?? PPC860常見(jiàn)外圍驅(qū)動(dòng)
?? C
字號(hào):
/*
 * (C) Copyright 2000
 * Paolo Scaffardi, AIRVENT SAM s.p.a - RIMINI(ITALY), arsenio@tin.it
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

#include <ppcboot.h>

#ifdef CONFIG_I2C

#include <commproc.h>
#include <i2c.h>

#define DEBUG_STEP	0
#define PRINTD(x)	if (DEBUG_STEP) printf(x);
#define DELAY_US	100000 	// us to wait before checking the I2c

//#define DEBUG_I2C_RATE	0	// To show selected I2C bus rate

#define I2C_PRAM 0
#define CPCR_FLAG 0x01
#define I2C_CPCR_CMD ( ( 0<<(15-7) ) | ( 1 << (15-11) ) | CPCR_FLAG )
#define I2C_RX_LEN 128 /* Receive buffer length */
#define I2C_TX_LEN 128 /* Transmit buffer length */
#define TXBD_R 0x8000  /* Transmit buffer ready to send */
#define TXBD_W 0x2000  /* Wrap, last buffer in buffer circle */
#define TXBD_L 0x0800  /* Last, this buffer is the last in this frame */
                       /* This bit causes the STOP condition to be sent */
#define TXBD_S 0x0400  /* Start condition.  Causes this BD to transmit a start */
#define RXBD_E 0x8000  /* Receive buffer is empty and can be used by CPM */
#define RXBD_W 0x2000  /* Wrap, last receive buffer in buffer circle */

typedef struct I2C_BD
{
  unsigned short status;
  unsigned short length;
  unsigned char *addr;
} I2C_BD;


static I2C_BD *rxbd, *txbd;  	/* buffer descriptors are defined */
	                	/* globally for this file */

static unsigned char
    rxbuf[I2C_RX_LEN],
    txbuf[I2C_TX_LEN];

// Returns the best value of I2BRG to meet desired clock speed of I2C with
// input parameters (clock speed, filter, and predivider value).
// It returns computer speed value and the difference between it and desired
// speed.
static inline int i2c_roundrate (int hz, int speed, int filter, int modval,
				    int *brgval, int *totspeed)
{
    int moddiv = 1 << (5-(modval & 3)),
	brgdiv,
	div;

    brgdiv = hz / (moddiv * speed);

    *brgval = brgdiv / 2 - 3 - 2*filter ;

    if ((*brgval < 0) || (*brgval > 255))
	return -1 ;

    brgdiv = 2 * (*brgval + 3 + 2 * filter) ;
    div  = moddiv * brgdiv ;
    *totspeed = hz / div ;

    return  0;
}

// Sets the I2C clock predivider and divider to meet required clock speed
static int i2c_setrate (int hz, int speed)
{
    immap_t	*immap = (immap_t *)CFG_IMMR ;
    i2c8xx_t	*i2c	= (i2c8xx_t *)&immap->im_i2c;
    int brgval,
	modval,	// 0-3
	bestspeed_diff = speed,
	bestspeed_brgval=0,
	bestspeed_modval=0,
	bestspeed_filter=0,
	totspeed,
	filter=0;	// Use this fixed value

//    for (filter = 0; filter < 2; filter++)
	for (modval = 0; modval < 4; modval++)
	    if (i2c_roundrate (	hz, speed,
				filter, modval,
				&brgval, &totspeed) == 0)
	    {
		int diff = speed - totspeed ;

		if ((diff >= 0) && (diff < bestspeed_diff))
		{
		    bestspeed_diff 	= diff ;
		    bestspeed_modval 	= modval;
		    bestspeed_brgval 	= brgval;
		    bestspeed_filter 	= filter;
		}
	    }

#ifdef DEBUG_I2C_RATE
    printf("Best is:\n");
    printf("\nCPU=%dhz RATE=%d F=%d I2MOD=%08x I2BRG=%08x DIFF=%dhz",
	    hz, speed,
	    bestspeed_filter, bestspeed_modval, bestspeed_brgval,
	    bestspeed_diff);
#endif
    i2c->i2c_i2mod |= ((bestspeed_modval & 3) << 1) | (bestspeed_filter << 3);
    i2c->i2c_i2brg = bestspeed_brgval & 0xff;

#ifdef DEBUG_I2C_RATE
    printf("i2mod=%08x i2brg=%08x\n", i2c->i2c_i2mod, i2c->i2c_i2brg);
#endif

    return 1 ;
}

volatile i2c8xx_t	*i2c;
volatile cbd_t		*tbdf, *rbdf;
volatile iic_t		*iip;

void i2c_init(int speed)
{
	init_data_t *idata = (init_data_t *)(CFG_INIT_RAM_ADDR + CFG_INIT_DATA_OFFSET);
        immap_t	*immap 	= (immap_t *)CFG_IMMR ;
	volatile cpm8xx_t	*cp;

	/* Get pointer to Communication Processor
	 * and to internal registers
	 */
	cp = (cpm8xx_t *)&immap->im_cpm ;
	iip = (iic_t *)&cp->cp_dparam[PROFF_IIC];
	i2c = (i2c8xx_t *)&(immap->im_i2c);

	// Disable relocation
	iip->iic_rpbase = 0 ;

	/* Initialize Port B I2C pins.
	 */
	cp->cp_pbpar |= 0x00000030;
	cp->cp_pbdir |= 0x00000030;
	cp->cp_pbodr |= 0x00000030;

	/* Disable interrupts.
	 */
	i2c->i2c_i2mod = 0;
	i2c->i2c_i2cmr = 0;
	i2c->i2c_i2cer = 0xff;

	// Set the I2C BRG Clock division factor from desired i2c rate
	// and current CPU rate (we assume sccr dfbgr field is 0;
	// divide BRGCLK by 1)

	PRINTD("\n[I2C  ] Setting rate...");
	i2c_setrate (idata->cpu_clk, speed) ;

	/* Set I2C controller in master mode
	 */
	i2c->i2c_i2com = 0x01;

	// Set SDMA bus arbitration level to 5 (SDCR)
	immap->im_siu_conf.sc_sdcr = 0x0001 ;

	/* Initialize Tx/Rx parameters.*/
#if 0
        iip->iic_rbptr = iip->iic_rbase = BD_IIC_START ;//2018 ;
	iip->iic_tbptr = iip->iic_tbase = iip->iic_rbase + sizeof(I2C_BD) ; //2020 ;
#else
	iip->iic_rbptr = iip->iic_rbase = m8xx_cpm_dpbase_align(8) ;
        iip->iic_tbptr = iip->iic_tbase = iip->iic_rbase + sizeof(I2C_BD);
#endif
	rxbd = (I2C_BD *)((unsigned char *)&cp->cp_dpmem[iip->iic_rbase]);
	txbd = (I2C_BD *)((unsigned char *)&cp->cp_dpmem[iip->iic_tbase]);

#if DEBUG_STEP
	printf("rbase = %04x\n", iip->iic_rbase);
	printf("tbase = %04x\n", iip->iic_tbase);
	printf("Rxbd1=%08x\n", (int)rxbd);
	printf("Txbd1=%08x\n", (int)txbd);
#endif

        cp->cp_cpcr = mk_cr_cmd(CPM_CR_CH_I2C, CPM_CR_INIT_TRX) | CPM_CR_FLG;
	while (cp->cp_cpcr & CPM_CR_FLG);

	/* Set big endian byte order
	 */
	iip->iic_tfcr = 0x15;
	iip->iic_rfcr = 0x15;

	/* Set maximum receive size.
	 */
	iip->iic_mrblr = 128;

	PRINTD("\n[I2C  ] Clearing the buffer memory...");

	// Clear the buffer memory
	memset ((char *)rxbuf, I2C_RX_LEN, 0);
	memset ((char *)txbuf, I2C_TX_LEN, 0);

	PRINTD("\n[I2C  ] Initializing BD's...");

	// Initialize the BD's

	// Rx: Wrap, no interrupt, empty
	rxbd->addr = rxbuf;
	rxbd->status = 0xa800;

	// Tx: Wrap, no interrupt, not ready to send, last
	txbd->addr = txbuf;
	txbd->status = 0x2800;

	// Clear events and interrupts
	i2c->i2c_i2cer = 0xff ;
	i2c->i2c_i2cmr = 0 ;
}

void i2c_send( unsigned char address,
              unsigned char secondary_address,
              int enable_secondary,
              unsigned short size, unsigned char dataout[] )
{
  int i,j;

  if( size > I2C_TX_LEN )  /* Trying to send message larger than BD */
    return;

  PRINTD("\n[I2C  ] Waiting for transmit buffer empty...");
  while( txbd->status & TXBD_R ) ; // Loop until previous data sent

  PRINTD("\n[I2C  ] Formatting addresses...");
  if( enable_secondary ) /* Device has an internal address */
  {
    txbd->length = size + 2;  /* Length of message plus dest addresses */
    txbd->addr[0] = address;
    txbd->addr[0] &= ~(0x01);
    txbd->addr[1] = secondary_address;
    i = 2;
  }
  else
  {
    txbd->length = size + 1;  /* Length of message plus dest address */
    txbd->addr[0] = address;  /* Write destination address to BD */
    txbd->addr[0] &= ~(0x01);  /* Set address to write */
    i = 1;
  }

#if DEBUG_STEP
    printf("Length = %d addr[0] = %08x addr[1] = %08x\n",
	txbd->length,
	txbd->addr[0],
	txbd->addr[1]);
#endif

  /* Copy data to send into buffer */

 PRINTD("\n[I2C  ] Copying data into buffer...");

  for( j = 0; j < size; i++, j++ )
    txbd->addr[ i ] = dataout[j];

  /* Ready to Transmit, wrap, last */

  PRINTD("\n[I2C  ] Waiting to transmit...");

  txbd->status = txbd->status | TXBD_R | TXBD_W | TXBD_L | TXBD_S ;

  /* Enable I2C */

  PRINTD("\n[I2C  ] Enabling I2C...");
  i2c->i2c_i2mod |= 1;

  /* Transmit */
  PRINTD("\n[I2C  ] Transmitting...");
  i2c->i2c_i2com |= 0x80;

  PRINTD("\n[I2C  ] Waiting for transmit buffer empty...");
  udelay (DELAY_US) ;	// This is a patch!

  while( txbd->status & TXBD_R );

  /* Turn off I2C */
  PRINTD("\n[I2C  ] Turning off I2C...");
  i2c->i2c_i2mod &= (~1);

#if DEBUG_STEP
 printf("\nTXBD->CBD_SC=%08x\n", txbd->status);

 if (txbd->status & 4)
    while(1);
#endif
}

void i2c_receive(unsigned char address,
		unsigned char secondary_address,
		int enable_secondary,
                unsigned short size_to_expect, unsigned char datain[] )
{
  int i, j;

  if( size_to_expect > I2C_RX_LEN )
	return;  /* Expected to receive too much */

  /* Turn on I2C */
  i2c->i2c_i2mod |= 0x01;

  /* Setup TXBD for destination address */
  if( enable_secondary )
  {
    txbd->length = 2;
    txbd->addr[0] = address | 0x00;   /* Write data */
    txbd->addr[1] = secondary_address;  /* Internal address */
    txbd->status = TXBD_R;

    /* Reset the rxbd */
    rxbd->status = RXBD_E | RXBD_W;

    /* Begin transmission */
    i2c->i2c_i2com |= 0x80;

  }
  else
  {
    txbd->length = 1 + size_to_expect;
    txbd->addr[0] = address | 0x01;


    /* Buffer ready to transmit, wrap, loop */
    txbd->status |= TXBD_R | TXBD_W | TXBD_L;

    /* Reset the rxbd */
    rxbd->status = RXBD_E | RXBD_W;

    /* Begin transmission */
    i2c->i2c_i2com |= 0x80;

    while( txbd->status & TXBD_R);  /* Loop until transmit completed */
  }

  while( rxbd->status & RXBD_E);  /* Wait until receive is finished */

  for( i= 0, j = 0; j < size_to_expect; j++, i++ )  /* Copy data to datain[] */
    datain[j] = rxbd->addr[i];

  /* Turn off I2C */
  i2c->i2c_i2mod &= (~1);
}

#endif	/* CONFIG_I2C */

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区欧美视频| 国产资源在线一区| 久久久亚洲高清| 欧美在线观看视频一区二区三区| 另类小说色综合网站| 亚洲色图丝袜美腿| 国产网站一区二区| 日韩视频一区在线观看| 91久久精品一区二区二区| 国产成人精品亚洲777人妖| 日韩高清不卡一区二区| 亚洲柠檬福利资源导航| 国产欧美1区2区3区| 欧美一级国产精品| 欧美色综合久久| 成人av免费在线| 激情深爱一区二区| 亚洲成人免费影院| 一区二区三区成人| 国产午夜精品一区二区三区嫩草 | 国产精品资源网| 香蕉久久一区二区不卡无毒影院| 亚洲欧美在线aaa| 国产欧美1区2区3区| 久久久综合视频| 日韩欧美亚洲国产另类| 欧美日韩视频第一区| 色婷婷综合久久久久中文| 成人国产在线观看| 波多野结衣亚洲一区| 国产成人av一区二区| 国产精品性做久久久久久| 美女视频黄久久| 蜜桃av一区二区| 蜜桃视频在线一区| 美国一区二区三区在线播放| 日韩精品一二三区| 蜜臀av国产精品久久久久| 日韩激情av在线| 蜜臀a∨国产成人精品| 久久精品国产澳门| 欧美日韩五月天| 欧美亚洲国产一卡| 欧美三级一区二区| 91麻豆精品国产| 日韩视频在线永久播放| 精品少妇一区二区三区免费观看| 日韩午夜在线影院| 精品噜噜噜噜久久久久久久久试看 | 欧美成人性战久久| 精品91自产拍在线观看一区| 精品盗摄一区二区三区| 久久久噜噜噜久久人人看| 久久久久国产精品厨房| 国产精品久久久一区麻豆最新章节| 国产欧美日韩亚州综合 | 91在线免费视频观看| 91麻豆精东视频| 欧美三级日韩三级国产三级| 91精品国产一区二区三区香蕉| 欧美成人一区二区三区片免费| 国产亚洲精品资源在线26u| 国产精品成人一区二区艾草 | 肉色丝袜一区二区| 狠狠狠色丁香婷婷综合激情 | 色伊人久久综合中文字幕| 欧美日韩黄色一区二区| 欧美电影免费观看高清完整版在线| 欧美精品一区二区三| 欧美激情一区二区在线| 夜夜操天天操亚洲| 在线观看欧美黄色| 精品免费国产二区三区| 国产精品美女久久久久久久久久久| 玉足女爽爽91| 精油按摩中文字幕久久| 91丨porny丨中文| 欧美一区二区性放荡片| 国产精品毛片无遮挡高清| 亚洲第一狼人社区| 国产成人精品www牛牛影视| 在线视频国内一区二区| 欧美精品一区二区久久久| 亚洲精品视频观看| 激情综合网激情| 欧美在线一二三| 国产欧美一区二区精品久导航| 亚洲国产一区视频| 成人激情午夜影院| 欧美一区二区三区在线观看视频| 中文字幕的久久| 蜜桃久久精品一区二区| 色综合天天综合网国产成人综合天 | 国产精品中文字幕日韩精品| 欧美中文字幕一区二区三区| 国产午夜三级一区二区三| 偷窥国产亚洲免费视频| 成人av综合在线| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 亚洲午夜久久久久久久久久久| 国产精品资源在线| 欧美一区二区不卡视频| 一区二区三区中文在线| 国产成人精品综合在线观看| 91精品国产91久久久久久一区二区| 亚洲欧洲三级电影| 国产精品综合视频| 欧美大肚乱孕交hd孕妇| 亚洲1区2区3区视频| 色婷婷久久久综合中文字幕 | 国产农村妇女毛片精品久久麻豆| 日本亚洲三级在线| 欧美性大战久久久| 一区在线观看视频| 国产成a人亚洲精品| 欧美成人精品3d动漫h| 99免费精品在线观看| 国产欧美日韩麻豆91| 国产精品一级黄| 精品福利在线导航| 蜜臀av性久久久久蜜臀aⅴ四虎 | 久久99精品国产91久久来源| 3atv在线一区二区三区| 亚洲va韩国va欧美va精品 | 在线国产亚洲欧美| 亚洲日本在线观看| a4yy欧美一区二区三区| 欧美韩国日本一区| 成人天堂资源www在线| 久久久国产午夜精品| 国产乱一区二区| 欧美激情中文字幕一区二区| 国产成人精品网址| 中文字幕成人网| 成人激情开心网| 亚洲欧洲日韩女同| 色94色欧美sute亚洲线路一久| 亚洲欧美中日韩| 成人福利在线看| 最新国产成人在线观看| 色一区在线观看| 亚洲成av人片一区二区三区| 欧美日韩三级一区| 日韩vs国产vs欧美| 精品捆绑美女sm三区| 国产乱妇无码大片在线观看| 久久久久久久久伊人| 国产成人av资源| 综合在线观看色| 欧美综合在线视频| 日韩激情视频网站| 日韩精品专区在线影院重磅| 国内欧美视频一区二区| 国产欧美一区二区三区在线老狼| 国产成人精品亚洲777人妖 | 国产一区二区三区在线观看精品 | 国产精品欧美久久久久一区二区 | 综合电影一区二区三区 | 欧美日韩另类一区| 免费成人av在线播放| 2021国产精品久久精品| av不卡免费在线观看| 亚洲综合999| 日韩欧美资源站| 国产精品69毛片高清亚洲| 亚洲区小说区图片区qvod| 91精品国产一区二区人妖| 精品一区二区三区视频| 亚洲四区在线观看| 日韩欧美中文字幕公布| 成人精品国产免费网站| 一区二区三区日韩欧美精品| 555www色欧美视频| 国产电影精品久久禁18| 亚洲女人****多毛耸耸8| 成人sese在线| 久久夜色精品国产欧美乱极品| 欧美国产一区二区| 亚洲精品高清在线| 日本视频一区二区| 91国模大尺度私拍在线视频| 在线免费不卡电影| 色婷婷av一区二区三区软件| 日韩欧美国产一区二区三区| 亚洲老妇xxxxxx| 狠狠色狠狠色综合系列| a美女胸又www黄视频久久| 欧美一区二区三区电影| 亚洲成人在线观看视频| 国产成人丝袜美腿| 91亚洲精品久久久蜜桃网站| 91免费在线视频观看| 欧美体内she精高潮| 久久久久久日产精品| 国产精品传媒入口麻豆| 三级亚洲高清视频| 91看片淫黄大片一级| 欧美一区二区啪啪| 亚洲日本在线a| 国产伦精一区二区三区|