도와주세요!!
안녕하세요, 리눅스 초보자입니다.
S3C2440 보드에 외부 rtc(i2c 인터페이스, ds1307)을 배터리와 함께 달아놓았습니다.
문제는... 외부 RTC에 시간설정하는 방법을 모르겠습니다.
현재까지 되는것은 다음과 같습니다.
1. 시스템 초기시간은 RTC에서 읽어서 초기화됩니다.
커널 menuconfig에서 설정하였고, 정상동작하네요.
-> Devicd Drivers
-> Real Tiem Clock
[*] Set system time from RTC on startup
(rtc1) The RTC to read the time from
...
<*> DS1307 and similar I2C RTC chips.
...
부팅로그는...
s3c2440-i2c s3c2440-i2c: slave address 0x10
s3c2440-i2c s3c2440-i2c: bus frequency set to 378 KHz
ds1307 0-0068: rtc core: registered ds1307 as rtc1
s3c2440-i2c s3c2440-i2c: i2c-0: S3C I2C adapter
정상인듯 합니다.
2. 시간정보는 조회됩니다.
/sys/class/rtc/rtc1 인터페이스는 생성되어 있고,
$cat name
ds1307
$cat time
05:13:03
처럼, 시간정보도 제대로 가고... 시스템파워를 off -> on 해도 기존시간 잘 유지됩니다.
문제1. 응용프로그램에서 RTC1에서 시간 읽는방법은 ?
/dev/rtc1이 없어서 다음과 같이 만들었습니다.
$mknod /dev/rtc1 c 254 1 // <-- 맞는가요 ? rtc dev major 가 254라서...
응용프로그램에서 rtc1(ds1307)의 시간을 읽기위해 다음과 같이 간단한 테스트 프로그램을 짜서 돌려봤는데,
계속 에러가 납니다.
...
dev = open("/dev/rtc1", O_RDONLY); // <-- 정상.
....
ioctl(dev, RTC_RD_TIME, &t1); // <---- ERROR (-1)을 리턴함.
왜일까요 ?
(물론, /sys/..../rtc1 의 파일을 읽으면 되긴 하지만.... /dev/rtc1 에서 ioctl()로 못읽는게 이상해서요..)
감사합니다.
답변 감사합니다. 그런데 그 방법은 알겠습니다만, 질문과는 약간 다른내용이네요.
질문은 RTC시간을 시스템에 적용하는게 아니라, RTC 시간을 응용프로그램에서 읽고 쓰는 방법입니다.
인터넷에서 찾아보면 ioctl을 응용에서 호출할 수 있는것처럼 되어 있는데,
안되는 이유가.. 가령, /dev/rtc1을 잘못 등록했다던지
rtc1을 응용에서 접근하지는 못하고, 드라이버/시스템 레벨에서만 접근이 가능하다던지.. --;
응용프로그램에서 ioctl(dev, RTC_RD_TIME, &t1); 로 안되는 이유가 궁금하네요.
감사합니다.
프로그램으로 직접 설정하지 마시고 외부 유틸리티 함수를 사용하세요
저희가 제공하는 램디스크안에 hwclock 이라는 유틸리티가 있습니다.
아래는 사용방법입니다.
./hwclock --hctosys RTC 시간을 시스템시간에 적용
./hwclock --systohc 시스템 시간을 RTC 에 적용