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

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

?? s3c2410-iic.c

?? 這是一個ARM9|+LINUX的驅動程序
?? C
字號:
/*this is a simple driver for s3c2410'iic  writer is cahill  date 2006.10.20*/#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 <asm-asm/irq.h>#include <linux/errno.h>#include <asm/arch/irq.h>#include <linux/sched.h>#include <linux/i2c.h>#include <asm-arm/irq.h>#include <asm-arm/arch-s3c2410/cpu_s3c2410.h>   //added by cahill#include <linux/i2c-algo-s3c2410.h>#include <linux/i2c-algo-s3c2410.h>#include <asm-arm/arch-s3c2410/irqs.h>#include <asm-arm/io.h>          //added by cahill#include "i2c-s3c2410.h"/*------------globle value-------------------*/static wait_queue_head_t iic_wait;static unsigned int *r_GPECON;static unsigned int *r_GPEDAT;static unsigned int *r_GPEUP;static unsigned int *r_IICCON;static unsigned int *r_IICSTAT;static unsigned int *r_IICADD;static unsigned int *r_IICDS;static int iic_irq;static int iic_pending = 0;static int DevMojor;static int read_flag=0;//static unsigned int iic_flag = 1;            //the flag of iic's operation, 0 = ok 1 = no; //static unsigned u8 *iic_data;static u8 real_val = 59;static int real_count = 0;static u8 real_buf[20];/*----------------globle value define over--------------------*///#define VA_IIC_BASE           __ioremap(0x54000000, 4, 0)#define S3C2410_GPECON       *r_GPECON#define S3C2410_GPEDAT       *r_GPEDAT	      #define S3C2410_GPEUP	     *r_GPEUP#define S3C2410_IICCON       *r_IICCON   // (VA_IIC_BASE + 0x0)#define S3C2410_IICSTAT      *r_IICSTAT  // (VA_IIC_BASE + 0x4)#define S3C2410_IICADD       *r_IICADD   // (VA_IIC_BASE + 0x8)#define S3C2410_IICDS        *r_IICDS    // (VA_IIC_BASE + 0xC)#define I2C_M_WR             0#define I2C_M_RD            1 /* ----- local functions ----------------------------------------------	*/static int address_map(void){	r_GPECON = __ioremap(0x56000040,4,0);	r_GPEDAT = __ioremap(0x56000044,4,0);	r_GPEUP  = __ioremap(0x56000048,4,0);	r_IICCON = __ioremap(0x54000000,4,0);	r_IICSTAT= __ioremap(0x54000004,4,0);	r_IICADD = __ioremap(0x54000008,4,0);	r_IICDS  = __ioremap(0x5400000C,4,0);	           return 0;}static void s3c2410_init(void){	S3C2410_GPECON  |= 0xa0000000;  //set the iic pin to iic function  	              S3C2410_GPEUP  |= 0xc000;       //disable pull up        S3C2410_IICCON  = (1<<7)|(1<<6)| (1<<5)|(0x0f);  //enable iic|iicclk=fpclk/512|enable interrupt|iicclk/0x0f+1		}static int inter_count = 50;	static int real_status ;static int ok_or;/* disable iic interrupt*/ static void cliic(void){	S3C2410_IICCON &= 0xdf;}/*enable iic interrupt*/static void stiic(void){	S3C2410_IICCON |=0x20;}/*	s3c2410 iic bus demands that it is not busy when a send/receive cycle is begainning  	this function detect the iic bus is busy or not	if the bus is busy return -1, else 0;*/static int busy_or(void)         {	if(S3C2410_IICSTAT & 0x20){		return -1;	}else{		return 0;	}}/* 	send one byte one time*/	static int send_one(u8 buf){	int i = 0;	int ret;		while(busy_or() == -1){		i++;		udelay(5);           	//printk("the bus is busy ,wait it\n");		if(i>15){			//printk("the bus is busy , but for a long time ! maybe, erros are occured!\n ");			break;		}	}	i = 0;	udelay(5);	S3C2410_IICDS = buf;        ret = S3C2410_IICCON;	S3C2410_IICCON = ret & ~S3C2410_IICCON_INT_PEND;	while(iic_pending == 0){		i++;		udelay(5);           	        	if(i>15)			break;	}			iic_pending = 0;	if (ok_or == 0){		printk("send ok!\n");		printk("send %d to device\n",buf);			}else{			printk("in send :> send erro!\n");		return -1;			}		return 0;	}/* read one byte one time*/static void read_one(){	int i = 0;	int ret;	u8 buf;		while(busy_or() == -1){		i++;		udelay(5);           	//printk("the bus is busy ,wait it\n");		if(i>15){			//printk("the bus is busy , but for a long time ! maybe, erros are occured!\n ");			break;		}	}	i = 0;		udelay(5);	ret = S3C2410_IICCON;	S3C2410_IICCON = ret & ~S3C2410_IICCON_INT_PEND;	while(iic_pending == 0){		i++;		udelay(5);           	//printk("wait for interrupt!\n");        	if(i>60)			break;	}	iic_pending = 0;		buf = S3C2410_IICDS ;	printk(":> read %d from device\n", buf);	if (buf == real_val)	{		real_count++;	}	real_val++;	udelay(5);}/*	send a command head for memory device	if you control other device , this function should be changed for demands */static int write_head(void){	int ret,i=0;	printk( "s3c2410_sendbytes: Set transmit mode\n");		ret = S3C2410_IICCON;	S3C2410_IICCON = ret & ~S3C2410_IICCON_INT_PEND;	while(busy_or() == -1){		i++;		udelay(5);           	//printk("the bus is busy ,wait it\n");		if(i>15)			break;	}	i = 0;	ret = S3C2410_IICSTAT_MTX_ENABLE;	S3C2410_IICSTAT = ret;	udelay(100);	S3C2410_IICDS=0xa0;	//udelay(5);	while(iic_pending == 0){		i++;		udelay(5);           	//printk("wait for interrupt!\n");        	if(i>15)			return -1;	}	iic_pending = 0;	if (ok_or == 0){		printk("send ok!\n");		printk("the commond is %d \n",S3C2410_IICDS);		//ret = S3C2410_IICCON;	        //S3C2410_IICCON = ret & ~S3C2410_IICCON_INT_PEND;			}else{			printk("in write head :> send erro!\n");		return -1;		//s3c2410_init();		//goto reset;	}	return 0 ;}/*	send a command head for memory device	if you control other device , this function should be changed for demands */static int read_head(void){	int ret,i=0;	printk( "s3c2410_sendbytes: Set transmit mode\n");	//stiic();	ret = S3C2410_IICCON;	S3C2410_IICCON = ret & ~S3C2410_IICCON_INT_PEND;	while(busy_or() == -1){		i++;		udelay(5);           	//printk("the bus is busy ,wait it\n");		if(i>15)			break;	}		S3C2410_IICDS=0xa1;	ret = S3C2410_IICSTAT_MRX_ENABLE;	//ret = S3C2410_IICSTAT_MTX_ENABLE;	S3C2410_IICSTAT = ret;	//udelay(100);	//S3C2410_IICSTAT &= 0xbf; //set receive mode	S3C2410_IICDS=0xa1;	//udelay(5);	while(iic_pending == 0){		i++;		udelay(5);           	//printk("wait for interrupt!\n");        	if(i>15)			return -1;	}	iic_pending = 0;	if (ok_or == 0){		printk("send ok!\n");		//ret = S3C2410_IICCON;	        //S3C2410_IICCON = ret & ~S3C2410_IICCON_INT_PEND;			}else{			printk("in read head :>send erro!\n");		return -1;		//s3c2410_init();		//goto reset;	}		//S3C2410_IICSTAT &= 0xbf; //set receive mode	printk( "s3c2410_sendbytes: Set receive mode\n"); 	return 0 ;}/*	this function create a stop pulse, */static int iic_stop(void){	int ret;	// generate a STOP condition	//udelay(5000);	ret = S3C2410_IICSTAT;	S3C2410_IICSTAT = ret & ~S3C2410_IICSTAT_BUSY;	//udelay(10000);	// clear the pending bit and re-enable ACK generation	ret =  S3C2410_IICCON;	ret = (ret & ~S3C2410_IICCON_INT_PEND) | S3C2410_IICCON_ACK_EN;	S3C2410_IICCON = ret;		return 0 ;}/*	this function is important ,it send several bytes one time*/static int try_interrupt(u8 data){	int ret ,i=0;		stiic();	while(1){				if((ret=write_head())==0)			break;	}		//send_addr(0);	send_one(0);	send_one(0);	for(i = 0; i<8; i++){			send_one(data);		}		        iic_stop();	printk(" write over !\n\n\n");}/*	read serval bytes one time*/static int try_read( ){	int ret ,i=0;		int busystat;	//stiic();		while(1)	{		if((ret=write_head())==0)		break;	}	        //send_addr(0);	send_one(0);	send_one(0);	read_head() ;	busystat = S3C2410_IICSTAT;	i = (busystat & S3C2410_IICSTAT_BUSY)?0:1;			if(i == 0){		printk("this data is erro");		read_one();   //dump read;	}		for(i=0;i<7;i++){				read_one();	}	ret =  S3C2410_IICCON;	ret = ret & ~S3C2410_IICCON_ACK_EN;	S3C2410_IICCON = ret;	read_one();		iic_stop();	ret =  S3C2410_IICCON;	ret = ret | S3C2410_IICCON_ACK_EN;	S3C2410_IICCON = ret;		printk(" read over !\n\n\n");	return 0;} 	//// Description: The registered interrupt handler//static int iic_s3c2410_handler(int irq, void *dev_id, struct pt_regs *regs) {   int ret;     	//	iic_pending = 1;	iic_pending = 1;	printk("now, it's in iic_s3c2410_handler!\n");	        real_status = S3C2410_IICSTAT;	if(read_flag == 1){		ret = S3C2410_IICDS;		printk("interrup say:> the %d was received!\n",ret );	}     // Clear interrupt pending bit		 /*       ret = S3C2410_IICCON;	        S3C2410_IICCON = ret & ~S3C2410_IICCON_INT_PEND;		        cliic();         */  		 //S3C2410_IICCON  = (1<<7)|(1<<6)| (0<<5)|(0<<4)|(0x07);		//S3C2410_IICCON &= 0xdf;	if ( S3C2410_IICSTAT & S3C2410_IICSTAT_NACK) {	      		printk( "Master transfer aborted by a NACK during the transfer of the address byte\n");			ok_or = 1;			// sti();				      		return  1;	   	}else {		        printk("recieve the ACK !\n ")	;			ok_or = 0 ;			 //sti();						return 0;		 }           if(read_flag == 1){		ret = S3C2410_IICDS;		printk("interrup say:> the %d was received!\n",ret );	}     }//// Description: This function is very hardware dependent.  First, we lock// the region of memory where out registers exist.  Next, we request our// interrupt line and register its associated handler.//static int iic_hw_resrc_init(void){	if (request_irq(iic_irq, iic_s3c2410_handler, 0, "s3c2410 IIC", 0) < 0) {	   printk( "iic_hw_resrc_init: Request irq%d failed\n", iic_irq);	   iic_irq = 0;	} else {	   printk("iic_hw_resrc_init: Enabled interrupt (irq%d)\n", iic_irq);	   enable_irq(iic_irq);	}	return 0;}static int s3c2410_iic_open(struct inode * inode, struct file * filp){	MOD_INC_USE_COUNT;	printk("s3c2410 iic is opened !\n");	return 0;}static int s3c2410_iic_release(struct inode *inode, struct file *filp){	MOD_DEC_USE_COUNT;        //iic_s3c2410_release();	printk("s3c2410 iic released!\n");	return 0;}static int s3c2410_iic_write(struct file *file, const u8 *buffer, size_t count, loff_t *ppos){	u8 data, databuf[100];	u8 addr[2]={0x00,0x00};	int i;	int j;	address_map(); 	real_count = 0 ;	s3c2410_init();	copy_from_user(&data, buffer, sizeof(data));	//databuf[0] = 0x00;	//databuf[1] = 0x00;	for (i=0 ;i<64;i++){         	databuf[i]=i+ '0';		printk("%d  ", databuf[i]);	}	printk("\n\n");	//static int s3c2410_sendbytes(u8 buf[], int count );//static int s3c2410_readbytes(u8 buf[], int count, u8 address[] )         udelay(10000);	//try_interrupt(databuf);	iic_stop();	if(data){			stiic();	//for(i=0;i<150;i++){			udelay(5000);	try_interrupt(data);	//s3c2410_init();		for(i=0;i<21;i++)	udelay(5000);	try_read();	        //s3c2410_init();        udelay(5000);//	}			}	printk("ritght %d\n",real_count);	return sizeof(data);}static struct file_operations s3c2410_iic_fops = {		owner:       THIS_MODULE,	open :       s3c2410_iic_open,	write:	     s3c2410_iic_write,	release:     s3c2410_iic_release,};#ifdef CONFIG_DEVFS_FS	static devfs_handle_t devfs_Dbled_dir, devfs_Dbledraw;#endifstatic int __init iic_s3c2410_init(void) {        int ret,i;	printk( "iic_s3c2410_init: Samsung S3C2410X iic adapter module version %s (%s)\n", I2C_VERSION, I2C_DATE);	iic_irq = IRQ_IIC;        address_map();             //added by cahill 	init_waitqueue_head(&iic_wait);        s3c2410_init();        ret = register_chrdev(0, "s3c2410_iic",&s3c2410_iic_fops );	if(ret < 0){		printk("can't get major number!\n");	}	DevMojor = ret;	//init_waitqueue_head(iic_wait);	i = iic_hw_resrc_init();		if(i!= 0 ){		printk("set interrupt is erro!\n ");	}else{		printk("set interrupt successfully!\n");	}#ifdef CONFIG_DEVFS_FS	devfs_Dbled_dir = devfs_mk_dir(NULL, "s3c2410_iic", NULL);	devfs_Dbledraw = devfs_register(devfs_Dbled_dir,"0" ,						DEVFS_FL_DEFAULT,ret,1,S_IFCHR | S_IRUSR | S_IWUSR, 							&s3c2410_iic_fops,NULL);#endif			printk( "iic_s3c2410_init: initialized iic-bus successfully! \n "); 	return 0;}static void __exit iic_s3c2410_exit(void){	//i2c_s3c2410_del_bus(&iic_s3c2410_ops);        //iic_s3c2410_release();        	devfs_unregister(devfs_Dbledraw);	devfs_unregister(devfs_Dbled_dir);	unregister_chrdev(DevMojor,"s3c2410_iic");	}module_init(iic_s3c2410_init);module_exit(iic_s3c2410_exit); MODULE_LICENSE("GPL");MODULE_AUTHOR("cahill<dapengbird2g@163.com>");MODULE_DESCRIPTION("S3C2410+LINUX-IIC-DRIVERS");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
粉嫩av一区二区三区在线播放| 亚洲午夜久久久久久久久电影院 | 欧美一级二级三级乱码| 欧美一级片在线看| 亚洲欧洲av在线| 午夜影视日本亚洲欧洲精品| 国产69精品久久久久777| 国产欧美日韩中文久久| 日日噜噜夜夜狠狠视频欧美人| 国产精品18久久久久| 国产在线麻豆精品观看| 日本高清无吗v一区| 国产午夜精品美女毛片视频| 日本午夜一区二区| 在线免费观看日本一区| 欧美精彩视频一区二区三区| 成人涩涩免费视频| 久久久久99精品一区| 日韩精品亚洲专区| 久久久久久一二三区| 99re这里只有精品6| 久久久久久一二三区| 9久草视频在线视频精品| 国产日韩欧美精品在线| 色综合久久久久久久| 中文字幕中文乱码欧美一区二区| 国产一区二区在线电影| 日韩你懂的在线播放| 亚洲第一福利视频在线| 日韩丝袜美女视频| 波多野结衣欧美| 日韩中文字幕91| 中文文精品字幕一区二区| 麻豆精品一区二区三区| 欧美日韩免费高清一区色橹橹| 亚洲丝袜美腿综合| 欧美无砖专区一中文字| 伊人性伊人情综合网| 一本一本大道香蕉久在线精品 | 韩国av一区二区三区在线观看| 亚洲天堂2014| 欧美草草影院在线视频| 免费观看一级特黄欧美大片| 欧美一区二区在线免费播放| 粉嫩蜜臀av国产精品网站| 丝瓜av网站精品一区二区| 国产精品九色蝌蚪自拍| 精品欧美久久久| 欧美性色欧美a在线播放| 国产电影精品久久禁18| 日韩黄色一级片| 亚洲精选一二三| 欧美韩日一区二区三区四区| 欧美一区二区三区喷汁尤物| 色婷婷激情综合| 国产不卡免费视频| 欧美aaaaa成人免费观看视频| 亚洲三级在线观看| 国产午夜久久久久| 欧美一级理论片| 欧美乱妇15p| 国产一区二区三区最好精华液 | 亚洲 欧美综合在线网络| 欧美国产成人在线| 久久久三级国产网站| 91精品福利在线一区二区三区| 欧美视频在线观看一区| 91天堂素人约啪| 亚洲第一狼人社区| 亚洲欧美偷拍卡通变态| 欧美一区在线视频| 91麻豆精品国产91久久久久久 | 国产蜜臀97一区二区三区| 日韩欧美色综合| 日韩一区二区三| 制服丝袜成人动漫| 欧美日本免费一区二区三区| 欧美三电影在线| 国产精品18久久久久久vr| 久久成人免费网站| 一级精品视频在线观看宜春院| 欧美一区二区三区婷婷月色 | 久久综合九色综合欧美就去吻| heyzo一本久久综合| 成人一区二区三区视频在线观看| 国产福利一区二区| 风流少妇一区二区| 99精品国产99久久久久久白柏| 成人午夜av在线| 色综合久久综合网欧美综合网| 91在线国内视频| 91蝌蚪国产九色| 欧美视频在线播放| 欧美变态凌虐bdsm| 久久精品一区蜜桃臀影院| 久久久久99精品国产片| 欧美高清一级片在线观看| 国产精品白丝在线| 亚洲一区视频在线观看视频| 国产欧美精品日韩区二区麻豆天美| 国产日韩精品一区二区三区| 国产精品灌醉下药二区| 亚洲线精品一区二区三区八戒| 日韩制服丝袜先锋影音| 国内精品在线播放| 成人av动漫网站| 国产乱码精品一区二区三区五月婷| 国产精品一区不卡| 91蜜桃传媒精品久久久一区二区 | 欧美三级日韩三级国产三级| 欧美一个色资源| 国产精品情趣视频| 天堂蜜桃一区二区三区| 国产精品99久久久久久久vr| 91在线观看免费视频| 精品视频免费在线| 国产日韩三级在线| 亚洲综合网站在线观看| 久久精品国产久精国产| 99久久精品一区| 日韩精品一区二区在线观看| 国产精品国模大尺度视频| 天堂成人免费av电影一区| 国产69精品久久久久毛片| 欧美日韩亚州综合| 亚洲国产激情av| 日本女人一区二区三区| 成人av电影在线观看| 91精品国产欧美一区二区成人| 国产人久久人人人人爽| 午夜av一区二区| 日韩激情一二三区| 91网站在线播放| 久久久不卡影院| 日韩va欧美va亚洲va久久| www.欧美日韩| 精品久久久久一区二区国产| 一区二区不卡在线播放 | 亚洲成人自拍一区| 福利电影一区二区三区| 日韩网站在线看片你懂的| 亚洲精品国产无天堂网2021| 国产乱码精品一区二区三| 欧美高清你懂得| 亚洲综合免费观看高清在线观看| 国产+成+人+亚洲欧洲自线| 成人欧美一区二区三区黑人麻豆| 亚洲福利一二三区| 色综合天天综合网天天看片| 在线观看免费一区| 国产精品久久久久婷婷| 国产在线播放一区二区三区| 91精品国产麻豆国产自产在线| 亚洲女人****多毛耸耸8| 成人综合在线网站| 国产偷国产偷亚洲高清人白洁 | 日韩成人午夜电影| 91福利精品第一导航| 日韩毛片高清在线播放| 成人精品视频一区| 国产亚洲女人久久久久毛片| 久久成人免费电影| 欧美成人免费网站| 三级亚洲高清视频| 精品视频资源站| 天堂在线一区二区| 欧美电影在线免费观看| 香蕉av福利精品导航| 欧美三级电影网| 日韩av电影天堂| 欧美日本精品一区二区三区| 亚洲第四色夜色| 91麻豆精品国产91久久久久久 | 久久狠狠亚洲综合| 精品久久久久一区二区国产| 久久精品国产99国产| 精品久久久久久久人人人人传媒 | 麻豆精品国产传媒mv男同| 日韩一卡二卡三卡| 精品系列免费在线观看| 92精品国产成人观看免费| 国产精品二区一区二区aⅴ污介绍| 不卡高清视频专区| 亚洲伦理在线免费看| 欧洲人成人精品| 日韩精彩视频在线观看| 精品嫩草影院久久| 成人亚洲一区二区一| 综合欧美亚洲日本| 欧美日韩在线一区二区| 日韩成人午夜电影| 国产性色一区二区| 91福利视频网站| 免费观看一级欧美片| 欧美极品少妇xxxxⅹ高跟鞋| 91在线你懂得| 99久久99久久久精品齐齐| 一区精品在线播放| 6080日韩午夜伦伦午夜伦| 国产一区久久久|