I 2 Cサブシステムのat 24 c 02読み書きテスト

4111 ワード

ioctlとat 24 c 02の紹介を結びつけて、at 24 c 02のテストプログラムを書きました
テストハードウェアプラットフォーム:TQ 2440、at 24 c 02
カーネルバージョン:linux-2.6.37.1
読み書きは単独で2つの小さなプログラムに分かれている.ソースコードは次のとおりです.
書き込みテストプログラム:
#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, char *argv[])
{
	int num, err, i, j;
	int fd, addr;
	char *buff;
	
	printf("please input as:");
	printf("./wat24 [data]
"); fflush(stdout); if(argc < 3){ printf("arg error
"); return -1; } num = argc - 1; buff = malloc(num*sizeof(char)); if(buff < 0){ printf("alloc failed
"); return -1; } buff[0] = atoi(argv[1]); printf("write data:
"); for(i = 1; i < num; i++){ buff[i] = atoi(argv[i + 1]); printf("%d
",buff[i]); } printf("from word addr:%d
",buff[0]); fd = open("/dev/i2c-0",O_RDWR); if(fd < 0){ printf("device open failed
"); return -1; } err = ioctl(fd, I2C_SLAVE_FORCE, 0x50); if(err < 0){ printf("ioctl failed:%d
",err); return -1; } write(fd, buff, num); close(fd); return 0; }
at 24 c 02の書き込み操作は、write()関数実装を直接呼び出すことができる.
byte writeまたはpage writeを直接行うことができます
page writeを行う場合は、ページの開始アドレスを計算する必要があります.
プログラムの使用方法は次のとおりです.
page write
./wat24 0 1 2 3 4 5 6 7 8
at 24 c 02におけるword addressが0のアドレスから1~8の書き込みを開始することを示す.
./wat24 1 1 2 3 4 5 6 7 8
at 24 c 02のword addressが1のアドレスから1~8データの書き込みを開始することを示すが、1はpage 0内のアドレスであり、アドレスはページ揃えではない.
だから最後にpage 0内のデータは8 1 2 3 4 5 6 7で、8はpage 0の最初のアドレスに書かれました.
byte write
./wat24 255 1
byte writeは比較的簡単です.255はat 24 c 02の1つのアドレスを表し、1はこのアドレスに書き込まれたデータである.
リードテストルーチン
#include 
#include 
#include 
#include 
#include 
#include 

struct i2c_rdwr_ioctl_data rdwrdata;

int main(int argc, char *argv[])
{
	int i, err;
	int fd;
	char wordaddr;
	char *rdbuf1;
	char *rdbuf2;
	int bytenum;
	
	if(argc < 3){
		printf("please input as:");
		printf("./rat24 [read byte addr] [read num of byte]
"); return -1; } wordaddr = atoi(argv[1]); bytenum = atoi(argv[2]); printf("%d
",bytenum); rdwrdata.msgs = (struct i2c_msg *)malloc(2*sizeof(struct i2c_msg)); if(!rdwrdata.msgs){ printf("rdwrdata.msgs malloc failed!
"); return -1; } rdbuf1 = (unsigned char *)malloc(sizeof(char)); rdbuf2 = (unsigned char *)malloc(bytenum*sizeof(char)); if((!rdbuf1) || (!rdbuf2)){ printf("rdbuf malloc failed!
"); return -1; } rdwrdata.nmsgs = 2; (rdwrdata.msgs[0]).addr = 0x50; (rdwrdata.msgs[0]).len = 1; (rdwrdata.msgs[0]).flags = 0; (rdwrdata.msgs[0]).buf = rdbuf1; (rdwrdata.msgs[0]).buf[0] = wordaddr; (rdwrdata.msgs[1]).addr = 0x50; (rdwrdata.msgs[1]).len = bytenum; (rdwrdata.msgs[1]).flags = I2C_M_RD; (rdwrdata.msgs[1]).buf = rdbuf2; fd = open("/dev/i2c-0",O_RDWR); if(fd < 0){ printf("i2c device open failed!
"); return -1; } err = ioctl(fd, I2C_SLAVE_FORCE, 0x50); if(err < 0){ printf("ioctl failed
"); return -1; } err = ioctl(fd, I2C_RDWR, &rdwrdata); if(err < 0){ printf("ioctl msgs error, error number:%d
", err); return -1; } printf("read %d byte data from at24c02 word address 0x%02x:
",bytenum, wordaddr); for(i = 0; i < bytenum; i++) printf("%d
", rdbuf2[i]); close(fd); return 0; }
at 24 c 02のreadは全部で3種類あります
1.current read
2.sequential read
3.random read
そのうち1と2はreadシステム呼び出しによって直接実現できる
3.はioctl(,I 2 C_RDWR,)で実現する必要がある.
上記のプログラムはこの機能を実現し、at 24 c 02のrandom readを実現することができる.
random read
./rat24 0 256
at 24 c 02のword addressが0のアドレスから256バイトのデータを読み出すことを示す
./rat24 0 8
at 24 c 02のword addressが0のアドレスから8バイトのデータを読み出す、すなわちpage 0のデータを読み出すことを示す.