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结构体里