linux内核分析与移植,内核分析移植

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  */

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值