免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3946 | 回复: 6
打印 上一主题 下一主题

24C02驱动/IIC驱动! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-19 15:25 |只看该作者 |倒序浏览
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 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-01-19 15:46 |只看该作者
前辈们指点一下!
谢谢!!

论坛徽章:
0
3 [报告]
发表于 2009-01-19 15:49 |只看该作者
自己


顶一个!

论坛徽章:
5
4 [报告]
发表于 2009-01-19 18:00 |只看该作者
缩小一下范围:
1。 确认总线上有信号, 能否驱动CLK和DATA?
2。 确认信号正确
3。 确认slave存在,并正常工作。

论坛徽章:
0
5 [报告]
发表于 2009-01-20 08:42 |只看该作者

回复 #4 yidou 的帖子

我看了一下,一些ADS中的IIC程序,里面初始化了IO口!
我这个程序应该是没有初始化IO口吧!现在还在寻找当中,等找到了再贴上来!至于说的
1。 确认总线上有信号, 能否驱动CLK和DATA?
2。 确认信号正确
3。 确认slave存在,并正常工作。
这三个方面!确实没有去好好查查!!
谢谢!前辈提醒!!

论坛徽章:
5
6 [报告]
发表于 2009-01-20 09:03 |只看该作者
原帖由 shuiyu123 于 2009/1/20 08:42 发表
我看了一下,一些ADS中的IIC程序,里面初始化了IO口!


你这里的IO口具体是指???

仔细看了一下,确实没有I2C相关的初始化。设备的reset, clk rate相关设置都没有。

论坛徽章:
0
7 [报告]
发表于 2009-01-20 11:27 |只看该作者

回复 #6 yidou 的帖子

设置GPE两个口线工作在SDA.SCL模式下!
程序是重新写的,没有用内核里面的那个驱动设备接口程序!

[ 本帖最后由 shuiyu123 于 2009-1-20 11:28 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP