展讯android LEDS模块分析----从错误中来,到错误中去

        看来还是不适合写长篇小说,就像小品里的白云一样,半天憋不出来几个字!但是,本着对观众的负责--人生的悲剧与喜剧就在于此,总是以为自己就是这个世界的主角,讽刺得却是,你认为那些目中无人、狂妄自大的2b们,往往却是这个世界的主宰者!

        毛主席说:祸从口出。话还是少说为妙。既然“keyboard-backlight”挂在在了“platform”上,是因为keyboard-backlight的kobject的parent是platform,那么,platform是怎么在sys目录中出现的呢?世上像keyboard-backlight这样的设备不计其数,但是platform却只有一个。哎,屌丝千千万,女神就有一个。不过在linux的世界里,可没有“高富帅”和“白富美”。畅享吧,在linux的代码里面!但是单想是不够的,代码只准备给看她的人。就如美女,光想是远远不行滴,just do it!还好,我们并不是没有头绪,还记得platform_driver_register这个函数吗?当年我们把bus注册为了platform。什么?贵人,您忘了?看来,你似乎比我年长了!在platform.c里面的platform_bus_type,我已经贴过一遍这个结构体了。好吧,就让读者再少一半吧
int __init platform_bus_init(void)
{
int error;

early_platform_cleanup();

error = device_register(&platform_bus);
if (error)
return error;
error =  bus_register(&platform_bus_type);
if (error)
device_unregister(&platform_bus);
return error;
}

struct device platform_bus = {
.init_name = "platform",
};

这个函数相当有意思,也相当重要。device_register(&platform_bus)->device_initialize(dev)->dev->kobj.kset = devices_kset,哈哈,是不是有点熟悉?是啊,看到kset,就让我们想起了kobj,就可以对应到sys目录啦!正所谓山穷水尽疑无路,柳暗花明--还是没看见啊!因为如果你用si一跟的话,发现devices_kset并不是在现在一开始就被钉在十字架上了的,那么when it is?just like platform,在linux的世界里面,每一个文件里面似乎总是那个德行,好吧,找一找init。在devices_init中,kset_create_and_add("devices", &device_uevent_ops, NULL)->kset_create(name, uevent_ops, parent_kobj);
static struct kset *kset_create(const char *name,
const struct kset_uevent_ops *uevent_ops,
struct kobject *parent_kobj)
{
struct kset *kset;
int retval;

kset = kzalloc(sizeof(*kset), GFP_KERNEL);
if (!kset)
return NULL;
retval = kobject_set_name(&kset->kobj, name);
if (retval) {
kfree(kset);
return NULL;
}
kset->uevent_ops = uevent_ops;
kset->kobj.parent = parent_kobj;

/*
 * The kobject of this kset will have a type of kset_ktype and belong to
 * no kset itself.  That way we can properly free it when it is
 * finished being used.
 */
kset->kobj.ktype = &kset_ktype;
kset->kobj.kset = NULL;

return kset;
}

来吧,典型的,创建一个kobject,包括kobject_set_name和设置了一些kobkect的一些参数。可是,这一切都如小三,所有的一切都有了,就差一分名义,一个红本本。of cause,咱们的linux不是一个花花公子,自然会为做的事情负责人。在creat完毕以后,kset_register(kset),马上就把前面初始化的kset注册到内核里面,然后的然后,剩下的一切似乎又是那么熟悉了。kobject_add_internal->create_dir->sysfs_create_dir。大功告成。platform目录构建成功,挂在在谁的名下了呢?说了这些我忽然又有了一种感觉,这一切都是错觉。我们在努力得追求着功、追求着名、追求着财富和成功。忽然有一天,我们似乎发现苦苦追求的一切都到手了,小心翼翼打开,干干净净的纸上貌似只写了两个字--变老!

你可能感兴趣的:(android,linux,struct,null)