内核分析移植

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章