'Personal Computer/Linux'에 해당되는 글 37건

  1. 2007.12.11 sys_reboot()
  2. 2007.08.22 console loglevel
  3. 2007.08.06 pxa27x에서 RTC와 system time과 관계. 4
  4. 2007.03.22 kernel 개발자의 변명 1
  5. 2006.11.02 kernel에 대한 열정. 1
  6. 2005.10.28 xscale의 QCI
  7. 2005.10.18 camera working...
  8. 2005.10.08 mmc driver
  9. 2005.10.06 현재 camera 상태
  10. 2005.09.30 camera, camera, ... 2

sys_reboot()

Personal Computer/Linux 2007. 12. 11. 20:40 posted by tolkien
수행하고 있는 project에서 가끔 reboot이 되지 않는 문제가 발생해서
reboot() system call을 추적해봤다.
kernel/sys.c:sys_reboot()
	switch (cmd) {
	case LINUX_REBOOT_CMD_RESTART:
		kernel_restart(NULL);
		break;

kernel/sys.c:kernel_restart()
	kernel_restart_prepare(cmd);
	if (!cmd)
		printk(KERN_EMERG "Restarting system.\n");
	else
		printk(KERN_EMERG "Restarting system with command '%s'.\n", cmd);
	machine_restart(cmd);

arch/arm/kernel/process.c:machine_restart()
	arm_pm_restart(reboot_mode);

arch/arm/kernel/process.c:
void (*arm_pm_restart)(char str) = arm_machine_restart;

arch/arm/kernel/process.c:arm_machine_restart()
	...
	/*
	 * Now call the architecture specific reboot code.
	 */
	arch_reset(mode);

	/*
	 * Whoops - the architecture was unable to reboot.
	 * Tell the user!
	 */
	mdelay(1000);
	printk("Reboot failed -- System halted\n");
	while (1);

console loglevel

Personal Computer/Linux 2007. 8. 22. 20:16 posted by tolkien
kernel내 pr_debug()라는 함수가 있다.
include/linux/kernel.h에 다음과 같이 정의되어 있는 함수이다.
#define pr_debug(fmt,arg...) \
	printk(KERN_DEBUG fmt,##arg)
kernel 몇몇 code의 debug print문은 저걸로 되어 있는 것을 볼 수 있는데,
저 msg를 보려면 해당 source 상단에 #define DEBUG 로 해주는 것만으로는
안된다. console에서
echo "8" > /proc/sys/kernel/printk
와 같이 해주어야 하는데, 이건 booting이 끝난다음에나 가능한 방법이다.

결국 kernel/printk.c를 손대야 한다.
어느 건 손대야 하는지 알고자 한다면
위 echo 8 ... 하는 것부터 쫓아가는 것이 무난.
kernel/sysctl.c:root_table[]
	{
		.ctl_name	= KERN_PRINTK,
		.procname	= "printk",
		.data		= &console_loglevel,
		.maxlen		= 4*sizeof(int),
		.mode		= 0644,
		.proc_handler	= &proc_dointvec,
	},
proc_dointvec()이므로 단순한 integer 변수 값만 바꾸는 것외 나머지는 다른 곳에서 처리한다는 것.
console_loglevel은 include/linux/kernel.h 안에 정의되어 있다.
extern int console_printk[];

#define console_loglevel (console_printk[0])
console_printk[]는 kernel/printk.c에 다음과 같이 정의되어 있습니다.
/* printk's without a loglevel use this.. */
#define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */

/* We show everything that is MORE important than this.. */
#define MINIMUM_CONSOLE_LOGLEVEL 1 /* Minimum loglevel we let people use */
#define DEFAULT_CONSOLE_LOGLEVEL 7 /* anything MORE serious than KERN_DEBUG */

int console_printk[4] = {
	DEFAULT_CONSOLE_LOGLEVEL,	/* console_loglevel */
	DEFAULT_MESSAGE_LOGLEVEL,	/* default_message_loglevel */
	MINIMUM_CONSOLE_LOGLEVEL,	/* minimum_console_loglevel */
	DEFAULT_CONSOLE_LOGLEVEL,	/* default_console_loglevel */
};

따라서, console_print[0] = 8로 바꾸어주면 debug msg가 주루룩.
linux kernel은 CPU에 rtc 설비가 없어도 쓸 수 있다.

pxa27x에서 내장 RealTimeClock(이하 rtc)가 있다.
따라서, kernel은 pxa-rtc를 가지고, system time을 표시하지 않는다.
(즉, date로 시간을 설정하면 바로 rtc 설비에 시간을 update하는 것이 아니다.)
거꾸로 system time을 주기적으로 pxa-rtc에 update한다.

이에 대한 kernel 함수 추적.
include/linux/time.h 에서 xtime. -> 이것이 system time.

/* pxa27x에서 OS timer 0가 schedule timer */
arch/arm/mach-pxa27x/time.c:__pxa_timer_interrupt()
	do {
		timer_tick();
		OSSR = OSSR_M0;  /* Clear match on timer 0 */
		next_match = (OSMR0 += LATCH);
	} while( (signed long)(next_match - OSCR) <= 8 );

arch/arm/kernel/time.c:timer_tick()
	do_set_rtc();
	do_timer(1);	-> system time update
			scheduling 계산할 것으로 추정.

arch/arm/kernel/time.c:do_set_rtc()
	if (set_rtc())
		...

arch/arm/kernel/time.c
	/*
	 * hook for setting the RTC's idea of the current time.
	 */
	int (*set_rtc)(void);

arch/arm/mach-pxa27x/time.c:pxa_timer_init()
	set_rtc = pxa_set_rtc;

arch/arm/mach-pxa27x/time.c:pxa_set_rtc()
	unsigned long current_time = xtime.tv_sec;

	if (RTSR & RTSR_ALE) {
		/* make sure not to forward the clock over an alarm */
		unsigned long alarm = RTAR;
		if (current_time >= alarm && alarm >= RCNR)
			return -ERESTARTSYS;
	}
	RCNR = current_time;
	return 0;

따라서, sleep/wakeup시 backup RTC 값을 읽어서
	//tv.tv_sec = pxa_get_rtc_time();
	do_settimeofday(&tv);
하면 됨.

kernel 개발자의 변명

Personal Computer/Linux 2007. 3. 22. 17:18 posted by tolkien
배포판 중심 메세지 번역의 폐해 - 커뮤니케이션 부재 - 류창우님의 글

보다가 뜨끔한 내용을 인용해보자.
FOSDEM 2007의 비디오 중에서 리눅스 커널에 관한 세션을 보면 이런 얘기가 있다 -- "임베디드 분야의 리눅스 커널의 발전이 더딘 이유는 피드백이 없기 때문인데, 칩 메이커를 제외하고 완제품을 만드는 제조업체들은 제품의 개발기간도 짧은 데다가 스펙이 한정되어 있고 소프트웨어 업데이트도 거의 없기 때문에 피드백의 현실적인 필요가 적다".

1. 소프트웨어 업데이트.가 없는 이유는 길게 쓰지 않기 때문에.
1년후 새로운 제품이 나온다. 전혀 다른 s/w를 사용해서. H/W 조금 바꾸고, S/W 업데이트가 되면 좋은데, 그런 표준 H/W platform은 없다.

2. embedded 분야에서 kernel은 최신 것을 잘 쓰지 않는다.
patch를 올려도 반영이 될 가능성이 없어서 지레짐작 포기하는 경우가 있다. 또, 그런 개선 결과를 자사 제품에만 담으려고 하는 경향이 있다. source는 공개해도 메인스트림에 반영이 되지 않으므로, 해당 S/W가 많이 쓰이기 전까지는 잘 모르게 됩니다.

3. 제 탓입니다.
반영이 되던 말던 제출하려는 노력이 부실합니다.

kernel에 대한 열정.

Personal Computer/Linux 2006. 11. 2. 09:20 posted by tolkien
Apple의 스티브 잡스 스탠포드 졸업식 연설문... - 진우의 블로그에서

5년전 내가 미지에 입사할 때, kernel을 다룰 수 있는 행운에 기뻐하고 있었다. 안정되어 보이던 직장을 그만 둔 이유는 "따분함"이었고, 불확실한 직장에 오게 한 이유는 "재미, 흥분"이었다.
미지에서 최초 2년간 이런 저런 시행착오를 거치면서 내 자신이 단련이 되었고, 그후 1년동안 나, 그리고 우리 회사는 최초로 "제품"을 만들었다. 시장에서 많이 환영을 받은 제품은 아니지만 나, 내게는 많은 의미가 있는 제품이다.
그후 지금까지 2년간 난 혼돈이었던 같다. 하던 일이니까 하고, 시키니까 하고... 그러다가 같이 일했던 사람들이 하나 둘씩 떠나면서 내가 원하지 않은 직책을 맡았다. 내가 잘하고 있는건가, 이젠 떠나야 하지 않을까...
이젠 내가 질투를 많이 하는 사람이라는 것을 안다. 겉으로 조금씩 드러나지만 나보다 잘하는 사람을 시기하고 미워한다. 이젠 그런 사람을 인정하고, (그 사람에게) 나보다 좋은 점을 배우는 것이 좋다는 것도 안다. 배움에 있어 더딘 것은 사실이다. 하지만, 난 아직도 "최고"가 되려는 꿈은 버리지 않았다.
나는 직업 프로그래머이다. 이젠 내가 하고 싶은 것만 할 수 있는 것이 아닌, 주어지 환경에서 필요하면 시행착오를 겪으면서 일을 해내야 한다는 것을 안다. 지금 내게 kernel 2.6는 거대한 산이다. 하지만, 미래의 나는 그 산의 정상에 올라가 있을 것이다.

꼬랑지. 그 혼돈의 기간에 (아직 계속되는 것일지도 모르지만) 지금 집사람을 만났다. 처음에는 마냥 달콤했지만, 이젠 서로 짜증도 내고 화내기도 하고... 그래도 좋은 사람, 내가 사랑하는 사람이다.

xscale의 QCI

Personal Computer/Linux 2005. 10. 28. 16:52 posted by tolkien
Quick Capture Interface
라고 불리는 놈. 문제는 FOM (buffer overrun) 문제를 잡아야...

camera working...

Personal Computer/Linux 2005. 10. 18. 15:05 posted by tolkien
몇명이 모여서 삽질하니 된다.
근데 camera module이 좀 시원찮다.

mmc driver

Personal Computer/Linux 2005. 10. 8. 21:56 posted by tolkien
아직도 지워지지 않네. ^^;;;

SD cards and ARM Linux

현재 camera 상태

Personal Computer/Linux 2005. 10. 6. 17:49 posted by tolkien
이전에 부시아찌가 만든 driver를 실장아찌가 이것저것 손대서 만들걸 인수해서 다음과 같은 상태까지는 만들었다.


현재 preview만 되는 상태.
이걸 색깔 제대로 나오게 하고 캡쳐까지 되게 해야한다.

꼬랑지. 미치겠다. 지금 받은 2M pixel이 아닌 1.3M pixel로 데모하란다.
근데 h/w은 토요일에 입고예정. 데모는 월요일. 주말에 일하라고?

camera, camera, ...

Personal Computer/Linux 2005. 9. 30. 13:41 posted by tolkien
CMOS camera device driver를 작성해야한다. 으아악.
일단 dataSheet부터 출력, 읽기 시작.

MT9D011 - 2-Megapixel Low-Power, CMOS Image Sensor
The Color Filter Array FAQ