程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 內核分析移植

內核分析移植

編輯:關於C語言

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved