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

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

?? iic.c.txt

?? 初學者的福音. 代碼易懂! 通過IO模擬實現的arm2410的iic總線驅動程序 可進行讀寫操作
?? TXT
字號:

/*
**********************************************************

			s3c2410 gpio linux driver program

**********************************************************
*/
#ifndef __KERNEL__
	#define __KERNEL__
#endif

#ifndef MODULE
	#define MODULE
#endif

#ifdef CONFIG_SMP
	#define __SMP__
#endif

#include <linux/config.h>
#include <linux/module.h>
#include <linux/fs.h>

#include <linux/kernel.h>
#include <linux/init.h>
#include <asm/delay.h>
#include <linux/vmalloc.h>

#include <asm/uaccess.h>
#include <asm/hardware.h>
#include <asm/io.h>

#include "iic_drv.h"

#undef DEBUG	
//#define DEBUG
// define tracy function
#ifdef DEBUG
	#define DPRINTK( x... )	printk("iic_drv:" ##x)
#else
	#define DPRINTK( x... )
#endif

#define DEVICE_NAME 	"iic_drv"
#define EMPLED_MINOR	1

static int  iic_drv_major = 0;	/* Define major device number -- auto allocate!*/

/*
static ssize_t d11_arm_write(struct file * file, const char * buffer, size_t count, loff_t ppos)
{
	copy_from_user(&d11_gpiostatus,buffer,sizeof(d11_gpiostatus));
	update_d11_gpio();

	DPRINTK("write: d11_gpio=0x%x,count=%d\n",d11_gpiostatus,count);
	return sizeof(d11_gpiostatus);
}
*/



#define  clrsda  GPEDAT &=(~(0x1<<15))  
#define  setsda	 GPEDAT |=(0x1<<15)
#define  clrscl  GPEDAT &= (~(0x1<<14))
#define  setscl  GPEDAT |= (0x1<<14)
#define  setio1  GPECON = (GPECON & (~(0xf<<28))) | (0x1<<28)
#define  setio2  GPECON = (GPECON & (~(0xf<<28))) | (0x5<<28)


/*改變sda電平*/
void Change_Sda( int data)
{  
	if(data==0)
			clrsda ;   //向sda寄存器寫
 	else
			setsda ;       //向sda寄存器寫1
}
/*改變scl電平*/   	
void  Change_Scl( int data)
{
	if(data==0)
			clrscl ;	//向scl寄存器寫0
	else 
			setscl ;		//向scl寄存器寫1

}
/*改變數據傳輸方向*/    
void	Sda_Io( int sda)
{   
	if(sda==1)
			setio1 ;     //scl輸出,sda輸入
	else
			setio2 ;	  //scl輸出,sda輸出
}
/*延時函數*/
void  Delay( long int time)
{
	udelay(1 * time);
}
/*讀一個比特數據*/
unsigned int Bit_Read(unsigned int var,int bit)
{
	unsigned int value,number;
	value=1<<bit;					//bit+1位置1
	number=(value&var)/value;		//number為0/1
	return(number);
}
/*寫一個字節數據*/
void  Write_Byte(unsigned char data)
{
	unsigned  int j,k;
	Change_Scl(0);				//scl為低電平
	Sda_Io(0);                  //sda輸出   scl輸出
	for(j=0;j<8;)				//寫8位數據
	{
		Change_Scl(0);		//scl為低電平
		k=Bit_Read(data,j); //k=0/1=number
		Change_Sda(k);		
		Delay(4);
		Change_Scl(1);			//scl=1
		Delay(2);
		j++;
  }
}
/*讀一個字節數據*/
unsigned  char Read_Byte()
{
	unsigned int j;
	unsigned char data=0x00,i;
	Change_Scl(0);        //scl為低電平
	Sda_Io(1);     //scl輸出   sda輸入
	Delay(4);
	for(j=0;j<8;)
	{
		Change_Scl(1);     //scl為高電平
		i=Bit_Read(GPEDAT,15);    //讀sda寄存器的值
		data=(data<<1)|i;         //左移是因為有八位數據讀入
		Delay(2);
		Change_Scl(0);        //scl為低電平
		Delay(4);
		j++;
	}
 	return(data);         //返回的data為讀入的八位數據
}
/*總線開始信號*/		
void	Iic_Start()
{
	Sda_Io(0);	             //scl輸出sda 輸入
	Change_Sda(1);          //sda線為高電平
	Change_Scl(1);         //scl線為高電平
	Delay(4);
	Change_Sda(0);        //sda線為低電平
	Delay(2); 
	Change_Scl(0);     //scl線為低電平
}
/*總線結束信號*/
void  Iic_Stop()
{
	Sda_Io(0);
	Change_Sda(0);
	Change_Scl(1);
	Delay(4);
	Change_Sda(1);
	Delay(2);
}

  /*接收端返回的確認信號*/
 void   Ack_In(void)
{
	Change_Scl(0);                    //scl線為低電平
	Change_Sda(0);
	Delay(4);
	Sda_Io(1);                        //scl輸出  sda輸入 
	Change_Scl(1);                    //scl線為高電平 
	Delay(2);
	Change_Scl(0);                     //線為低電平   
} 
/*發送端的確認信號*/
void   Ack_Out(void)
{
	Change_Scl(0);                      //為低電平
	Change_Sda(0);                     //sda為低電平  
	Sda_Io(0);                        //scl輸出sda輸出
	Delay(4);
	Change_Scl(1);                    
	Delay(2);
	Change_Scl(0);
}
/*調用該函數實現向從機寫n字節的數據,slvaddr為從機地址,regaddr為寄存器地址,d為發送的數據數組*/
int Write_Iic(unsigned char slvaddr, unsigned char* pdata, unsigned char size)
{
  int i=0;
  unsigned char data=0x00,m=0x00,addr=0;
  unsigned int j,f,k;
  if(size <= 0)
	return -1;

	addr=((slvaddr<<1) & 0xfe);	              //將slvaddr的高低位順序換過來
	//printk("The slvaddr of Writ_Byte is:%d\n ",addr);
	for(i=0;i<8;)
	{
		j=Bit_Read(addr,i);
		data=(data<<1)|j;
		i++;	
	}
	addr=data;
	//printk("The change slvaddr is :%d\n",addr);
	
	Iic_Start();           
	Write_Byte(addr);          
	Ack_In();
	for(i = 0; i < size;i++)             
	{
		for(f=0;f<8;)                         //將pdata[i]的高低位按順序換過來 
		{
			k=Bit_Read(pdata[i],f);
			m=(m<<1)|k;
			f++	;
		}
		pdata[i]=m;
	//	printk("The pdata[i] is :%d\n",pdata[i]);
		m=0;
		Write_Byte(pdata[i]);		
		Ack_In();
	}	
	Iic_Stop();
	Delay(100);
	return 0;
}
/*調用該函數實現由從機讀n字節的數據(無須提供寄存器地址),slvaddr為從機地址,regaddr為寄存器地址,(*d)為接受數據指針*/
int Read_noaddr_Iic(unsigned char slvaddr, unsigned char* pdata, unsigned char size)
{ 
	int i,l,j;
	unsigned char addr=0,data=0x00;
	addr=((slvaddr<<1) | 0x01);
	for(l=0;l<8;)                        //將slvaddr的高低位按順序換過來,發送時先發高位
	{
		j=Bit_Read(addr,l);
		data=(data<<1)|j;
		l++;	
	}
	addr=data;
	
	//printk("The slvaddr is :%d\n",addr);
	Iic_Start();
	Write_Byte(addr);
	Ack_In();
	for(i = 0; i < size; i++)
	{
		*pdata = Read_Byte();
	//	printk("read byte is:%d\n",*pdata);
		return(*pdata);
		pdata++;
		if(i == (size - 1))
			break;
		else
			Ack_Out	();
	}
	Iic_Stop();
	Delay(100);
	return 0 ;
}

/*調用該函數實現由從機讀n字節的數據(須提供寄存器地址),slvaddr為從機地址*/
int Read_addr_Iic(unsigned char slvaddr, unsigned char* pdata, unsigned char size)
{ 
	int i;
  unsigned char addr=0,data=0x00,l,j;
	
	//printk("slvaddr is :0x%x\n",slvaddr);
	addr=((slvaddr<<1)&0xfe);	                          //change   send  order
	for(l=0;l<8;)
	{
		j=Bit_Read(addr,l);
		data=(data<<1)|j;
		l++;	
	}
	addr=data;
	//printk("The first time send slvaddr is :0x%x\n",addr);
	Iic_Start();
	Write_Byte(addr);
	Ack_In();
		
	//printk("The send regaddr is :0x%x\n",pdata[0]);
	data=0;
	for(l=0;l<8;)
	{
		j=Bit_Read(pdata[0],l);
		data=(data<<1)|j;
		l++;	
	}
	pdata[0]=data;
	//printk("The send regaddr is:%d\n",pdata[0]);
	Write_Byte(pdata[0]);	                         
	Ack_In();
	Iic_Start();
	addr=addr|0x80;
	//printk("The slvaddr is :%d\n",slvaddr);
	/*addr=((slvaddr<<1)|0x01);	
	data=0x00;                            //change send order
	for(l=0;l<8;)
	{
		j=Bit_Read(addr,l);
		data=(data<<1)|j;
		l++;	
	}
	slvaddr=data;
	*/
	Write_Byte(addr);
	//printk("The second time send slvaddr is:%d\n",addr);
	Ack_In();
	pdata++;
	//printk("*pdata is :%d\n",*pdata);
	for(i = 0; i < size; i++)
	{
		*pdata = Read_Byte();
	//	printk("The read_byte  is:0x%x\n",*pdata);
		return(*pdata);
		pdata++;                                  
		if(i == (size - 1))                
			break;
		else
			Ack_Out	();	
	}
	Iic_Stop();
	Delay(100);
	return 0;
}
/*********************************************************/
static int iic_drv_open(struct inode * inode, struct file * filp)
{
	MOD_INC_USE_COUNT;
	DPRINTK("open\n");
	return 0;
}

static int iic_drv_release(struct inode * inode, struct file * filp)
{
	MOD_DEC_USE_COUNT;
	DPRINTK("releas\n");
	return 0;
}


int iic_drv_ioctl(struct inode * inode, struct file * filp, unsigned int command, unsigned long arg)
{
	int err = 0;	
	struct iic_drv_tag iic_data;
	
	switch(command)
	{		
		case READ_NADD_IIC:
		{
			copy_from_user(&iic_data, (struct iic_drv_tag *)(arg), sizeof(struct iic_drv_tag));				
			Read_noaddr_Iic(iic_data.addr, iic_data.pdata, iic_data.size);
			copy_to_user(&iic_data, (struct iic_drv_tag *)(arg), sizeof(iic_data));
			copy_to_user(iic_data.pdata, ((struct iic_drv_tag *)(arg))->pdata, iic_data.size);
			break;	    
	  }
    
	    case READ_ADD_IIC:
		{
			copy_from_user(&iic_data, (struct iic_drv_tag *)(arg), sizeof(struct iic_drv_tag));			
			Read_addr_Iic(iic_data.addr, iic_data.pdata, iic_data.size);
			copy_to_user(&iic_data, (struct iic_drv_tag *)(arg), sizeof(iic_data));
		  //copy_to_user(iic_data.pdata, ((struct iic_drv_tag *)(arg))->pdata, iic_data.size);
			break;	    
	  }
		
		case WRITE_IIC:			
		{
			copy_from_user(&iic_data, (struct iic_drv_tag *)(arg), sizeof(struct iic_drv_tag));
			copy_from_user(iic_data.pdata, ((struct iic_drv_tag *)(arg))->pdata, iic_data.size);		  	
			Write_Iic(iic_data.addr, iic_data.pdata, iic_data.size);	
		}
		
		default:
			return -ENOTTY;
		break;	
	}

	return err;
}

static struct file_operations iic_drv_fops = {

	owner:	  THIS_MODULE,
	ioctl:	  iic_drv_ioctl,
	open:	  iic_drv_open,
	release:  iic_drv_release,
};

#ifdef CONFIG_DEVFS_FS
	static devfs_handle_t devfs_iic_drv_dir, devfs_iic_drv;
#endif

static int __init iic_drv_init(void)
{
	int ret;	
	ret = register_chrdev(0, DEVICE_NAME, &iic_drv_fops);
	if(ret < 0)
	{
		printk("iic_drv:Cant't get major number!\n");
		return ret;
	}
	iic_drv_major = ret;	

	#ifdef CONFIG_DEVFS_FS
		devfs_iic_drv_dir = devfs_mk_dir(NULL, "iic_drv", NULL);
		if(!devfs_iic_drv_dir) return -EBUSY;	/* ERROR */
		
			devfs_iic_drv = devfs_register(devfs_iic_drv_dir, "0", 
			DEVFS_FL_DEFAULT, iic_drv_major, EMPLED_MINOR, 
		S_IFCHR | S_IRUSR | S_IWUSR, &iic_drv_fops, NULL);
	#endif

	printk("iic_drv:Initialized!\n");
	printk("iic_drv:Major device no. -> %d\n",iic_drv_major);
	
	return 0;
}


static void __exit  iic_drv_exit(void)
{
	#ifdef CONFIG_DEVFS_FS
		devfs_unregister(devfs_iic_drv);
		devfs_unregister(devfs_iic_drv_dir);
	#endif
	
	printk("iic_drv:release!\n");
	unregister_chrdev(iic_drv_major, DEVICE_NAME);
	
}

module_init(iic_drv_init);
module_exit(iic_drv_exit);

MODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
蜜臀av性久久久久蜜臀aⅴ流畅 | 美腿丝袜在线亚洲一区| 国产亚洲精品久| 欧美xfplay| 欧美激情一区二区三区在线| 精品国产一区二区精华| 欧美老女人在线| 欧美乱妇15p| 精品久久久久久久久久久院品网| 欧美中文字幕不卡| 在线亚洲高清视频| 欧美日韩一区二区在线观看视频| 色8久久人人97超碰香蕉987| 一本大道久久a久久综合| 91麻豆国产自产在线观看| 91成人看片片| 日韩精品一区在线| 国产婷婷色一区二区三区在线| 国产日韩欧美高清| 亚洲理论在线观看| 日本美女一区二区三区视频| 首页亚洲欧美制服丝腿| 国产大片一区二区| 欧美日韩在线电影| 久久久久久久免费视频了| www一区二区| 亚洲激情欧美激情| 精品一区二区三区在线视频| 色视频欧美一区二区三区| 欧美一二三四区在线| 亚洲乱码国产乱码精品精小说 | 国产福利不卡视频| thepron国产精品| 欧美一区二区三区的| 成人免费在线观看入口| 日韩av电影天堂| 成人黄色av电影| 日韩一区二区在线看片| 亚州成人在线电影| 91福利在线播放| 亚洲色图一区二区| 成人动漫一区二区三区| 91精品国产aⅴ一区二区| 亚洲国产精品99久久久久久久久 | 亚洲欧美偷拍卡通变态| 久久激情综合网| 欧美日韩国产精品自在自线| 亚洲你懂的在线视频| av中文字幕一区| 成人免费视频在线观看| 成人毛片在线观看| 国产精品的网站| 91玉足脚交白嫩脚丫在线播放| 欧美国产成人精品| av在线综合网| 亚洲电影欧美电影有声小说| 欧美少妇bbb| 亚洲国产日产av| 91精品欧美久久久久久动漫 | 韩国欧美国产1区| 国产精品素人一区二区| 精品一二三四区| 欧美激情一区在线观看| 色88888久久久久久影院按摩 | ww亚洲ww在线观看国产| 亚洲欧美福利一区二区| 蜜桃av一区二区三区| 日韩精品一区二区在线| 成人高清视频在线观看| 亚洲一区二区五区| 国产视频在线观看一区二区三区| 不卡高清视频专区| 日韩电影在线看| 国产精品视频免费| 欧美一三区三区四区免费在线看 | 久久成人久久爱| 亚洲欧美日本在线| 久久久美女毛片| 欧美日韩激情一区| 成人av网站在线观看免费| 欧美三级在线看| 99精品欧美一区| 成人午夜电影久久影院| 色婷婷av一区二区三区gif| 蜜桃精品视频在线观看| 香蕉成人伊视频在线观看| 中文字幕一区二区三区色视频| 精品成人私密视频| 日韩视频在线你懂得| 在线欧美小视频| 99精品欧美一区二区三区小说| 从欧美一区二区三区| 国产福利视频一区二区三区| 精品制服美女丁香| 国产精品白丝jk白祙喷水网站| 亚洲第一搞黄网站| 蜜桃视频在线一区| 精品一区二区久久| 国产精品综合网| 国产成人免费视频精品含羞草妖精| 久久成人久久爱| 国产精品一二三区在线| 91在线观看美女| 欧美色手机在线观看| 日韩欧美亚洲国产另类| 欧美成人伊人久久综合网| 精品成人一区二区三区| 精品污污网站免费看| 国产成人在线色| 欧美优质美女网站| 91精品一区二区三区在线观看| 欧美日产国产精品| 国产亚洲欧美激情| 亚洲三级视频在线观看| 亚洲无线码一区二区三区| 老司机精品视频一区二区三区| 国产在线精品不卡| 欧美日韩一区二区三区视频| 日韩一区二区三区电影在线观看| 中文字幕精品三区| 国内一区二区视频| 欧美视频完全免费看| 2023国产精品视频| 亚洲妇熟xx妇色黄| 国模一区二区三区白浆| 欧美日韩一区 二区 三区 久久精品| 精品久久五月天| 亚洲国产aⅴ天堂久久| 91香蕉国产在线观看软件| 9191久久久久久久久久久| 综合久久久久综合| 国产精品亚洲视频| 久久综合九色综合97_久久久| 亚洲免费看黄网站| 欧日韩精品视频| 一区二区成人在线观看| 91免费视频网| 国产亚洲va综合人人澡精品| 午夜伊人狠狠久久| 日韩亚洲欧美在线| 另类中文字幕网| 欧美国产成人在线| 99久久久精品免费观看国产蜜| 国产精品久久久一本精品 | 日韩电影一区二区三区四区| 日本韩国一区二区三区视频| 亚洲中国最大av网站| 欧美日韩中文字幕精品| 青青草国产成人av片免费| 欧美日韩小视频| 男人的j进女人的j一区| 日韩欧美成人午夜| 国产suv精品一区二区6| 亚洲丝袜美腿综合| 884aa四虎影成人精品一区| 激情另类小说区图片区视频区| 欧洲精品在线观看| 亚洲人成小说网站色在线| 在线成人免费视频| 丁香五精品蜜臀久久久久99网站| 亚洲九九爱视频| 欧美精品123区| 国产91精品精华液一区二区三区 | 精品国产欧美一区二区| youjizz国产精品| 丝瓜av网站精品一区二区| 久久美女艺术照精彩视频福利播放 | 亚洲欧美另类久久久精品2019| 欧美精品 日韩| 在线欧美小视频| 成人夜色视频网站在线观看| 日日摸夜夜添夜夜添精品视频 | 51精品视频一区二区三区| 国产精品1区2区3区在线观看| 亚洲午夜激情网页| 国产精品久久久久影院色老大| 日韩精品在线一区| 日韩一级高清毛片| 欧美一级电影网站| 制服丝袜中文字幕一区| 欧美日韩不卡一区二区| 91丨porny丨户外露出| 91啪九色porn原创视频在线观看| 国产精品1区2区| 成人美女在线视频| av午夜一区麻豆| 99久久精品情趣| 色欧美88888久久久久久影院| 色综合视频一区二区三区高清| 一本色道久久加勒比精品| caoporen国产精品视频| 在线看一区二区| 欧美日韩国产色站一区二区三区| 欧美久久久久免费| 最新久久zyz资源站| 亚洲免费观看高清| 婷婷久久综合九色综合伊人色| 久久精品久久综合| 国产高清不卡一区| 在线看不卡av|