linux 测试i2c,测试基于linux-2.6.27的9G9260开发板I2C驱动

1,找到drivers/i2c/busses/i2c-at91.c文件本文引用地址:http://www.eepw.com.cn/article/148411.htm

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

#include

#include

#include

#include

#include

#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 %dn,I2C_DEV,addr);

return -1;

}

res = read(fd,buff,count);

printf(read %d bytes at 0x%02xnr,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%02xnr,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 %snr,__DATE__,__TIME__);

fd=open(I2C_DEV,O_RDWR);

if(fd0)

{

printf(Can't Open %s !!!nr,I2C_DEV);

return -1;

}

res = ioctl(fd,I2C_TENBIT,0);

res = ioctl(fd,I2C_SLAVE,CHIP_ADDR);

for(i=0;i

{

// write_eeprom(fd,buf,i,1);

}

for(i=0;i

{

read_eeprom (fd,buf+i,i,1);

printf(buf[0x%02x] = 0x%02xnr,i,buf[i]);

}

close(fd);

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值