24C02驱动/IIC驱动!
insmod 是没有问题!可是好像数据写不进去·
程序不知道那里出错了!请前辈指点!!
代码:
#include <linux/kernel.h>
#include <linux/config.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <asm-generic/errno-base.h>
#include <asm/arch-s3c2410/regs-gpio.h>
#include <asm/arch-s3c2410/regs-iic.h>
#include <asm/hardware.h>
#include <asm/io.h>
#define DEV_ID 107
#define DEV_NAME "2402_RW"
#define IICCON 0x54000000
#define IICSTAT 0x54000004
#define IICDS 0x5400000c
#define IICADD 0x54000008
#define IICLC 0x54000010
#define write_init 0x01
#define read_init 0x02
static void *S3C2402_IICSTAT;
static void *S3C2402_IICCON;
static void *S3C2402_IICDS;
static void *S3C2402_IICADD;
static void *S3C2402_IICLC;
static int open_2402(struct inode * inode, struct file * file)
{ int cmd;
S3C2402_IICCON=ioremap(IICCON,0x04);
S3C2402_IICSTAT=ioremap(IICSTAT,0x04);
S3C2402_IICDS=ioremap(IICDS,0x04);
S3C2402_IICADD=ioremap(IICADD,0x04);
S3C2402_IICLC=ioremap(IICLC,0X04)
cmd=((S3C2410_IICCON_ACKEN)|(S3C2410_IICCON_TXDIV_512)|(S3C2410_IICCON_IRQEN)|(0x0f));
writel(cmd,S3C2402_IICCON);
writel(0x10,S3C2402_IICADD); //2440 slave address = [7:1]
writel(0x10,S3C2402_IICSTAT); //IIC bus data output enable(Rx/Tx)
writel(S3C2410_IICLC_FILTER_ON,S3C2402_IICLC); // Filter enable,
return 0;
}
static int write_2402(struct file * file, const char __user * userbuf,size_t count, loff_t * off)
{ writel(0xa0,S3C2402_IICDS); /*从机地址*/
writel(0xf0,S3C2402_IICSTAT); /* ( 写) 开始传输信号*/
while(!(readl(S3C2402_IICCON)&S3C2410_IICCON_IRQPEND)); 从机地址发送?
writel(*userbuf,S3C2410_GPFDAT); /*开始发送数据*/
writel(*userbuf,S3C2402_IICDS);
writel((readl(S3C2402_IICCON)&(~S3C2410_IICCON_IRQPEND)),S3C2402_IICCON); /*清除发送标志位*/
while(!(readl(S3C2402_IICCON)&S3C2410_IICCON_IRQPEND)); /*等待发送完毕,查询*/
writel(0xd0,S3C2402_IICSTAT); /* ( 写) 停止传输信号*/
writel((readl(S3C2402_IICCON)&(~S3C2410_IICCON_IRQPEND)),S3C2402_IICCON); /*清除发送标志位*/
return count;
}
static int read_2402 (struct file * file, char __user * userbuf, size_t count, loff_t * off)
{ writel(0xa0,S3C2402_IICDS);
writel(0xf0,S3C2402_IICSTAT); /* ( 写) 开始传输信号*/
while(!(readl(S3C2402_IICCON)&S3C2410_IICCON_IRQPEND)); /*等待发送完毕,查询*/
*userbuf=readl(S3C2402_IICDS); /*读取数据*/
writel((readl(S3C2402_IICCON)&(~S3C2410_IICCON_IRQPEND)),S3C2402_IICCON); /*清除中断标志位*/
while(!(readl(S3C2402_IICCON)&S3C2410_IICCON_IRQPEND)); /*等待发送完毕,查询*/
writel(0xb0,S3C2402_IICSTAT); /* ( 读) 停止传输信号*/
writel((readl(S3C2402_IICCON)&(~S3C2410_IICCON_IRQPEND)),S3C2402_IICCON); /*清除中断标志位*/
return count;
}
static struct file_operations test_2402 ={
.open = open_2402,
.write = write_2402,
.read = read_2402,
};
static int __init init_2402(void)
{ int result;
result=register_chrdev(DEV_ID,DEV_NAME,&test_2402);
if (result<0)
{ printk ("the derive register is fail!!!\n"
return ENODEV;
}
else
{ printk ("the derive register is sucess!!!\n"
devfs_mk_cdev(MKDEV(DEV_ID,0),S_IFCHR | S_IRUSR | S_IWUSR,"2402_RW"
return result;
}
}
static void __exit exit_2402(void)
{ unregister_chrdev(DEV_ID,DEV_NAME);
devfs_remove(DEV_NAME);
printk ("the derive is unregister\n"
}
module_init(init_2402);
module_exit(exit_2402);
下面为DOME 程序!
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#define DEV_NAME "/dev/2402_RW"
int main()
{ int fd,ret,*P,i;
int data[5]={0x00,0x10,0x30,0x70,0xf0};
fd=open(DEV_NAME,O_RDWR);
if (fd<0)
{ printf ("the derive is opened fail !!\n"
return fd;
}
else
{ printf ("the derive is opened success !!\n"
for (P=data<(data+5)++)
{ write(fd,P,sizeof(P));
printf ("write-----data=%x\n",*P);
sleep(2);
}
for (P=data,i=0<(data+5)++,i++)
{ read(fd,P,sizeof(P));
data=*P;
printf ("read------data=%x\n",data);
sleep(2);
}
}
ret=close(fd);
printf ("the ret=%d\n",ret);
}
[ 本帖最后由 shuiyu123 于 2009-1-19 15:34 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
前辈们指点一下!
谢谢!!
自己
顶一个!
缩小一下范围:
1。 确认总线上有信号, 能否驱动CLK和DATA?
2。 确认信号正确
3。 确认slave存在,并正常工作。
我看了一下,一些ADS中的IIC程序,里面初始化了IO口!
我这个程序应该是没有初始化IO口吧!现在还在寻找当中,等找到了再贴上来!至于说的
1。 确认总线上有信号, 能否驱动CLK和DATA?
2。 确认信号正确
3。 确认slave存在,并正常工作。
这三个方面!确实没有去好好查查!!
谢谢!前辈提醒!!
你这里的IO口具体是指???
仔细看了一下,确实没有I2C相关的初始化。设备的reset, clk rate相关设置都没有。
设置GPE两个口线工作在SDA.SCL模式下!
程序是重新写的,没有用内核里面的那个驱动设备接口程序!
[ 本帖最后由 shuiyu123 于 2009-1-20 11:28 编辑 ]