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つの小さなプログラムに分かれている.ソースコードは次のとおりです.
書き込みテストプログラム:
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はこのアドレスに書き込まれたデータである.
リードテストルーチン
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のデータを読み出すことを示す.
テストハードウェアプラットフォーム: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のデータを読み出すことを示す.