官术网_书友最值得收藏!

6.2.2 OMAP處理器部分的移植

arch/arm/mach-omap2是OMAP機器相關部分的移植的目錄,其中Makefile文件的一個片斷如下所示:

    obj-y := irq.o id.o io.o sdrc.o control.o prcm.o clock.o mux.o \
              devices.o serial.o gpmc.o timer-gp.o powerdomain.o \
              clockdomain.o omapdev.o
    obj-$(CONFIG_MACH_OMAP_ZOOM2)        += board-zoom2.o \
                              mmc-twl4030.o \
                              board-ldp-flash.o \
                              board-zoom2-camera.o \
                              board-zoom2-wifi.o

在這里,不需要條件編譯的各種文件,如irq.c,clock.c,serial.c等是通用OMAP中的文件。由于本例使用的是zoom2類型板級配置,因此MACH_OMAP_ZOOM2宏被打開,選擇了一些編譯的內容。

board-zoom2.c是OMAP機器實現的核心文件,機器類型的定義如下所示:

    MACHINE_START(OMAP_ZOOM2, "OMAP ZOOM2 board")
        .phys_io = 0x10000000,
        .io_pg_offst  = ((0xfb000000) >> 18) & 0xfffc,
        .boot_params  = 0x80000100,
        .map_io        = omap_zoom2_map_io,
        .init_irq     = omap_zoom2_init_irq,
        .init_machine= omap_zoom2_init,
        .timer         = &omap_timer,
    MACHINE_END

在MACHINE_START和MACHINE_END之間的內容為機器的信息,實際上是結構struct machine_desc。這里賦值了影射IO、初始化irq、初始化機器等函數指針。omap_zoom2_map_io,omap_zoom2_init_irq,omap_zoom2_init都是在同文件中實現的初始化函數。omap_timer是為當前機器實現的定時器。

其中,omap_zoom2_map_io()函數用于映射IO空間,這個函數的實現如下所示:

    static struct map_desc zoom2_io_desc[] __initdata = {
        {
              .virtual        = ZOOM2_QUART_VIRT,
              .pfn                  = __phys_to_pfn(ZOOM2_QUART_PHYS),
              .length        = ZOOM2_QUART_SIZE,
              .type          = MT_DEVICE
        },
    };
    static void __init omap_zoom2_map_io(void)
    {
        omap2_set_globals_343x();
        iotable_init(zoom2_io_desc, ARRAY_SIZE(zoom2_io_desc));
        omap2_map_common_io();
    }

由于設備比較多,因此初始化的過程比較復雜。這些設備有一些是OMAP處理器SOC內部的,有一些是在板級連接的設備(SOC外部)。

omap_zoom2_init_irq()函數用于初始化板級的中斷系統,內容如下所示:

    static void __init omap_zoom2_init_irq(void)
    {
        omap2_init_common_hw(mt46h32m32lf6_sdrc_params, omap3_mpu_rate_table,
                      omap3_dsp_rate_table, omap3_l3_rate_table);
        omap_init_irq();       // 處理器級別的中斷初始化
        omap_gpio_init();
        zoom2_init_smc911x(); // 初始化Zoom的板級的以太網控制器SMC911
    }

omap_zoom2_init()函數是OMAP ZOOM平臺的板級的初始化函數,這個函數實現的主要內容如下所示:

    static void __init omap_zoom2_init(void)
    {
        omap_i2c_init();                       // 初始化處理器的i2c系統
        platform_add_devices(zoom2_devices, ARRAY_SIZE(zoom2_devices));
        omap_board_config = zoom2_config;
        omap_board_config_size = ARRAY_SIZE(zoom2_config);
        spi_register_board_info(zoom2_spi_board_info,
                      ARRAY_SIZE(zoom2_spi_board_info));
        synaptics_dev_init();                 // synaptics觸摸屏相關的初始化
        msecure_init();
        ldp_flash_init();                      // 板級Flash的初始化
        zoom2_init_quaduart();                // 調試板Quad UART (TL16CP754C)的初始化
        omap_serial_init();                    // 串口的初始化
        usb_musb_init();                       // USB的初始化
        config_wlan_gpio();                    // 配置無線局域網相關的GPIO
        zoom2_cam_init();                      //板級Camera部分的初始化
        zoom2_lcd_tv_panel_init();           //板級顯示屏幕的初始化
    }

根據配置,這里調用的zoom2_cam_init()是在board-zoom2-camera.c中實現的。board-zoom2-camera.c和board-zoom2-wifi.c這兩個文件是Zoom板級使用的文件,前者負責Camera子系統的初始化,后者負責注冊Wifi設備的功能。

文件devices.c的功能和其他平臺類似 ,主要負責向系統中注冊各種平臺設備(platform_device)。例如,spi1的平臺設備的資源和注冊如下所示:

    static struct resource omap2_mcspi1_resources[] = {  // SPI 1所使用的左緣
        {
              .start         = OMAP2_MCSPI1_BASE,
              .end                  = OMAP2_MCSPI1_BASE + 0xff,
              .flags         = IORESOURCE_MEM,
        },
    };
    static struct platform_device omap2_mcspi1 = {        // SPI 1的平臺設備
        .name                 = "omap2_mcspi",
        .id                    = 1,
        .num_resources       = ARRAY_SIZE(omap2_mcspi1_resources),
        .resource             = omap2_mcspi1_resources,
        .dev                   = {
            .platform_data = &omap2_mcspi1_config,
        },
    };

平臺設備(platform_device)需要和平臺驅動(platform_driver)根據名稱相匹配。在各種驅動程序中定義平臺驅動,通過匹配可以獲得平臺設備中注冊的各種資源(內存、中斷、DMA)。

devices.c中定義了Camera、McSBSP接口、SPI等平臺設備,另外的一些平臺設備也在arch/arm/mach-omap2目錄中的其他文件中定義。

主站蜘蛛池模板: 襄垣县| 阿拉善左旗| 绍兴市| 冷水江市| 库伦旗| 岢岚县| 札达县| 泰安市| 从化市| 漳州市| 获嘉县| 元氏县| 班戈县| 唐河县| 长海县| 江口县| 阜宁县| 榆社县| 广宗县| 密云县| 永胜县| 衡阳县| 黄山市| 温宿县| 来凤县| 望江县| 阿坝| 福安市| 乌拉特后旗| 乌鲁木齐市| 许昌县| 贺州市| 大田县| 绵竹市| 苍南县| 中卫市| 长汀县| 洛川县| 开封县| 彭水| 金湖县|