안녕하십니까.
몇일째 smdk6410 보드에서 2.6.27로 삽질중입니다.
android kerenl 2.6.27 버젼에 smdk6410을 merge 하여 nfs로는 잘 동작을 합니다.
yaffs2와 onenand를 사용하는데 mount하고 read/write도 잘 동작하는것으로 보아 onenand쪽도 문제가 없습니다
그런데 유독 onenand에 android 를 넣고 onenand로 부팅하면 android 의 init에서 죽어 버립니다.
안드로이드 init에서 device_init()부분에서 coldboot(/sys/class). coldboot(sys/device), coldboot(sys/block)
coldboot(sys/device) 동작을 하다 죽어버립니다.
이부분이 뭐가 보니 kernel 2.6.x에 들어갓다는 kernel event layer 였습니다.
lib/kobject_uevent.c의
nt kobject_uevent_env(struct kobject *kobj, enum kobject_action action,) 함수에서
154 /* default keys */
155 retval = add_uevent_var(env, "ACTION=%s", action_string);
156 if (retval)
157 goto exit;
158 retval = add_uevent_var(env, "DEVPATH=%s", devpath);
159 if (retval)
160 goto exit;
161 retval = add_uevent_var(env, "SUBSYSTEM=%s", subsystem);
162 if (retval)
163 goto exit;
164
이부분에서 action_string, devpath, subsystem을 얻어 오는데
유독 mtd쪽에서 죽어 버립니다.
ACTION=add DEVPATH=/devices/virtual/sound/timer SUBSYSTEM=sound 일반적으로 이렇게 나와야 하는데
유독 mtd만 subsystem이 NULL을 리턴합니다.
vi drivers/base/core.c
147 static const char *dev_uevent_name(struct kset *kset, struct kobject *kobj)
148 {
149 struct device *dev = to_dev(kobj);
150
152 if (dev->bus)
153 return dev->bus->name;
154 if (dev->class)
155 return dev->class->name; // 대부분 class의 name을 리턴한다.
156 return NULL; // -> return
157 }
디바이스 드라이버 모델이란 개념과 uevent에 대해 깊은 이해가 없어 헤메이고 있습니다
대체 어느 부분을 좀더 봐야 할까요?...
--;;;