Raspberry Pi に NetBSDを入れて I2C でデータを読み出せるようにしてみた.
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <dev/i2c/i2c_io.h>
int main(int argc, char *argv[])
{
int i, r;
int iicfd = -1;
i2c_ioctl_exec_t iie;
char *fdev;
int len;
int addr;
int cmd;
char cmd_a[1];
char buf[256];
if (argc < 5) {
fprintf(stderr, "usage: %s <dev> <addr> <cmd/reg> <read len>\n\n", argv[0]);
return 1;
}
fdev = argv[1];
sscanf(argv[2], "%i", &addr);
sscanf(argv[3], "%i", &cmd);
cmd_a[0] = (char) (cmd & 0x0FF);
len = atoi(argv[4]);
if (len > 256) {
len = 256;
}
else if (len < 1) {
len = 1;
}
/*
printf("dev %s\n", fdev);
printf("addr 0x%02x\n", addr);
printf("cmd 0x%02x\n", cmd);
printf("len %d\n", len);
*/
iie.iie_op = I2C_OP_READ_WITH_STOP;
iie.iie_addr = (char) ( 0x0FF & addr );
iie.iie_cmd = cmd_a;
iie.iie_cmdlen = 1;
iie.iie_buf = buf;
iie.iie_buflen = len;
iicfd = open(fdev, O_RDWR);
if (iicfd == -1) {
fprintf(stderr, "I2C open failed: %s\n\n", fdev);
return -1;
}
r = ioctl(iicfd, I2C_IOCTL_EXEC, &iie);
if (r == -1) {
fprintf(stderr, "I2C_IOCTL_EXEC failed\n\n");
return -1;
}
for(i = 0; i < len; i++) {
printf("%02X\n", buf[i]);
}
return 0;
}
コンパイルは特にオプション不要.root権限が必要なので,setuidビットを立てる.
rpi$ cc i2c_read.c -o i2c_read rpi$ su rpi# chmod 4755 i2c_read rpi# exit rpi$ ./i2c_read /dev/iic1 0x68 0x00 7 47 36 14 06 12 86 15
ちなみにこのデバイスはRTC(DS3231).レジスタアドレス 00h ~ 06h (0x00から7バイト分) を読み取った結果.47秒,36分,14時,金曜日(6),12日,6月(MSBは世紀),15年(西暦下2桁)の順にちゃんと読み取れた.