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

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

?? i2c-algo-s3c2410.c

?? s3c2410 arm-linux-2.4.18 i2c master driver
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*   -------------------------------------------------------------------------   i2c-algo-s3c2410.c i2c driver algorithms for the Samsung S3C2410X   processor and SMDK2410 reference board.   Steve Hein <ssh@sgi.com>   Copyright 2002 SGI, Inc.   -------------------------------------------------------------------------   This file was highly leveraged from i2c-algo-ppc405.c:      Ian DaSilva, MontaVista Software, Inc.   idasilva@mvista.com or source@mvista.com   Copyright 2000 MontaVista Software Inc.   Changes made to support the IIC peripheral on the IBM PPC 405   ---------------------------------------------------------------------------   This file was highly leveraged from i2c-algo-pcf.c, which was created   by Simon G. Vogl and Hans Berglund:     Copyright (C) 1995-1997 Simon G. Vogl                   1998-2000 Hans Berglund   With some changes from Ky鰏ti M鋖kki <kmalkki@cc.hut.fi> and    Frodo Looijaard <frodol@dds.nl> ,and also from Martin Bailey   <mbailey@littlefeet-inc.com>    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., 675 Mass Ave, Cambridge, MA 02139, USA.   ---------------------------------------------------------------------------*/#include <linux/kernel.h>#include <linux/module.h>#include <linux/delay.h>#include <linux/slab.h>#include <linux/version.h>#include <linux/init.h>#include <asm/uaccess.h>#include <linux/ioport.h>#include <linux/errno.h>#include <linux/sched.h>#include <linux/i2c.h>#include <linux/i2c-algo-s3c2410.h>#include "i2c-s3c2410.h"#undef KERN_DEBUG#define KERN_DEBUG#ifdef MODULE_LICENSEMODULE_LICENSE("GPL");#endif/* ----- global defines ----------------------------------------------- */#define DEB(x) if (s3c2410_i2c_debug>=1) x#define DEB2(x) if (s3c2410_i2c_debug>=2) x#define DEB3(x) if (s3c2410_i2c_debug>=3) x /* print several statistical values*/#define DEBPROTO(x) if (s3c2410_i2c_debug>=9) x; 	/* debug the protocol by showing transferred bits */#define DEF_TIMEOUT 2/* debugging - slow down transfer to have a look at the data .. 	*//* I use this with two leds&resistors, each one connected to sda,scl 	*//* respectively. This makes sure that the algorithm works. Some chips   *//* might not like this, as they have an internal timeout of some mils	*//*#define SLO_IO      jif=jiffies;while(jiffies<=jif+i2c_table[minor].veryslow)\                        if (need_resched) schedule();*//* ----- global variables ---------------------------------------------	*/#ifdef SLO_IO	int jif;#endif/* module parameters: */int s3c2410_i2c_debug=0;static int i2c_clkdiv=1;/* --- setting states on the bus with the right timing: ---------------	*/#define s3c2410_outb(adap, reg, val) adap->setiic(adap->data, reg, val)#define s3c2410_inb(adap, reg) adap->getiic(adap->data, reg)#define IIC_SINGLE_XFER		0#define IIC_COMBINED_XFER	1/* --- other auxiliary functions --------------------------------------	*///// Description: returns the current speed of the I2C clock in kHz//static int s3c2410_clkspeed(void){	unsigned long pdiv = ((i2c_clkdiv / 100) != 0) ? 16 : 512;	unsigned long div = i2c_clkdiv % 100;	return (PCLK/pdiv)/(div+1)/1024;}//// Description: Puts this process to sleep for a period equal to timeout //static inline void s3c2410_sleep(unsigned long timeout){	schedule_timeout( timeout * HZ);}//// Description: This performs the Samsung S3C2410X IIC initialization sequence// as described in the S3C2410X data book.//static int s3c2410_init(struct i2c_algo_s3c2410_data *adap){	u8 conval = 0;	// initialize control/status regs to 0	s3c2410_outb(adap, S3C2410_IICCON, 0);	s3c2410_outb(adap, S3C2410_IICSTAT, 0);	// set up a dummy IIC slave addr (even though we never use it!)	s3c2410_outb(adap, S3C2410_IICADD, 0x10);		// set up clock frequency for IIC-bus	if (i2c_clkdiv/100) {	   /* IICCLK=PCLK/16 */	   conval |= (i2c_clkdiv%100);            /* Tx clk = IICCLK/(n+1) */	} else {	   conval |= S3C2410_IICCON_TCLK_PCLK512;  /* IICCLK=PCLK/512 */	   conval |= i2c_clkdiv;                   /* Tx clk = IICCLK/(n+1) */	}	// enable interrupts	conval |= S3C2410_IICCON_INT_EN;	// enable ACK generation	conval |= S3C2410_IICCON_ACK_EN;	// write out the control reg. value	s3c2410_outb(adap, S3C2410_IICCON, conval);	// enable I2C bus data output and set master transmit mode	// to get to a sane state (also generates a STOP condition)	s3c2410_outb(adap, S3C2410_IICSTAT, S3C2410_IICSTAT_MTX_MODE | S3C2410_IICSTAT_OUT_EN);	        DEB2(printk(KERN_DEBUG "s3c2410_init: Initialized IIC on S3C2410X, %dkHz clock\n", s3c2410_clkspeed()));	mdelay(20);        return 0;}//// Description: Attempts to reset the I2C controller/bus back to a sane state.//static int s3c2410_reset (struct i2c_algo_s3c2410_data *adap){	int ret;	int count = 0;	//	// re-initialize	//	s3c2410_init(adap);	//	// Assume all is OK if the bus is not busy....	//	while((ret = s3c2410_inb(adap, S3C2410_IICSTAT)) & S3C2410_IICSTAT_BUSY) {	  //	  // Generate stop condition	  //	  DEB2(printk(KERN_DEBUG "s3c2410_reset: Generating STOP condition\n"));	  s3c2410_outb(adap, S3C2410_IICSTAT, S3C2410_IICSTAT_MTX_ENABLE & ~S3C2410_IICSTAT_BUSY);	  //	  // Clear status register and enable ACK generation	  //	  DEB2(printk(KERN_DEBUG "s3c2410_reset: Clearing status register\n"));	  ret = s3c2410_inb(adap, S3C2410_IICCON);          ret = (ret & ~S3C2410_IICCON_INT_PEND) | S3C2410_IICCON_ACK_EN;	  s3c2410_outb(adap, S3C2410_IICCON, ret);          //	  // reset I2C again          //          s3c2410_init(adap);#if 0	  //	  // If still busy do a dummy read to reset the active slave device	  //	  ret = s3c2410_inb(adap, S3C2410_IICSTAT);	  if (ret & S3C2410_IICSTAT_BUSY) {	    DEB2(printk(KERN_DEBUG "s3c2410_reset: Clearing status register before dummy read\n"));	    ret = s3c2410_inb(adap, S3C2410_IICCON);            ret = ret & ~(S3C2410_IICCON_INT_PEND | S3C2410_IICCON_ACK_EN);	    s3c2410_outb(adap, S3C2410_IICCON, ret);	    DEB2(printk(KERN_DEBUG "s3c2410_reset: Dummy read\n"));	    s3c2410_outb(adap, S3C2410_IICSTAT, S3C2410_IICSTAT_MRX_ENABLE);	    s3c2410_inb(adap, S3C2410_IICDS);   // dummy read	    DEB2(printk(KERN_DEBUG "s3c2410_reset: Clearing status register after dummy read\n"));	    ret = s3c2410_inb(adap, S3C2410_IICCON);            ret = (ret & ~(S3C2410_IICCON_INT_PEND)) | S3C2410_IICCON_ACK_EN;	    s3c2410_outb(adap, S3C2410_IICCON, ret);	  }#endif	  //	  // Bail out after a more than reasonable number of attempts	  //	  if (count++ > 50) {	    printk(KERN_DEBUG "s3c2410_reset: I2C bus stuck BUSY!\n");	    return -EIO;	  }	}	return 0;}//// Description: After we issue a transaction on the IIC bus, this function// is called.  It puts this process to sleep until we get an interrupt from// from the controller telling us that the transaction we requested in complete.//static int wait_for_pin(struct i2c_algo_s3c2410_data *adap, int *status) {	int timeout = DEF_TIMEOUT+2;	//int retval;		*status = s3c2410_inb(adap, S3C2410_IICCON);	//printk("wait_for_pin: status = %x\n", *status);	while (timeout-- && !(*status & S3C2410_IICCON_INT_PEND)) {	   //printk("wait_for_pin: timeout=%d, status=%x\n", timeout, *status);	   //printk("wait_for_pin: calling waitforpin\n");	   adap->waitforpin();           //printk("wait_for_pin: returning from waitforpin\n");	   *status = s3c2410_inb(adap, S3C2410_IICCON);	   s3c2410_inb(adap, S3C2410_IICSTAT);	}	//printk("wait_for_pin: returning from wait_for_pin\n");	if (timeout <= 0) {	   // reset I2C	   s3c2410_reset(adap);#if 0	   /* Issue stop signal on the bus */           retval = s3c2410_inb(adap, S3C2410_IICSTAT);           s3c2410_outb(adap, S3C2410_IICSTAT, retval & ~S3C2410_IICSTAT_BUSY);	   /* Clear pending interrupt bit */           retval = s3c2410_inb(adap, S3C2410_IICCON);           s3c2410_outb(adap, S3C2410_IICCON, retval & ~S3C2410_IICCON_INT_PEND);	   // wait for the busy condition to clear	   udelay(adap->udelay);	   // Check the status of the controller.  Does it still see a	   // pending transfer, even though we've tried to stop any	   // ongoing transaction?           retval = s3c2410_inb(adap, S3C2410_IICSTAT);           if(retval & S3C2410_IICSTAT_BUSY) {	      // The iic controller didn't stop when we told it to....	      // The iic controller is hosed.              s3c2410_init(adap);	      /* Is the pending transfer bit in the sts reg finally cleared? */              retval = s3c2410_inb(adap, S3C2410_IICSTAT);              if(retval  & S3C2410_IICSTAT_BUSY) {                 printk("The IIC Controller is hosed.  A processor reset is required\n");              }           }#endif	   return(-ETIMEDOUT);	}	return(0);}//------------------------------------// Utility functions////// Description: This function tries to verify that the device we want to// talk to on the IIC bus really exists. //#if 0static inline int try_address(struct i2c_algo_s3c2410_data *adap,		       unsigned char addr, int retries){	int i, status, ret = -1;	for (i=0;i<retries;i++) {		i2c_outb(adap, addr);		i2c_start(adap);		status = s3c2410_inb(adap, 1);		if (wait_for_pin(adap, &status) >= 0) {			if ((status & I2C_PCF_LRB) == 0) { 				i2c_stop(adap);				break;	/* success! */			}		}		i2c_stop(adap);		udelay(adap->udelay);	}	DEB2(if (i) printk("i2c-algo-s3c2410.o: needed %d retries for %d\n",i,	                   addr));	return ret;}#endif//// Description: Whenever we initiate a transaction, the first byte clocked// onto the bus after the start condition is the address of the// device we want to talk to.  This function manipulates the address specified// so that it makes sense to the hardware when written to the IIC peripheral.//static inline unsigned char iic_addr(struct i2c_algo_s3c2410_data *adap,                                        struct i2c_msg *msg) {	unsigned short flags = msg->flags;	unsigned char addr;	addr = ( msg->addr << 1 );	if (flags & I2C_M_RD )		addr |= 1;	if (flags & I2C_M_REV_DIR_ADDR )		addr ^= 1;	return addr;}//// Description: This function is waits for an interrupt and checks for// timeouts and transmit/receive errors.//static int s3c2410_wait(struct i2c_adapter *i2c_adap, int check_ack){	struct i2c_algo_s3c2410_data *adap = i2c_adap->algo_data;	int ret, timeout, status;	u32 errbits = S3C2410_IICSTAT_ARB_FAILED | ((check_ack) ? S3C2410_IICSTAT_NACK : 0);	// Wait for transmission to complete.	DEB2(printk(KERN_DEBUG "s3c2410_wait: Waiting for interrupt\n"));	timeout = wait_for_pin(adap, &status);	if(timeout < 0) {	   // Error handling           //printk(KERN_ERR "Error: timeout\n");           return -ETIMEDOUT;	}	DEB2(printk(KERN_DEBUG "s3c2410_wait: Got interrupt\n"));	// Check transfer status	ret = s3c2410_inb(adap, S3C2410_IICSTAT);	if (ret & errbits) {	   if (ret & S3C2410_IICSTAT_ARB_FAILED) {	      //printk(KERN_ERR "Lost arbitration\n");	      ret = -EPROTO;	   }	   else if (ret & S3C2410_IICSTAT_NACK) {	      //printk(KERN_ERR "Master transfer aborted by a NACK during the transfer of the address byte\n");	      ret = -ENODEV;	   }	   s3c2410_reset(adap);	   return ret;	}	return 0;}//// Description: This function is called by the upper layers to do the// grunt work for a master send transaction//static int s3c2410_sendbytes(struct i2c_adapter *i2c_adap,                             struct i2c_msg *pmsg, int xfer_flag){	struct i2c_algo_s3c2410_data *adap = i2c_adap->algo_data;	int i = 0, count, ret;	char *buf;        u8 addr;	int rval;   	buf = pmsg->buf;	count = pmsg->len;	DEB(printk(KERN_DEBUG "I2C WRITE s3c2410_sendbytes: len=%d   addr=0x%04x   flags=0x%04x\n", pmsg->len, pmsg->addr, pmsg->flags));

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日精品一区二区三区| 欧美日韩激情一区二区三区| 欧美精品一区二区三| 老鸭窝一区二区久久精品| 日韩一级免费观看| 国内成人自拍视频| 久久久久9999亚洲精品| 成人精品视频网站| 亚洲色图视频网| 在线日韩一区二区| 青青草成人在线观看| 精品少妇一区二区三区 | 成人av电影免费观看| 成人欧美一区二区三区小说| 91成人在线精品| 美女高潮久久久| 欧美精品一区视频| 99精品久久99久久久久| 亚洲午夜私人影院| 精品日韩99亚洲| 波多野结衣的一区二区三区| 亚洲一区二三区| 日韩精品在线一区二区| www.99精品| 日韩激情视频网站| 久久精品欧美一区二区三区麻豆| 91社区在线播放| 奇米精品一区二区三区四区| 国产欧美日韩麻豆91| 欧美日韩在线电影| 国产成人在线视频免费播放| 一区二区三区四区激情| 欧美一区二区在线视频| 成人app在线| 蜜臀av亚洲一区中文字幕| 国产精品伦一区二区三级视频| 欧美性生活一区| 国产精品白丝av| 亚洲成国产人片在线观看| 国产欧美一区二区三区沐欲| 欧美天堂一区二区三区| 高清不卡一区二区| 日本欧美在线看| 亚洲免费看黄网站| 国产亚洲综合av| 欧美日韩在线播| www.成人在线| 国产精品白丝jk白祙喷水网站| 亚洲成av人片一区二区| 国产精品福利av| 久久久久久久久一| 91精品国产色综合久久久蜜香臀| bt欧美亚洲午夜电影天堂| 久久爱另类一区二区小说| 亚洲在线视频一区| 自拍偷在线精品自拍偷无码专区| 26uuu国产电影一区二区| 欧美日本视频在线| 在线观看精品一区| 91网站在线观看视频| 成人国产电影网| 国产一区在线视频| 另类人妖一区二区av| 五月天国产精品| 亚洲主播在线播放| 夜夜嗨av一区二区三区四季av| 亚洲午夜久久久| 欧美国产精品一区| 久久亚洲春色中文字幕久久久| 欧美一区二区三区人| 欧美日韩成人综合在线一区二区| 一本色道亚洲精品aⅴ| 国产ts人妖一区二区| 国产成人免费在线观看不卡| 激情五月婷婷综合网| 精品午夜久久福利影院| 久久国产婷婷国产香蕉| 日本在线不卡视频| 美女网站一区二区| 麻豆91免费看| 国产综合久久久久影院| 狠狠v欧美v日韩v亚洲ⅴ| 国产在线视频精品一区| 国产一区二区电影| 大白屁股一区二区视频| av在线不卡电影| 欧洲一区二区av| 欧美日韩国产美| 欧美一级日韩免费不卡| 日韩视频一区二区三区在线播放 | 亚洲午夜视频在线观看| 亚洲大片免费看| 美国十次了思思久久精品导航| 精品一区二区三区久久久| 国产裸体歌舞团一区二区| 丁香婷婷综合激情五月色| 99久久久国产精品| 欧美三级中文字幕| 日韩欧美中文一区二区| 久久精品亚洲麻豆av一区二区| 国产精品免费视频网站| 亚洲综合在线免费观看| 日韩vs国产vs欧美| 国产一区在线看| 91热门视频在线观看| 欧美美女一区二区在线观看| 精品三级在线看| 亚洲天堂网中文字| 丝瓜av网站精品一区二区| 国精产品一区一区三区mba视频| 成人午夜电影网站| 色诱亚洲精品久久久久久| 91精品国产高清一区二区三区蜜臀| 久久伊人中文字幕| 亚洲老妇xxxxxx| 另类小说一区二区三区| 97久久精品人人澡人人爽| 在线不卡免费av| 中文成人av在线| 午夜国产精品一区| 成人免费av在线| 欧美一区二区三区视频免费| 国产精品视频看| 秋霞午夜av一区二区三区| 成人免费视频一区| 欧美一区二区三区四区高清| 国产精品成人免费在线| 免费成人深夜小野草| 91看片淫黄大片一级| 久久久久久久性| 午夜成人免费视频| jvid福利写真一区二区三区| 日韩三级免费观看| 亚洲精品网站在线观看| 国产精品小仙女| 欧美二区乱c少妇| 亚洲男人天堂av| 国产激情一区二区三区四区| 欧美日韩五月天| 亚洲欧美一区二区三区孕妇| 国产在线播精品第三| 欧美日韩国产高清一区二区| 国产精品久久久久久久久免费丝袜 | 国产精品亚洲午夜一区二区三区| 欧美日韩国产三级| 亚洲免费在线视频| 国产.欧美.日韩| 欧美xxxx老人做受| 三级一区在线视频先锋| 在线中文字幕一区二区| 国产精品网站导航| 国产真实乱偷精品视频免| 欧美一区二区三区视频在线观看| 亚洲自拍偷拍av| 99国产精品久| 国产精品卡一卡二| 成人影视亚洲图片在线| 久久久午夜电影| 韩国视频一区二区| 日韩欧美国产精品一区| 日本特黄久久久高潮| 91 com成人网| 天天色综合成人网| 欧美精品vⅰdeose4hd| 亚洲一区二区精品3399| 欧洲一区在线观看| 一区二区三区自拍| 欧美在线看片a免费观看| 一区二区三区中文字幕精品精品 | 欧美xxxxxxxx| 黑人巨大精品欧美一区| 2021中文字幕一区亚洲| 国产一区二区三区四| 久久久久久影视| 狠狠色丁香久久婷婷综合丁香| 精品国产一区二区三区久久影院 | 亚洲一区二区精品久久av| 欧美午夜宅男影院| 亚洲成a人在线观看| 欧美精品日韩精品| 免费高清成人在线| 久久毛片高清国产| 成人免费毛片app| 亚洲欧美一区二区三区极速播放 | 日韩女优av电影| 国产福利一区在线观看| 中文字幕乱码日本亚洲一区二区| 成人美女在线视频| 一区二区三区视频在线看| 欧美日韩美女一区二区| 美女久久久精品| 国产欧美日韩三级| 日本韩国精品在线| 日本亚洲视频在线| 久久免费午夜影院| 一本大道综合伊人精品热热| 天天综合色天天综合| 久久精品一区八戒影视| 色噜噜狠狠一区二区三区果冻| 日本一区中文字幕|