krebs

本文详细介绍了构建基于高通8260芯片的Krebs平台的全过程,涵盖Bootloader、Kernel及Android系统的定制流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前 Android 的开发模式,均为对芯片厂商半成品的集成和修改,类似于 Linux 开发公司后期的开发模式,由芯片厂商提供开发参考代码,由生产厂商负责集成,并根据产品定义来做进一步的个性化修改。而针对不同的芯片厂商,它们所采用的集成策略也不尽相同,但同时也有共同点:

  • 共同点
  1. 均采用 Android 的默认 Android.mk 的编译方式集成;
  2. 不同硬件平台代码独立;
  3. 均已 Google Source Code 作为 Base,再通过 manifest.xml 或 patch 来将厂商的修改集成进 Base 版本中;
  4. 所有模块,包括 bootloader 和 kernel 均会在 Android Source 中编译集成。
  • 不同点
  1. 平台性代码和功能性代码每一个厂商的目录结构都有所不同;
  2. 对 Android 原有软件的修改方法有所不同,例如:Marvell 和 Qualcomm 对 Phone.apk 的修改方法就不一样;


从上面的描述中可以看出,记录下对一个平台的修改过程,对日后新平台的引入是非常有帮助的。下面我就针对高通 8260 芯片的,Nollec Krebs 平台构建的过程进行一个流水记录。

前期准备

  1. 确认新平台的版本代号;最后定义为Krebs(德语巨蟹座);(代号命名规则目前是12星座)
  2. 确认高通 ICS 的 base 版本,目前我们选择了最新 tag 的 M8260AAABQNLZA30140、HY11-N9123-6.zip 和 314009 的 Modem ;
  3. 基于 M8260AAABQNLZA30140 版本的 manifest 修改成属于我们自己 Krebs 分支的 manifest 文件;
  4. 基于修改的 manifest 同步代码,并编译 msm8660_suf,确认编译无问题后,开始 krebs 平台的构建。


开发流程

准则

为了确保各阶段点能够正确保存,并方便日后其他兄弟入手,在移植时,需要做到步骤明朗化、合理化的要求。大家都知道开发流程为:bootloader->kernel->rootfs为基本开发流程,但是在初期移植bootloader时,一定切记不要一次性将多个功能导入到版本库中,因为这样,日后其他兄弟介入时,一看是一大坨,很难查看和学习,因此希望大家养成良好的版本自我管理的习惯。

例如:当 msm8660_surf 编译通过后,需要先调试 bootloader,但目的是将 kernel 能够成功加载,而不是一股脑将能够开发的所有功能全部导入,如 LCD、Key 等。

lk

下面我们的修改目的就是为了能够启动 kernel。


  • 最终差异如下:
# On branch krebs
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   platform/msm8x60/include/platform/machtype.h
#       modified:   platform/msm_shared/smem.h
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       project/krebs.mk
#       target/krebs/


  • 操作步骤如下:
    • 增加平台类型,因为machtype大家的定义总是根据个人喜好,这里约束今后的项目从9000起始,并在相应项目页面中明确此值。
diff --git a/platform/msm8x60/include/platform/machtype.h b/platform/msm8x60/include/platform/machtype.h
index 6b372e3..345bb9a 100644
--- a/platform/msm8x60/include/platform/machtype.h
+++ b/platform/msm8x60/include/platform/machtype.h
@@ -38,5 +38,6 @@
 #define LINUX_MACHTYPE_8660_CHARM_SURF   3181
 #define LINUX_MACHTYPE_8660_CHARM_FFA    3199
 #define LINUX_MACHTYPE_8x60_DRAGON       3586
+#define LINUX_MACHTYPE_8660_KREBS       9000

 #endif
diff --git a/platform/msm_shared/smem.h b/platform/msm_shared/smem.h
index e3a1389..048d903 100644
--- a/platform/msm_shared/smem.h
+++ b/platform/msm_shared/smem.h
@@ -194,6 +194,7 @@ enum platform {
        HW_PLATFORM_FLUID = 3,
        HW_PLATFORM_SVLTE = 4,
        HW_PLATFORM_QT = 6,
+       HW_PLATFORM_KREBS = 7,
        HW_PLATFORM_MTP = 8,
        HW_PLATFORM_LIQUID = 9,
        HW_PLATFORM_DRAGON = 10,


    • 新增平台文件,这里主要添加平台配置文件和平台配置,具体操作如下:
cd bootable/bootloader/lk/
cp project/msm8660_surf.mk project/krebs.mk
cp -arp target/msm8660_surf target/krebs
--- msm8660_surf.mk     2012-03-29 14:54:35.000000000 +0800
+++ krebs.mk    2012-04-06 16:47:39.000000000 +0800
@@ -2,10 +2,11 @@
 #
 LOCAL_DIR := $(GET_LOCAL_DIR)

-TARGET := msm8660_surf
+TARGET := krebs

 MODULES += app/aboot

 #DEFINES += WITH_DEBUG_DCC=1
-#DEFINES += WITH_DEBUG_UART=1
-#DEFINES += WITH_DEBUG_FBCON=1
\ No newline at end of file
+DEFINES += WITH_DEBUG_UART=1
+DEFINES += _EMMC_BOOT=1
+#DEFINES += WITH_DEBUG_FBCON=1
diff -Nur target/msm8660_surf//init.c target/krebs//init.c
--- target/msm8660_surf//init.c 2012-03-29 14:54:35.000000000 +0800
+++ target/krebs//init.c        2012-04-06 15:52:21.000000000 +0800
@@ -159,6 +159,9 @@
        case 0x6:
                hw_platform = HW_PLATFORM_QT;
                break;
+        case 0x7:
+                hw_platform = HW_PLATFORM_KREBS;
+                break;
        case 0xA:
                hw_platform = HW_PLATFORM_DRAGON;
                break;
@@ -193,6 +196,8 @@
                                mach_id = LINUX_MACHTYPE_8660_FLUID;
                        else if (hw_platform == HW_PLATFORM_QT)
                                mach_id = LINUX_MACHTYPE_8660_QT;
+                        else if (hw_platform == HW_PLATFORM_KREBS)
+                                mach_id = LINUX_MACHTYPE_8660_KREBS;
                        else if (hw_platform == HW_PLATFORM_DRAGON)
                                mach_id = LINUX_MACHTYPE_8x60_DRAGON;
                }
@@ -207,6 +212,8 @@
                                mach_id = LINUX_MACHTYPE_8660_FLUID;
                        else if (hw_platform == HW_PLATFORM_QT)
                                mach_id = LINUX_MACHTYPE_8660_QT;
+                        else if (hw_platform == HW_PLATFORM_KREBS)
+                                mach_id = LINUX_MACHTYPE_8660_KREBS;
                        else if (hw_platform == HW_PLATFORM_DRAGON)
                                mach_id = LINUX_MACHTYPE_8x60_DRAGON;
                        break;
@@ -223,6 +230,7 @@
                        mach_id = LINUX_MACHTYPE_8660_FFA;
                }
        }
+        mach_id = LINUX_MACHTYPE_8660_KREBS;
        return mach_id;
 }


  • 综上所述,我们的修改仅仅是添加了平台,未对任何设备进行适配,也就是说,如果我们的开发板如果和8660_surf 的官方开发板,硬件基础功能的设计差异较大的话(例如 debug uart 的配置不同),目前的修改将无法确保能够实现启动 kernel,但事实是已经可以启动了,只是报一些 GPIO 错误,不过任务完成了。

kernel

  • 最终差异如下:
arch/arm/configs/krebs_defconfig        [new file with mode: 0644]
arch/arm/mach-msm/Kconfig
arch/arm/mach-msm/Makefile
arch/arm/mach-msm/board-krebs.c         [new file with mode: 0644]
arch/arm/tools/mach-types
drivers/power/Kconfig


  • 操作步骤如下:
    • 增加平台类型。
diff --git a/arch/arm/mach-msm/Kconfig b/arch/arm/mach-msm/Kconfig

index 8f3eeca..f7287ec 100644 (file)
--- a/arch/arm/mach-msm/Kconfig
+++ b/arch/arm/mach-msm/Kconfig
@@ -530,6 +530,14 @@ config MACH_MSM8X55_SVLTE_SURF
        help
          Support for the Qualcomm MSM8x55 SVLTE SURF eval board.
 
+config MACH_MSM8X60_KREBS
+       depends on ARCH_MSM8X60
+       default n
+       bool "KREBS"
+       help
+         Support for the Qualcomm MSM8260-based Krebs Development Board.
+
+
 config MACH_MSM8X60_RUMI3
        depends on ARCH_MSM8X60
        default n


diff --git a/arch/arm/mach-msm/Makefile b/arch/arm/mach-msm/Makefile

index db6c148..7a68e39 100644 (file)
--- a/arch/arm/mach-msm/Makefile
+++ b/arch/arm/mach-msm/Makefile
@@ -195,6 +195,7 @@ obj-$(CONFIG_ARCH_FSM9XXX) += dfe-fsm9xxx.o rfic-fsm9xxx.o
 obj-$(CONFIG_ARCH_FSM9XXX) += restart-fsm9xxx.o xo-fsm9xxx.o
 
 obj-$(CONFIG_MSM_WATCHDOG) += msm_watchdog.o
+obj-$(CONFIG_MACH_MSM8X60_KREBS) += board-krebs.o
 obj-$(CONFIG_MACH_MSM8X60_RUMI3) += board-msm8x60.o
 obj-$(CONFIG_MACH_MSM8X60_SIM) += board-msm8x60.o
 obj-$(CONFIG_MACH_MSM8X60_SURF) += board-msm8x60.o


diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types

index b4ca325..b18ca07 100644 (file)
--- a/arch/arm/tools/mach-types
+++ b/arch/arm/tools/mach-types
@@ -980,6 +980,7 @@ frisms                      MACH_FRISMS             FRISMS                  3350
 msm7x27a_ffa           MACH_MSM7X27A_FFA       MSM7X27A_FFA            3351
 msm7x27a_surf          MACH_MSM7X27A_SURF      MSM7X27A_SURF           3352
 msm7x27a_rumi3         MACH_MSM7X27A_RUMI3     MSM7X27A_RUMI3          3353
+msm8x60_krebs          MACH_MSM8X60_KREBS      MSM8X60_KREBS           9000
 dimmsam9g20            MACH_DIMMSAM9G20        DIMMSAM9G20             3354
 dimm_imx28             MACH_DIMM_IMX28         DIMM_IMX28              3355
 amk_a4                 MACH_AMK_A4             AMK_A4                  3356


diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig

index 3dfa68e..2ea9b54 100644 (file)
--- a/drivers/power/Kconfig
+++ b/drivers/power/Kconfig
@@ -244,6 +244,7 @@ config BATTERY_MSM
 
 config BATTERY_MSM8X60
        tristate "MSM8X60 battery"
+       depends on (MACH_MSM8X60_KREBS)
        select PMIC8XXX_BATTALARM
        help
          Some MSM boards have dual charging paths to charge the battery.
    • 新增平台文件,这里主要添加平台配置文件和平台配置,具体操作如下:
cd kernel/arch/arm/configs/
cp msm8660_defconfig krebs_defconfig
cd -
cd kernel/arch/arm/mach-msm/
cp board-msm8x60.c board-krebs.c
diff -Nur kernel/arch/arm/configs/msm8660_defconfig kernel/arch/arm/configs/krebs_defconfig
--- msm8660_defconfig   2012-03-31 16:49:12.000000000 +0800
+++ krebs_defconfig     2012-04-19 15:59:12.000000000 +0800
@@ -32,14 +32,15 @@
 CONFIG_DEFAULT_DEADLINE=y
 CONFIG_ARCH_MSM=y
 CONFIG_ARCH_MSM8X60=y
-CONFIG_MACH_MSM8X60_RUMI3=y
-CONFIG_MACH_MSM8X60_SIM=y
-CONFIG_MACH_MSM8X60_SURF=y
-CONFIG_MACH_MSM8X60_FFA=y
-CONFIG_MACH_MSM8X60_FLUID=y
-CONFIG_MACH_MSM8X60_FUSION=y
-CONFIG_MACH_MSM8X60_FUSN_FFA=y
-CONFIG_MACH_MSM8X60_DRAGON=y
+CONFIG_MACH_MSM8X60_KREBS=y
+# CONFIG_MACH_MSM8X60_RUMI3 is not set
+# CONFIG_MACH_MSM8X60_SIM is not set
+# CONFIG_MACH_MSM8X60_SURF is not set
+# CONFIG_MACH_MSM8X60_FFA is not set
+# CONFIG_MACH_MSM8X60_FLUID is not set
+# CONFIG_MACH_MSM8X60_FUSION is not set
+# CONFIG_MACH_MSM8X60_FUSN_FFA is not set
+# CONFIG_MACH_MSM8X60_DRAGON is not set
 CONFIG_MSM7X00A_USE_DG_TIMER=y
 CONFIG_MSM7X00A_SLEEP_MODE_POWER_COLLAPSE=y
 CONFIG_MSM7X00A_IDLE_SLEEP_WAIT_FOR_INTERRUPT=y


diff -Nur kernel/arch/arm/mach-msm/board-msm8x60.c kernel/arch/arm/mach-msm/board-krebs.c
--- kernel/arch/arm/mach-msm/board-msm8x60.c    2012-04-18 10:22:47.000000000 +0800
+++ kernel/arch/arm/mach-msm/board-krebs.c      2012-04-18 11:07:33.000000000 +0800
@@ -1407,7 +1407,7 @@
         * vbus notifications
         */
        if ((SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 2)
-                       && (machine_is_msm8x60_surf() ||
+                       && (machine_is_msm8x60_surf() || machine_is_msm8x60_krebs() ||
                                pmic_id_notif_supported)) {
                if (init)
                        ret = msm_charger_register_vbus_sn(callback);
@@ -3398,6 +3398,7 @@
 };
 #endif

+#ifndef CONFIG_MACH_MSM8X60_KREBS
 static struct regulator *vreg_tmg200;

 #define TS_PEN_IRQ_GPIO 61
@@ -3579,6 +3580,7 @@
                .platform_data = &cy8ctma340_dragon_pdata,
        }
 };
+#endif

 #ifdef CONFIG_SERIAL_MSM_HS
 static int configure_uart_gpios(int on)
@@ -5046,7 +5048,7 @@
         * implies that the regulator connected to MPP0 is enabled when
         * MPP0 is low.
         */
-       if (machine_is_msm8x60_surf() || machine_is_msm8x60_fusion()) {
+       if (machine_is_msm8x60_surf() || machine_is_msm8x60_krebs() || machine_is_msm8x60_fusion()) {
                msm_gpio_regulator_pdata[GPIO_VREG_ID_EXT_5V].active_low = 1;
                pm8901_vreg_mpp0.config.control = PM8XXX_MPP_DOUT_CTRL_HIGH;
        } else {
@@ -5735,7 +5737,7 @@

 #if defined(CONFIG_TOUCHDISC_VTD518_SHINETSU) || \
                defined(CONFIG_TOUCHDISC_VTD518_SHINETSU_MODULE)
-       if (machine_is_msm8x60_ffa() || machine_is_msm8x60_surf() ||
+       if (machine_is_msm8x60_ffa() || machine_is_msm8x60_surf() || machine_is_msm8x60_krebs() ||
                machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa()) {
                rc = pm8xxx_gpio_config(
                        PM8058_GPIO_PM_TO_SYS(PMIC_GPIO_TOUCH_DISC_INTR),
@@ -5749,7 +5751,7 @@

 #if defined(CONFIG_PMIC8058_OTHC) || defined(CONFIG_PMIC8058_OTHC_MODULE)
        /* Line_in only for 8660 ffa & surf */
-       if (machine_is_msm8x60_ffa() || machine_is_msm8x60_surf() ||
+       if (machine_is_msm8x60_ffa() || machine_is_msm8x60_surf() || machine_is_msm8x60_krebs() ||
                machine_is_msm8x60_fusion() || machine_is_msm8x60_dragon() ||
                machine_is_msm8x60_fusn_ffa()) {
                rc = pm8xxx_gpio_config(line_in_gpio_cfg.gpio,
@@ -7121,6 +7123,7 @@
                ARRAY_SIZE(msm_i2c_gsbi3_tdisc_info),
        },
 #endif
+#ifndef CONFIG_MACH_MSM8X60_KREBS
        {
                I2C_SURF | I2C_FFA | I2C_FLUID,
                MSM_GSBI3_QUP_I2C_BUS_ID,
@@ -7133,6 +7136,7 @@
                cy8ctma340_dragon_board_info,
                ARRAY_SIZE(cy8ctma340_dragon_board_info),
        },
+#endif
 #if defined(CONFIG_TOUCHSCREEN_CYTTSP_I2C) || \
                defined(CONFIG_TOUCHSCREEN_CYTTSP_I2C_MODULE)
        {
@@ -7225,7 +7229,7 @@
 {
 #ifdef CONFIG_I2C
 #if defined(CONFIG_GPIO_SX150X) || defined(CONFIG_GPIO_SX150X_MODULE)
-       if (machine_is_msm8x60_surf() || machine_is_msm8x60_fusion())
+       if (machine_is_msm8x60_surf() || machine_is_msm8x60_krebs() || machine_is_msm8x60_fusion())
                sx150x_data[SX150X_CORE].irq_summary =
                        PM8058_GPIO_IRQ(PM8058_IRQ_BASE, UI_INT2_N);
        else if (machine_is_msm8x60_ffa() || machine_is_msm8x60_fusn_ffa() ||
@@ -7246,7 +7250,7 @@
        int i;

        /* Build the matching 'supported_machs' bitmask */
-       if (machine_is_msm8x60_surf() || machine_is_msm8x60_fusion())
+       if (machine_is_msm8x60_surf() || machine_is_msm8x60_krebs() || machine_is_msm8x60_fusion())
                mach_mask = I2C_SURF;
        else if (machine_is_msm8x60_ffa() || machine_is_msm8x60_fusn_ffa())
                mach_mask = I2C_FFA;
@@ -7357,7 +7361,7 @@
         * with a hardware workaround.
         */
        if (SOCINFO_VERSION_MAJOR(socinfo_get_version()) == 2 &&
-                       (machine_is_msm8x60_surf() ||
+                       (machine_is_msm8x60_surf() || machine_is_msm8x60_krebs() ||
                        (machine_is_msm8x60_ffa() &&
                        pmic_id_notif_supported)))
                msm_otg_pdata.phy_can_powercollapse = 1;
@@ -7430,7 +7434,7 @@
        if (ebi2_cfg_ptr != 0) {
                ebi2_cfg = readl_relaxed(ebi2_cfg_ptr);

-               if (machine_is_msm8x60_surf() || machine_is_msm8x60_ffa() ||
+               if (machine_is_msm8x60_surf() || machine_is_msm8x60_krebs() || machine_is_msm8x60_ffa() ||
                        machine_is_msm8x60_fluid() ||
                        machine_is_msm8x60_dragon())
                        ebi2_cfg |= (1 << 4) | (1 << 5); /* CS2, CS3 */
@@ -7443,7 +7447,7 @@
                iounmap(ebi2_cfg_ptr);
        }

-       if (machine_is_msm8x60_surf() || machine_is_msm8x60_ffa() ||
+       if (machine_is_msm8x60_surf() || machine_is_msm8x60_krebs() || machine_is_msm8x60_ffa() ||
            machine_is_msm8x60_fluid() || machine_is_msm8x60_dragon()) {
                ebi2_cfg_ptr = ioremap_nocache(0x1a110000, SZ_4K);
                if (ebi2_cfg_ptr != 0) {
@@ -8601,7 +8605,7 @@
        int rc;
        static struct regulator *display_reg;

-       if (machine_is_msm8x60_surf() || machine_is_msm8x60_ffa() ||
+       if (machine_is_msm8x60_surf() || machine_is_msm8x60_krebs() || machine_is_msm8x60_ffa() ||
            machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa()) {
                if (on) {
                        /* LVDS */
@@ -10120,6 +10124,7 @@
        .gpiomux_cfgs = msm8x60_surf_ffa_gpiomux_cfgs,
 };

+
 static struct msm_board_data msm8x60_surf_board_data __initdata = {
        .gpiomux_cfgs = msm8x60_surf_ffa_gpiomux_cfgs,
 };
@@ -10199,7 +10204,7 @@
         * devices so that the RPM doesn't drop into a low power mode that an
         * un-reworked SURF cannot resume from.
         */
-       if (machine_is_msm8x60_surf()) {
+       if (machine_is_msm8x60_surf() || machine_is_msm8x60_krebs()) {
                int i;

                for (i = 0; i < ARRAY_SIZE(rpm_regulator_init_data); i++)
@@ -10235,7 +10240,7 @@
         * Enable EBI2 only for boards which make use of it. Leave
         * it disabled for all others for additional power savings.
         */
-       if (machine_is_msm8x60_surf() || machine_is_msm8x60_ffa() ||
+       if (machine_is_msm8x60_surf() || machine_is_msm8x60_krebs() || machine_is_msm8x60_ffa() ||
                        machine_is_msm8x60_rumi3() ||
                        machine_is_msm8x60_sim() ||
                        machine_is_msm8x60_fluid() ||
@@ -10264,7 +10269,7 @@
        }

 #ifdef CONFIG_BATTERY_MSM8X60
-       if (machine_is_msm8x60_surf() || machine_is_msm8x60_ffa() ||
+       if (machine_is_msm8x60_surf() || machine_is_msm8x60_krebs() || machine_is_msm8x60_ffa() ||
                machine_is_msm8x60_fusion() || machine_is_msm8x60_dragon() ||
                machine_is_msm8x60_fusn_ffa() || machine_is_msm8x60_fluid())
                platform_device_register(&msm_charger_device);
@@ -10288,7 +10293,7 @@
                pm8058_platform_data.vibrator_pdata = &pm8058_vib_pdata;
        }

-       if (machine_is_msm8x60_surf() || machine_is_msm8x60_ffa() ||
+       if (machine_is_msm8x60_surf() || machine_is_msm8x60_krebs() || machine_is_msm8x60_ffa() ||
            machine_is_msm8x60_fluid() || machine_is_msm8x60_fusion() ||
            machine_is_msm8x60_fusn_ffa() || machine_is_msm8x60_dragon()) {
                msm8x60_cfg_smsc911x();
@@ -10333,7 +10338,7 @@
                                     ARRAY_SIZE(rumi_sim_devices));
        }
 #if defined(CONFIG_USB_PEHCI_HCD) || defined(CONFIG_USB_PEHCI_HCD_MODULE)
-       if (machine_is_msm8x60_surf() || machine_is_msm8x60_ffa() ||
+       if (machine_is_msm8x60_surf() || machine_is_msm8x60_krebs() || machine_is_msm8x60_ffa() ||
                machine_is_msm8x60_dragon())
                msm8x60_cfg_isp1763();
 #endif
@@ -10550,3 +10555,13 @@
        .timer = &msm_timer,
        .init_early = msm8x60_charm_init_early,
 MACHINE_END
+
+MACHINE_START(MSM8X60_KREBS, "NOLLEC MSM8X60 KREBS")
+       .map_io = msm8x60_map_io,
+       .reserve = msm8x60_reserve,
+       .init_irq = msm8x60_init_irq,
+       .handle_irq = gic_handle_irq,
+       .init_machine = msm8x60_surf_init,
+       .timer = &msm_timer,
+       .init_early = msm8x60_charm_init_early,
+MACHINE_END


  • 如 lk 一样,我们的修改仅仅是添加了平台,通过和上面 lk 的配合,已经可以在 Krebs 硬件平台上启动 kernel 了。

android

终于到正餐了,到这里我们就要祈祷了,因为这里的事情最多,依赖最多,事情也最多;如果厂商版本质量比较好,那我们的工作将轻而易举,反之则步履蹒跚。


  • 简述

高通平台性代码都是通过 git server 发布的,也就是说,不管你有什么 license,都可以使用这个服务器,同步到最新的高通代码,但是你别高兴,你同步的仅仅是高通对 Google Android Code 的修改,里面很少有针对硬件平台的功能,当然已经开源的不包括在内;也就是说,你编译个模拟器,编一个apk都没有问题,但是如果你想要编译一个针对 8660_surf 能够运行起上层应用的版本,那么就没戏了。所以高通针对不同厂商 License 授权,发布不同的 proprietary 包,这里我们使用的版本为 30140,压缩包名为 HY11-N9123-6.zip,解压路径就根据压缩包中的路径存放即可,这样我们就拥有了 license 授权的功能了,也就是我们有构建 Krebs 平台的 Base 了。


  • 目的

这里我们以快速完成任务为目的,并辅助学习。因此我们采用的策略为,验证平台(8660_surf)->确认自有平台差异性项目(Krebs)->修改增加配置->适配项目(Krebs)完毕->功能开发->项目结束。

  1. 验证平台(8660_surf):按照高通文档进行编译,验证,确保 Android 能够编译通过,最好同时验证 SDK、OTA、CTS 的编译是否正常。此步骤主要为了熟悉平台框架,为下一步做好准备。
  2. 确认自有平台差异性项目(Krebs):当我们编译完 8660_surf 平台的功能后,需要基本掌握 Android 的编译方法,和高通硬件平台主要的几个模块的集成方法,其实主要就是 Android.mk 的修改。最后将 8660_surf 修改成 Krebs,由于我们的平台还是依赖于 8660 的,因此不是将所有的 8660_surf 都修改成 Krebs,否则将会编译不过,或引起其它问题。
  3. 修改增加配置:整理好思路,在这里就是一边编译一边修改了,直到编译通过。
  4. 适配项目(Krebs)完毕:我们已经有一个类 8660_surf 的项目 Krebs 了,但是两者在定义上一定会或多或少的区别,例如关闭 HDMI 的支持等,这个步骤需要去除这些已知不需要的功能。
  5. 功能开发:根据 Krebs 项目的 URD 定义,具体针对功能进行代码开发,并导入到相应分支中。
  6. 项目结束:完成开发不同的阶段点,直到完成 SR 阶段点后,此项目便结束了。


  • 操作流程
mkdir device/nollec
cp -arp device/qcom/common device/nollec/common
diff -Nur device/qcom/common/ device/nollec/common/

diff -Nur device/qcom/common//recovery/miniui/Android.mk device/nollec/common//recovery/miniui/Android.mk
--- device/qcom/common//recovery/miniui/Android.mk      2012-03-30 18:50:03.000000000 +0800
+++ device/nollec/common//recovery/miniui/Android.mk    2012-04-06 16:45:03.000000000 +0800
@@ -4,7 +4,7 @@
 LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)

-LOCAL_MODULE := librecovery_ui_qcom
+LOCAL_MODULE := librecovery_ui_krebs

 LOCAL_MODULE_TAGS := optional


cp -arp device/qcom/msm8660_surf device/nollec/krebs
diff -Nur device/qcom/msm8660_surf/ device/nollec/krebs/
diff -Nur device/qcom/msm8660_surf//AndroidBoard.mk device/nollec/krebs//AndroidBoard.mk
--- device/qcom/msm8660_surf//AndroidBoard.mk   2012-03-29 14:54:41.000000000 +0800
+++ device/nollec/krebs//AndroidBoard.mk        2012-04-06 16:19:02.000000000 +0800
@@ -19,7 +19,7 @@
 # Compile Linux Kernel
 #----------------------------------------------------------------------
 ifeq ($(KERNEL_DEFCONFIG),)
-    KERNEL_DEFCONFIG := msm8660-perf_defconfig
+    KERNEL_DEFCONFIG := krebs_defconfig
 endif

 include kernel/AndroidKernel.mk
diff -Nur device/qcom/msm8660_surf//AndroidProducts.mk device/nollec/krebs//AndroidProducts.mk
--- device/qcom/msm8660_surf//AndroidProducts.mk        2012-03-29 14:54:41.000000000 +0800
+++ device/nollec/krebs//AndroidProducts.mk     2012-04-06 16:20:24.000000000 +0800
@@ -1,3 +1,3 @@

 PRODUCT_MAKEFILES := \
-    $(LOCAL_DIR)/msm8660_surf.mk
+    $(LOCAL_DIR)/krebs.mk
diff -Nur device/qcom/msm8660_surf//BoardConfig.mk device/nollec/krebs//BoardConfig.mk
--- device/qcom/msm8660_surf//BoardConfig.mk    2012-03-29 14:54:41.000000000 +0800
+++ device/nollec/krebs//BoardConfig.mk 2012-04-12 10:28:41.000000000 +0800
@@ -90,7 +90,7 @@
 TARGET_USES_LAUNCHER_V1 := true

 BOARD_KERNEL_CMDLINE := console=ttyHSL0,115200,n8 androidboot.hardware=qcom
-BOARD_EGL_CFG := device/qcom/$(TARGET_PRODUCT)/egl.cfg
+BOARD_EGL_CFG := device/nollec/$(TARGET_PRODUCT)/egl.cfg

 BOARD_BOOTIMAGE_PARTITION_SIZE := 0x00A00000
 BOARD_RECOVERYIMAGE_PARTITION_SIZE := 0x00A00000
diff -Nur device/qcom/msm8660_surf//krebs.mk device/nollec/krebs//krebs.mk
--- device/qcom/msm8660_surf//krebs.mk  1970-01-01 08:00:00.000000000 +0800
+++ device/nollec/krebs//krebs.mk       2012-04-06 16:26:43.000000000 +0800
@@ -0,0 +1,11 @@
+$(call inherit-product, device/nollec/common/common.mk)
+
+PRODUCT_NAME := krebs
+PRODUCT_DEVICE := krebs
+
+# Wallpapers
+PRODUCT_PACKAGES += Galaxy4
+PRODUCT_PACKAGES += HoloSpiralWallpaper
+PRODUCT_PACKAGES += MagicSmokeWallpapers
+PRODUCT_PACKAGES += NoiseField
+PRODUCT_PACKAGES += PhaseBeam
diff -Nur device/qcom/msm8660_surf//msm8660_surf.mk device/nollec/krebs//msm8660_surf.mk
--- device/qcom/msm8660_surf//msm8660_surf.mk   2012-03-29 14:54:41.000000000 +0800
+++ device/nollec/krebs//msm8660_surf.mk        1970-01-01 08:00:00.000000000 +0800
@@ -1,11 +0,0 @@
-$(call inherit-product, device/qcom/common/common.mk)
-
-PRODUCT_NAME := msm8660_surf
-PRODUCT_DEVICE := msm8660_surf
-
-# Wallpapers
-PRODUCT_PACKAGES += Galaxy4
-PRODUCT_PACKAGES += HoloSpiralWallpaper
-PRODUCT_PACKAGES += MagicSmokeWallpapers
-PRODUCT_PACKAGES += NoiseField
-PRODUCT_PACKAGES += PhaseBeam

将私有代码导入,解压 HY11-N9123-6.zip 后,将 proprietary 目录拷贝到 vendor/qcom/ 目录下,然后开始进行 Krebs 的进一步适配。

diff --git a/common/config/device-vendor.mk b/common/config/device-vendor.mk

index fe0ea61..27f7563 100644 (file)
--- a/common/config/device-vendor.mk
+++ b/common/config/device-vendor.mk
@@ -22,6 +22,7 @@ PRODUCT_LIST += qsd8250_ffa
 PRODUCT_LIST += qsd8650a_st1x
 PRODUCT_LIST += msm8660_csfb
 PRODUCT_LIST += msm8960
+PRODUCT_LIST += krebs
 
 MSM7K_PRODUCT_LIST := msm7625_surf
 MSM7K_PRODUCT_LIST += msm7625_ffa
cp -arp vendor/qcom/proprietary/modem-apis/msm8660_surf vendor/qcom/proprietary/modem-apis/krebs
cp -arp vendor/qcom/proprietary/prebuilt_HY11/target/product/msm8660_surf/ vendor/qcom/proprietary/prebuilt_HY11/target/product/krebs/
rm -rf vendor/qcom/proprietary/prebuilt_HY11/target/product/krebs/READMES/
rm -rf vendor/qcom/proprietary/prebuilt_HY11/target/product/krebs/data/ 
rm -rf vendor/qcom/proprietary/prebuilt_HY11/target/product/krebs/obj/         
rm -rf vendor/qcom/proprietary/prebuilt_HY11/target/product/krebs/symbols/
rm -rf vendor/qcom/proprietary/prebuilt_HY11/target/product/krebs/system/

ok,到这里我们所有的修改就可以保证所有的功能可以编译了,不过仅仅是框架搭建完毕,还有进一步优化的功能需要做,不过所有的开发人员可以切入了。


modem

高通的 Modem 编译环境为 Windows + Cygwin + RealView Developer Suite + Python + Perl,环境搭建在初期磕磕绊绊,很不顺利,经过反复测试,总结出来了下面的搭建方法,可以快速有效的构建编译环境,但不是最快最精简的方法(同时可以参考郭岩海过去的总结Build AMSS modem software,很有帮助)。下面我们流水介绍一下安装方法。首先将安装包拷贝到本地,\\smb.nollec.com\private\Release\QUALCOMM\Source\modem_release\toolchain


  • Windows
  1. 我们仅仅在公司默认安装的 Windows XP 版本中测试过环境。找 IT 部门的人员初始化一台 Windows 机器就可以了。
  2. 注意:未在其他系统上测试此环境。


  • Cygwin
  1. 进入 toolchain\cygwin\setup 目录,运行 setup_26014.exe;
  2. 文件:cygwin_install_1.JPG
  3. 文件:cygwin_install_2.JPG
  4. 文件:cygwin_install_3.JPG
  5. 文件:cygwin_install_4.JPG
  6. 文件:cygwin_install_5.JPG
  7. 文件:cygwin_install_6.JPG
  8. 文件:cygwin_install_7.JPG
  9. 文件:cygwin_install_8.JPG
  10. 文件:cygwin_install_9.JPG
  11. 文件:cygwin_install_10.JPG
  12. 文件:Cygwin install 11.JPG
  13. 按下一步后,就需要漫长的等待了,需要2个小时以上。


  • RealView Developer Suite
  1. 进入 toolchain\Rvds\RVDS2.2_B593\RVDS 2.2 SP1 目录,运行 setup.exe
  2. 很傻瓜的安装方式,同意、下一步...注意以下几步即可。
  3. 文件:rvds22_install_1.JPG
  4. 文件:rvds22_install_2.JPG
  5. 文件:rvds22_install_3.JPG
  6. 继续下一步好了,我们完成了程序的安装,不过我们还要升级和破解;先阅读 toolchain\Rvds\RVDS2.2_B593\简要说明.txt,照做后就将ARM编译器升级到593版本了。
  7. 破解方法,先阅读 toolchain\Rvds\RVDS 2.2 Crack\readme.txt,照做即可,提示病毒忽略(病毒也没辙,谁叫没有license呢),也可参考网络资料RVDS 2.2 的破解方法;别忘记加环境变量,右键我的电脑->属性->高级->环境变量->系统变量->增加变量LM_LICENSE_FILE = c:\flexlm\license.dat

注意:如果到这里,你的arm编译环境还是有问题,例如显示license问题,那么不是你的操作没有暗自叫好上述步骤,就是你通过windows的远程桌面做的,如果都不是,那么重装系统吧,这就是血一样的的教训总结下来的。


  • Python
  1. 进入 toolchain 目录,运行 python-2.7.2.msi
  2. 很傻瓜的安装方式,同意、下一步...所有组件全装即可。
  3. 安装完毕后,在环境变量中加入 python 的目录,右键我的电脑->属性->高级->环境变量->系统变量->修改变量PATH,在最先面加入 python 的安装目录。


  • Perl
  1. 进入 toolchain 目录,运行 ActivePerl-5.12.4.1205-MSWin32-x86-294981.msi
  2. 很傻瓜的安装方式,同意、下一步...所有组件全装即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值