//---------------IIC的linux驱动------------------ #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/sched.h> #include <asm/hardware.h>
#include <asm/semaphore.h>
#include <asm/uaccess.h>
#include <linux/kernel.h>
#include <linux/slab.h> #include <linux/fs.h> #include <linux/errno.h> #include <linux/types.h> #include <linux/mm.h> #include <linux/kdev_t.h> #include <linux/cdev.h> #include <linux/delay.h> //#include <linux/device.h> #include <asm/io.h> #include <asm/uaccess.h> #include <linux/errno.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/slab.h> #include <linux/input.h> #include <linux/init.h> #include <linux/serio.h> #include <asm/irq.h> //#include <asm/arch/regs-adc.h> #include <asm/arch/map.h> #include <asm/arch/regs-gpio.h> #include <asm/arch/regs-irq.h> #include <asm/arch/regs-clock.h> //#include <asm/arch/regs-iic.h> volatile int f_nGetACK; #define UINT unsigned int #define I2C_MAGIC 'k' #define I2C_set _IO(I2C_MAGIC,1) #define I2C_MAJOR 259 #define DEVICE_NAME "s3c2410_I2C" MODULE_LICENSE("GPL"); MODULE_AUTHOR("caogos"); MODULE_DESCRIPTION("s3c2410 I2C"); char data[128]="\0"; #define rGPECON *(volatile unsigned int *)S3C2410_GPECON #if 0 #define S3C2410_I2C(x) (S3C2410_IICREG(x)) #define S3C2410_IICCON S3C2410_I2C(0x00) #define S3C2410_IICSTAT S3C2410_I2C(0x04) #define S3C2410_IICADD S3C2410_I2C(0x08) #define S3C2410_IICDS S3C2410_I2C(0x0c) #define rIICCON *(volatile unsigned int *)S3C2410_IICCON #define rIICSTAT *(volatile unsigned int *)S3C2410_IICSTAT #define rIICADD *(volatile unsigned int *)S3C2410_IICADD #define rIICDS *(volatile unsigned int *)S3C2410_IICDS #define rGPECON *(volatile unsigned int *)S3C2410_GPECON #else #define rIICCON *(volatile unsigned int *)i2c_base #define rIICSTAT *(volatile unsigned int *)((unsigned int)i2c_base + 4) #define rIICADD *(volatile unsigned int *)((unsigned int)i2c_base + 8) #define rIICDS *(volatile unsigned int *)((unsigned int)i2c_base + 0xc) static volatile void __iomem *i2c_base; static struct resource *area = NULL; #endif #define CLKCON 0x4c00000c static volatile unsigned int *clkcon; static int I2C_major = I2C_MAJOR; static struct cdev I2C_cdev; // IIC interrupt handler static irqreturn_t iic_int_24c04(int irq,void *dev_id,struct pt_regs *regs) { //ClearPending(BIT_IIC); f_nGetACK = 1; return IRQ_HANDLED ; } // write data to 24C040 void iic_write_24c040(UINT unSlaveAddr,UINT unAddr,UINT ucData) { f_nGetACK = 0; // Send control byte rIICDS = unSlaveAddr; // 0xa0 slave设备地址,由硬件的原理图决定 rIICSTAT = 0xf0; // Master Tx,Start while(f_nGetACK == 0);// Wait ACK //这个标志在邋錓IC中断处理函数中被修改 f_nGetACK = 0; //Send address rIICDS = unAddr; //数据在slave设备的存放地址 rIICCON = 0xaf; // Resumes IIC operation. while(f_nGetACK == 0);// Wait ACK f_nGetACK = 0; rIICDS = ucData; // 向slave设备写的数据 rIICCON = 0xaf; ?/ Resumes IIC operation. // printk("4444444\n"); while(f_nGetACK == 0);// Wait ACK f_nGetACK = 0; // End send rIICSTAT = 0xd0; // Stop Master Tx condition rIICCON = 0xaf; // Resumes IIC operation. // Wait until stop condtion is in effect. mdelay(10); // 这个延时时间查slave设备的资料,