您尚未登录。

楼主 #1 2020-05-09 20:56:36

缥缈九哥
会员
注册时间: 2020-05-09
已发帖子: 93
积分: 96

测试基于linux-2.6.27的9G9260开发板I2C驱动--缥缈九哥

测试基于linux-2.6.27的9G9260开发板I2C驱动
 
1,找到drivers/i2c/busses/i2c-at91.c文件
root@yuanxh-desktop:/home/yuanxh/sam9260/linux-2.6.27-9g9260#  vi drivers/i2c/busses/Makefile
在第28行看到:

obj-$(CONFIG_I2C_AT91)  += i2c-at91.o

2, 找到drivers/i2c/busses/Kconfig文件
root@yuanxh-desktop:/home/yuanxh/sam9260/linux-2.6.27-9g9260#  vi drivers/i2c/busses/Kconfig
在第259行看到:

 config I2C_AT91
  tristate "Atmel AT91 I2C Two-Wire interface (TWI)"
  depends on ARCH_AT91 && EXPERIMENTAL && BROKEN
  help
    This supports the use of the I2C interface on Atmel AT91
    processors.
 
    This driver is BROKEN because the controller which it uses
    will easily trigger RX overrun and TX underrun errors.  Using
    low I2C clock rates may partially work around those issues
    on some systems.  Another serious problem is that there is no
    documented way to issue repeated START conditions, as needed
    to support combined I2C messages.  Use the i2c-gpio driver
    unless your system can cope with those limitations.
 

 
说明AT91 I2C标准驱动不稳定,需要用GPIO模拟!!!

3,编译配置内核
root@yuanxh-desktop:/home/yuanxh/sam9260/linux-2.6.27-9g9260#  make menuconfig
进入配置菜单添加驱动到内核:

 Device Drivers  --->   
 <*> I2C support  --->  
 <*>   I2C device interface
    
       I2C Hardware Bus support  --->  
   <*> GPIO-based bitbanging I2C

4, 编译内核生成驱动
root@yuanxh-desktop:/home/yuanxh/sam9260/linux-2.6.27-9g9260#  make

5, 查看内核启动信息
i2c /dev entries driver
i2c-gpio i2c-gpio: using pins 55 (SDA) and 56 (SCL)
6,查看内核系统信息
# cat /proc/devices
会看到
Character devices:
...
  89 i2c
...

# cat /sys/devices/platform/i2c-gpio/i2c-adapter\:i2c-0/name
i2c-gpio-1
7,建立设备结点
mknod /dev/i2c-0 c 89 0
8,编译测试代码
root@yuanxh-desktop:/home/yuanxh/sam9260/i2ctest-1.0-9g9260# arm-linux-gcc -o i2ctest i2ctest.c
root@yuanxh-desktop:/home/yuanxh/sam9260/i2ctest-1.0-9g9260# cp i2ctest /nfsboot/rootfs/app
9,运行测试代码
# /app/i2ctest
I2C Test version 1.0-9g9260 (yuanxihua@21cn.com) Buile on Jan  5 2009 00:54:45
buf[0x00] = 0x46
...

附件:

//i2ctest.c

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/i2c.h>
#include <linux/i2c-dev.h>

#define CHIP_ADDR 0x50   //24C64
#define PAGE_SIZE 32
#define I2C_DEV  "/dev/i2c-0"

static int read_eeprom(int fd,char buff[],int addr,int count)
{
 int res;

 if (write(fd,&addr,1)!=1)
 {
  printf("Can't write %s's addr %d\n",I2C_DEV,addr);
  return -1;
 }
 res = read(fd,buff,count);
 printf("read %d bytes at 0x%02x\n\r",res,addr);
 return res;
}
static int write_eeprom(int fd,char buff[],int addr,int count)
{
 int res;
 int i;
 static char sendbuffer[PAGE_SIZE+1];

 memcpy(sendbuffer+1,buff,count);
 sendbuffer[0]=addr;
 
 res = write(fd,&addr,count+1);
 printf("write %d bytes at 0x%02x\n\r",res,addr);
 return res;
}

int main(void)
{
 int fd,i,res;
 unsigned char buf[PAGE_SIZE];
 
 printf("I2C Test version 1.0-9g9260 (yuanxihua@21cn.com) Buile on %s %s\n\r",__DATE__,__TIME__);
 
 fd=open(I2C_DEV,O_RDWR);
 if(fd<0)
 {
  printf("Can't Open %s !!!\n\r",I2C_DEV);
  return -1;
 }
 
 res = ioctl(fd,I2C_TENBIT,0);
 res = ioctl(fd,I2C_SLAVE,CHIP_ADDR);
 
 for(i=0;i<sizeof(buf);i++)
 {
//  write_eeprom(fd,buf,i,1);
 } 
 for(i=0;i<sizeof(buf);i++)
 {
  read_eeprom (fd,buf+i,i,1);
  printf("buf[0x%02x] = 0x%02x\n\r",i,buf[i]);
 }

 close(fd);
 return 0;
}

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn