I2C read on NetBSD

投稿日:

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です