简体   繁体   English

用于i2c设备的linux驱动程序 - 两个字节读取

[英]linux driver for an i2c device — two byte read

I'm trying to write a Linux driver for an I2C device that seems to be slightly different from a typical device. 我正在尝试为I2C设备编写一个Linux驱动程序,它似乎与典型设备略有不同。 Specifically, I need to read two bytes in a row without sending a stop bit in between, like so: 具体来说,我需要连续读取两个字节而不在其间发送停止位,如下所示:

[S] [Slave Addr | 0] [A] [Reg Addr 1] [A] [Sr] [Slave Addr | 1] [Data Byte 1] [NA]  
[Sr][Slave Addr | 0] [A] [Reg Addr 2] [A] [Sr] [Slave Addr | 1] [Data Byte 2] [NA] [P]

I've looked at a few ways of doing this, including i2c_transfer(), i2c_master_send() and i2c_master_recv(), but I'm not sure if they will support these. 我已经看了几种方法,包括i2c_transfer(),i2c_master_send()和i2c_master_recv(),但我不确定他们是否会支持这些。 Is there any way of doing this directly with these functions that isn't horribly painful? 有没有办法直接使用这些不是非常痛苦的功能? The documentation that I've found so far hasn't been entirely clear on the matter. 到目前为止,我发现的文件在这个问题上并不完全清楚。

EDIT#1: adding symbols key to make it readable. 编辑#1:添加符号键以使其可读。 Courtesy to http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/i2c/i2c-protocol 感谢http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=blob;f=Documentation/i2c/i2c-protocol

 Key to symbols
==============

S     (1 bit) : Start bit
P     (1 bit) : Stop bit
Rd/Wr (1 bit) : Read/Write bit. Rd equals 1, Wr equals 0.
A, NA (1 bit) : Accept and reverse accept bit. 
Addr  (7 bits): I2C 7 bit address. Note that this can be expanded as usual to 
                get a 10 bit I2C address.
Comm  (8 bits): Command byte, a data byte which often selects a register on
                the device.
Data  (8 bits): A plain data byte. Sometimes, I write DataLow, DataHigh
            for 16 bit data.
Count (8 bits): A data byte containing the length of a block operation.
[..]: Data sent by I2C device, as opposed to data sent by the host adapter.

no stop bit is send between bytes in the same read/write operation. 在相同的读/写操作中,在字节之间不发送停止位。 i2c_master_recv is probably what you need. i2c_master_recv可能就是你所需要的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM