www.pudn.com > test_iic.rar > test_iic.c


 
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
 
#include  
#include  
 
#include  
#include  
 
static int debug;	/* insmod parameter */ 
static int this_adap; 
 
 
static struct i2c_client client_template; 
 
#define TLV320AIC32_IIC_ADDR	0x18 
 
/* Addresses to scan */ 
static unsigned short normal_i2c[] = {I2C_CLIENT_END}; 
static unsigned short normal_i2c_range[] = {TLV320AIC32_IIC_ADDR, TLV320AIC32_IIC_ADDR+1, I2C_CLIENT_END}; 
static unsigned short probe[2]        = { I2C_CLIENT_END, I2C_CLIENT_END }; 
static unsigned short probe_range[2]  = { I2C_CLIENT_END, I2C_CLIENT_END }; 
static unsigned short ignore[2]       = { I2C_CLIENT_END, I2C_CLIENT_END }; 
static unsigned short ignore_range[2] = { I2C_CLIENT_END, I2C_CLIENT_END }; 
static unsigned short force[2]        = { I2C_CLIENT_END, I2C_CLIENT_END }; 
 
static struct i2c_client_address_data addr_data = { 
	normal_i2c, normal_i2c_range,  
	probe, probe_range,  
	ignore, ignore_range,  
	force 
}; 
 
 
 
 
 
/* ---------------------------------------------------------------------- */ 
 
static int  
test_attach(struct i2c_adapter *adap, int addr, 
	     unsigned short flags, int kind) 
{ 
 
	static unsigned char send_buffer[5]; 
	static unsigned char recv_buffer[5]; 
	 
	struct i2c_client *client; 
	int i,send_ret,recv_ret; 
	if (this_adap > 0) 
		return -1; 
	this_adap++; 
	 
        client_template.adapter = adap; 
        client_template.addr = addr; 
 
	client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL); 
        if (client == NULL) 
                return -ENOMEM; 
        memcpy(client, &client_template, sizeof(struct i2c_client)); 
 
	printk("test: SAB3036 found, addr:%x \n",addr); 
 
        i2c_attach_client(client); 
	//MOD_INC_USE_COUNT; 
 
	send_buffer[0]=0x00;//reg addr 
	send_buffer[1]=0x00;//write value 
	i2c_master_send(client, send_buffer, 2); 
 
                send_buffer[0]=0x00;//reg addr 
                send_ret=i2c_master_send(client, send_buffer,1); 
                recv_ret=i2c_master_recv(client, recv_buffer,1); 
                printk("test: reg read value: %x  send_ret:%d,recv_ret:%d\n",recv_buffer[0],send_ret,recv_ret); 
 
 
	for(i=0;i<50;i++){ 
		send_buffer[0]=i;//reg addr 
		send_ret=i2c_master_send(client, send_buffer,1); 
		recv_ret=i2c_master_recv(client, recv_buffer,1); 
                printk("test: reg addr : %d ,reg read value: %x  send_ret:%d,recv_ret:%d\n",i,recv_buffer[0],send_ret,recv_ret); 
	} 
 
 
	return 0; 
} 
 
static int  
test_detach(struct i2c_client *c) 
{ 
	//MOD_DEC_USE_COUNT; 
	return 0; 
} 
 
static int  
test_command(struct i2c_client *client, unsigned int cmd, void *arg) 
{ 
	return 0; 
} 
 
static int  
test_probe(struct i2c_adapter *adap) 
{ 
	this_adap = 0; 
	printk("probing~~~\n"); 
	if (adap->id == (I2C_ALGO_S3C2440 ){ 
		 
		printk("probing222~~~\n"); 
		return i2c_probe(adap, &addr_data, test_attach); 
	 
	} 
	return 0; 
} 
 
/* ----------------------------------------------------------------------- */ 
 
static struct i2c_driver  
i2c_driver_test =  
{ 
	"sab3036",		/* name       */ 
	I2C_DRIVERID_SAB3036,	/* ID         */ 
        I2C_DF_NOTIFY, 
	test_probe, 
	test_detach, 
	test_command 
}; 
 
static struct i2c_client client_template = 
{ 
        "TEST_IIC",		/* name       */ 
        -1, 
        0, 
        0, 
        NULL, 
        &i2c_driver_test 
}; 
 
EXPORT_NO_SYMBOLS; 
 
int __init 
test_iic_init(void) 
{ 
	i2c_add_driver(&i2c_driver_test); 
	return 0; 
} 
 
void __exit 
test_iic_exit(void) 
{ 
	i2c_del_driver(&i2c_driver_test); 
} 
 
MODULE_DESCRIPTION("SAB3036 test driver"); 
MODULE_AUTHOR("Philip Blundell "); 
MODULE_LICENSE("GPL"); 
 
MODULE_PARM(debug,"i"); 
MODULE_PARM_DESC(debug,"Enable debugging output"); 
 
module_init(test_iic_init); 
module_exit(test_iic_exit);