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

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

?? i2c-algo-s3c2410.c

?? linux下S3C2410的I2C總線的驅動
?? 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.history:    	2004-7-24 add iic slave receive communication.		threewater<threewater@up-tech.com>   ---------------------------------------------------------------------------*/#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 <linux/i2c-s3c2410.h>//laputa for to get the PCLK freq.  from s3c2410_get_clk(GET_PCLK)#include <asm/arch/cpu_s3c2410.h>//laputa debug msg 030901#define LAPUTA_DEBUG_MSG	1#include  "dbg_msg.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: */static int s3c2410_i2c_debug=0;//laputa for iic clk freq prescale = 1x//static int i2c_clkdiv=1;  // -- remove//static int i2c_clkdiv=0;	// += modify 030902static int i2c_clkdiv=107;	// set i2c clk=PCLK/16/8, modify by threeater/* --- 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;//laputa - what (where) is PCLK ?  #if 0	return (PCLK/pdiv)/(div+1)/1024;#else//laputa for to get Peripheral clock frequency  030830	unsigned long PCLK = s3c2410_get_bus_clk(GET_PCLK);  //++ append	return (PCLK/pdiv)/(div+1)/1024;#endif//laputa end 030830}//// 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);	//s3c2410_outb(adap, S3C2410_IICADD, 0xa0);		// 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);	//set iic to slave receive mode	//add by threewater	udelay(100);	s3c2410_outb(adap, S3C2410_IICSTAT, S3C2410_IICSTAT_SRX_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;		// laputa IIC interface is only unsigned char receive & transfer	//	char *buf;			// -- remove 	unsigned char *buf;  	// +- modify 030903    	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));	// setup transfer.  if NOSTART flag set, then transfer is already in	// progress so skip init

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品资源在线看| 国产精品美女久久久久久2018| 8x8x8国产精品| 亚洲一区二区三区免费视频| 国产在线不卡一卡二卡三卡四卡| 99久久精品情趣| 一区二区三区 在线观看视频| 狠狠色2019综合网| 久久精品视频免费观看| 日韩国产精品久久| 精品蜜桃在线看| 成人免费视频国产在线观看| ...av二区三区久久精品| 日本韩国视频一区二区| 国产日本欧洲亚洲| 91视频你懂的| 日韩电影在线观看一区| 精品av久久707| 豆国产96在线|亚洲| 亚洲中国最大av网站| 欧美成人女星排行榜| caoporn国产精品| 国产午夜精品在线观看| 色综合天天综合狠狠| 青青青伊人色综合久久| 久久久精品tv| 欧美日韩一区二区三区四区| 激情五月播播久久久精品| 中文在线资源观看网站视频免费不卡 | 日韩av中文在线观看| 久久精品人人爽人人爽| 一本色道久久综合亚洲精品按摩| 久久精品亚洲精品国产欧美kt∨| 久久精品国产99国产精品| 一色屋精品亚洲香蕉网站| 欧美一区二区网站| 97久久超碰精品国产| 国产精品久久久久久妇女6080| 国产一区二区0| 亚洲一二三四在线| 国产欧美一区二区三区在线看蜜臀| 国内精品免费**视频| 一区av在线播放| 国产精品视频第一区| 欧美一区二视频| 蜜桃av一区二区| 亚洲一级不卡视频| 中文字幕中文乱码欧美一区二区| 99久久国产综合精品麻豆| 麻豆久久久久久| 一区二区久久久| 国产精品久久三| 精品福利av导航| 91精品国产欧美一区二区成人| 欧美aaaaa成人免费观看视频| 日韩一区二区视频| 欧美日免费三级在线| 99免费精品视频| 岛国精品一区二区| 免费xxxx性欧美18vr| 一区二区三区国产精华| 日本一区二区三区在线不卡| 99这里只有久久精品视频| 国产乱人伦偷精品视频不卡| 中文字幕一区二区三区在线观看| 色婷婷激情综合| 成a人片亚洲日本久久| 国产不卡免费视频| 亚洲一区在线播放| 精品福利一区二区三区| 日韩亚洲电影在线| 69av一区二区三区| 在线亚洲人成电影网站色www| 亚洲va在线va天堂| 亚洲午夜羞羞片| 26uuu久久综合| 2023国产精品自拍| 粉嫩aⅴ一区二区三区四区五区| 亚洲综合激情另类小说区| 亚洲女厕所小便bbb| 国产精品久久久久久久久免费丝袜 | 欧美日韩免费视频| 国产成人综合亚洲网站| 国产毛片精品国产一区二区三区| 一级精品视频在线观看宜春院| 日韩免费一区二区| 欧美精品一区二区三区四区| 精品国产免费人成在线观看| 日韩精品中文字幕一区二区三区| www.欧美精品一二区| caoporen国产精品视频| 91女人视频在线观看| 狠狠v欧美v日韩v亚洲ⅴ| 国产乱子轮精品视频| 亚洲成人资源网| 中文字幕在线一区免费| 日韩一本二本av| 亚洲精品一区二区三区蜜桃下载| 欧美怡红院视频| 成人午夜av在线| 一本久道久久综合中文字幕| 欧美三级中文字| 日韩欧美不卡在线观看视频| 久久久久久久网| 日韩一区二区三区视频在线 | 国产美女精品在线| 亚洲柠檬福利资源导航| 一区二区三区中文字幕电影| 日韩欧美高清dvd碟片| 国内成人自拍视频| 国产麻豆一精品一av一免费| 成人免费视频播放| 欧美色偷偷大香| 精品国产伦一区二区三区观看体验| 91免费版pro下载短视频| 成人做爰69片免费看网站| 一本一道综合狠狠老| 91精品国产黑色紧身裤美女| 欧美激情中文字幕一区二区| 亚洲午夜免费福利视频| 国产精品一线二线三线| 欧美日韩一级二级三级| 国产片一区二区| 日韩二区在线观看| 成人激情免费网站| 欧美一级黄色片| 亚洲免费av高清| 国产在线视频不卡二| 欧美日韩一区二区三区四区 | av动漫一区二区| 91精品国产综合久久福利| 国产精品无遮挡| 黄一区二区三区| 国产成人精品网址| 懂色一区二区三区免费观看| 成人动漫一区二区三区| 91麻豆精品国产91久久久使用方法| 7878成人国产在线观看| 亚洲欧美怡红院| 国产成人a级片| 精品久久国产字幕高潮| 亚洲国产精品天堂| 91偷拍与自偷拍精品| 久久久久国产免费免费| 日韩精品成人一区二区三区| 韩国欧美一区二区| 欧美一区二区日韩一区二区| 久久婷婷国产综合精品青草| 欧美激情一区二区三区四区 | 欧美大片一区二区三区| 亚洲一卡二卡三卡四卡无卡久久 | 精品盗摄一区二区三区| 欧美电影免费观看完整版| 亚洲高清免费在线| 91视频你懂的| 成人欧美一区二区三区1314 | 日韩国产精品久久久久久亚洲| 久久国产综合精品| 在线成人免费观看| 亚洲国产日韩一级| 在线观看视频一区二区欧美日韩| 在线综合亚洲欧美在线视频| 亚洲一区二区三区四区在线 | 蜜桃视频第一区免费观看| 国产大陆a不卡| 久久免费美女视频| 麻豆91免费看| 精品国产凹凸成av人网站| 日韩一区欧美一区| 97久久精品人人澡人人爽| 日韩女优av电影| 国产在线一区观看| 国产欧美1区2区3区| 波波电影院一区二区三区| 欧美久久久久久蜜桃| 日一区二区三区| 欧美一区二区三区在线观看视频 | 亚洲在线免费播放| 欧美艳星brazzers| 天堂久久一区二区三区| 岛国av在线一区| 日韩美女精品在线| 一本色道久久综合亚洲精品按摩| 亚洲精品在线观| 337p粉嫩大胆色噜噜噜噜亚洲| 国产精品久久二区二区| 91小宝寻花一区二区三区| 亚洲精品乱码久久久久| 欧美系列在线观看| 日韩av午夜在线观看| 日韩欧美一区二区免费| 国产精品一品二品| 亚洲日本在线看| 欧美久久久久久久久久| 国产真实乱子伦精品视频| 国产精品久久久久久久久快鸭| 国产毛片精品视频| 日韩女优视频免费观看| 成人午夜激情影院| 午夜私人影院久久久久|