- Android系統級深入開發
- 韓超 梁泉
- 896字
- 2018-12-29 13:39:41
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目錄中的其他文件中定義。
- JavaScript Unlocked
- Java從入門到精通(第4版)
- Spring Cloud、Nginx高并發核心編程
- The Computer Vision Workshop
- Learning ArcGIS Pro
- Mastering Google App Engine
- PhoneGap Mobile Application Development Cookbook
- 程序是怎樣跑起來的(第3版)
- Mastering JavaScript High Performance
- 小程序,巧應用:微信小程序開發實戰(第2版)
- Kivy Cookbook
- Unity 2018 Augmented Reality Projects
- Spring技術內幕:深入解析Spring架構與設計原理(第2版)
- 交互設計師成長手冊:從零開始學交互
- 產品架構評估原理與方法