MTK SmartPhone Record-(5)

来源:互联网 发布:重庆大数据培训 编辑:程序博客网 时间:2024/06/05 18:48
1. 把设置菜单下的黑色背景换成图片显示,修改如下: 
(1)找开 \packages\apps\Settings\AndroidManifest.xml 文件,找到 Setting菜单的主题
android:theme="@android:style/Theme.Holo"
(2)找开 \frameworks\base\core\res\res\values\themes.xml 文件,找到
   <style name="Theme.Holo">
        把<item name="windowBackground">@android:drawable/screen_background_selector_light</item>
改成:<item name="windowBackground">@android:drawable/setting_bg</item>
注:setting_bg.png放在 \frameworks\base\core\res\res\drawable-hdpi 目录下。

2. 外部类的对象去实例化一内部类的对象
Outer 外部类
Inner 内部类
public class InnerCalssDemo3
{
public static void main(String[] args)
{
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
inner.display();
}
}

3. publicclass APN {
         publicStringid;
         publicStringset;  //我自己添加的,用户确认是否需要设置为默认
         publicString name; //显示的名称
         publicString apn;   //接入点名称 cmwap/cmnet…….
         publicString mcc;   //国家编号
         publicString mnc;  //运营商编号
         publicString numeric;  //mcc+mnc运营商在全球上唯一标识
         publicString user;  //用户名
         publicString password;  //密码
         publicString server;   //服务
         publicString proxy;   //代理
         publicString port;  //端口
         publicString mmsport;   //短信端口
         publicString mmsproxy;   //短信代理
         publicString mmsc;
         publicString authtype; 
         publicString current;  //当=“1”的时候,显示
         publicString type;  //类型
}


4. 修改插入Usb安装驱动时弹出的字串显示: #define PRODUCT_STRING "MT65xx Android Phone"
文件路径: \kernel\drivers\usb\gadget\android.c

5. 自动删除文件
方法一:
     public static boolean deleteFoder(File file) {
                if (file.exists()) { // 判断文件是否存在
                        if (file.isFile()) { // 判断是否是文件
                                file.delete(); // delete()方法 你应该知道 是删除的意思;
                        } else if (file.isDirectory()) { // 否则如果它是一个目录
                                File files[] = file.listFiles(); // 声明目录下所有的文件 files[];
                                if (files != null) {
                                        for (int i = 0; i < files.length; i++) { // 遍历目录下所有的文件
                                                deleteFoder(files[i]); // 把每个文件 用这个方法进行迭代
                                        }
                                }
                        }
                        boolean isSuccess = file.delete();
                        if (!isSuccess) {
                                return false;
                        }
                }
                return true;
        }用这个方法解决
    方法二:
    File f=new File(“路径”)
if(f.exist()){
f.delete();

这个是可以实现的,需要权限

<!-- 在SDCard中创建与删除文件权限 -->
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <!-- 往SDCard写入数据权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    


6. 关机电压
\mediatek\kernel\include\mach\battery_common.h
#define SYSTEM_OFF_VOLTAGE3400

7. 改假内存
alps\kernel\fs\proc\meminfo.c

8. 具体对应时区
\frameworks\base\core\res\res\xml\time_zones_by_country.xml

9. android工程源码root手机
APK获取Root的su权限

针对一些APK,只有在一键Root之后才能使用的问题,如下是破解方法:
(1)在源码顶层目录下搜索su.c,find -name Su.c
(2)修改Su.c   路径:\system\extras\su\su.c
int main(int argc, char **argv)
{
...
   /* Until we have something better, only root and the shell can use su. */
    myuid = getuid();
#if 0 //注释掉如下if模块,就是su的时候不检查uid的权限了
   if (myuid != AID_ROOT && myuid != AID_SHELL) {
       fprintf(stderr,"su: uid %d not allowed to su\n", myuid);
       return 1;
   }
#endif
....
}
(3)然后需要在init.rc中添加chmod 4777 /system/xbin/su     修改su的属性
修改su.c后,可以直接用adb把重新生成的su push到手机里
但是修改了init.rc需要刷boot.img
(4)如有必要:如果涉及到/data目录而非/data/data/<你的包名>/的修改,则修改system/core/rootdir/init.rc
将 mount yaffs2 mtd@userdata /data nosuid nodev 改为 mount yaffs2 mtd@userdata /data nodev

10. Android 双卡改单卡
双卡:
GEMINI = yes
MTK_GEMINI_ENHANCEMENT = yes
MTK_GEMINI_3G_SWITCH = yes
MTK_SHARE_MODEM_SUPPORT = 2
MTK_SHARE_MODEM_CURRENT = 2

单卡:
GEMINI = no
MTK_GEMINI_ENHANCEMENT = no
MTK_GEMINI_3G_SWITCH = no
MTK_SHARE_MODEM_SUPPORT = 2
MTK_SHARE_MODEM_CURRENT = 1

10-1. MT6575 3G切换2G
(1)在mediatek/custom/common/modem/  路径下增加一个文件夹: yecon15_tb_ics_gprs
(2)修改修改编译工程配置文件ProjectConfig.mk 文件
[2G] 
CUSTOM_MODEM= yecon15_tb_ics_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 yecon75_tb_ics new

11.
dip  device independent pixels(设备独立像素). dip的换算: dip(value)=(int) (px(value)/1.5 + 0.5)
dp (与密度无关的像素):同dip是一样的。 一种基于屏幕密度的抽象单位。在每英寸160点的显示器上,1dp = 1px。 dip 与dp相同,多用于android/ophone示例中。
px  pixels(像素)  屏幕上的点,不同设备不同的显示屏显示效果相同,这是绝对像素,是多少就永远是多少不会改变。
sp  scaled pixels — best for text size (放大像素)(与刻度无关的像素):主要处理字体的大小。与dp类似,但是可以根据用户的字体大小首选项进行缩放。主要用于字体显示best for textsize。
由此,根据 google 的建议,TextView 的字号最好使用 sp 做单位,而且查看TextView的源码可知 Android 默认使用 sp 作为字号单位。
pt(磅) point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用; 在 Android 中,1pt 大概等于 2.22sp
in  inches(英寸):长度单位。
mm  millimeters(毫米):长度单位。

12. android 电话接通时震动
电话接通时振动功能,亦可进一步做成系统设置选项,用preference实现。
package com.android.phone;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneBase;
import com.android.internal.telephony.gsm.SuppServiceNotification;
import com.android.phone.CdmaDisplayInfo;
import com.android.phone.NotificationMgr;
import com.android.phone.CallNotifier.InCallTonePlayer;


import android.os.AsyncResult;
import android.os.Message;
import android.util.Log;


//来电入口类
public class CallNotifier extends Handler implements CallerInfoAsyncQuery.OnQueryCompleteListener {


    //保存上一状态
    private Call.State mPreviousCallState;
    
    private void onNewRingingConnection(AsyncResult r) {
    }
    
    //处理通话状态message
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            //other
            case PHONE_STATE_CHANGED:
                onPhoneStateChanged((AsyncResult) msg.obj);
                break;
            //other
        }
    }
    
    //通话状态改变时
    private void onPhoneStateChanged(AsyncResult r) {
        //other
        //判断来电状态,若刚接通则震动
        if ((mPhone.getForegroundCall().getState() == Call.State.ACTIVE) 
                && ((mPreviousCallState == Call.State.DIALING) || (mPreviousCallState == Call.State.ALERTING))) {
            Vibrator vbr = (Vibrator) mPhone.getContext().getSystemService(Context.VIBRATOR_SERVICE);
            vbr.vibrate(200);
        } 
        mPreviousCallState = mPhone.getForegroundCall().getState();
    }
}


13.电话接通时打开扬声器
public class LoudSpeakerOnOff extends BroadcastReceiver{
        TelephonyManager tm;
        public static ITelephony telephonyService;
        public static AudioManager am;
        Context context;
        boolean loudspeakerOn = false, vibrateOn = false;
    
        @Override
        public void onReceive(Context context, Intent intent) {
                // TODO Auto-generated method stub
                this.context = context;
                
                am = (AudioManager)context.getSystemService("audio");
                
                tm = (TelephonyManager)context.getSystemService("phone");
                tm.listen(new phoneState(), PhoneStateListener.LISTEN_CALL_STATE);
                 
        }




        class phoneState extends PhoneStateListener{
                public void onCallStateChanged(int state, String incomingNumber){
                
                        switch(state){
                                case TelephonyManager.CALL_STATE_IDLE:
                                        am.setSpeakerphoneOn(false);                                
                                        break;
                                case TelephonyManager.CALL_STATE_OFFHOOK:
                                        am.setSpeakerphoneOn(true);
                                        break;
                                case TelephonyManager.CALL_STATE_RINGING:
                                        break;
                        }
                }
        }




}


14. 修改Ram内存显示,做假
\kernel\fs\proc\meminfo.c
把K(i.totalram),改成 K(i.totalram<<1), 意思是改成原值的双倍。

15. 改CPU型号
在 \frameworks\base\core\java\android\widget\TextView.java

   private void setText(CharSequence text, BufferType type,
                       boolean notifyBefore, int oldlen) {
      if (text == null) {
          text = "";
     }

//add start
if(text.toString().trim().equals("Dual-Core ARMv7 Procesor")){
text = "MT6572"
}
//add end
.....
}
例:
if(text.toString().trim().equals("MT8382")){
text = "Exynos 5420";
}

if(text.toString().trim().equals("1280 x 800")){
text = "2560 x 1600";
}


16. Android获取手机制作商,系统版本等
在开发中 我们有时候会需要获取当前手机的系统版本来进行判断,或者需要获取一些当前手机的硬件信息。
android.os.Build类中。包括了这样的一些信息。我们可以直接调用 而不需要添加任何的权限和方法。
android.os.Build.BOARD:获取设备基板名称
android.os.Build.BOOTLOADER:获取设备引导程序版本号
android.os.Build.BRAND:获取设备品牌
android.os.Build.CPU_ABI:获取设备指令集名称(CPU的类型)
android.os.Build.CPU_ABI2:获取第二个指令集名称
android.os.Build.DEVICE:获取设备驱动名称
android.os.Build.DISPLAY:获取设备显示的版本包(在系统设置中显示为版本号)和ID一样
android.os.Build.FINGERPRINT:设备的唯一标识。由设备的多个信息拼接合成。
android.os.Build.HARDWARE:设备硬件名称,一般和基板名称一样(BOARD)
android.os.Build.HOST:设备主机地址
android.os.Build.ID:设备版本号。
android.os.Build.MODEL :获取手机的型号 设备名称。
android.os.Build.MANUFACTURER:获取设备制造商
android:os.Build.PRODUCT:整个产品的名称
android:os.Build.RADIO:无线电固件版本号,通常是不可用的 显示unknown
android.os.Build.TAGS:设备标签。如release-keys 或测试的 test-keys 
android.os.Build.TIME:时间
android.os.Build.TYPE:设备版本类型  主要为"user" 或"eng".
android.os.Build.USER:设备用户名 基本上都为android-build
android.os.Build.VERSION.RELEASE:获取系统版本字符串。如4.1.2 或2.2 或2.3等
android.os.Build.VERSION.CODENAME:设备当前的系统开发代号,一般使用REL代替
android.os.Build.VERSION.INCREMENTAL:系统源代码控制值,一个数字或者git hash值
android.os.Build.VERSION.SDK:系统的API级别 一般使用下面大的SDK_INT 来查看
android.os.Build.VERSION.SDK_INT:系统的API级别 数字表示

android.os.Build.VERSION_CODES类 中有所有的已公布的Android版本号。全部是Int常亮。可用于与SDK_INT进行比较来判断当前的系统版本

17.
而这个persist.sys.usb.config 中adb 的配置是在alps/build/tools/post_process_props.py 中根据ro.debuggable = 1 or 0 来设置,1 就是开启adb, 0 即关闭adb debug. 而这个ro.debuggable 也是在alps/build/core/main.mk 中设置,和2.3 修改类似
不过您这样打开之后,对于user 版本adb shell 开启的还是shell 权限,而不是root 权限,如果您需要root 权限,需要再改一下system/core/adb/adb.c 里面的should_drop_privileges() 这个函数,在#ifndef ALLOW_ADBD_ROOT 时return 0; 而不是return 1; 即可。
User版本默认打开USB调试开关:
ro.debuggable=1
persist.service.adb.enable=1

18. Android动画切换
(1)*.java //设置切换动画,从右边进入,左边退出
overridePendingTransition(R.anim.in_from_right, R.anim.out_to_left);
(2)*.xml
<translate android:fromXDelta="100%p" android:toXDelta="0%p"
        android:duration="500" />
  注: android:fromXDelta 动画开始的位置,  android:toXDelta 动画结束的位置, android:duration动画的时间。      

19. 将Activity伪装成Dialog
就是给AndroidManifest文件中Activity添加Dialog样式属性
<activity android:name=".DialogActivity" android:label="@string/app_name"
      android:theme="@android:style/Theme.Dialog">


20. Camera旋转90,270
MT6572平台:\mediatek\custom\mt6572\hal\camera\camera\cfg_setting_imgsensor.h
SensorOrientation_T const&
MT6575平台:\mediatek\custom\project\hal\camera\camera\cfg_tuning_mt6575.h
getSensorOrientation()
{
    static SensorOrientation_T const inst = {
        u4Degree_0  : 90,   //  main sensor in degree (0, 90, 180, 270)
        u4Degree_1  : 0,    //  sub  sensor in degree (0, 90, 180, 270)
        u4Degree_2  : 90,   //  main2 sensor in degree (0, 90, 180, 270) 
    };
    return inst;
}


21. 设置菜单下的SIM status、Wifi信号dbM值做假
路径: \mediatek\frameworks\base\op\java\com\mediatek\op\telephony\ServiceStateExt.java
    public int mapGsmSignalDbm(int GsmRscpQdbm,int asu){
        int dBm;
        Log.d(TAG,"mapGsmSignalDbm() GsmRscpQdbm=" + GsmRscpQdbm + " asu=" + asu);
        if (GsmRscpQdbm < 0) {
            dBm = GsmRscpQdbm / 4; //Return raw value for 3G Network
        } else {
            dBm = -113 + (2 * asu);
        }
if(FeatureOption.G6_V21_WEIHENG_GQ_PROJECT){
return dBm+15;
}else{
     return dBm;
}
   }

22. (一)修改马达震动电压
(1)\mediatek\custom\cp706\kernel\vibrator\cust_vibrator.c
static struct vibrator_hw cust_vibrator_hw = {
.vib_timer = 50,
 #ifdef CUST_VIBR_LIMIT
.vib_limit = 10,
 #endif
  .vosel = VOL_2800,//电压值
};
(2)\mediatek\platform\mt6572\kernel\drivers\vibrator\vibrator.c
static int vibr_Enable(void)
{ ...
    hwPowerOn(MT6323_POWER_LDO_VIBR, vibr_voltage, "VIBR");//修改这个值vibr_voltage
   ..
}

(二)修改震动强弱,通过修改震动时长以达到强震效果:
\packages\apps\Phone\src\com\android\phone\HapticFeedback.java
private static final long DURATION = 15;//4;  // millisec.


23. Android里的音量调节 (2012-10-25 16:17:36)转载▼
步骤1:或许系统音量对象的实例
AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
 
步骤2:获取各种音量情报
Android的音量信息一共有7种。

①通话音量
int max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_VOICE_CALL );
int current = mAudioManager.getStreamVolume( AudioManager.STREAM_VOICE_CALL );
Log.d(”VIOCE_CALL”, “max : ” + max + ” current : ” + current);
②系统音量
max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_SYSTEM );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_SYSTEM );
Log.d(”SYSTEM”, “max : ” + max + ” current : ” + current);
③铃声音量
max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_RING );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_RING );
Log.d(”RING”, “max : ” + max + ” current : ” + current);
④音乐音量
max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_MUSIC );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_MUSIC );
Log.d(”MUSIC”, “max : ” + max + ” current : ” + current);
⑤提示声音音量
max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_NOTIFICATION );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_NOTIFICATION );
Log.d(”NOTIFICATION”, “max : ” + max + ” current : ” + current); 
⑥闹铃音量 
max = mAudioManager.getStreamMaxVolume( AudioManager.STREAM_ALARM );
current = mAudioManager.getStreamVolume( AudioManager.STREAM_ALARM );
Log.d(”ALARM”, “max : ” + max + ” current : ” + current);
⑦DTMF(Double Tone MulitiFrequency,双音多频)

设置音量的方法也很简单,AudioManager提供了方法:
public void setStreamVolume(int streamType, int index, int flags)
 
其他:
各种音量有不同的播放方式,例如,音乐就应该用MediaPlayer来播放。
private MediaPlayer mediaPlayer=null; //声频
mediaPlayer=MediaPlayer.create(AudioActivity.this, R.raw.music);
mediaPlayer.setLooping(true);//设置循环播放
mediaPlayer.start();//播放声音
而铃声就应该用RingtoneManager来播放。
 
如果混用的话,参照的音量就会不正确。
这个时候可以通过设定流类型来改善。
例如
Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
mRingtone = RingtoneManager.getRingtone(getApplicationContext(), uri);

RingtoneManager是播放铃声的,如果用来播放通知音,
就需要把声音的流类型改成AudioManager.STREAM_NOTIFICATION
mRingtone.setStreamType(AudioManager.STREAM_NOTIFICATION );


24. 内存EMMC做假,步骤如下四步:
(1)mkfs.vfat -n voume_name -v -C fat.img [block-count]
(2)把fat.img mount到某个目录
mkdir fat_disk
mount -o loop,iocharset=utf8 fat.img fat_disk/
(3)umount fat_disk/
(4)./trim fat.img fat_sparse.img 


25. Android去掉虚拟按键全屏显示的方法
在 oncreate 方法中 设置 
if (Util.getCurrentAPIVersion() >= 14) {
   getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
}
要放在 setcontentview 方法前
而且这个方法只能在api 14以上的代码中使用,所以要注意加上判定。
另外无论你怎么隐藏 虚拟按键,在发生交互行为的时候,按键都是会出现的。具体的解释,可以参考官方文档


26. android截屏功能实现
/**
* 获取和保存当前屏幕的截图
*/
private void GetandSaveCurrentImage()  
{  
//构建Bitmap  
WindowManager windowManager = getWindowManager();  
Display display = windowManager.getDefaultDisplay();  
int w = display.getWidth();  
int h = display.getHeight();  
Bitmap Bmp = Bitmap.createBitmap( w, h, Config.ARGB_8888 );      
//获取屏幕  
View decorview = this.getWindow().getDecorView();   
decorview.setDrawingCacheEnabled(true);   
Bmp = decorview.getDrawingCache();   
//图片存储路径
String SavePath = getSDCardPath()+"/Demo/ScreenImages";
//保存Bitmap   
try {  
File path = new File(SavePath);  
//文件  
String filepath = SavePath + "/Screen_1.png";  
File file = new File(filepath);  
if(!path.exists()){  
path.mkdirs();  
}  
if (!file.exists()) {  
file.createNewFile();  
}  
FileOutputStream fos = null;  
fos = new FileOutputStream(file);  
if (null != fos) {  
Bmp.compress(Bitmap.CompressFormat.PNG, 90, fos);  
fos.flush();  
fos.close();    
Toast.makeText(mContext, "截屏文件已保存至SDCard/ScreenImages/目录下",Toast.LENGTH_LONG).show();  
}  
} catch (Exception e) {  
e.printStackTrace();  
}  
}  
/**
* 获取SDCard的目录路径功能
* @return
*/
private String getSDCardPath(){
File sdcardDir = null;
//判断SDCard是否存在
boolean sdcardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
if(sdcardExist){
sdcardDir = Environment.getExternalStorageDirectory();
}
return sdcardDir.toString();
}


27. Linux下对工程搜索字串命令
grep -Irns "xxxxxx"


28. 情景模式下打开“Touch sound 触摸提示音”
(1)在\mediatek\frameworks\base\media\audio\java\com\mediatek\audioprofile\AudioProfileManager.java
final boolean DEFAULT_SOUNDEFFECT_GENERAL = true;//只改此处即可
(2)\frameworks\base\packages\SettingsProvider\res\values\defaults.xml
<bool name="def_sound_effects_enabled">true</bool>//改此处无效


29.
mt_set_gpio_mode(GPIO_ALS_EINT_PIN, GPIO_ALS_EINT_PIN_M_EINT);
      mt_set_gpio_dir(GPIO_ALS_EINT_PIN, GPIO_DIR_IN);
mt_set_gpio_pull_enable(GPIO_ALS_EINT_PIN, GPIO_PULL_ENABLE);
mt_set_gpio_pull_select(GPIO_ALS_EINT_PIN, GPIO_PULL_UP);
这个代码的意思
1. 设置mode为中断
2. 设置输入GPIO
3. 维持上来 内部的
4. 默认高阻 就是开机的时候维持高电平


30. G-sensor兼容开关
# one load to support different accelerometer sensor
MTK_AUTO_DETECT_ACCELEROMETER=no


31. 音量等级
默认音量等级: \frameworks\base\media\java\android\media\AudioManager.java
public static final int[] DEFAULT_STREAM_VOLUME = new int[] {
        6,  // STREAM_VOICE_CALL
        7,//7,  // STREAM_SYSTEM
        4,// 4,  // STREAM_RING
...
   };
 最大音量: \frameworks\base\media\java\android\media\AudioService.java   
    private final int[] MAX_STREAM_VOLUME = new int[] {
        6,  // STREAM_VOICE_CALL
        7,  // STREAM_SYSTEM
        7,  // STREAM_RING
...
    };


32. G-sensor方向旋转
(1)\mediatek\kernel\drivers\hwmon\hwmsen\hwmsen_helper.c
struct hwmsen_convert map[] = {
   { { 1, 1, 1}, {0, 1, 2} },
   { {-1, 1, 1}, {1, 0, 2} },
   { {-1,-1, 1}, {0, 1, 2} },
   //{ { 1,-1, 1}, {1, 0, 2} },
   { { 1,-1, -1}, {1, 0, 2} },
     
   { { 1, -1,-1}, {0, 1, 2} },
   { { 1, 1,-1}, {1, 0, 2} },
   { { 1,-1,-1}, {0, 1, 2} },
   { {-1,-1,-1}, {1, 0, 2} },      
};
(2)\mediatek\custom\cp600\kernel\accelerometer\bma250_auto\cust_acc.c
static struct acc_hw cust_acc_hw = {
   .i2c_num = 1,
   .direction = 4,   // 4///3,  
   .power_id = MT65XX_POWER_NONE,  /*!< LDO is not used */
   .power_vol= VOL_DEFAULT,        /*!< LDO is not used */
   .firlen = 0, //old value 16                /*!< don't enable low pass fileter */
};


33. MIPI与DVP接口区别
DVP是并口,需要PCLK、VSYNC、HSYNC、D[0:11]——可以是8/10/12bit数据,看ISP或baseband是否支持;
MIPI是LVDS,低压差分串口。只需要要CLKP/N、DATAP/N——最大支持4-lane,一般2-lane可以搞定。
显然,MIPI接口比DVP的接口信号线少,由于是低压差分信号,产生的干扰小,抗干扰能力也强。最重要的是DVP接口在信号完整性方面受限制,速率也受限制。500W还可以勉强用DVP,800W及以上都采用MIPI接口。


34. 调光感关闭了I2C兼容共用
\mediatek\platform\mt6572\kernel\core\mt_devs.c


35. 取消破解减360
  (1) \mediatek\custom\cp695\lk\include\target\board.h
  //#define CFG_DISPLAY_HEIGHT      (DISP_GetScreenHeight()-360)//Daniel_mod_lcm
  (2)\mediatek\kernel\drivers\video\mtkfb.c
  //MTK_FB_YRES  = DISP_GetScreenHeight()-360;//Daniel_mod 20141017: Debug 6.95Lcm,delete 360
 
36. Android 判断sd卡和sim卡是否可用
在一个项目中,要用到sdcard和sim卡。使用sdcard时,需要判断其状态是否可读写。使用sim卡时,要判断是否可读,怎么做呢,请参阅下面两个函数:
//sdcard是否可读写 
public boolean IsCanUseSdCard() { 
   try { 
       return Environment.getExternalStorageState().equals( 
               Environment.MEDIA_MOUNTED); 
   } catch (Exception e) { 
       e.printStackTrace(); 
   } 
   return false; 

//sim卡是否可读 
public boolean isCanUseSim() { 
   try { 
       TelephonyManager mgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 
 
       return TelephonyManager.SIM_STATE_READY == mgr 
               .getSimState(); 
   } catch (Exception e) { 
       e.printStackTrace(); 
   } 
   return false; 


主要用到了:android.telephony.TelephonyManager、android.os.Environment及android.app.Activity.getSystemService 方法  


37. 开机第一张Logo花屏、屏闪
不良原因為:主板在boot的VSYNC設置的參數過大,達到1270,
而正常的為: VW+VBP+BFP+600=1+22+12+600=635
   而其knerel設置是正確的,故導致開機時前面的畫面異常,後面的顯示OK。


38. 延时
void Delayms(kal_uint32 ms)
{
 kal_uint32 i;
 for(i=0;i<5000*ms;i++)
}

39. Mtk Android 之NvRAM customer
分类: Linux_mtk 2014-08-27 15:17 100人阅读 评论(0) 收藏 举报
转载:http://blog.csdn.net/cbk861110/article/details/26851817
(1)nvram lib id定义:
alps\mediatek\custom\prj\cgen\inc\Custom_NvRam_LID.h
typedef enum
{
   AP_CFG_RDCL_FILE_AUDIO_LID=AP_CFG_CUSTOM_BEGIN_LID,//AP_CFG_CUSTOM_BEGIN_LID: this lid must not be changed, it is reserved for system.

   AP_CFG_REEB_PRODUCT_INFO_LID,

   AP_CFG_CUSTOM_FILE_MAX_LID,
} CUSTOM_CFG_FILE_LID;

#define AP_CFG_REEB_PRODUCT_INFO_LID_VERNO      "000"

(2)nvram lib id的数据结构和版本号声明
\alps\mediatek\custom\prj\cgen\inc\Custom_NvRam_data_item.h
LID_BIT VER_LID(AP_CFG_REEB_PRODUCT_INFO_LID)
PRODUCT_INFO *CFG_FILE_PRODUCT_INFO_TOTAL
{
};

(3)nvram lib内容加入nvram数组中
\alps\mediatek\custom\prj\cgen\inc\CFG_file_info_custom.h
   const TCFG_FILE g_akCFG_File_Custom[]=
   {
       {
           "/data/nvram/APCFG/APRDEB/PRODUCT_INFO",       VER(AP_CFG_REEB_PRODUCT_INFO_LID),         CFG_FILE_PRODUCT_INFO_SIZE,
           CFG_FILE_PRODUCT_INFO_TOTAL,                   SIGNLE_DEFUALT_REC, (char *)&stPRODUCT_INFOConfigDefault,DataReset, NULL
       },
   };

(4)nvram lib 数据结构定义
alps\mediatek\custom\prj\cgen\inc\CFG_file_info_custom.h

// the record structure define of PRODUCT_INFO nvram file
typedef struct
{
   unsigned char imei[8];
   unsigned char svn;
   unsigned char pad;
} nvram_ef_imei_imeisv_struct;

typedef struct{
unsigned char barcode[64];
nvram_ef_imei_imeisv_struct IMEI[4];
unsigned char reserved[1024-40-64];
}PRODUCT_INFO;

//the record size and number of PRODUCT_INFO nvram file
#define CFG_FILE_PRODUCT_INFO_SIZE    sizeof(PRODUCT_INFO)
#define CFG_FILE_PRODUCT_INFO_TOTAL   1

(5)nvram lib 默认值定义
alps\mediatek\custom\prj\cgen\cfgdefault\CFG_PRODUCT_INFO_Default.h
PRODUCT_INFO stPRODUCT_INFOConfigDefault =
{
   /* barcode */
   {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
    0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
    0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
    0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
    0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
    0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
    0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,
    0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},
   /* IMEI*/
   {{0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},0x0,0x0,
    {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},0x0,0x0,
    {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},0x0,0x0,
    {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0},0x0,0x0},
   /* reserved */
}

(6)nvram lib id需要备份到BinRegion:
\alps\mediatek\custom\prj\cgen\CFG_file_info.c
FileName aBackupToBinRegion[]=
{
#ifndef MTK_PRODUCT_INFO_SUPPORT
{"PRODUCT_INFO",AP_CFG_REEB_PRODUCT_INFO_LID},
#endif
};

(7)native(c)层读写:
[FAQ04545]【NvRAM】Native层读写nvram
    1,NVM_GetFileDesc(file_lid, &rec_size, &rec_num,true);//读打开
    2,read
    3,NVM_CloseFileDesc
    4,NVM_GetFileDesc(file_lid, &rec_size, &rec_num,false);//写打开
    5,write
    6,NVM_CloseFileDesc

(8)java层读写:
参照[FAQ04542]【NvRAM】apk中中读写nvram
IBinder binder = ServiceManager.getService("NvRAMAgent");
NvRAMAgent agent = NvRAMAgent.Stub.asInterface(binder);

buffer = agent.readFile(AP_CFG_CUSTOM_FILE_LID_ID);
agent.writeFile(AP_CFG_CUSTOM_FILE_LID_ID,buffer);


40. Android4.4 MT6572,KK版,开机第一张Logo和第二张Logo之间会出现花屏(第一张Logo开始能正常显示2-3秒钟就开始花屏)。
目前是在分辨率:540X960的情况下花屏,其他分辨率正常。
解决如下: 路径: \mediatek\platform\mt6572\lk\disp_drv.c
UINT32 DISP_GetVRamSize(void)
{
  // Use a local static variable to cache the calculated vram size
  //    
  static UINT32 vramSize = 0;
  
  if (0 == vramSize)
  {
  ...
     // Align vramSize to 1MB
     //
     vramSize = ALIGN_TO_POW_OF_2(vramSize, 0x100000);
 //if((vramSize%0x100000) < 0x1000){
 // vramSize += 0x1000;
// }
DISP_LOG("DISP_GetVRamSize-1: %u bytes\n", vramSize);
if((DISP_GetScreenWidth()==540) && (DISP_GetScreenHeight()==960)){
vramSize=0xb00000;//增加此语句 Add this line to solve First logo abnormal display.
  }   
     DISP_LOG("DISP_GetVRamSize: %u bytes\n", vramSize);
  }
 
  return vramSize;
}


41. 去掉设置-存储-内部存储
\packages\apps\Settings\src\com\android\settings\deviceinfo\Memory.java
public void onCreate(Bundle icicle) {
...
        if (mMemoryExts.isAddInternalCategory()) {
          //  addCategory(StorageVolumePreferenceCategory.buildForInternal(context));
        }
        ...
      }  


42. android 如何将桌面较长的图标名称显示完整(有些APP的图标名称太长)
(1)请找到对应的res资源,修改styles.xml,将
<style name="WorkspaceIcon.Portrait">
        <item name="android:drawablePadding">0dp</item>
        ...
        <item name="android:lines">2</item> //增加此项
    </style>
(2)请修改BubbleTextView.java的applyFromShortcutInfo方法,将
setCompoundDrawablePadding((int) ((grid.folderIconSizePx - grid.iconSizePx) / 2f));
这行代码中的参数改小为合适的值。


43. android Launcher3中主菜单的布局调整(如从5*4调整为4*4)
Launcher3主菜单布局的行数和列数,都是在DynamicGrid.java中动态计算的,xml中无法配置。
如果想修改主菜单的布局,调整行数和列数,请修改DynamicGrid.java中allAppsNumRows和allAppsNumCols的值。


44. android 让Launcher Hotseat中的图标显示title
(1)请修改alps/packages/apps/Launcher2/res/values/dimens.xml中的hotseat_cell_height值,例如修改为100;
(2)请修改alps/packages/apps/Launcher2/src/com/android/launcher2/HotSeat.java中的resetLayout()方法,对主菜单图标添加title,例如:添加allAppsButton.setText("allAppsButton_title");
(3)请修改alps/packages/apps/Launcher2/src/com/android/launcher2/CellLayout.java的addViewToCellLayout方法,将下面的代码注释掉:
        // Hotseat icons - remove text
        if (child instanceof BubbleTextView) {
            BubbleTextView bubbleChild = (BubbleTextView) child;
            bubbleChild.setTextVisibility(!mIsHotseat);
        }    


45. android 打开蓝牙语音拨号功能
修改mediatek/external/bluetooth/bt_cust/bt_cust_table.h文件,将HFPVoiceRecognition属性的值改为1。
    {
        .name = "HFPVoiceRecognition",
        .value = (void*)1,
    },


46. android 修改设备管理器中的磁盘驱动器名
1)修改F_mass_storage.c中fsg_common_init()的此处代码:
snprintf(common->inquiry_string, sizeof common->inquiry_string,
  "%-8s%-16s%04x", cfg->vendor_name ?: "Linux",
  /* Assume product name dependent on the first LUN */
  cfg->product_name ?: (common->luns->cdrom
        ? "File-Stor Gadget"
        : "File-CD Gadget"),
  i);
2)或者直接修改/sys/class/android_usb/f_mass_storage/inquiry_string内容


47. Flash做兼容时,Preloader bin size过大编译报错怎么办
相关的FAQ请参考"[FAQ07839]【Storage】eMMC和NAND Flash的兼容个数" 對於KK版本,由於Preloader新增了對LPDDR3的支援,
因此default可能無法配置出10顆兼容的mcp/emcp/discrete dram,需要參考以下的說明修改code,減少debug code佔用的size。
* MT6589/72/71平台,请修改alps\mediatek\platform\$PLATFORM\preloader\src\drivers\inc\mt_pmic_wrap_init.h文件
* MT6582/92平台,请修改alps\mediatek\platform\$PLATFORM\preloader\src\drivers\inc\pmic_wrap_init.h文件 
具体修改code的方法是一样的:
(1)#define PMIC_WRAP_DEBUG //注释掉这一行
(2)#define PWRAPERR(fmt, arg...) printf(PWRAPTAG "ERROR,line=%d " fmt, __LINE__, ##arg)
修改为:#define PWRAPERR(fmt, arg...) printf(PWRAPTAG "ERROR,line=%d ", __LINE__) 
另外JB3.MP MT6572版本的check_size.sh脚本存在bug,size检查机制会失效,
如果您发现在这个脚本中PL_MAX_ROM_SIZE定义的方法如下,那么就说明您没有打上patch,需要提e-service申请ALPS00869854这笔patch。 
# Keep ROM size smaller than 90KB PL_MAX_ROM_SIZE=(95*1024)
注:针对编译报错 mt_pmic_wrap_init.c:772: error: undefined reference to 'PWRAPFUC',用宏开关PMIC_WRAP_DEBUG控制即可编译通过。


48. linux 下查找文件或者内容常用命令
whereis <程序名称>
查找软件的安装路径
-b 只查找二进制文件
-m 只查找帮助文件
-s 只查找源代码
-u 排除指定类型文件
-f 只显示文件名
-B <目录> 在指定目录下查找二进制文件
-M <目录> 在指定目录下查找帮助文件
-S <目录> 在指定目录下查找源代码
locate <文件名称>
在文件索引数据库中搜索文件
-d <数据库路径> 搜索指定数据库
updatedb
更新文件索引数据库
find [路径] <表达式>
查找文件
-name <表达式> 根据文件名查找文件
-iname <表达式> 根据文件名查找文件,忽略大小写
-path <表达式> 根据路径查找文件
-ipath <表达式> 根据路径查找文件,忽略大小写
-amin <分钟> 过去N分钟内访问过的文件
-atime <天数> 过去N天内访问过的文件
-cmin <分钟> 过去N分钟内修改过的文件
-ctime <天数> 过去N天内修改过的文件
-anewer <参照文件> 比参照文件更晚被读取过的文件
-cnewer <参照文件> 比参照文件更晚被修改过的文件
-size <大小> 根据文件大小查找文件,单位b c w k M G
-type <文件类型> 根据文件类型查找文件。b 块设备 c 字符设备 d 目录 p 管道文件 f 普通文件 l 链接 s 端口文件
-user <用户名> 按归属用户查找文件
-uid <uid> 按UID查找文件
-group <群组名> 按归属群组查找文件
-gid <gid> 按GID查找文件
-empty 查找空文件
从文件内容查找匹配指定字符串的行:
$ grep "被查找的字符串" 文件名
从文件内容查找与正则表达式匹配的行:
$ grep –e “正则表达式” 文件名
查找时不区分大小写:
$ grep –i "被查找的字符串" 文件名
查找匹配的行数:
$ grep -c "被查找的字符串" 文件名
从文件内容查找不匹配指定字符串的行:
$ grep –v "被查找的字符串" 文件名
从根目录开始查找所有扩展名为.log的文本文件,并找出包含”ERROR”的行
find / -type f -name "*.log" | xargs grep "ERROR"
系统查找到httpd.conf文件后即时在屏幕上显示httpd.conf文件信息。 
find/-name"httpd.conf"-ls
在根目录下查找某个文件
find . -name "test"
在某个目录下查找包含某个字符串的文件
grep -r "zh_CN" ./


49. 通过查字符找文件
find ./ name "aaa"

50. Android4.4 Database路径
\out\target\product\cp706_pq_jqx250\obj\CODEGEN\cgen
\out\target\product\cp706_pq_jqx250\obj\CUSTGEN\custom\modem
51. Camera照相闪烁
Android4.2
packages\apps\Camera\src\com\android\camera\SettingChecker.java
RESET_STATE_VALUE[ROW_SETTING_ANTI_FLICKER]     = new String[]{"60HZ
Android4.4
\packages\apps\Camera\res\values\camera_arrays.xml
   <!-- Default antibanding setting.-->
   <string-array name="pref_camera_antibanding_default_array" translatable="false">
       <item>50hz</item>
       <item>off</item>
       <item>auto</item>
   </string-array>


52. 关闭串口打印开关
\mediatek\custom\Project_name\preloader\inc\cust_bldr.h
#define CFG_LOG_BAUDRATE            (921600)
#define CFG_META_BAUDRATE           (115200)
#define CFG_UART_LOG                (UART1) //(UART2)  //若要关闭则改为UART2,打开则为UART1
#define CFG_UART_META               (UART1)


53. USB打印
打印信息保存路径
adb shell cat /proc/kmsg >D://test
0 0
原创粉丝点击