linux kernelドライバのロード順序を変更する

3320 ワード

最近、LCD駆動でnandを読み取る需要があり、nandの駆動ロードはLCD駆動前でなければならないが、linux kernel駆動のロード順序はマクロによって決定される.
例えばhelper 2416プレート(s 3 c 2416チップ)のnand駆動module_init(s3c_nand_init), module_Initはその優先度を決定した.同じ優先順位の順序はMakefileにある.oの前後影響
優先度はinclude/linux/initで定義する.h
#define early_initcall(fn)      __define_initcall("early",fn,early)


/*
 * A "pure" initcall has no dependencies on anything else, and purely
 * initializes variables that couldn't be statically initialized.
 *
 * This only exists for built-in code, not for modules.
 */
#define pure_initcall(fn)       __define_initcall("0",fn,0)


#define core_initcall(fn)       __define_initcall("1",fn,1)
#define core_initcall_sync(fn)      __define_initcall("1s",fn,1s)
#define postcore_initcall(fn)       __define_initcall("2",fn,2)
#define postcore_initcall_sync(fn)  __define_initcall("2s",fn,2s)
#define arch_initcall(fn)       __define_initcall("3",fn,3)
#define arch_initcall_sync(fn)      __define_initcall("3s",fn,3s)
#define subsys_initcall(fn)     __define_initcall("4",fn,4)
#define subsys_initcall_sync(fn)    __define_initcall("4s",fn,4s)
#define fs_initcall(fn)         __define_initcall("5",fn,5)
#define fs_initcall_sync(fn)        __define_initcall("5s",fn,5s)
#define rootfs_initcall(fn)     __define_initcall("rootfs",fn,rootfs)
#define device_initcall(fn)     __define_initcall("6",fn,6)
#define device_initcall_sync(fn)    __define_initcall("6s",fn,6s)
#define late_initcall(fn)       __define_initcall("7",fn,7)
#define late_initcall_sync(fn)      __define_initcall("7s",fn,7s)


#define __initcall(fn) device_initcall(fn)
#define module_init(x)  __initcall(x);

moudle_init実質はdevice_initcall、rootfsに変更します.initcall以上のレベルでは、ロード順序が繰り上げられます.
ただし、このように単純に修正することはできません.駆動間は相互に依存し、一発で全身を動かすため、nandを修正する場合は、nand依存の駆動の優先度を変更する必要があります.そうしないと、kernelは起動できません.例えばmtd駆動ですが、コードを修正する場合は複数の場所を修正し、Makefileから始めると比較的簡単です.
drivers/Makefileを見て
14行obj-y+=video/#LCDはvideoで
54行obj-$(CONFIG_MTD)+=mtd/#nand mtdサブディレクトリの下
上の2行目を1行目の上に移動し、カーネルを再コンパイルすればいいのです
これは、起動プロセスで印刷された情報からわかります.
S3C NAND Driver, (c) 2007 Samsung Electronics                                                                                         
S3C NAND Driver is using hardware ECC.                                                                                                
NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)                                                    
Creating 3 MTD partitions on "NAND 256MiB 3,3V 8-bit":                                                                                
0x000000000000-0x000000040000 : "Bootloader"                                                                                         
0x000000040000-0x000000400000 : "Kernel"                                                                                             
0x000000400000-0x000010000000 : "File System"                                                                                        
LCD TYPE::S3C_4.3inch LCD will be initialized 
作者:帅得不敢外出c++哈哈堂31843264