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

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

?? spd.c

?? Linux 2.6.24通過SMBUS總線(也類似于i2c總線)讀寫內存上的SPD信息。里面包含驅動和測試程序。再PC機上反復測試過
?? C
字號:
#include <linux/kernel.h>#include <linux/init.h>#include <linux/module.h>#include <linux/slab.h>#include <linux/jiffies.h>#include <linux/i2c.h>#include <linux/mutex.h>#include <linux/fs.h>#include <linux/cdev.h>#include <linux/device.h>#include <linux/delay.h>#include <linux/types.h>#include <asm/uaccess_32.h>#define  CREATE_AUTO		1/* Addresses to scan *///static unsigned short normal_i2c[] = { 0xA4,0xA5, I2C_CLIENT_END };static unsigned short normal_i2c[] = { 0x50, I2C_CLIENT_END };/* Insmod parameters */I2C_CLIENT_INSMOD_1(SPD);/* device number */#define SPD_MAJOR			(225)#define SPD_MINOR			(0)/* device node */#define NODE_NAME			("spd")   /* command mode */#define 	SPD_READ		(1)#define 	SPD_WRITE		(0)					/* functon prototype declaration */static int 	spd_attach_adapter(struct i2c_adapter *adapter);static int 	spd_detect(struct i2c_adapter *adapter, int address, int kind);static int 	spd_detach_client(struct i2c_client *client);int  		spd_open(struct inode *inode,struct file *flip);int  		spd_release(struct inode *inode,struct file *filp);int  		spd_ioctl(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg);int  		spd_command(struct i2c_client *client,unsigned int cmd,void *arg);ssize_t 	spd_read(struct file *filp,unsigned char __user *buf,size_t count,loff_t *f_pos);ssize_t     spd_write(struct file *filp,const unsigned char __user *buf,size_t count,loff_t *f_pos);/* file interface */struct file_operations SPD_fops={	.owner = THIS_MODULE,	.ioctl = spd_ioctl,	.read  = spd_read,	.write = spd_write,	.open = spd_open,	.release = spd_release,};/* device struct */struct spd_dev{	struct cdev cdev;};/* Each client has this additional data */struct spd_data {	struct i2c_client client;	struct mutex update_lock;};/* This is the driver that will be inserted */static struct  i2c_driver spd_driver = {	.driver = {		.name	= "spd",	},	.attach_adapter	= spd_attach_adapter,	.detach_client	= spd_detach_client,	.command		= spd_command,};/* the glogal variable definition */struct spd_dev 		*SPD_cdev = NULL;struct spd_data     *SPD_data = NULL;#ifdef CREATE_AUTOstruct class  		*SPD_class = NULL;struct class_device *SPD_class_device =NULL;#endif/*  the function implement *//* typedef long ssize_t */#define 	COUNT		(1)ssize_t 	spd_read(struct file *filp,unsigned char __user *buf,size_t count,loff_t *f_pos){	struct i2c_client  client;	int i;	unsigned char result;	client = SPD_data->client;#if 0	result = i2c_smbus_read_byte(&client);	if(result<0)	{			printk(KERN_ALERT "    read data failed.\n");		goto out;	}		if(copy_to_user(buf,&result,COUNT))	{		result = -EFAULT;		goto out;	}#else	for(i=0;i<count;i++)	{		result = i2c_smbus_read_byte_data(&client,i);		if(result < 0)		{			printk(KERN_ALERT "    read data failed.\n");			goto out;		}		if(copy_to_user(buf+i,&result,COUNT))		{			result = -EFAULT;			goto out;		}	}#endifout:	return result;}ssize_t     spd_write(struct file *filp,const unsigned char __user *buf,size_t count,loff_t *f_pos){	struct i2c_client client;	unsigned char temp;	client = SPD_data->client;	if(copy_from_user(&temp,buf,COUNT))	{		return -EFAULT;	}	return i2c_smbus_write_byte(&client,temp);}int spd_ioctl(struct inode *inode,struct file *filp,unsigned int cmd,unsigned long arg){	struct i2c_adapter *adap;	printk(KERN_ALERT "    ==>sign:%s\n",__FUNCTION__);    adap = SPD_data-> client.adapter;	switch(cmd)	{		case SPD_WRITE:		case SPD_READ:			i2c_clients_command(adap,cmd,arg);				while(1)			{				printk("Just a test!\n");				ssleep(1000);			}		break;		default:-EINVAL;	}	return 0;}int spd_command(struct i2c_client *client,unsigned int cmd,void *arg){	printk(KERN_ALERT "    ==>sign:%s\n",__FUNCTION__);	switch(cmd)	{		case SPD_READ:			return i2c_smbus_read_byte(client);			break;		case SPD_WRITE:			return i2c_smbus_write_byte(client,arg);  //			break;		default: 			return -EINVAL;	}}int spd_open(struct inode *inode, struct file *filp){	struct spd_dev  *dev;	printk(KERN_ALERT "    ==>sign:%s\n",__FUNCTION__);	dev = container_of(inode->i_cdev,struct spd_dev,cdev);	filp -> private_data = dev;	return 0;}int spd_release(struct inode *inode,struct file *filp){	printk(KERN_ALERT "    ==>sign:%s\n",__FUNCTION__);	return 0;}static int spd_attach_adapter(struct i2c_adapter *adapter){	printk(KERN_ALERT "    ==>sign:%s\n",__FUNCTION__);	return i2c_probe(adapter, &addr_data, spd_detect);}/* This function is called by i2c_probe */static int spd_detect(struct i2c_adapter *adapter, int address, int kind){	struct 	i2c_client 		*new_client;	int 	err = 0;	printk(KERN_ALERT "    ==>sign:%s\n",__FUNCTION__);	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_READ_BYTE_DATA					    | I2C_FUNC_SMBUS_BYTE))		goto exit;	if (!(SPD_data = kzalloc(sizeof(struct spd_data), GFP_KERNEL))) {		err = -ENOMEM;		goto exit;	}	new_client = &SPD_data->client;	i2c_set_clientdata(new_client, SPD_data);	new_client->addr = address;	new_client->adapter = adapter;	new_client->driver = &spd_driver;	new_client->flags = 0;	/* Fill in the remaining client fields */	strlcpy(new_client->name, "spd", I2C_NAME_SIZE);	mutex_init(&SPD_data->update_lock);	/* Tell the I2C layer a new client has arrived */	if ((err = i2c_attach_client(new_client)))		goto exit_kfree;	/* Detect the Vaio nature of EEPROMs.	   We use the "PCG-" or "VGN-" prefix as the signature. */	if (address == 0x57) 	{		char name[4];				name[0] = i2c_smbus_read_byte_data(new_client, 0x80);		name[1] = i2c_smbus_read_byte(new_client);		name[2] = i2c_smbus_read_byte(new_client);		name[3] = i2c_smbus_read_byte(new_client);	}		return 0;exit_kfree:	kfree(SPD_data);exit:	return err;}static int spd_detach_client(struct i2c_client *client){	int err;	printk(KERN_ALERT "    ==>sign:%s\n",__FUNCTION__);/*	sysfs_remove_bin_file(&client->dev.kobj, &spd_attr);*/	err = i2c_detach_client(client);	if (err)		return err;	kfree(i2c_get_clientdata(client));	return 0;}static int __init spd_init(void){	int result;	dev_t dev = 0;		printk(KERN_ALERT "    ==>Welcome to %s fuction.\n",__FUNCTION__);	/* Get the device number */	dev = MKDEV(SPD_MAJOR,SPD_MINOR);	if(SPD_MAJOR)	{		result = register_chrdev_region(dev,1,"SPD");  	// apply the device number to system 	}	else	{		result = alloc_chrdev_region(&dev,0,1,"SPD");	}	if(result )	{		printk(KERN_ALERT "SPD: can't get major %d\n",SPD_MAJOR);		return result;	}		SPD_cdev = kmalloc(sizeof(struct spd_dev),GFP_KERNEL);	if(!SPD_cdev)	{		result = -ENOMEM;		goto out_unregister_device_number;	}	memset(SPD_cdev,0,sizeof(struct spd_dev));	cdev_init(&SPD_cdev->cdev,&SPD_fops);	SPD_cdev->cdev.owner = THIS_MODULE;	SPD_cdev->cdev.ops = &SPD_fops;	result = cdev_add(&SPD_cdev->cdev,dev,1);	if(result)	{		printk(KERN_ALERT "Error %d adding SPD\n",result);		goto out_free_dev;	}	#ifdef CREATE_AUTO	/* creating my own class */	SPD_class = class_create(THIS_MODULE,"SPD");	if(IS_ERR(SPD_class))	{		printk(KERN_ALERT "ERR:failed in creating class.\n");		goto out_del_dev;	}	/* register your own device in sysfs,and this will casue udeved to create corresponding device node */	SPD_class_device = class_device_create(SPD_class,NULL,MKDEV(SPD_MAJOR,SPD_MINOR),NULL, NODE_NAME);	if(IS_ERR(SPD_class_device))	{		printk(KERN_ALERT "ERR:failed in creating class device.\n");		goto out_uncreate_class;	}#endif	/* add the  i2c_driver */	result = i2c_add_driver(&spd_driver);	if(result)	{		printk(KERN_ALERT "ERR:failed in adding i2c_driver.\n");		goto out_uncreate_device;		}	printk(KERN_ALERT "    ==>The %s fuction is OK.\n",__FUNCTION__);	return result;out_uncreate_device:	class_device_destroy(SPD_class,MKDEV(SPD_MAJOR,SPD_MINOR));out_uncreate_class:	class_destroy(SPD_class);out_del_dev:	cdev_del(&SPD_cdev->cdev);out_free_dev:	kfree(SPD_cdev);out_unregister_device_number:	unregister_chrdev_region(dev,1);	return result;}static void __exit spd_exit(void){	printk(KERN_ALERT "    ==>Goodby to  %s fuction.\n",__FUNCTION__);		i2c_del_driver(&spd_driver);#ifdef CREATE_AUTO	class_device_destroy(SPD_class,MKDEV(SPD_MAJOR,SPD_MINOR));	class_destroy(SPD_class);#endif	dev_t devno = MKDEV(SPD_MAJOR,SPD_MINOR);	cdev_del(&SPD_cdev->cdev);	kfree(SPD_cdev);	unregister_chrdev_region(devno,1);}module_init(spd_init);module_exit(spd_exit);MODULE_AUTHOR("Wshenglin <wshenglin@gmail.com>");MODULE_DESCRIPTION("SMBUS EEPROM driver");MODULE_LICENSE("Dual BSD/GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美三级三级三级爽爽爽| 一本色道综合亚洲| 色天天综合色天天久久| 国产黄人亚洲片| 欧美亚洲国产一区二区三区va| 欧美丝袜丝交足nylons| 亚洲精品免费视频| 国产成人高清在线| 1000部国产精品成人观看| 国产精品一二二区| 精品久久一区二区三区| 亚洲一区二区三区精品在线| 国产成人精品三级麻豆| 国产精品久久久久久久久久免费看| 奇米四色…亚洲| 欧美电视剧免费全集观看| 亚洲欧美另类综合偷拍| 久久99国产精品久久99| 国产精品久久久久影院老司| 色呦呦国产精品| 亚洲午夜视频在线观看| 国产伦精一区二区三区| 日韩限制级电影在线观看| 亚洲成人动漫av| 欧美色国产精品| 久久99精品国产麻豆不卡| 国产精品丝袜在线| av成人动漫在线观看| 欧美国产禁国产网站cc| 国产剧情在线观看一区二区| 亚洲人妖av一区二区| jlzzjlzz亚洲日本少妇| 午夜精品久久久久久久久久久| 一本久久综合亚洲鲁鲁五月天| 日韩精品欧美精品| 欧美日韩成人综合天天影院| 午夜精品久久久久久久99水蜜桃| 欧美精品一区男女天堂| 国产原创一区二区| 亚洲综合色在线| 久久精品在线免费观看| 成人网男人的天堂| 亚洲日本一区二区三区| 2020日本不卡一区二区视频| 成人黄色国产精品网站大全在线免费观看 | 欧美国产一区在线| 制服.丝袜.亚洲.另类.中文| 天天影视涩香欲综合网| 国产精品久久久久久亚洲毛片 | 国产综合色产在线精品| 精品99久久久久久| 欧美日韩精品一区二区天天拍小说| 福利一区福利二区| 中文字幕一区二区在线播放| 日韩欧美第一区| 欧美网站一区二区| 91蝌蚪porny九色| 天天操天天综合网| 亚洲日本va午夜在线电影| 国产亚洲精品超碰| 精品国产一区二区三区久久影院 | 精品粉嫩超白一线天av| 欧美日韩中文字幕精品| 99久久精品情趣| 香蕉久久夜色精品国产使用方法| 中文无字幕一区二区三区| 精品国产sm最大网站免费看| 欧美一区二区三区播放老司机| 久久99这里只有精品| 国产精品久久久久久久浪潮网站| 日韩视频一区二区| 日韩欧美国产一区二区在线播放 | 日韩视频在线一区二区| 在线观看区一区二| 九色综合国产一区二区三区| 日本成人中文字幕在线视频| 久久久噜噜噜久久中文字幕色伊伊| a在线播放不卡| 成人综合婷婷国产精品久久免费| 久久99久久精品| 精品一区二区在线观看| 久久激情五月激情| 韩国成人福利片在线播放| 国产美女在线精品| 国产又黄又大久久| 成人免费看的视频| 99国产精品久久久久久久久久| 粉嫩aⅴ一区二区三区四区 | 美女视频免费一区| 国产精品乱人伦| 亚洲欧洲日韩综合一区二区| 亚洲精品日产精品乱码不卡| 一区二区三区蜜桃网| 久久精品一区四区| 日韩一区有码在线| 成人一区二区三区| 91免费国产视频网站| 欧美午夜精品免费| 日韩精品一区二区三区视频| 久久蜜桃香蕉精品一区二区三区| 日本一区二区三区免费乱视频| 在线电影欧美成精品| 91麻豆精品一区二区三区| 在线观看亚洲一区| 欧美一区二区三区四区视频| 精品少妇一区二区三区在线视频| 国产欧美一区二区精品性色| 亚洲激情中文1区| 日韩国产精品91| 成人午夜视频免费看| 欧美性受xxxx黑人xyx| 精品粉嫩超白一线天av| 亚洲人123区| 美女视频网站黄色亚洲| av电影一区二区| 欧美一级高清大全免费观看| 国产精品色婷婷久久58| 亚洲一区在线视频观看| 国产一区二区三区四区五区入口| 97精品久久久午夜一区二区三区| 欧美嫩在线观看| 日本一区二区免费在线观看视频| 亚洲一区在线观看免费观看电影高清 | 99r精品视频| 日韩欧美电影在线| 一区二区欧美在线观看| 国产一区二区在线影院| 欧美日韩一区三区四区| 国产亚洲精品资源在线26u| 亚洲最大成人综合| 国产福利一区二区三区视频| 欧美性大战久久| 日本一区二区三区电影| 久久精品国产精品亚洲红杏| 北条麻妃一区二区三区| 亚洲综合激情另类小说区| 国产一区二区福利| 337p亚洲精品色噜噜| 亚洲欧洲色图综合| 国产成人一区在线| 日韩欧美国产电影| 亚洲图片欧美一区| 91在线一区二区三区| 国产丝袜美腿一区二区三区| 免费观看91视频大全| 91国偷自产一区二区使用方法| 欧美这里有精品| 国产精品久久三区| 国产成人99久久亚洲综合精品| 欧美一区二区三区日韩视频| 中文字幕va一区二区三区| 91丨九色porny丨蝌蚪| 欧美群妇大交群的观看方式| 日本午夜精品视频在线观看| 欧美自拍偷拍一区| 成人av综合一区| 免费观看在线综合色| 亚洲成年人影院| 亚洲成av人影院在线观看网| 一区二区三区视频在线看| 亚洲免费资源在线播放| 亚洲三级视频在线观看| 中文字幕亚洲欧美在线不卡| 欧美狂野另类xxxxoooo| 99久久国产综合色|国产精品| 成人动漫一区二区在线| av福利精品导航| 欧美顶级少妇做爰| 久久综合久久鬼色| 一区二区三区在线视频观看| 亚洲一区在线视频观看| 久久成人精品无人区| 青椒成人免费视频| 欧美三级一区二区| 91丨九色丨蝌蚪富婆spa| 国产69精品久久99不卡| 国产在线看一区| 国产一区二区三区在线看麻豆| 狠狠色丁香婷综合久久| 精品一区二区三区欧美| 国内一区二区视频| 风流少妇一区二区| 国产精品99久久久| 色综合久久久久综合体桃花网| 不卡av免费在线观看| 7777精品伊人久久久大香线蕉完整版 | 成人免费看片app下载| 日本不卡在线视频| 国产精品青草综合久久久久99| 97se狠狠狠综合亚洲狠狠| 色综合色综合色综合色综合色综合| 日韩国产精品久久| 亚洲免费看黄网站| 午夜精品福利一区二区蜜股av| 日韩黄色片在线观看| 久久超碰97中文字幕| 97久久人人超碰| 欧美一二三在线| 亚洲日本在线视频观看| 免费观看30秒视频久久|