Content-Type: text/x-zim-wiki
Wiki-Format: zim 0.4
Creation-Date: 2017-02-22T10:30:13+08:00
====== mt6735开发板驱动学习 ======
==== 编译源代码 ====
所谓的编译源代码 应该主要是指工程源代码(即手机厂商生成整个rom的代码,包括内核,驱动,中间层,各个不同芯片厂商的不同代码,framework,以及应用等等) 这个源代码比谷歌发布的 要更丰富 更完善 很多对象谷歌的那套源代码都是没有实现的 是空的
不知道是不是这样,个人理解,因为谷歌的源码除了生成模拟器,好像其他感觉都没实现(例如很多在模拟器上无法实现的)
第二,编译源码一般是为了获取隐藏api,因为sdk提供的api有些没有提供,但是确实存在,在源码下能编译通过
其次,手机厂商是肯定要编译源码的
还有些啥 一些发烧友可能也会编译改些东西玩玩
源码里面分为多个文件夹 vender里面就是你需要添加的东西,一般不需要裁减,除非你想去掉一些系统的东西,另外kernel 驱动等都是需要各厂家自己定制的。
源码编译后除了得到系统文映像件system.img 和 userdate.img 外,我在有些资料上看到还有 SDK 工具的产生, SDK 工具是编译源码生成、
==== android源码编译完成之后 ====
Android源码编译完成之后,在根目录下会有一个out目录生成,如果我们想要运行虚拟机的话,需要配置一下环境变量.
首先我们使用下面的命令打开配置环境变量的文件:
gedit ~./bashrc
在这个文件的最后,添加如下代码:
export ANDROID_PRODUCT_OUT=~/android/out/target/product/generic
ANDROID_PRODUCT_OUT_BIN=~/android/out/host/linux-x86/bin
export PATH=${PATH}:${ANDROID_PRODUCT_OUT_BIN}:${ANDROID_PRODUCT_OUT};
其中,ANDROID_PRODUCT_OUT和ANDROID_PRODUCT_OUT_BIN填写的是自己的对应的文件的目录.
填写完成之后,保存,使用下面的命令更新环境变量.
source [[~/.bashrc]]
下面就可以使用emulator启动安卓虚拟机了.
启动Android虚拟机需要四个文件,__zImage__,system,img,userdata.img和randisk.img,其中第一个是Linux内核镜像文件,后面三个是Android系统镜像文件
1,准备开发板的驱动
2,放进源码内核
3,编译源码生成底包
4刷机
boot.img 内核镜像
system.img
=== ramdisk 软盘在android中的使用 ===
http://blog.csdn.net/wh_19910525/article/details/7536047
ramdisk中包含一些对于启动android的很重要的文件,比如内核启动完后,加载的第一个进程init,一些重要的配置文件等,总之它控制着整个android的启动。
ramdisk的使用有两种方法:1,编译进内核;2,将ramdisk单独烧写
recovery.img是设备进入recovery模式时所加载的镜像。recovery模式就是用来更新系统的,我们可以认为我们的设备具有两个系统。一个是正常的系统,它由boot.img、system.img、ramdisk.img和userdata.img等组成,另外一个就是recovery系统,由recovery.img组成
由于recovery.img和boot.img都是用来启动系统的,因此,它们的内容是比较类似,例如都包含有Kernel及其启动参数、Ramdisk,以及可选的BootLoader第二阶段。
=== 刷机烧录 ===
out/target/product/lentk6735_65c_l1/lk.bin
out/target/product/lentk6735_65c_l1/recovery.img
out/target/product/lentk6735_65c_l1/boot.img
out/target/product/lentk6735_65c_l1/logo.bin
out/target/product/lentk6735_65c_l1/system
一般 Android 系统都有两个分区 /boot 和 /recovery。这两个分区都可以引导系统
recovery卡刷相当于ghost,但是他的主要用途是更新系统rom,方便备份和格式化
fastboot可以简单的理解是一个电脑的Bios。一般__线刷底包__才会用到
=== 驱动目录 ===
[[~/mt6753/alps/kernel-3.10/drivers/misc/mediatek/tooan]]
编译
make -j8 没编到驱动
make bootimg试试
[[~/mt6753/alps/out/target/product/lentk6735_65c_l1/obj/KERNEL_OBJ/drivers/misc/mediatek]]
没有tooan目录
DTC arch/arm64/boot/dts/lentk6735_65c_l1.dtb
Warning (ranges_format): /soc has empty "ranges" property but its #address-cells (1) differs from / (2)
Warning (ranges_format): /soc has empty "ranges" property but its #size-cells (1) differs from / (2)
CAT arch/arm64/boot/Image.gz-dtb
make[1]: Leaving directory `/home/mpa/mt6753/alps/kernel-3.10'
Target boot image: out/target/product/lentk6735_65c_l1/boot.img
=== 仿照系统自带的spi来写自己的驱动 ===
在上一级目录的makefile文件添加tooan模块
===== 添加tooan驱动过程 =====
[[~/mt6735/alps/kernel-3.10/drivers/misc/mediatek/tooan]]
编译
make -j8 没编到驱动
make bootimg试试
[[~/mt6735/alps/out/target/product/lentk6735_65c_l1/obj/KERNEL_OBJ/drivers/misc/mediatek]]
makefile 注释我用//竟然没报错
把系统自带的spi改错,看编译报错与否?
#add by tony
试试obj-y += tooan/
发现还是不报错看来是没有编到
把obj-y +=tooan/放在第一行
可以编到
SP_Flash_Tool_exe_Linux_v5.1620.00.100 刷机
{{./pasted_image.png}}
开发板先关机,用root权限执行
root@mpa:/home/mpa/Tools/mt6735_5.1/tools/SP_Flash_Tool_exe_Linux_v5.1620.00.100# ./flash_tool
执行shell脚本运行flash tool
点击download
然后按下音量键+和电源进入fastboot模式刷底包
mpa@mpa:~$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 003 Device 003: ID 0000:0538
Bus 001 Device 003: ID 5986:02d5 Acer, Inc
__Bus 001 Device 028: ID 0e8d:2003 MediaTek Inc. __
拔掉手机后再试试发现 最后一个没有说明那个是手机的编号
在源码目录下编译过源码后可以用adb命令,其他目录不行
root@mpa:/home/mpa/mt6735/alps# adb shell
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
root@lentk6735_65c_l1:/ #
然后可以在源码package/apps目录下TooanFp目录下mm编译apk后
通过adb install 命令安装
==== 安卓6.0 mtk6735 管脚配置 ====
[[~/mt6735/alps/kernel-3.10/arch/arm/boot/dts/]]mt6735-pinfunc.h
==== 安卓5.1 mtk6735 管脚配置 ====
[[/home/mpa/mt6735/alps/kernel-3.10/drivers/misc/mediatek/mach/mt6735/lentk6735_65c_l1/dct/dct]][[~/mt6735/alps/kernel-3.10/arch/arm/boot/dts/|/]]mt6735-pinfunc.h
#define PINMUX_GPIO65__FUNC_GPIO65 (MTK_PIN_NO(65) | 0)
#define PINMUX_GPIO65__FUNC___SPI_CS__A (MTK_PIN_NO(65) __| 1)__
#define PINMUX_GPIO65__FUNC_EXT_FRAME_SYNC (MTK_PIN_NO(65) | 2)
#define PINMUX_GPIO65__FUNC_I2S3_MCK (MTK_PIN_NO(65) | 3)
#define PINMUX_GPIO65__FUNC_KROW2 (MTK_PIN_NO(65) | 4)
#define PINMUX_GPIO65__FUNC_GPS_FRAME_SYNC (MTK_PIN_NO(65) | 5)
#define PINMUX_GPIO65__FUNC_PTA_RXD (MTK_PIN_NO(65) | 6)
#define PINMUX_GPIO65__FUNC_DBG_MON_A22 (MTK_PIN_NO(65) | 7)
#define PINMUX_GPIO66__FUNC___SPI_CK__A (MTK_PIN_NO(__66) | 1__)
#define PINMUX_GPIO67__FUNC_SPI_MIA (MTK_PIN_NO(67) | 1)
#define PINMUX_GPIO68__FUNC_SPI_MOA (MTK_PIN_NO(68) | 1)
#define PINMUX_GPIO69__FUNC_DISP_PWM (MTK_PIN_NO(69) | 1)
#define PINMUX_GPIO69__FUNC_GPIO69 (MTK_PIN_NO(69) | 0)
#define PINMUX_GPIO69__FUNC_DISP_PWM (MTK_PIN_NO(69) | 1)
#define PINMUX_GPIO69__FUNC_PWM1 (MTK_PIN_NO(69) | 2)
#define PINMUX_GPIO69__FUNC_LTE_MD32_JTAG_TRST (MTK_PIN_NO(69) | 3)
#define PINMUX_GPIO69__FUNC_TDD_TRSTN (MTK_PIN_NO(69) | 4)
#define PINMUX_GPIO69__FUNC_ANT_SEL7 (MTK_PIN_NO(69) | 5)
#define PINMUX_GPIO69__FUNC_DM_JTINTP (MTK_PIN_NO(69) | 6)
==== 修改framework的activity/phoneWindowManager/SystemServer/Settings ====
=== 然后make -j8 systemimage ===
frameworks/base/core/java/android/app/Activity.java:1265: error: cannot find symbol
String lastPackage = Settings.System.getString(getContentResolver(), __Settings.System.TOOAN_LAST_LOCK_APP_PACKAGE_NAME__);
^
symbol: variable TOOAN_LAST_LOCK_APP_PACKAGE_NAME
location: class System
frameworks/base/core/java/android/app/Activity.java:1266: error: cannot find symbol
int appLockAble = Settings.System.getInt(getContentResolver(), Settings.System.TOOAN_USEDTO_APPLOCK, 0);
^
symbol: variable TOOAN_USEDTO_APPLOCK
location: class System
frameworks/base/core/java/android/app/Activity.java:1276: error: cannot find symbol
String appString = Settings.System.getString(getContentResolver(), Settings.System.TOOAN_NEEDLOCKAPP_PACKAGE_NAME);
^
symbol: variable TOOAN_NEEDLOCKAPP_PACKAGE_NAME
location: class System
frameworks/base/core/java/android/app/Activity.java:1286: error: cannot find symbol
if (Settings.System.getInt(getContentResolver(), Settings.System.TOOAN_USEDTO_SCREENLOCK, 0) == 1) {
^
symbol: variable TOOAN_USEDTO_SCREENLOCK
location: class System
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
4 errors
make: *** [out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes-full-debug.jar] Error 41
#### make failed to build some targets (04:40 (mm:ss)) ####
setting里没有定义__TOOAN_LAST_LOCK_APP_PACKAGE_NAME__
=== 在设置里定义自己的key ,以后就可以通过key来存一些 设置偏好 ===
Settings数据存放在com.Android.providers.settings/databases/settings.db 中
数据库中数据的默认数据在frameworks/base/packages/SettingsProvider/res/values/defaults.xml中定义,如果要在数据库中添加一个新的字段,则可用如下步骤:
1、在defaults.xml中为新加的数据定义一个默认值(当然也可在代码中直接给定)
2、在frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.Java中的loadSystemSettings()方法中加入新字段的添加代码,如下:
loadIntegerSetting(stmt, "homescreen_switch_effict",
R.integer.def_homescreen_switch_effict);
3、重新编译一个SettingsProvider.apk,再替换原来的SettingsProvider.apk
4、用Settings.System.putInt();Settings.System.getInt()来设置和取得设置的值
通常很多定制系统或者与系统相关的应用都需要查询/设置Settings(设置)里边的值,比如系统亮度,休眠时间,锁屏之类的系统设置等,主要通过SettingsProvider来查询/设置,前提是要知道所要修改的值的数据类型与字符串代表的name。
对应的name值与数据类型在./ics/frameworks/base/core/java/android/provider/Settings.java文件中
在frameworks/base/packages/SettingsProvider/src/com/android/providers/Settings.java定义,都是字符串常量。这样数据库中就形成了“属性--值”这样的映射存储
http://blog.csdn.net/sgmenghuo/article/details/46238009
刷机后发现系统很卡,点几下就重启
现在注释掉activity里添加的部分重新刷机试试