한번에 한놈만 open?

Personal Computer/debug, iom_v2 2005. 6. 14. 08:41 posted by tolkien
drivers/char/sa1100-rtc.c에서 open()쪽을 보면...

if (test_and_set_bit (1, &rtc_status))
return -EBUSY;
rtc_irq_data = 0;

짜잔~ 다른 놈이 open하고 있으면 다시는 안 열린다.
RTC 동작방식을 생각하면 일견 이해가 되지만, 문제는 debugging...
sleep/wakeup에 문제가 있어 debugging하려니 영~불편하군.

임시로 return -EBUSY를 skip하게 만들어서 kernel을 올려서 test하다가 자주 이런 일이 발생할 것같기도 해서...
내친김에 run-time debugging feature를 만들어버렸다.

static __inline__ int mz_debug_on_p(void) {
return (mz_ops.stat & MZ_DEBUG_ON);
}

echo 1 > /proc/sys/debug/enable 이면 debugging-on
0이면 off하게...
가볍게 생각하고 다음과 같이 code를 고치고 룰루랄라했는데...

if (test_and_set_bit (1, &rtc_status))
+#ifdef CONFIG_MIZI
+ if (!mz_debug_on_p())
+#endif
return -EBUSY;
rtc_irq_data = 0;

이런... 한번 debugging feature를 on 시켜서 강제로 열면 계속 열리는 것이 아닌가!!! 헐헐헐... 가볍게 끝날 것같던 code가 결국 5시간이나 debugging을 해야했다. (중간에 점심시간을 생각해도 T.T)

close()쪽에서 rtc_status를 clear하는 것을 미쳐 생각 못한 것.
더하기 변수 하나 (open된 횟수 세는 놈) 추가하기 싫어서 rtc_status의 상위 16bit가지고 끄적거린다고 버린 시간이 5시간 된 것이다. --;;;

결국 변수하나 추가하고 (처음부터 그럴 것이지...) 해결봤다.

open()...
#ifdef CONFIG_MIZI
if (mz_debug_on_p()) {
rtc_open_cnt++;
if (!test_and_set_bit (1, &rtc_status))
rtc_irq_data = 0;
return 0;
}
#endif
if (test_and_set_bit (1, &rtc_status))
return -EBUSY;
#ifdef CONFIG_MIZI
rtc_open_cnt++;
#endif
rtc_irq_data = 0;
return 0;

close()...
#ifdef CONFIG_MIZI
rtc_open_cnt--;
if (mz_debug_on_p()) {
if (rtc_open_cnt > 0)
return 0;
}
#endif
spin_lock_irq (&rtc_lock);
RTSR = 0;
blah... blah...

PM_STATE_UNKNOWN!!!

Personal Computer/Linux 2005. 6. 14. 08:40 posted by tolkien
drivers/char/serial.c에서 pm관련 code...

pm_rs_callback(...) {
int i = 0;

while (i < NR_PORTS) {
struct async_struct * info = rs_table[i].info;
if (req == PM_LAST_SLEEP_CHECK && info ) {
blah... blah...
} else if (req == PM_FIRST_WAKEUP_CHECK && info) {
blah... blah...
} else
return ENOENT;
i++;
}
return 0;
}

이렇게 하니까, 나중에 wakeup한 다음에 pm->state가 PM_FIRST_WAKEUP_CHECK가 아닌
PM_STATE_UNKNOWN으로 나온다. ???
이해를 못함. 그래서 이렇게 바꾸어봤다.

pm_rs_callback(...) {
int i;

if (req == PM_LAST_SLEEP_CHECK) {
for(i=0; i < NR_PORTS; i++) {
struct async_struct * info = rs_table[i].info;
if (info) {
blah... blah...
}
}
} else if (req == PM_FIRST_WAKEUP_CHECK) {
for(i=0; i < NR_PORTS; i++) {
struct async_struct * info = rs_table[i].info;
if (info) {
blah... blah...
}
}
} else {
return ENOENT;
}
return 0;
}

그랬더니 pm->state가 변한다. PM_FIRST_WAKEUP_CHECK로 기억... (아니면 PM_HID_RESUME이었던가... 이런 확인해봐야겠네.)

그 이유가 뭔지 확인해야하겠지?

mz_test구현시 의존성...

Personal Computer/misc 2005. 6. 9. 19:28 posted by tolkien
keyboard.c는 kernel builtin.
keyboard.c는 mz_test.c에 의존성을 지니고 있으니까 mz_test.c도 kernel builtin?
그렇다면 또 다른 의존성을 지니고 있는 wm9705_ts.c도 kernel builtin? @.@
으아~ 우짜지. T.T

-> wm9705_ts.c를 mz_touchpanel.c와 wm9705_ts.c로 분리하고, touch device driver interface를 가진 mz_touchpanel.c를 builtin하는 것으로 처리했습니다. 문제는... 아직도 test를 못했다는 거. T.T