1.make menuconfig
添加對s3c2440的支持
system type--> s3c2440 machine--> smdk2440
2. __lookup_machine_type
處理uboot傳來的 machine id 獲得一個 表示該id的 machine_desc 結構體
smdk2440的 machin_desc 結構體的定義如下/arch/arm/mach-s3c2440/mach-smdk2440.c
MACHINE_START(S3C2440, "SMDK2440")
/* Maintainer: Ben Dooks <[email protected]> */
.phys_io = S3C2410_PA_UART,
.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
.boot_params = S3C2410_SDRAM_PA + 0x100,
.init_irq = s3c24xx_init_irq,
.map_io = smdk2440_map_io,
.init_machine = smdk2440_machine_init,
.timer = &s3c24xx_timer,
MACHINE_END
3. setup_arch函數
函數的目的 處理uboot傳來的tag 參數
__lookup_machine_type 獲取machine_desc-->boot_params
parse_tags(tags ) 根據獲得的 boot_params 對tags 初步處理
__tagtable(ATAG_MEM, parse_tag_mem32); 內存參數處理函數的定義
在全局結構變量meninfo結構中增加內存的描述
__tagtable(ATAG_CMDLINE, parse_tag_cmdline);命令行參數bootargs)處理函數的定義
將命令行字符串拷貝為 default_command_line
parse_cmdline(cmdline_p, from); 進一步處理 default_command_line
__early_param("mem=", early_mem); 當bootargs裡有 men=xxx 時執行early_men函數 進行處理
__early_param("initrd=", early_initrd); 當bootargs裡有 initrd=xxx 時執行early_initrd函數進行處理
paging_init(&meminfo, mdesc); 對上邊的 meninfo結構處理
--> devicemaps_init(mdesc);
-->(mdesc->map_io()) 這裡的mdesc就是上邊的 machine_desc 結構體
map_o 就是smdk2440_machine_init)
smdk2440_machine_init)代碼如下 該函數主要用於 設置外部晶振12000000
該函數在mach_smdk2440.c中定義
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(16934400);
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
4.parse_args)
setup_arch)函數並沒有全部處理完tag參數 比如 ttySAC0= XXX
這個函數會繼續處理 並對已處理的參數進一步處理
5.console_init()
該函數依次調用 __con_initcall_start 與 __con_initcall_end之間定義的每個函數
這些函數用宏 console_initcall( fn )定義 例如console_initcall(s3c24xx_serial_initconsole)
s3c24xx_serial_initconsol函數在/dev/serial/s3c2410.c中定義
-->register_console(&s3c24xx_serial_console); //向內核注冊控制台
s3c24xx_serial_console 為一個結構體
6.修改MTD分區
MTD---內存技術設備
7.驅動對設備的識別
內核確定設備的信息 加載驅動時將驅動程序與設備信息比較
如果驅動和某個設備匹配 則通過該驅動操作這個設備
內核裡設備的信息用 結構體表示
設備 struct platform_device {
const char * name;
u32 id;
struct device dev;
u32 num_resources;
struct resource * resource;
};
驅動 struct platform_driver {
int (*probe)(struct platform_device *);
int (*remove)(struct platform_device *);
void (*shutdown)(struct platform_device *);
int (*suspend)(struct platform_device *, pm_message_t state);
int (*suspend_late)(struct platform_device *, pm_message_t state);
int (*resume_early)(struct platform_device *);
int (*resume)(struct platform_device *);
struct device_driver driver;
};
10. 默認的arm的mtd的分區在arch/arm/plat-s3c24xx/common-smdk.c文件中的smdk_default_nand_part結構體裡
本文出自 “linux菜鳥” 博客,請務必保留此出處http://zheshigepangzi.blog.51cto.com/6407906/1263944