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桁)の順にちゃんと読み取れた.