結論として、読込方/書込方を変えることによりアクセスが可能になりました。
最初、WEB検索で良く見つかる、以下のコードを使用していました。
static int Ioctl(int fd, int request, void * arg)
{
int ret;
ret = ioctl(fd, request, arg);
if ( ret == -1 ) printf("ioctl");
return ret;
}
static void read_rtc(int fd , struct rtc_time * rtc_tm)
{
/* 現在の RTC 時刻を読み出して rtc_tm にセットする。 */
Ioctl( fd, RTC_RD_TIME, rtc_tm );
/* 現在の RTC 時刻を表示する。 */
printf("RTC Now time: %d / %d / %d - %02d : %02d : %02d \n",
rtc_tm->tm_year + 1900, rtc_tm->tm_mon + 1, rtc_tm->tm_mday,
rtc_tm->tm_hour, rtc_tm->tm_min, rtc_tm->tm_sec
);
}
void write_rtc(int year,int month,int day,int hour,int min,int sec)
{
struct rtc_time rtc_tm;
int m_fd;
rtc_tm.tm_year = year - 1900;
rtc_tm.tm_mon = month - 1;
rtc_tm.tm_mday = day;
rtc_tm.tm_hour = hour;
rtc_tm.tm_min = min;
rtc_tm.tm_sec = sec;
m_fd = open( RTC_DEVICE_FILE , O_RDWR ); /* device file open */
if (m_fd < 0){ printf("rtc open error !\n"); return; }
if (ioctl(m_fd, RTC_SET_TIME, &rtc_tm) < 0) printf("rtc set error !\n");
close(m_fd);
}
上記を、以下の様に変更すると、アクセス可能でした。
なぜ、アクセス可能になるかは、良く分かりませんでした。
ioctrl()の使い方なのかもしれません。
int readI2cReg(int regNo, unsigned char *pValue) {
struct {
unsigned char number;
unsigned char value;
} reg;
int fd, retval;
if ((fd = open("/dev/rtc1", O_RDWR)) < 0) {return -1;}
reg.number = regNo;
retval = ioctl(fd, _IOWR('p', 0x20, reg), ®);
close(fd);
if (retval == -1) {return -1;}
*pValue = reg.value;
return 0;
}
int writeI2cReg(int regNo, unsigned char value) {
struct {
unsigned char number;
unsigned char value;
} reg;
int fd, retval;
if ((fd = open("/dev/rtc1", O_RDWR)) < 0) {return -1;}
reg.number = regNo;
reg.value = value;
retval = ioctl(fd, _IOW('p', 0x21, reg), ®);
close(fd);
if (retval == -1) {return -1;}
return 0;
}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/28 02:37