kk Blog —— 通用基础

date [-d @int|str] [+%s|"+%F %T"]

编译努比亚内核

源码下载 http://support.zte.com.cn/support/news/NewsMain.aspx?type=service

nx403a在 http://support.zte.com.cn/support/news/NewsDetail.aspx?newsId=1004862

先解压zip在合并再解压7z,tar

修改arch/arm/configs/apq8064-nubiamini2_defconfig,加入

1
2
CONFIG_LOCALVERSION="-g3720aca-00082-g0ea2092"
CONFIG_PRIMA_WLAN=m # 这样子wlan还是起不来,只能用原来自带的proma_wlan.ko

编译

1
2
make apq8064-nubiamini2_defconfig
make

make会有些头文件的include错误,看着改改

制作boot.img

/blog/2014/12/22/android-img/

1
mkbootimg --kernel zImage --ramdisk boot.img-ramdisk.cpio.gz --base 80200000 --ramdisk_offset 1FF8000 --pagesize 2048 --cmdline "console=null androidboot.hardware=qcom user_debug=31 msm_rtb.filter=0x3F ehci-hcd.park=3 maxcpus=4" -o boot.img

刷入

对于nx403a,fastboot 命令要加 -i 0x19d2,不然识别不到设备

1
2
3
adb reboot bootloader
fastboot -i 0x19d2 flash boot boot.img
fastboot -i 0x19d2 reboot

刷入失败

刷入的boot.img有可能起不来,这时nx403a似乎无法再进入bootloader,但可以进recovery(按音量上+开机键),用官方zip升级包去刷新整个系统

Android分区

http://blog.csdn.net/kieven2008/article/details/19327907

安卓手机和平板一般包括以下标准内部分区:

1
2
3
4
5
6
/boot
/system
/recovery
/data
/cache
/misc

另外还与SD卡分区:

1
2
/sdcard
/sd-ext

system 分区

这里是挂载到/system目录下的分区。这里有 /system/bin 和 /system/sbin 保存很多系统命令。它是由编译出来的system.img来烧入。

相当于你电脑的C盘,用来放系统。这个分区基本包含了整个安卓操作系统,除了内核(kerne)和ramdisk。包括安卓用户界面、和所有预装的系统应用程序。擦除这个分区,会删除整个安卓系统。你可以通过进入Recovery程序或者bootloader程序中,安装一个新ROM,也就是新安卓系统。

MISC分区

这个分区包括了一些杂项内容:比如一些系统设置和系统功能启用禁用设置。这些设置包括CID(运营商或区域识别码)、USB设置和一些硬件设置等等。这是一个很重要的分区,如果此分区损坏或者部分数据丢失,手机的一些特定功能可能不能正常工作。

recovery分区

recovery 分区即恢复分区,在正常分区被破坏后,仍可以进入这一分区进行备份和恢复.我的理解是这个分区保存一个简单的OS或底层软件,在Android的内核被破坏后可以用bootloader从这个分区引导进行操作。

这个分区可以认为是一个boot分区的替代品,可以是你的手机进入Recovery程序,进行高级恢复或安卓系统维护工作。

boot 分区

一般的嵌入式Linux的设备中.bootloader,内核,根文件系统被分为三个不同分区。在Android做得比较复杂,从这个手机分区和来看,这里boot分区是把内核和ramdisk file的根文件系统打包在一起了,是编译生成boot.img来烧录的。

如果没有这个分区,手机通常无法启动到安卓系统。只有必要的时候,才去通过Recovery软件擦除(format)这个分区,一旦擦除,设备只有再重新安装一个新的boot分区,可以通过安装一个包含boot分区的ROM来实现,否则无法启动安卓系统。

userdata 分区

它将挂载到 /data 目录下, 它是由编译出来的userdata.img来烧入。

这个分区也叫用户数据区,包含了用户的数据:联系人、短信、设置、用户安装的程序。擦除这个分区,本质上等同于手机恢复出厂设置,也就是手机系统第一次启动时的状态,或者是最后一次安装官方或第三方ROM后的状态。在Recovery程序中进行的“data/factory reset ”操作就是在擦除这个分区。

cache 分区

它将挂载到 /cache 目录下。这个分区是安卓系统缓存区,保存系统最常访问的数据和应用程序。擦除这个分区,不会影响个人数据,只是删除了这个分区中已经保存的缓存内容,缓存内容会在后续手机使用过程中重新自动生成。

其它隐藏分区:

HBOOT

保存的bootloader HBOOT。手机的启动引导的一段程序。 类似电脑主板BIOS,这部分刷错了手机就会变成砖块。

Radio分区

保存是基带芯片的固件代码,Linux不认识其格式,在手机启动时装入特定内存中用于驱动芯片。所有与电信网络交互就是靠它了,一般往往用专用开发环境来开发。手机无线信号、蓝牙、wifi等无线管理。

splash分区

这里是启动画面。

SD卡分区

一般默认的是挂载在/sdcard目录。

这个分区不是设备系统存储空间,是SD卡空间。从使用上讲,这个是你自己的存储空间,可以随便你任意存放相片、视频、文档、ROM安装包等。擦除这个分区是完全安全的,只要你把分区中你需要的数据都备份到了你的电脑中。虽然一些用户安装的程序会使用这个分区保存它的数据和设置信息,擦除了这个分区,这些程序的数据,比如有些游戏的存档,就会全部丢失。在既有内部SD卡和外部SD卡的设备中,比如三星Galaxy S和一些平板电脑,/sdcard分区通常指向内部SD卡。外部SD卡,如果存在的话,会对应一个新的分区,每个设备都不一样。在三星Galaxy S手机中, /sdcard/sd代表的是外部SD卡,而其它设备,有可能是/sdcard2。与/sdcard不同,没有系统或应用程序数据会自动存放在外部SD卡中。外部SD卡中的所有数据都是用户自己添加进去的。在你把分区中需要的数据都备份到了你的电脑中之后,你可以安全的擦除这个分区。 SD卡扩展分区

它的目录名是 /sd-ext ,它不是一个标准的Android分区,是运行APP2D软件扩展出来分区。目的是为了多扩展一个安装程序空间,这个对于Flash空间(或者说ROM空间)不够,又喜欢安装软件的人是有用应用。

二.各分区详细分析

各个分区的内容,可以用cat命令直接导出,用一般的二进制的软件来分析,我一般用WinHex,并且自己写了几个模板。 导出分区内容,如果用adb 导出,必须有root权限,

1
2
3
4
5
6
7
8
9
10
11
12
cat /proc/mounts
rootfs / rootfs ro,relatime 0 0 #根文件系统的格式,只读
tmpfs /dev tmpfs rw,relatime,mode=755 0 0
devpts /dev/pts devpts rw,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
none /acct cgroup rw,relatime,cpuacct 0 0
tmpfs /mnt/asec tmpfs rw,relatime,mode=755,gid=1000 0 0
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
/dev/block/mtdblock3 /system yaffs2 ro,relatime 0 0 #system分区,只读
/dev/block/mtdblock5 /data yaffs2 rw,nosuid,nodev,relatime 0 0 #data分区,可读写
/dev/block/mtdblock4 /cache yaffs2 rw,nosuid,nodev,relatime 0 0 #cache分区,可读写
  1. http://bbs.hiapk.com/thread-1446706-1-1.html
  2. http://www.addictivetips.com/mobile/android-partitions-explained-boot-system-recovery-data-cache-misc/
  3. http://www.addictivetips.com/mobile/what-is-clockworkmod-recovery-and-how-to-use-it-on-android-complete-guide/

【官方固件】努比亚Z5Smini官方4.4.2全新UI公测版

http://www.onekeyrom.com/rom/zte_130038_10965.html

pan.baidu.com/s/1c0u18Ik

nx403a进入bootloader模式直接些boot分区,但是驱动没弄好起不来。这时再进bootloader却进不了(严重怀疑他们的bootloader建在boot上),只能进recovery模式。但是recovery是官方的,只能按官方方法升级整个系统救砖

本次放出的压缩包内含两套固件:从4.2升级到4.4.2和从4.4.2再降级回4.2两套共计4个zip文件包
所以请大家下载后先不要急于不要一键刷机,仔细阅读下面的使用说明和注意事项

【升级注意事项】

  1. 升级前,请取消手机的人脸解锁、图案锁、密码锁等各种屏幕锁。
  2. 升级前,请务必备份好手机内的各项重要数据(联系人、短信、通话记录、程序等),避免异常丢失。
  3. 升级前,请保证手机电池电量至少达到40%。
  4. 在升级过程中,请将手机平放,务必不要触碰手机屏幕(否则可能导致触屏失准),直至确认升级成功。
  5. 为了便于升级发生异常后的手机挽救,nubia UI ROM安装包同时提供升级文件与回退文件,请务必同时保留在手机里。

【Z5S mini 机型4.2到4.4版本升级操作说明】

步骤1: 下载Z5S mini机型的nubia UI ROM安装包(内含4个zip文件)
步骤2: 将手机连接电脑,将安装包的4个zip文件并列拷贝至手机sdcard根目录下
步骤3: 按开关机键,选择“重启”手机,在重启过程中一直长按音量上键进入recovery模式
步骤4: 在recovery模式界面,请按音量键选择apply update from sdcard菜单项,并按开关机键确定,接着按音量键选择NX403A_4.2_to_4.4_recovery_xxx.zip文件,并按开关机键确定,开始升级
步骤5: 步骤4升级完成后如下图所示,此时光标条位于reboot system now菜单项,直接按开关机键重启手机,请观察手机能否顺利进入桌面
步骤6: 手机顺利进入桌面后,请重复步骤3,即再次重启手机,并在重启过程中一直长按音量上键,再次进入recovery模式
步骤7: 在recovery模式界面,请按音量键选择wipe date/factory reset 菜单项,按开关机键进入,进行数据擦除
步骤8: 数据擦除结束后,请按音量键选择apply update fromsdcard菜单项,按开关机键进入,再按音量键选择NX403A_4.4_update_xxx.zip文件,按开关机键 确认,执行升级,此过程要1到2分钟
步骤9: 步骤8升级完成后如下图所示,此时光标条位于reboot system now菜单项,直接按开关机键重启手机

分区(看看就好)

http://www.miui.com/forum.php?mod=viewthread&tid=1804584&extra=

http://bbs.nubia.cn/thread-120471-1-1.html

http://bbs.nubia.cn/thread-128729-1-1.html

内核模块编译怎样绕过insmod时的版本检查

http://blog.sina.com.cn/s/blog_53931eca01015uky.html

在開發kernel driver時,總是會遇到討人厭的vermagic檢查,只要目前在run的kernel版本跟driver編譯時用的kernel版本不一致,就沒辦法insmod。

1
2
3
4
bash-3.2# insmod sdio.ko
sdio: version magic '2.6.28-271-gec75a15 preempt mod_unload modversions ARMv7 '
should be '2.6.28 preempt mod_unload ARMv7 '
insmod: init_module 'sdio.ko' failed (Exec format error)

這大大降低了開發速度,尤其是當你拿不到客戶在用的kernel時,又要開發driver給他用,真的是很麻煩……

那麼要怎麼利用噁心的方式繞過去呢???

一、先把 Moudle version 檢查關掉。
1
2
3
4
5
6
7
user@host # ARCH=arm make menuconfig
--- Enable loadable module support                                             │ │
│ │         [ ]   Forced module loading                                      │ │
│ │         [*]   Module unloading                                           │ │
│ │         [*]     Forced module unloading                                  │ │
│ │         [ ]   Module versioning support                                  │ │
│ │         [ ]   Source checksum for all modules
二、 使用modinfo時,可以看到目前這driver的vermagic
1
2
3
4
5
6
7
8
filename: external_drivers/omap3530/Linux/sdio/sdio.ko
author: Texas Instruments Inc
alias: TIWLAN_SDIO
license: GPL
description: TI WLAN SDIO driver
depends:
vermagic: 2.6.28-271-gec75a15 preempt mod_unload ARMv7
parm: g_sdio_debug_level:debug level (int)
三、 修改 kernel 的 vermagic,再重新編譯driver

vermagic 的第一個值 2.6.28-noneed 是由這 include/linux/utsrelease.h裡的 UTS_RELEASE 所定義。

1
#define UTS_RELEASE "2.6.28-271-gec75a15"

之後再由 include/linux/vermagic.h 裡的 macro
去組合出 VERMAGIC_STRING , 也就是 kernel 的vermagic。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <generated/utsrelease.h>

#ifdef CONFIG_SMP
#define MODULE_VERMAGIC_SMP "SMP "
#else
#define MODULE_VERMAGIC_SMP ""
#endif
#ifdef CONFIG_PREEMPT
#define MODULE_VERMAGIC_PREEMPT "preempt "
#else
#define MODULE_VERMAGIC_PREEMPT ""
#endif完成編譯後,你就可以得
#ifdef CONFIG_MODULE_UNLOAD
#define MODULE_VERMAGIC_MODULE_UNLOAD "mod_unload "
#else
#define MODULE_VERMAGIC_MODULE_UNLOAD ""
#endif
#ifndef CONFIG_MODVERSIONS
#define MODULE_VERMAGIC_MODVERSIONS "modversions "
#else
#define MODULE_VERMAGIC_MODVERSIONS ""
#endif
#ifndef MODULE_ARCH_VERMAGIC
#define MODULE_ARCH_VERMAGIC ""
#endif

#define VERMAGIC_STRING \
UTS_RELEASE " " \
MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT \
MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS \
MODULE_ARCH_VERMAGIC

所以, 我們只要把 UTS_RELEASE 改成我們的數字即可,當然若是懶得去try組合後的字串,也可以直接將VERMAGIC_STRING改成你要的字串

建議修改完 vermagic.h, utsrelease.h後,還是把kernel重編完再編kernel,比較保險。

以下是修改後,用modinfo看的結果

1
2
3
4
5
6
7
8
filename: external_drivers/omap3530/Linux/sdio/sdio.ko
author: Texas Instruments Inc
alias: TIWLAN_SDIO
license: GPL
description: TI WLAN SDIO driver
depends:
vermagic: 2.6.28 preempt mod_unload ARMv7
parm: g_sdio_debug_level:debug level (int)


另外若你是用git 做版本控制 , 那就會出現git的版本號在kernel 編號上
所以要把他關掉

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
General setup  --->
 [ ] Automatically append version information to the version strin

解釋;
CONFIG_LOCALVERSION_AUTO:                                                   │ 
  │                                                                         │ 
  │ This will try to automatically determine if the current tree is a       │ 
  │ release tree by looking for git tags that belong to the current         │ 
  │ top of tree revision.                                                   │ 
  │                                                                         │ 
  │ A string of the format -gxxxxxxxx will be added to the localversion     │ 
  │ if a git-based tree is found.  The string generated by this will be     │ 
  │ appended after any matching localversion* files, and after the value    │ 
  │ set in CONFIG_LOCALVERSION.                                             │ 
  │                                                                         │ 
  │ (The actual string used here is the first eight characters produced     │ 
  │ by running the command:                                                 │ 
  │                                                                         │ 
  │ which is done within the script "scripts/setlocalversion".)             │ 
  │                                                                         │ 
  │ Symbol: LOCALVERSION_AUTO [=y]                                          │ 
  │ Prompt: Automatically append version information to the version string  │ 
  │   Defined at init/Kconfig:84                                            │ 
  │   Location:                                                             │ 
  │ ingT

moto sbf包

解出的CG35.smg或CG35.img是boot.img, boot.img可以按照 这里 的方式编辑

注意: motorola只有一些新的机型有方法解bootloader锁,沒解锁的bootloader会验证boot、recovery等分区的完整性(两个分区都是8M),不管有用的数据还是没用的数据都加入验证(好像是隔段距离取点数据做验证,因为替换最后100字节可以刷成功,替换多点就失败。可是实际有用的boot.img大小才4M左右)。

MOTO X解BL锁教程 http://bbs.gfan.com/android-6726986-1-1.html

1 命令行解包

1
./sbf_flash -x OLYFR_U4_1.8.3_SIGNED_OLPSATTSPE_P013_HWolympus_1g_Service1FF.sbf

提取到一堆img文件

2神器:MotoAndroidDepacker

http://www.veryhuo.com/down/html/47416.html

就是这个软件,可以把moto的底包解开。
使用很简单:
1 点open from file菜单打开sbf底包,然后点split to files就解开了
2 将要打包的文件拷到单独的文件夹A,然后点open files,选择刚刚的文件夹A,然后点compile file,就会在文件夹A里面生成result\firmware.sbf文件

解包出的文件解释:

1
2
3
4
5
6
7
8
9
CG31/CDT是描述各文件版本号的, 相当于注释文件
CG33/CDROM是个ISO文件, 可以用WinRAR之类的打开, 包含PC端程序(MotoHelperAgent)
CG35/Boot包含了系统内核<-boot-only就是这个
CG39/system分区
CG40/cache缓存分区(国行多余的部分), 显然里面什么都没有
CG45/Baseband基带固件
CG47/Recovery就是官方恢复, 里面也包含独立的内核, 但不用于启动
CG61/devtree包含设备描述符
RAMDLD/RamDisk&tmpfs, Android/Linux启动初始化的一部分, 不涉及具体设备

这篇感觉没用 http://bbs.ihei5.com/thread-5883-1-1.html