도와주세요!!
글 수 15,339
2006.06.21 21:10:17 (*.232.132.11)
8494
푸지님께서 제공해 주신 rtc 함수 소스 사용하였습니다.
zImage.x5를 커널로 사용할때는 이상없이 동작을 하는것 같습니다.
시간 설정도 되구요...
근데 실제로 ds1307이 사용가능한 zImage.x5.pi를 커널로 올리고 시간 설정을 하면
보드가 다음과 같은 에러메시지를 내면서 죽네요
---- 에러 메시지 ----
QWidget(ImageView): deleted while being painted
QPaintDevice; Cannot destroy paint device that is being paintedpc : [<00000000>]
lr : [00045bf4>] Not tainted
그리고 레지스터 목록이 나오고(생략)
마지막에
Flags: nzCv IRQs on FIQs on Mode USER_32 Segment user
control: 397F Table A0C30000 DAC: 00000015
Segmentation fault
라는 에러 메시지나 나타나면서 명령프롬프트로 나가버립니다.
--> 참고로 QT 2.3.7버전으로 프로그램을 짜고 있습니다.
사용한 rtc 함수는 아래와 같습니다.
물론 아래의 함수를 사용하지 않으면 어플리케이션은 이상없이 동작합니다.
void ImageView::check_rtc_devicefile( void )
{
if( access( "/dev/rtc" , F_OK ) == 0 ) return;
mknod( "/dev/rtc" , S_IRWXU|S_IRWXG|S_IFCHR,(10<<8|(135)));
}
void ImageView::rtc2systemtime( void )
{
int rtc;
struct rtc_time rtc_time_data;
struct tm tm_src;
struct timeval tv = { 0, 0 };
check_rtc_devicefile();
rtc = open ( "/dev/rtc", O_RDONLY );
if( rtc < 0 )
{
perror( "/dev/rtc open error" );
return;
}
if ( ioctl ( rtc, RTC_RD_TIME, &rtc_time_data ) < 0 )
{
perror( "/dev/rtc rtc read time error" );
close( rtc );
return;
}
tm_src.tm_year = rtc_time_data.tm_year;
tm_src.tm_mon = rtc_time_data.tm_mon;
tm_src.tm_mday = rtc_time_data.tm_mday;
tm_src.tm_hour = rtc_time_data.tm_hour;
tm_src.tm_min = rtc_time_data.tm_min;
tm_src.tm_sec = rtc_time_data.tm_sec;
tv.tv_sec = mktime( &tm_src );
settimeofday ( &tv, NULL );
close( rtc );
}
int ImageView::set_systemtime( int year, int mon, int day, int hour, int min, int sec )
{
int rtc;
struct rtc_time rtc_time_data;
struct tm tm_src;
struct timeval tv = { 0, 0 };
tm_src.tm_year = rtc_time_data.tm_year = year - 1900;
tm_src.tm_mon = rtc_time_data.tm_mon = mon - 1;
tm_src.tm_mday = rtc_time_data.tm_mday = day;
tm_src.tm_hour = rtc_time_data.tm_hour = hour;
tm_src.tm_min = rtc_time_data.tm_min = min;
tm_src.tm_sec = rtc_time_data.tm_sec = sec;
tv.tv_sec = mktime( &tm_src );
settimeofday ( &tv, NULL );
check_rtc_devicefile();
rtc = open ( "/dev/rtc", O_WRONLY );
if( rtc < 0 )
{
perror( "/dev/rtc open error" );
return -1;
}
if ( ioctl ( rtc, RTC_SET_TIME, &rtc_time_data ) < 0 )
{
perror( "/dev/rtc rtc write time error" );
close( rtc );
return -1;
}
close( rtc );
return 0;
}
zImage.x5를 커널로 사용할때는 이상없이 동작을 하는것 같습니다.
시간 설정도 되구요...
근데 실제로 ds1307이 사용가능한 zImage.x5.pi를 커널로 올리고 시간 설정을 하면
보드가 다음과 같은 에러메시지를 내면서 죽네요
---- 에러 메시지 ----
QWidget(ImageView): deleted while being painted
QPaintDevice; Cannot destroy paint device that is being paintedpc : [<00000000>]
lr : [00045bf4>] Not tainted
그리고 레지스터 목록이 나오고(생략)
마지막에
Flags: nzCv IRQs on FIQs on Mode USER_32 Segment user
control: 397F Table A0C30000 DAC: 00000015
Segmentation fault
라는 에러 메시지나 나타나면서 명령프롬프트로 나가버립니다.
--> 참고로 QT 2.3.7버전으로 프로그램을 짜고 있습니다.
사용한 rtc 함수는 아래와 같습니다.
물론 아래의 함수를 사용하지 않으면 어플리케이션은 이상없이 동작합니다.
void ImageView::check_rtc_devicefile( void )
{
if( access( "/dev/rtc" , F_OK ) == 0 ) return;
mknod( "/dev/rtc" , S_IRWXU|S_IRWXG|S_IFCHR,(10<<8|(135)));
}
void ImageView::rtc2systemtime( void )
{
int rtc;
struct rtc_time rtc_time_data;
struct tm tm_src;
struct timeval tv = { 0, 0 };
check_rtc_devicefile();
rtc = open ( "/dev/rtc", O_RDONLY );
if( rtc < 0 )
{
perror( "/dev/rtc open error" );
return;
}
if ( ioctl ( rtc, RTC_RD_TIME, &rtc_time_data ) < 0 )
{
perror( "/dev/rtc rtc read time error" );
close( rtc );
return;
}
tm_src.tm_year = rtc_time_data.tm_year;
tm_src.tm_mon = rtc_time_data.tm_mon;
tm_src.tm_mday = rtc_time_data.tm_mday;
tm_src.tm_hour = rtc_time_data.tm_hour;
tm_src.tm_min = rtc_time_data.tm_min;
tm_src.tm_sec = rtc_time_data.tm_sec;
tv.tv_sec = mktime( &tm_src );
settimeofday ( &tv, NULL );
close( rtc );
}
int ImageView::set_systemtime( int year, int mon, int day, int hour, int min, int sec )
{
int rtc;
struct rtc_time rtc_time_data;
struct tm tm_src;
struct timeval tv = { 0, 0 };
tm_src.tm_year = rtc_time_data.tm_year = year - 1900;
tm_src.tm_mon = rtc_time_data.tm_mon = mon - 1;
tm_src.tm_mday = rtc_time_data.tm_mday = day;
tm_src.tm_hour = rtc_time_data.tm_hour = hour;
tm_src.tm_min = rtc_time_data.tm_min = min;
tm_src.tm_sec = rtc_time_data.tm_sec = sec;
tv.tv_sec = mktime( &tm_src );
settimeofday ( &tv, NULL );
check_rtc_devicefile();
rtc = open ( "/dev/rtc", O_WRONLY );
if( rtc < 0 )
{
perror( "/dev/rtc open error" );
return -1;
}
if ( ioctl ( rtc, RTC_SET_TIME, &rtc_time_data ) < 0 )
{
perror( "/dev/rtc rtc write time error" );
close( rtc );
return -1;
}
close( rtc );
return 0;
}