⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c-pport.c

📁 I2C总线LINUX驱动程序
💻 C
字号:
/* ------------------------------------------------------------------------- *//* i2c-pport.c i2c-hw access  for primitive i2c par. port adapter	     *//* ------------------------------------------------------------------------- *//*   Copyright (C) 2001    Daniel Smolik    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.		     *//* ------------------------------------------------------------------------- *//*	See doc/i2c-pport for instructions on wiring to the	parallel port connector.	Cut & paste :-)  based on Velleman K8000 driver by Simon G. Vogl	Note that SDA is hardware inverted.*/#include <linux/kernel.h>#include <linux/module.h>#include <linux/delay.h>#include <linux/slab.h>#include <linux/init.h>#include <linux/ioport.h>#include <linux/errno.h>#include "i2c.h"#include "i2c-algo-bit.h"#include <asm/io.h>#define DEFAULT_BASE 0x378static int base = DEFAULT_BASE;static unsigned char PortData = 0;/* ----- global defines -----------------------------------------------	*/#define DEB(x)		/* should be reasonable open, close &c. 	*/#define DEB2(x) 	/* low level debugging - very slow 		*/#define DEBE(x)	x	/* error messages 				*/#define DEBINIT(x) x	/* detection status messages			*//* --- Convenience defines for the parallel port:			*/#define BASE	(unsigned int)(data)#define DATA	BASE			/* Centronics data port		*/#define STAT	(BASE+1)		/* Centronics status port	*/#define CTRL	(BASE+2)		/* Centronics control port	*//* we will use SDA - Auto Linefeed(14)       POUT (ctrl bit 1) *//* we will use SCL - Initialize printer(16)  BUSY (ctrl bit 2) */#define  SET_SCL    | 0x04#define  CLR_SCL    & 0xFB#define  SET_SDA    & 0xFD#define  CLR_SDA    | 0x02/* ----- local functions ----------------------------------------------	*/static void bit_pport_setscl(void *data, int state){	if (state) {		PortData = PortData SET_SCL;	} else {		PortData = PortData CLR_SCL; 	}	outb(PortData, CTRL);}static void bit_pport_setsda(void *data, int state){	if (state) {		PortData = PortData SET_SDA;	} else {		PortData = PortData CLR_SDA;	}	outb(PortData, CTRL);} static int bit_pport_getscl(void *data){	return ( 4 == ( (inb_p(CTRL)) & 0x04 ) );}static int bit_pport_getsda(void *data){	return ( 0 == ( (inb_p(CTRL)) & 0x02 ) );}static int bit_pport_init(void){	if (!request_region((base+2),1, "i2c (PPORT adapter)")) {		return -ENODEV;		}	PortData = inb(base+2);	bit_pport_setsda((void*)base, 1);	bit_pport_setscl((void*)base, 1);	return 0;}static void bit_pport_inc_use(struct i2c_adapter *adap){#ifdef MODULE	MOD_INC_USE_COUNT;#endif}static void bit_pport_dec_use(struct i2c_adapter *adap){#ifdef MODULE	MOD_DEC_USE_COUNT;#endif}/* ------------------------------------------------------------------------ * Encapsulate the above functions in the correct operations structure. * This is only done when more than one hardware adapter is supported. */static struct i2c_algo_bit_data bit_pport_data = {	.setsda		= bit_pport_setsda,	.setscl		= bit_pport_setscl,	.getsda		= bit_pport_getsda,	.getscl		= bit_pport_getscl,	.udelay		= 40,	.mdelay		= 80,	.timeout	= HZ};static struct i2c_adapter bit_pport_ops = {	.name		= "Primitive Parallel port adaptor",	.id		= I2C_HW_B_PPORT,	.algo_data	= &bit_pport_data,	.inc_use	= bit_pport_inc_use,	.dec_use	= bit_pport_dec_use,};static int __init i2c_bitpport_init(void){	printk("i2c-pport.o: i2c Primitive parallel port adapter module version %s (%s)\n", I2C_VERSION, I2C_DATE);	bit_pport_data.data = (void*)base;	if (bit_pport_init() < 0)		return -ENODEV;	if (i2c_bit_add_bus(&bit_pport_ops) < 0) {		release_region(base+2, 1);		return -ENODEV;	}	printk("i2c-pport.o: found device at %#x.\n",base);	return 0;}static void __exit i2c_bitpport_exit(void){	i2c_bit_del_bus(&bit_pport_ops);	release_region((base+2),1);}EXPORT_NO_SYMBOLS;MODULE_AUTHOR("Daniel Smolik <marvin@sitour.cz>");MODULE_DESCRIPTION("I2C-Bus adapter routines for Primitive parallel port adapter");MODULE_LICENSE("GPL");MODULE_PARM(base, "i");module_init(i2c_bitpport_init);module_exit(i2c_bitpport_exit);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -