目前 Android 的开发模式,均为对芯片厂商半成品的集成和修改,类似于 Linux 开发公司后期的开发模式,由芯片厂商提供开发参考代码,由生产厂商负责集成,并根据产品定义来做进一步的个性化修改。而针对不同的芯片厂商,它们所采用的集成策略也不尽相同,但同时也有共同点:
- 共同点
- 均采用 Android 的默认 Android.mk 的编译方式集成;
- 不同硬件平台代码独立;
- 均已 Google Source Code 作为 Base,再通过 manifest.xml 或 patch 来将厂商的修改集成进 Base 版本中;
- 所有模块,包括 bootloader 和 kernel 均会在 Android Source 中编译集成。
- 不同点
- 平台性代码和功能性代码每一个厂商的目录结构都有所不同;
- 对 Android 原有软件的修改方法有所不同,例如:Marvell 和 Qualcomm 对 Phone.apk 的修改方法就不一样;
从上面的描述中可以看出,记录下对一个平台的修改过程,对日后新平台的引入是非常有帮助的。下面我就针对高通 8260 芯片的,Nollec Krebs 平台构建的过程进行一个流水记录。
前期准备
- 确认新平台的版本代号;最后定义为Krebs(德语巨蟹座);(代号命名规则目前是12星座)
- 确认高通 ICS 的 base 版本,目前我们选择了最新 tag 的 M8260AAABQNLZA30140、HY11-N9123-6.zip 和 314009 的 Modem ;
- 基于 M8260AAABQNLZA30140 版本的 manifest 修改成属于我们自己 Krebs 分支的 manifest 文件;
- 基于修改的 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)完毕->功能开发->项目结束。
- 验证平台(8660_surf):按照高通文档进行编译,验证,确保 Android 能够编译通过,最好同时验证 SDK、OTA、CTS 的编译是否正常。此步骤主要为了熟悉平台框架,为下一步做好准备。
- 确认自有平台差异性项目(Krebs):当我们编译完 8660_surf 平台的功能后,需要基本掌握 Android 的编译方法,和高通硬件平台主要的几个模块的集成方法,其实主要就是 Android.mk 的修改。最后将 8660_surf 修改成 Krebs,由于我们的平台还是依赖于 8660 的,因此不是将所有的 8660_surf 都修改成 Krebs,否则将会编译不过,或引起其它问题。
- 修改增加配置:整理好思路,在这里就是一边编译一边修改了,直到编译通过。
- 适配项目(Krebs)完毕:我们已经有一个类 8660_surf 的项目 Krebs 了,但是两者在定义上一定会或多或少的区别,例如关闭 HDMI 的支持等,这个步骤需要去除这些已知不需要的功能。
- 功能开发:根据 Krebs 项目的 URD 定义,具体针对功能进行代码开发,并导入到相应分支中。
- 项目结束:完成开发不同的阶段点,直到完成 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
- 我们仅仅在公司默认安装的 Windows XP 版本中测试过环境。找 IT 部门的人员初始化一台 Windows 机器就可以了。
- 注意:未在其他系统上测试此环境。
- Cygwin
- 进入 toolchain\cygwin\setup 目录,运行 setup_26014.exe;
- 文件:Cygwin install 11.JPG
- 按下一步后,就需要漫长的等待了,需要2个小时以上。
- RealView Developer Suite
- 进入 toolchain\Rvds\RVDS2.2_B593\RVDS 2.2 SP1 目录,运行 setup.exe
- 很傻瓜的安装方式,同意、下一步...注意以下几步即可。
- 继续下一步好了,我们完成了程序的安装,不过我们还要升级和破解;先阅读 toolchain\Rvds\RVDS2.2_B593\简要说明.txt,照做后就将ARM编译器升级到593版本了。
- 破解方法,先阅读 toolchain\Rvds\RVDS 2.2 Crack\readme.txt,照做即可,提示病毒忽略(病毒也没辙,谁叫没有license呢),也可参考网络资料RVDS 2.2 的破解方法;别忘记加环境变量,右键我的电脑->属性->高级->环境变量->系统变量->增加变量LM_LICENSE_FILE = c:\flexlm\license.dat
注意:如果到这里,你的arm编译环境还是有问题,例如显示license问题,那么不是你的操作没有暗自叫好上述步骤,就是你通过windows的远程桌面做的,如果都不是,那么重装系统吧,这就是血一样的的教训总结下来的。
- Python
- 进入 toolchain 目录,运行 python-2.7.2.msi
- 很傻瓜的安装方式,同意、下一步...所有组件全装即可。
- 安装完毕后,在环境变量中加入 python 的目录,右键我的电脑->属性->高级->环境变量->系统变量->修改变量PATH,在最先面加入 python 的安装目录。
- Perl
- 进入 toolchain 目录,运行 ActivePerl-5.12.4.1205-MSWin32-x86-294981.msi
- 很傻瓜的安装方式,同意、下一步...所有组件全装即可。