MTK SmartPhone Record-(4)

来源:互联网 发布:程序员未来的发展趋势 编辑:程序博客网 时间:2024/06/06 00:03
1.MT6572修改蓝牙名称
若修改上层无效的话,则改底层。
上层:\mediatek\frameworks-ext\base\core\jni\android_bluetooth_common.h
修改: #define BTMTK_ANDROID_DEFAULT_LOCAL_NAME "ANDROID BT"
底层:\mediatek\config\common\custom.conf
修改: bluetooth.HostName = Zyrex

2.延时背光
\mediatek\source\kernel\drivers\leds\leds.c
static int mt65xx_led_set_cust(struct cust_mt65xx_led *cust, int level)
{
....
switch (cust->mode) {
case MT65XX_LED_MODE_PWM:
if(strcmp(cust->name,"lcd-backlight") == 0)
{
bl_brightness = level;
if(level == 0)
{
mt_set_pwm_disable(cust->data);
mt_power_off (cust->data);
}else
{
level = brightness_mapping(tmp_level);
if(level == ERROR_BL_LEVEL)
level = brightness_mapto64(tmp_level);
mdelay(200); //加延时
backlight_set_pwm(cust->data, level, bl_div,&cust->config_data);
}
                bl_duty = level;
}else{...}

3.修改测试apk读出的CPU主频
修改系统在sys下面的频率显示,在/kernel/drivers/cpufreq/cpufreq.c
/**
* cpufreq_per_cpu_attr_read() / show_##file_name() -
* print out cpufreq information
*
* Write out information from cpufreq_driver->policy[cpu]; object must be
* "unsigned int".
*/

#define show_one(file_name, object) \
static ssize_t show_##file_name \
(struct cpufreq_policy *policy, char *buf)  \
{ \
return sprintf(buf, "%u\n", policy->object);
\
}

#define show_change(file_name, object)  \
static ssize_t show_##file_name \
(unsigned int val, char *buf) \
{ \
return sprintf(buf, "%u\n", 1200000); 
\
}

show_one(cpuinfo_min_freq, cpuinfo.min_freq);
//show_one(cpuinfo_max_freq, cpuinfo.max_freq);
show_change(cpuinfo_max_freq, cpuinfo.max_freq);  //change by azad  for change the freq
show_one(cpuinfo_transition_latency, cpuinfo.transition_latency);
show_one(scaling_min_freq, min);
show_one(scaling_max_freq, max);
//show_one(scaling_cur_freq, cur);
show_change(scaling_cur_freq, cur);


cpuinfo.max_freq  系统的最大频率

scaling_cur_freq     系统当前的频率

修改这两个频率的的接口,不从系统中读取,直接写死

4. 使用定时器timer实现按钮闪烁的效果
private count  = 0;
private change = false;

import java.util.Timer;
import java.util.TimerTask;

//animation flash effect
private void forwardbtnAnimation(){
       count  = 0;
       change = false;
       timer = new Timer();
       task = new TimerTask() {
           public void run() {
               runOnUiThread(new Runnable() {
                   public void run() {
                       if (count < 10) {  //闪烁5次
                           if (change == true) {
                               change = false;
                               forwardbtn.setVisibility(View.VISIBLE);
                           } else {
                               change = true;
                               forwardbtn.setVisibility(View.INVISIBLE);
                           }
                           count++;
                       }
                   }
               });
           }
       };
       timer.schedule(task,0,100); //0表示立即开始,100为每100ms执行一次
   } 

提示:android控件的都是线程不安全的,因此更新控件必须得放在Runnable()中。

5. 下面我们就来讲讲如何通过代码来获取CPU频率:
package com.orange.cpu;


import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;

public class CpuManager {

        // 获取CPU最大频率(单位KHZ)
     // "/system/bin/cat" 命令行
     // "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq" 存储最大频率的文件的路径
        public static String getMaxCpuFreq() {
                String result = "";
                ProcessBuilder cmd;
                try {
                        String[] args = { "/system/bin/cat",
                                        "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq" };
                        cmd = new ProcessBuilder(args);
                        Process process = cmd.start();
                        InputStream in = process.getInputStream();
                        byte[] re = new byte[24];
                        while (in.read(re) != -1) {
                                result = result + new String(re);
                        }
                        in.close();
                } catch (IOException ex) {
                        ex.printStackTrace();
                        result = "N/A";
                }
                return result.trim();
        }

         // 获取CPU最小频率(单位KHZ)
        public static String getMinCpuFreq() {
                String result = "";
                ProcessBuilder cmd;
                try {
                        String[] args = { "/system/bin/cat",
                                        "/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq" };
                        cmd = new ProcessBuilder(args);
                        Process process = cmd.start();
                        InputStream in = process.getInputStream();
                        byte[] re = new byte[24];
                        while (in.read(re) != -1) {
                                result = result + new String(re);
                        }
                        in.close();
                } catch (IOException ex) {
                        ex.printStackTrace();
                        result = "N/A";
                }
                return result.trim();
        }


         // 实时获取CPU当前频率(单位KHZ)
        public static String getCurCpuFreq() {
                String result = "N/A";
                try {
                        FileReader fr = new FileReader(
                                        "/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq");
                        BufferedReader br = new BufferedReader(fr);
                        String text = br.readLine();
                        result = text.trim();
                } catch (FileNotFoundException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                }
                return result;
        }


        // 获取CPU名字
        public static String getCpuName() {
                try {
                        FileReader fr = new FileReader("/proc/cpuinfo");
                        BufferedReader br = new BufferedReader(fr);
                        String text = br.readLine();
                        String[] array = text.split(":\\s+", 2);
                        for (int i = 0; i < array.length; i++) {
                        }
                        return array[1];
                } catch (FileNotFoundException e) {
                        e.printStackTrace();
                } catch (IOException e) {
                        e.printStackTrace();
                }
                return null;
        }
}


6. MT6572建工程,需另外在如下目录建
\bootable\bootloader\lk\build-mbk72_wet_jb3_yibotong
\bootable\bootloader\lk\build-mbk72_wet_jb3_yibotong\custom\mbk72_wet_jb3_yibotong
\bootable\bootloader\lk\custom\mbk72_wet_jb3_yibotong
\bootable\bootloader\lk\project\mbk72_wet_jb3_yibotong.mk

7. Class.getSimpleName()的作用
public class sample{
 public static void main(String[] args){
   //得到类的简写名称
   System.out.println(sample.class.getSimpleName());
 
  //得到对象的全路径
  System.out.println(sample.class);
 
  //得到对象的类模板示例,也就是Class
  System.out.println(sample.class.getClass());
 
  //得到Class类的名称
  System.out.println(sample.class.getClass().getName());

}
打印结果为:
sample
class com.lovo.test.sample
class java.lang.Class
java.lang.Class


8.MTK Android部分配置修改
(1)MTK Android浏览器输入框字数限制
/mediatek/frameworks/base/res/res/values/config.xml:    <integer name="max_input_browser_search_limit">2000</integer>

(2)系统默认值(默认背光亮度及默认背光时间):
修改如下无效:
frameworks\base\core\res\res\values\Config.xml:  <integer name="config_screenBrightnessSettingDefault">102</integer>
DisplaySettings.java中private static final int FALLBACK_SCREEN_TIMEOUT_VALUE = 30000;
需要修改:
frameworks/base/packages/SettingsProvider/res/values/defaults.xml中的值,系统初始化创建table的时候会从default.xml中取值
(3)有些跟运营商有关的配置放在:
Defaults.xml (\mediatek\operator\op01\packages\apps\plugins\res\values\)
(4)默认音量修改:
思路:DatabaseHelper.java中查看加载音量数据库函数loadVolumeLevels(db); 具体修改AudioManager.java文件中的DEFAULT_STREAM_VOLUME
最大音量:
AudioService.java中MAX_STREAM_VOLUME
(5)系统数据库初始化流程参考:
http://www.docin.com/p-583591404.html

(6)view相关配置:
ViewConfiguration.java (base\core\java\android\view)
如默认待机长按HOME键时间配置:DEFAULT_LONG_PRESS_TIMEOUT

(7)待机launcher相关速度优化参数配置:
PagMAX_PAGE_SNAP_DURATIONedView.java (z:\media\f89cbe729cbe2b50\project\mt6589_td\packages\apps\launcher2\src\com\android\launcher2)


(8)电池电量处理消息:
BatteryService.java,如发送低电消息sendBatteryLow,4.2.1中在文件PowerUI.java中处理,先前的可能在StatusBarPolicy.java中处理
状态栏电量百分比显示:
BatteryController.java:
action:ACTION_BATTERY_PERCENTAGE_SWITCH控制电量显示方式
(9)屏幕点亮:
mPowerManager.wakeUp(SystemClock.uptimeMillis());

(10)RTSP,RTP,RTCP端口号
http://wenku.it168.com/d_000650129.shtml

(11)NavigationBar开关
frameworks/base/core/res/res/values/config.xml:<boolname="config_showNavigationBar">false</bool>
参考:http://blog.csdn.net/yihongyuelan/article/details/7623578

(12)通话界面下拉状态栏屏蔽:
InCallScreen.java中函数:updateExpandedViewState

(13)下拉状态栏快捷图标代码:
QuickSettingsConnectionModel.java (frameworks\base\packages\systemui\src\com\android\systemui\statusbar\toolbar)

(14)wifi状态栏和设置菜单中在不同的地方显示(4.2):
状态栏在NetworkControllerGemini.java里面的updateWifiIcons函数更新icon
设置菜单在AccessPoint.java里调用update通知preference更新icon

(15)通话界面线控耳机:(目前验证下来并没有执行这里)
PhoneUtils.java文件中函数:handleHeadsetHook

(16)来电/锁屏界面自定义view:
com.android.internal.widget.multiwaveview.GlowPadView
部分配置:
prvandroid:targetDrawables="@array/incoming_call_widget_3way_targets"
?prvandroid:targetDescriptions="@array/incoming_call_widget_3way_target_descriptions"
prvandroid:directionDescriptions="@array/incoming_call_widget_3way_direction_descriptions"
prvandroid:handleDrawable="@drawable/ic_in_call_touch_handle"
prvandroid:innerRadius="@*android:dimen/glowpadview_inner_radius"
prvandroid:outerRadius="@*android:dimen/glowpadview_target_placement_radius"
prvandroid:outerRingDrawable="@*android:drawable/ic_lockscreen_outerring"
prvandroid:snapMargin="@*android:dimen/glowpadview_snap_margin"
prvandroid:vibrationDuration="20"
prvandroid:feedbackCount="1"
prvandroid:glowRadius="@*android:dimen/glowpadview_glow_radius"
prvandroid:pointDrawable="@*android:drawable/ic_lockscreen_glowdot"?
配置修改:frameworks/base/core/res/res/values/dimens.xml

(17)按键定义:
KeyEvent.java (frameworks\base\core\java\android\view)
(18)按键处理:
PhoneWindowManager.java (frameworks\base\policy\src\com\android\internal\policy\impl)
参考《Android的全局键(home键_长按耳机键)详解》:http://wenku.baidu.com/view/43f4606ea98271fe900ef900.html
按键驱动底层发消息:
accdet.c

(18)Vcard相关:
tag字段定义:VCardConstants.java


9. Android 4.2 系统编译 找不到添加的内部资源:com.android.internal.R
android 4.2相比4.1又做了一些改动,将所有私有资源的声明放到了framework/base/core/res/res/values/symbols.xml中。
如果对系统新增了一些资源进行源码编译时会遇到 com.android.internal.R.XX   can not find symbol的问题。
具体解决方法网上已经有人提出:
make framework 2>&1 | sed -n -f MakeJavaSymbols.sed | sort -u
使用这个命令将会列出所有新增的私有资源,将它们拷贝到symbols.xml中即可。

10. APK安装路径
<manifest>  标签下的android:installLocation 属性internalOnly 是安装到手机内存,preferExternal 是sd卡  “auto”是先检测内存是否足够空间,如果不能安装就会选择安装到sd卡上

11. 存储
手机: internal storage 即:Data下的
存储卡: /storage/sdcard0 即:phone storage 文件管理下看得到的
扩展存储: /storage/sdcard1/即: 外插T卡


12. android 修改默认浏览器的默认主页和去除书签
(1)修改默认的 主页网址
packages/apps/Browser/src/com/android/browser/sitenavigation下SiteNavigation.java里
把 public static final Uri SITE_NAVIGATION_URI = Uri.parse("content://com.android.browser.site_navigation/websites");改成
public static final Uri SITE_NAVIGATION_URI = Uri.parse("http://www.google.com/");

在mtk_strings.xml 与 strings.xml里 把
    <string name="homepage_base_site_navigation" translatable="false">
        content://com.android.browser.site_navigation/websites</string>
    改成 
    <string name="homepage_base_site_navigation" translatable="false">
        http://www.google.com/</string>
    (2) 修改书签    
    packages/apps/Browser/res/values/strings.xml 或有可能是 \packages\apps\Browser\res\values\mtk_strings.xml
    strings.xml mtk_strings.xml注释掉下面的
    <!--  The build-in bookmark for yahoo -->
    <string-array name="bookmarks_for_yahoo" translatable="false">
        <!--item>Yahoo! Mobile</item>
        <item>http://m.yahoo.com/?.tsrc=mtk&amp;.sep=mtkbrowser</item>
        <item>Yahoo! Mail</item>
        <item>http://m.yahoo.com/mail?.tsrc=mtk&amp;.sep=mtkbrowser</item>
        <item>Yahoo! Messenger</item>
        <item>http://m.yahoo.com/w/bp-messenger?.tsrc=mtk&amp;.sep=mtkbrowser</item>
        <item>Yahoo! News</item>
        <item>http://m.yahoo.com/news?.tsrc=mtk&amp;.sep=mtkbrowser</item-->
    </string-array>
    <string-array name="bookmarks" translatable="false">
        <!--item>Google</item>
        <item>http://www.google.com/</item>
        <item>Picasa</item>
        <item>http://picasaweb.google.com/</item-->
        ......
    </string-array>
    
    bookmarks_icons.xml里 注释掉下面的
    <array name="bookmark_preloads_for_yahoo">
    
     </array>
     <array name="bookmark_preloads">
        <!--item>@raw/favicon_google</item>
        <item>@raw/thumb_google</item>
        <item>@raw/favicon_picasa</item>
        <item>@raw/thumb_picasa</item-->
......
    </array>
   
13. 添加、设置APN    
\mediatek\frameworks\base\telephony\etc\apns-conf.xml

14. Android.mk中添加宏定义(试了一次,好像没生效)
在Boardconfig.mk
中添加一个
IS_FLAG := true
由于Boardconfig.mk和各目录的Android.mk是相互关联的
所以我们可以在Android.mk 中添加一个
ifdef IS_FLAG
          LOCAL_CFLAGS += -DHHHH
endif
在Android.mk中添加的这行相当于在 该目录下的文件中定义了一个宏
#define HHHH
如果我们想要在某个工程中根据工程的不同来对相关的代码中的某段参数进行选择时,可以参考此方法

15. 紧急号码定制
在 \frameworks\base\telephony\java\android\telephony\PhoneNumberUtils.java
String []emergencyNumList = {"112", "911", "000", "08", "110", "118", "119", "999"};


16. 各国时区显示
\frameworks\base\core\res\res\xml\time_zones_by_country.xml


17. 按键配置文件位置
find -name *.idc
./frameworks/base/data/keyboards/qwerty2.idc
./frameworks/base/data/keyboards/qwerty.idc
./out/target/product/godbox/system/usr/idc/qwerty2.idc
./out/target/product/godbox/system/usr/idc/qwerty.idc
./device/samsung/tuna/Melfas_MMSxxx_Touchscreen.idc
./device/samsung/crespo/mxt224_ts_input.idc
./device/moto/wingray/qtouch-touchscreen.idc


18. 72 T卡热插拨如何配置
软件修改如下:
GPIO配置,Board.c中
#define MSDC_SDCARD_FLAG  (MSDC_SYS_SUSPEND | MSDC_CD_PIN_EN | MSDC_REMOVABLE | MSDC_HIGHSPEED| MSDC_UHS1 |MSDC_DDR)
插上T卡,第9pin跟第8pin 相连,电压一直在跳动

R723,R724贴0欧电阻
PS:还是硬件问题,插上T卡将第9脚接地即可

FAQ Content
[DESCRIPTION]
       在实现SD卡热插拔机制时,需要注意的几个方面
[SOLUTION]
      1,sd卡热插拔机制的实现需要软件和硬件同时配合才能实现。
      2,在电路上,需要一根单独的检测pin脚,通过检测pin脚的高低电平来检测sd卡的插拔动作,并在dws中将其配置成上拉或下拉
      3,软件上的配置主要就是在\mediatek\custom\<proj>\kernel\core\src\board.c中,msdc1_hw 结构体中的 flags 的 MSDC_CD_PIN_EN 和 MSDC_REMOVABLE ,这两个flag是热插拔的flag,如果不需要热插拔,请把这两个flag移除。
      4,如果是低电平触发,将msdc1_hw中的.cd_level  设置成 MSDC_CD_LOW,否则设置成MSDC_CD_HIGH


19. MT6575 3G切换2G
(1)在mediatek/custom/common/modem/  路径下增加一个文件夹: abc_gprs
(2)修改修改编译工程配置文件ProjectConfig.mk 文件
[2G] 
CUSTOM_MODEM= abc_gprs
MTK_VT3G324M_SUPPORT= no
MTK_MODEM_SUPPORT= modem_2g
MTK_FD_SUPPORT= no
MTK_GEMINI_3G_SWITCH=no
MTK_FD_FORCE_REL_SUPPORT=no
MTK_RAT_WCDMA_PREFERRED = no
MTK_MD1_SUPPORT=1

[3G]        
CUSTOM_MODEM= yecon75_tb_ics_hspa
MTK_VT3G324M_SUPPORT= yes
MTK_MODEM_SUPPORT= modem_3g
MTK_FD_SUPPORT= yes
MTK_GEMINI_3G_SWITCH=yes
MTK_FD_FORCE_REL_SUPPORT=yes
MTK_RAT_WCDMA_PREFERRED =yes
MTK_MD1_SUPPORT=3

执行命令 ./mk abc new
0 0