½ñÌìÔÚ×öÒ»¸öÇý¶¯µÄʱºòÒªÓõ½ÁíÒ»¸öÇý¶¯£¨I2C£©ÌṩµÄAPI£¬ÔÚÄں˳õʼ»¯Ê±Åöµ½ÁËÒ»¸öÒÀÀµÎÊÌâ¡£
ÎÒµÄÇý¶¯ÔÚI2C³õʼ»¯Ö®Ç°¾ÍÔËÐÐÆðÀ´ÁË£¬¶øÕâʱI2CÌṩµÄAPI»¹´¦ÓÚ²»¿ÉÓÃ״̬¡£²éÁ˺ܶà×ÊÁÏ£¬ÍøÉÏÓÐÈË˵ËùÓÐʹÓÃmodule_initÕâ¸öºêµÄÇý¶¯³ÌÐòµÄÆð¶¯Ë³Ðò¶¼ÊDz»È·¶¨µÄ£¨ÎÒûÓв鵽ȨÍþµÄ×ÊÁÏ£©¡£ºóÀ´ÔÚlinuxforumÉÏ¿´µ½Ò»ÕÅÌû×Óhttp://www.linuxforum.net/forum/showflat.php?Cat=&Board=linuxK&Number=563349&page=&view=&sb=&o=&fpart=1&vc=1£¬ÕâÀïÃæ½²ÁËÒ»ÏÂÕâ¸öÎÊÌ⣺
ËùÓеÄ__initº¯ÊýÔÚÇø¶Î.initcall.initÖл¹±£´æÁËÒ»·Ýº¯ÊýÖ¸Õ룬
ÔÚ³õʼ»¯Ê±Äں˻áͨ¹ýÕâЩº¯ÊýÖ¸Õëµ÷ÓÃÕâЩ__initº¯ÊýÖ¸Õ룬
²¢ÔÚÕû¸ö³õʼ»¯Íê³Éºó£¬ÊÍ·ÅÕû¸öinitÇø¶Î£¨°üÀ¨.init.text£¬.initcall.initµÈ£©£¬
×¢Ò⣬ÕâЩº¯ÊýÔÚÄں˳õʼ»¯¹ý³ÌÖеĵ÷ÓÃ˳ÐòÖ»ºÍÕâÀïµÄº¯ÊýÖ¸ÕëµÄ˳ÐòÓйأ¬
ºÍ1£©ÖÐËùÊöµÄÕâЩº¯Êý±¾ÉíÔÚ.init.textÇø¶ÎÖеÄ˳ÐòÎ޹ء£
ÔÚ2.4ÄÚºËÖУ¬ÕâЩº¯ÊýÖ¸ÕëµÄ˳ÐòÒ²ÊǺÍÁ´½ÓµÄ˳ÐòÓйصģ¬ÊDz»È·¶¨µÄ¡£
ÔÚ2.6ÄÚºËÖУ¬initcall.initÇø¶ÎÓÖ·Ö³É7¸ö×ÓÇø¶Î£¬·Ö±ðÊÇ
.initcall1.init
.initcall2.init
.initcall3.init
.initcall4.init
.initcall5.init
.initcall6.init
.initcall7.init
µ±ÐèÒª°Ñº¯Êýfn·Åµ½.initcall1.initÇø¶Îʱ£¬Ö»ÒªÉùÃ÷
core_initcall(fn);
¼´¿É¡£
ÆäËûµÄ¸÷¸öÇø¶ÎµÄ¶¨Òå·½·¨·Ö±ðÊÇ£º
core_initcall(fn) --->.initcall1.init
postcore_initcall(fn) --->.initcall2.init
arch_initcall(fn) --->.initcall3.init
subsys_initcall(fn) --->.initcall4.init
fs_initcall(fn) --->.initcall5.init
device_initcall(fn) --->.initcall6.init
late_initcall(fn) --->.initcall7.init
¶øÓë2.4¼æÈݵÄinitcall(fn)ÔòµÈ¼ÛÓÚdevice_initcall(fn)¡£
¸÷¸ö×ÓÇø¶ÎÖ®¼äµÄ˳ÐòÊÇÈ·¶¨µÄ£¬¼´Ïȵ÷ÓÃ.initcall1.initÖеĺ¯ÊýÖ¸Õë
ÔÙµ÷ÓÃ.initcall2.initÖеĺ¯ÊýÖ¸Õ룬µÈµÈ¡£
¶øÔÚÿ¸ö×ÓÇø¶ÎÖеĺ¯ÊýÖ¸ÕëµÄ˳ÐòÊǺÍÁ´½Ó˳ÐòÏà¹ØµÄ£¬ÊDz»È·¶¨µÄ¡£
ÔÚÄÚºËÖУ¬²»Í¬µÄinitº¯Êý±»·ÅÔÚ²»Í¬µÄ×ÓÇø¶ÎÖУ¬Òò´ËÒ²¾Í¾ö¶¨ÁËËüÃǵĵ÷ÓÃ˳Ðò¡£
ÕâÑùÒ²¾Í½â¾öÁËһЩinitº¯ÊýÖ®¼ä±ØÐë±£Ö¤Ò»¶¨µÄµ÷ÓÃ˳ÐòµÄÎÊÌâ¡£
°´ÕÕinclude/linux/init.hÎļþËùдµÄ£¬ÎÒÔÚÇý¶¯Àï³¥ÊÔÁËÕâÑùÁ½ÖÖ·½Ê½£º
__define_initcall("7", fn);
late_initcall(fn);
¶¼¿ÉÒÔ°ÑÎÒµÄÇý¶¯µ÷Õûµ½×îºóµ÷Óá£Êµ¼ÊÉÏÉÏÃæÁ½¸öÊÇÒ»»ØÊ£º
#define late_initcall(fn) __define_initcall("7", fn)