Articles of i2c

I2C在Linux Kernel中写入确认轮询

这里平淡无奇的回答使我想到这一点 。 我已经背负了一个器件(Analog Devices 525x) (从数据手册第16页): 在内部[EEPROM]写周期内禁用I2C接口。 这看起来不公平,比如“ 现在我正在下沙发,所以不要用了一会儿,因为我在座垫上放了一个裂口 ”。 老实说,为什么这是我的问题呢? 无论如何,数据表build议确认轮询是答案 – 进入Linux内核… Linux GPIO位的bashed I2C驱动程序提供了一个机制来做到这一点? 主要发送一个地址与写入位设置,并继续这样做,直到出现一个ACK。 我使用2.6.14在一个ARM上,带有后端的GPIO位打包驱动(我认为从2.6.19开始)。

i2c驱动程序是否需要像其他字符设备驱动程序一样执行?

我是Linux设备驱动程序的noob,所以请耐心等待。 我试图实现一个i2c驱动程序(客户端)。 这是我可以insmod , .probe被调用(因为设备树条目),并在.probe我可以读/写设备。 大。 不过,我需要能够从用户空间启动读取/写入驱动程序。 为了做到这一点,一个i2c驱动程序应该像任何其他字符设备驱动程序的形状? 意思是有一个file_operations结构,所以用户空间可以open , close , read , write和ioctls ? 我在问,因为在我见过的所有i2c客户端例子中,没有人实现我提到的这些东西。 我想知道他们如何发起呼叫从用户空间没有file_operations结构设置。 也许这是如此明显,没有人提到它,我不知道…我想知道是不是因为i2c被称为平台设备驱动程序,它不需要这个? 如果有人可以证实,将帮助我第二次猜测自己。 如果你明白我在问什么,请忽略其余部分。 如果你对我的问题感到困惑,这里是我所问的更具体的解释: 我现在所拥有的: static int device_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct device *dev = &client->dev; struct device_data *data; /* Check the functionality of the i2c-adapter for smbus byte read/write */ if (!i2c_check_functionality(client->adapter, […]

使用Linux通过I2C读取和写入EEPROM

我试图通过I2C读取和写入具有Raspberry Pi B +的Atmel 24C256 EEPROM ,但是我无法正确完成所有工作。 这是我到目前为止的代码: #include <stdio.h> #include <stdlib.h> #include <linux/i2c-dev.h> #include <fcntl.h> #include <string.h> #include <sys/ioctl.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <errno.h> #include <linux/i2c.h> #define DEVICE_PATH "/dev/i2c-1" #define PAGE_SIZE 64 #define DEVICE_ADDR 0x50 // 0b1010xxxx int file_desc; char buffer[PAGE_SIZE + 2]; // 64 bytes + 2 for the address […]

I2C_SLAVE ioctl的用途

我正在编写代码来实现一个简单的i2c读/写function,使用一般的linux i2c驱动程序linux/i2c-dev.h 我对ioctl : I2C_SLAVE感到困惑 内核文档说明如下: 您可以使用read(2)和write(2)调用来执行简单的i2c事务。 你不需要传递地址字节; 而是在尝试访问设备之前通过ioctl I2C_SLAVE进行设置 但是,我正在使用ioctl I2C_RDWR ,我再次使用i2c_msg.addr设置从站地址。 内核文档还提到了以下内容: 一些ioctl()调用是用于pipe理任务的,由i2c-dev直接处理。 例子包括I2C_SLAVE 那么是否必须使用ioctl I2C_SLAVE ? 如果是这样,我只需要设置一次或每次执行读取和写入? 如果我有一个i2c设备,我可以刚刚在设备上testing代码,不会打扰你们,但不幸的是我现在没有一个。 谢谢您的帮助。

在Linux上使用I2C进行读写

我试图读取/写入通过地址为0b 1010 011的I2C总线连接的FM24CL64-GTR FRAM芯片。 当我试图写3个字节(数据地址2个字节,+数据一个字节)时,我得到一个内核消息( [12406.360000] i2c-adapter i2c-0: sendbytes: NAK bailout. ),以及写回车!= 3.请参阅下面的代码: #include <linux/i2c-dev.h> #include <fcntl.h> #include <unistd.h> #include <stdint.h> int file; char filename[20]; int addr = 0x53; // 0b1010011; /* The I2C address */ uint16_t dataAddr = 0x1234; uint8_t val = 0x5c; uint8_t buf[3]; sprintf(filename,"/dev/i2c-%d",0); if ((file = open(filename,O_RDWR)) < 0) exit(1); if […]

你怎么能使用文件描述符来刷新写入?

事实certificate,对open()和fopen()的误解源于ARM上的Linux 2.6.14内核中有错误的I2C驱动程序。 支持一个工作位的巴士司机解决了我想在这里解决的问题的根源。 我试图找出在Linux(I2C)串行设备驱动程序的问题。 看来,通过添加定时操作系统暂停(睡觉)之间的写入和读取设备的事情工作…(很多)更好。 除此之外,I2C的本质是主机读取或写入的每个字节都由线路另一端(从机)的设备确认 – 暂停的改进促使我将驱动程序视为asynchronous工作 – 这是我与巴士的工作方式无法协调。 Anyhoo … 我想要刷新写入以确保(而不是使用固定持续时间的暂停), 或以某种方式testing写入/读取事务已经以multithreading友好的方式完成。 使用fflush(fd);的麻烦fflush(fd); 是它需要'fd'是stream指针(而不是文件描述符),即 FILE * fd = fopen("filename","r+"); … // do read and writes fflush(fd); 我的问题是,我需要使用ioctl() ,它不使用stream指针。 即 int fd = open("filename",O_RDWR); ioctl(fd,…); build议?