MTK driver知識

一、Display
1.lcm 相關概念
1.1) MIPI接口:一共有三種接口:DBI(也做CPU或MCU接口)、DPI(也叫RGB接口)、DSI.
在使用DSI接口時,目前75/77都只支持到2條data lane,加上一條clock lane.
使用DPI接口時,根據LCM IC支持的情況,可以選擇16bus、18bus傳輸RGB格式文件,在GPIO部分分爲R、G、B分別對應 8個GPIO(GPIO20~46期間),客戶採用DPI接口需要根據選擇的bus方式進行配置,推薦RGB端口全部配置爲對應的複選模 式,並設置爲OUT輸出。
採用DBI接口,有兩種模式選擇,一種是選擇共用DPI的bus腳 +DPI控制線,另一種是共用nand data pin+CPU 控制線。

1.2) DSI接口有兩種sync 模式:video mode和command mode,其中video mode是BB端一直刷數據到LCM,cmd mode是在有數 據更新時刷數據到LCM GRAM中)
和DSI command mode相比,video mode 是需要實時傳輸image data到lcm端,DSI 的refresh rate決定了lcm的refresh rate。

Video模式又分三種子模式:
1 Non-burst Mode Sync pulses: 在這種模式下,DSI基於各種不同的同步數據包來做數據同步。這種數據包括:重構,時間校準等。更具體的請參考DSI協議標準。
2 Non-burst Mode Sync event: 這種模式和第一種模式很像,但是這種模式不會發重構和時間校準的數據包,它們只發送一種叫做”Sync event”的包。
3 Burst mode: 在horizontal 的時序是一樣的情況下DSI會把連接的速度提升到Panel支持的最大速度。在這種模式下發送RGB數據包的時間被壓縮,以留出更多的時間用來傳送其他的數據。

1.3)EDS機制:
92平臺LCM driver中定義了esd_check和esd_recovery的接口,但ESD線程不工作。
目前在MT6589之前平臺,video mode的ESD實現有三種模式,分別是:ext TE(外部TE信號檢測)、int TE(內部TE信號檢 測)、non cout clk

不同ESD方式需要注意的方面
a) int TE和ext TE的檢測,都不需要實現lcm_esd_check函數,而需要實現lcm_esd_recover函數。
non cont clk則不需要實現lcm_esd_check函數和lcm_esd_recover函數,而只需要在上面 params中配置爲TRUE即可
b) ext TE的實現,需要LCM外接TE pin到BB端,同時在inital code中配置寄存器打開TE信號的輸出 (一般是寫0x35寄存器,具體需要和LCM IC FAE確認)

1.4)HDMI/MHL:
目前我司HDMI/MHL的相關code和driver都是有集成在codebase中的,要使用的話,只需要只需要在對應的 ProjectConfig.mk文件中開啓,並且在dct中配置好對應的引腳定義即可。
以下以MHL爲例:
ProjectConfig中配置:
MTK_HDMI_SUPPORT=yes #表明開啓HDMI/MHL功能
CUSTOM_KERNEL_HDMI=Sii8338 #表明配置爲MHL的IC型號

1.4)TE 信號:
大部分TE問題是由於沒有正常開啓TE所導致,首先檢查TE是否開啓。
89平臺使用內部TE,lcm driver中只需要在init過程中打開LCM TE即可,一般是寫0x35寄存器,部分IC需要額外寫其他 寄存器,可與FAE確認。
檢查TE是否正常開啓,如果是工版,則可使用如下方式打開fps的log,查看TE信息:
adb shell
cd sys/kernel/debug
echo fps:on>mtkfb
然後查看mtklog, 搜索“FPS”,若看到等待TE時間爲0, 表示TE未正常開啓,需要與LCM IC的FAE進一步確認開啓流程 。
若TE已經成功開啓,依然有Teering現象,可從如下方面思考分析。
1)是否使用了豎屏橫用,導致對GRAM的讀寫方向不一致,一般會出現斜線切屏現象。
2)是否clock速度過低,FPS低於LCM自刷新率的1/2?
3)是否clock速率過快,超過LCM的自刷新率,導致寫GRAM時可能從後面趕上讀,導致Teering發生。

1.5)HS/LP:
HS:high speed , clock切爲HS模式,高速模式。
LP:low power,低電平
有些LCM在開機的時候,如果使用LP下發init code,可能會不準確或者導致花屏等問題,這時候需要使用HS mode發送init code,比如三星的某款OLED(D53D6EA8061V-Amoled)。
continuous clock/no-continuous clock模式

1.6)dithering:
抖動顯示技術:
MT6572 如所用lcm不支持RGB888 color format, 顯示效果差需要開啓dithering的。

1.7)其他概念:
AAL:BB端CABC(即AAL),爲1種方式控制背光
continuous clock/Non-continuous clock : Switch clock lane from HS to LP

2.LCM時鐘配置
MT6582 LCM Driver中配置:params->dsi.PLL_CLOCK = 234;
計算方法:

展頻開關:
如果MIPI Clock對RF/WCN產生干擾,並且在嘗試尋找相應的頻點依然無法解除 EMI,可以嘗試做Frequency Hopping;
82平臺默認打開展頻開關,不同於72/89平臺,將展頻的開關以及展頻幅度的選擇 ,都開放到LCM Driver中,以如下爲例:
params->dsi.ssc_range =4;
params->dsi.ssc_disable = 0;
代表:展頻打開,ssc_range = 4%

3.AAL與CABC背光選擇(兩種方式控制背光):
參考[FAQ05966]
89平臺支持BB端CABC(即AAL)或LCM端CABC方式控制背光,兩種方式使用方法如下
【BB端CABC(即AAL)】
– 打開功能,向MTK申請patch,並在ProjectConfig.mk中打開MTK_AAL_SUPPORT = yes
【LCM端CABC】
– 對於Video Mode,ALPS.JB2.MP.V1.3(包括1.3)之前的版本,請向MTK申請patch
– lcm driver中實現set_backlight接口
– cust_leds.c(包括lk與kernel中的兩支文件)設置如下

4. 調整Display 消耗的BW(bandwidth帶寬)方法:
•LCM driver建議如下:
–MIPI的clock 儘量低,建議60fps
–For DSI Video mode,建議不要使用burst mode(比較能吃BW)
params->dsi.mode = BURST_VDO_MODE;
–Video mode的時序,blank 區間(如VBP/VFP/HBP/HFP)儘量少(當然也需要滿足LCM
module的spec)

5.DSI video mode相關參數配置方法:
對應配置文件:\alps\mediatek\custom\common\kernel\lcm\xxxx.c中lcm_get_params()函數
1,data lane每幀回LP11(Low Power state,dp,dn都爲高電平),clk一直HS( High Speed),對應配置:
params->dsi.cont_clock=1;
params->dsi.clk_lp_per_line_enable=0;
2,data lane每一行回一次LP11,clk lane每一幀回一次LP,對應配置:
params->dsi.cont_clock=0;
params->dsi.clk_lp_per_line_enable=0;
3,data lane和clk lane都是每行回一次LP11,對應配置:
params->dsi.cont_clock=0;
params->dsi.clk_lp_per_line_enable=1;

6.LCM CABC 配置
參考[FAQ12413]

7.MHL 卡頓問題

8.ESD機制各個平臺的差異:
對於89/72/82等新平臺,Display架構做了調整,ESD的實現方式與之前的75/77等平臺稍有差異。
對於之前75/77平臺,可以參考FAQ03210及FAQ05163.
新舊架構下,主要是DSI Video Mode下ESD方式不一樣。
之前的架構下Video Mode的屏採用檢測外部TE或者內部TE來做ESD Check,因此需要在lcm driver中配置相應的參數。
新架構下不支持外部TE或內部TE來做ESD check, lcm_get_params中關於esd的參數不用再配置。
如lcm_int_te_monitor、lcm_int_te_period、lcm_ext_te_monitor等無需配置。
[SOLUTION]
新的Display架構下,DSI Video Mode及DSI Command Mode都採用讀寄存器的方式來進行esd check.
因此都只需要在lcm driver中實現esd_check和esd_recover函數即可。
對於具體讀取哪些寄存器來進行esd check,需要與屏廠確認。
ESD實現後如果出現每兩秒閃屏的問題,可以按如下流程處理:
1. 首先檢查esd check中是否添了過多的log信息或者有delay操作,建議先去掉所有log測試。
2. 如果依然出現每兩秒閃屏,可參考FAQ05680和FAQ05681進行處理。

9.DBI/DPI接口的GPIO的配置情況
DBI:DBI接口分爲串行和並行兩種。由lcm_params->ctrl這個參數控制。
LCM_CTRL_SERIAL_DBI/LCM_CTRL_PARALLEL_DBI

1.)如果是serial類型的,是通過MT6572 datasheet裏面的0x14012028 DBI_SCNF (DBI Serial Interface Configuration Register)這個寄存器來config串行接口。比如使用LSDI還是LSDA,LSCK上升沿還是下降沿發送數據 ,LSCK在沒有數據的時候是LOW/HIGH.
配置幾個GPIO pin:LSCE0B(相當於數據使能信號,低電平有效), LSCK, LSDA/LSDI(傳送command時用),DBI[XX:0](傳 送data時用)
CSS,CSH:chip select setup time/chip select hold time
(這兩個時間之內是不會傳數據的,Invalid data)
2.)如果是Parallel類型的,
配置幾個GPIO pin:LPCE0B(相當於CS信號,低電平有效), LPA0(RS信號,MTK平臺上面和CS信號是同步的), LCD CLK,LPWRB/LPRDB(類似數據使能信號)和DBI[XX:0](複用DPI的data pin,傳送data和command時用)
寫的時候用LPWRB,讀的時候用LPRDB
有C2WS和C2WH兩個變量:chip selection to write setup time和chip selection to write hold time
同理C2RS和C2RH.
硬件連接:
DBI Parallel類型:BB端需要打開LRDB、LWRB、LPA0 pin腳複用功能,並連接到LCM的RD、WR、RS
DBI serial類型: BB端需要打開LSCE0B、LSCK、LSDA/LSDI pin腳複用功能, 並連接到LCM的CSX, SCL, SDA/DOUT/DIN
lcm Driver裏面變量write wait state time,是處於wait狀態的時間。比如大於等於C2WS,參考MT6572 datasheet PAGE1659原理圖
note:89和72的DBI的clock都是不可調整的,都是130Mhz.
但是如果需要調整DBI的FPS的話,可以調整C2WS/C2WH/WST,分別對應write_setup/write_hold/write_wait

DPI:
使用DPI接口時,根據LCM IC支持的情況,可以選擇16bus、18bus傳輸RGB格式文件,在GPIO部分分爲R、G、B分別對應 8個GPIO(GPIO20~46期間),客戶採用DPI接口需要根據選擇的bus方式進行配置,推薦RGB端口全部配置爲對應的複選模式,並設置爲OUT輸出。
同時DPI的接口需要BB端打開DPIHSYNC、DPIVSYNC、DPIDE、DPICK複用功能,並分別連接到對應的LCM控制端
另注:
其實DPI和DBI一樣,都是可以通過lcm_params->ctrl這個變量來控制是使用Parallel還是serial還是GPIO的類型來下 command。
但是一般DPI都會選擇使用LCM_CTRL_SERIAL_DBI這個類型,因爲DPI的屏,DB[17..0]只是會用來做數據傳輸,控制線是 會通過LSDA/LSDI傳輸。

10.LCM Porting時如何配置Clock
clock配置方法:
lcm driver中配置clock有不同的方式,曾經使用過的配置方法有如下幾種:
Type1: 配置倍頻與分頻參數:dsi.pll_div1(倍頻), dsi.pll_div2(分頻)— (適用於75/77等之前的平臺)
Type2: 配置倍頻與分頻參數:dsi.pll_fbk_div(倍頻), dsi.pll_div1 & dsi.pll_div2 (分頻)—(適用於89/72等前 期版本)
Type3: 直接配置clock lane頻率:dsi.PLL_CLOCK(前期配置成枚舉值,後期將直接配置成對應的頻率常數值)—-(適 用於89/72/82…)

11.如何使用PMIC的LDO方式供給LCM端 1.8/2.8v的電壓
參考[FAQ10038]
1. 如何在開機階段使用PMIC的LDO方式供給LCM端1.8/2.8v的電壓?
2. 如何在suspend/resume的時候,斷掉/供給LCM端1.8/2.8v的電壓?

1. )在開機的時候,建議在preloader或者LK階段就通過PMIC的LDO方式來給LCM端上電,
比如可以在alps\mediatek\platform\mt6589\preloader\src\drivers\mtk_pmic_6320.c文件裏面的 pmic6320_init函數中做上電1.8/2.8v的操作。
AOSP版本mtk_pmic_6320.c的路徑 :alps/bootable/bootloader/preloader/platform/mt6572/src/drivers/mtk_pmic_6320.c
下面是在LK階段的上電/掉電方法:
使用upmu_common.c文件裏面API來分別控制每一個LDO_VGPX.
比如:
upmu_set_rg_vgp6_vosel用來控制上電的電壓值;
upmu_set_rg_vgp6_en用來控制enable VGP6這個pin

2. )因爲在suspend/resume的時候,kernel都是跑起來的,所以上電/掉電 1.8/2.8v的操作都應該放在kernel裏面。
下面是在kernel裏面的上電/掉電方法,在kernel裏面有統一的上電/掉電的接口函數: 上電接口函數:hwPowerOn 掉電接口函數hwPowerDown
以下以PMIC6320的VGP6爲例。
請在您要上電的文件#include 上電請調用 hwPowerOn,掉電請調用hwPowerDown
hwPowerOn(MT65XX_POWER_LDO_VGP6, VOL_2800, “ldo_test”);
bool hwPowerDown(MT65XX_POWER_LDO_VGP6, “ldo_test”);

12.如何拉低並保持LCM RESET PIN腳爲低 電平
平臺默認RESET PIN腳輸出爲高平的,如果一定需要拉低,可以配置RESET PIN腳爲GPIO模式,再通過GPIO方式拉低。
使用mediatek/dct目錄下的DCT工具,使用其打開custom/XXX/kernel/dct/dct目錄下的DWS文件,將GPIO131配置成 0:GPIO131.
對GPIO PIN腳的控制有如下一些方法:
lcm_util.set_gpio_mode(GPIO131, GPIO_MODE_00);
lcm_util.set_gpio_dir(GPIO131,GPIO_DIR_OUT);
lcm_util.set_gpio_out(GPIO131,0);

13.如何調節MIPI接口驅動能力
在使用DBI、DPI的MIPI接口時,可以在lcm_get_params函數中設置參數 io_driving_current的值來配置IO的驅動電流(6589上面不支持)
DSI的MIPI接口,不支持IO驅動電路的調節 ,其可選值的大小可以在lcm_drv.h看到定義。
其可選值的大小可以在lcm_drv.h看到定義:
typedef enum{
}LCM_DRIVING_CURRENT;
該值的會在lcd_drv.c文件中寫到寄存器中:
LCD_STATUS LCD_Set_DrivingCurrent();

14.如何通過檢測外部TE實現esd check的 功能
在72/82/92的JB/KK版本,我們都是通過讀取esd寄存器的方式實現esd check,但是由於esd check的時候會切換到cmd mode去讀,所以屏的玻璃存在最大1幀時間的等待,如果這個vdo
mode屏的玻璃延時等待時間較小(小於切換的時間),就會出現閃屏,所以不能使用讀esd寄存器 的方式做esd check。
如果這個屏有 external TE管腳的話,可以通過檢測ext.TE的方式來做esd check,具體原理 爲:把原來的esd流程全部關閉,啓動一個新的線程,循環檢測外部TE中斷,如果檢測失敗,就
recovery。
新的esd流程裏面需要做三件事:
1) 物理連接一根外部TE pin,然後在dws文件裏面配置一個GPIO口爲DSI_TE模式。
2) 在DSI初始化的時候,註冊該ext.TE的irq處理函數,收到中斷則設置irq_flag爲TRUE。
3) 啓動線程定時去wait flag==1,如果超時,則做esd recovery。

15.如何配置DSI時鐘頻率
1、)DSI vdo mode下的數據速率data_rate的大致計算公式爲: Data rate= (Height+VSA+VBP+VFP)*(Width+HSA+HBP+HFP)* total_bit_per_pixel*frame_per_second/total_lane_num
2、)DSI cmd mode下的數據速率data_rate的大致計算公式爲: Data rate= width*height*1.2* total_bit_per_pixel*frame_per_second/total_lane_num
參數註釋:
data_rate : 表示的是數據速率
width,height :屏幕分辨率
VSA VBP VFP :DSI vdo mode的vertical porch配置參數
HSA HBP HFP :DSI vdo mode的horizontal porch配置參數
total_bit_per_pixel :表示的是一個pixel需要用幾個bit來表示,比如RGB565的話 就是16個bit
frame_per_second :就是我們通常看到的fps,叫做幀率,表示每秒發送多少個幀 ,一般是60幀每秒
total_lane_num :表示的是data lane的對數。

3、)DSI採用的是雙邊採樣,則clk等於數據速率的一半,因此: clk=data_rate/2
有兩種配置clk的方式,第一種方式配置四個參數得到,第二種配置方式直接配置頻 率,建議採用第二種。
第一種方式,通過div分頻倍頻實現,各個平臺略有差異,但是原理基本一致,請參 考porting guide,如下舉例89平臺:
params->dsi.pll_div1 = ; //配置範圍爲0,1,2,3的時候,對應的 div1_real等於1,2,4,4
params->dsi.pll_div2 = ; //配置範圍爲0,1,2,3的時候,對應的 div2_real等於1,2,4,4
params->dsi.fbk_div = ; //範圍 0..63
params->dsi.fbk_sel = ; //配置範圍爲0,1,2,3的時候,對應的 fbk_sel_real等於1,2,4,4
輸出頻率 =26MHz*(fbk_div+1)*(2*fbk_sel_real)/(div1_real*div2_real)
第二種方式,直接配置clk大小:
params->dsi.PLL_CLOCK = LCM_DSI_6589_PLL_CLOCK_234;//這裏舉例89平臺,使用 一個宏,表示配置的clk等於234MHz。但是在89之後的平臺,使用直接配置一個頻率
數字的方式,比如params->dsi.PLL_CLOCK = 234,表示234MHZ)
4、在lcm porting過程中,這些參數都定義在lcm_drv.h文件中的LCM_DSI_PARAMS結 構體中,隨着平臺的發展,或許有所不同,但是基本原理都是一致的,如何配置clk的大小,請先根據自己的幀率、像素格式、porch值、屏的分辨率、data lane對數等計算出data_rate,然後計算出clk。

16.背光模式設置成 T65XX_LED_MODE_CUST_BLS_PWM,如何修改PWM的工作頻率
前提:cust_leds.c文件裏面使用的背光模式是MT65XX_LED_MODE_CUST_BLS_PWM
MT6582版本工作頻率計算公式如下:
PWM工作頻率計算公式:26MHz (clock freq.) / (PWM_CLKDIV+1) / 1024 (period) 26 KHz
所以需要修改PWM的工作頻率,可以通過修改PWM_CLKDIV,clock freq,或者period的值來達到修 改PWM的工作頻率的效果。
以下的三種方法可以任選1~2種來達到想要的PWM工作頻率:
1. 修改分頻參數方法,修改config_data裏面的第二個參數:
{“lcd-backlight”, MT65XX_LED_MODE_CUST_BLS_PWM, (int)disp_bls_set_backlight,{0, 1, 0, 0, 0}} //設置div=1
2. 修改clock freq:
在alps\mediatek\platform\mt6582\kernel\drivers\dispsys\ddp_bls.c文件的 disp_bls_init和disp_bls_config函數中設置CLK_CFG_1這個寄存器的值,來選擇合適的時鐘源,加入如下代碼:
mt65xx_reg_sync_writel(DRV_Reg32(CLK_CFG_1) | (0x00000003), CLK_CFG_1); //設置156 MHz的時鐘源

轉載請註明出處:http://blog.csdn.net/cbk861110/article/details/40931835

二、Driver – Battery Charging
1.充電方式
a.PMIC直接充電:驅動代碼位於:
mediatek\platform\mt6592\kernel\drivers\power\charging_hw_pmic.c
b.switch charge方式充電(switch charger是功率轉換型的芯片)。驅動代碼位於:
mediatek\platform\mt6592\kernel\drivers\power\charging_hw_xxxx.c
比如:fan5405 對應的文件就是charging_hw_fan5405.c
bq24158對應的文件就是charging_hw_bq24158.c
具體配置位於:
MTK_FAN5405_SUPPORT=no
MTK_FASTBOOT_SUPPORT=no

2.driver中mdelay() 與msleep()的區別使用:
在Linux Driver開發中,經常要用到延遲函數:msleep,mdelay/udelay.
雖然msleep和mdelay都有延遲的作用,但他們是有區別的.
1.)對於模塊本身
mdelay是忙等待函數,在延遲過程中無法運行其他任務.這個延遲的時間是準確的.是需要等待多少時間就會真正等待多少時間.
msleep是休眠函數,它不涉及忙等待.你如果是msleep(10),那實際上延遲的時間,大部分時候是要多於10ms的,是個不定的時間值.
他們的差異,平時我也講的出來,可是真正用起來的時候,就忘記了.曾在兩個driver的i2c的code中,需要用到delay函數,而我用了msleep函數,一直I2C速度超慢.而我又不知道哪裏出了問題,我潛意識中,認爲我只delay了1ms,可是,實際上是十幾毫秒.
2.)對於系統:
mdelay() 會佔用cpu資源,導致其他功能此時也無法使用cpu資源。
msleep() 則不會佔住cpu資源,其他模塊此時也可以使用cpu資源。
delay函數是忙則等待,佔用CPU時間;而sleep函數使調用的進程進行休眠。
3.)udelay() mdelay() ndelay() 區別:
udelay(); mdelay(); ndelay();實現的原理本質上都是忙等待,ndelay和mdelay都是通過udelay衍生出來的。
我們使用這些函數的實現往往會碰到編譯器的警告implicit declaration of function ‘udelay’,這往往是由於頭文件的使用不當造成的。
在include/asm-***/delay.h中定義了udelay(),而在include/linux/delay.h中定義了mdelay和ndelay.
udelay一般適用於一個比較小的delay,如果你填的數大於2000,系統會認爲你這個是一個錯誤的delay函數,因此如果需要2ms以上的delay需要使用mdelay函數。
4.)msleep,ssleep區別:
休眠單位不同
5.)秒的單位
ms是毫秒=0.001秒
us是微秒=0.000001秒
ns是納秒=0.000000001秒

3.如何配置關機充電(KPOC)中的 長按開機時間
file path:alps/mediatek/platform/mt6589/kernel/drivers/power/pmic_mt6320.c
modify #define LONG_PWRKEY_PRESS_TIME 2000*1000000

4.電池充電報警剋制化
手機充電出現異常的報警主要有:
1. 充電電壓超過正常允許的電壓範圍
2. 電池溫度超過允許的電池溫度
3. 長時間的超過1A的大電流充電
4. 電池電壓超過允許的電池電壓範圍
5. 總的充電時間超過24hr.
配置文件:alps\mediatek\custom\{project}\kernel\battery\battery\cust_battery.h
與上述5個報警相對應的宏:
#define BATTERY_NOTIFY_CASE_0001
#define BATTERY_NOTIFY_CASE_0002
#define BATTERY_NOTIFY_CASE_0003
#define BATTERY_NOTIFY_CASE_0004
#define BATTERY_NOTIFY_CASE_0005

5.如何讀取及設置PMIC registers
1)進入工程模式,讀取和設置
撥號界面 ———-輸入*#*# 3646633#*#* 進入工程模式 power —— pmu —— pmu register
或則 hardware testing —– power —— pmu —— pmu register ,所有讀寫都是16進制
2)程序運行時,如何通過ADB cmd 獲取及設置pmic registers?
adb shell cd /sys/devices/platform/mt-pmic

6.關於功耗問題:
1)第三方apk引起的,先予以排除;
2)wake up by RTC:kernel_log中查找wake up by RTC,分析喚醒源;
3)wake up by CCIF_MD:
4)wake up by EINT
7.高溫高壓後如何恢復充電
參考[FAQ10404]
在充電的過程中,如果出現高溫或者高壓的情況下, 系統會停止充電, 當溫度或者充電器的電壓值恢復正常後,如何恢復充電。

轉載請註明出處:http://blog.csdn.Net/cbk861110/article/details/40931835

三、Driver input system
1.如何添加新的kernel模塊:
參考 [FAQ08517]
(1)create new folder
alps\mediatek\custom\common\kernel\newdevice\device_a
–>notice need create 2 folder: newdevice\device_a
(2) copy your code in device_a(code can not include makefile file)
(3) Add CUSTOM_KERNEL_NEWDEVICE=device_a to projectconfig.mk
(4) compiling kernel

2.時鐘週期和時鐘頻率的換算問題
F代表頻率,單位是Hz; T代表週期,單位是s
頻率等於一除以週期, 寫成公式就是: F (Hz) = 1 / T (s) ,
所以倒過來就有周期等於一除以頻率,寫成公式就是:T = 1 / F
120MHZ = 120×10^6HZ
所以 T = 1/(120×10^6) = 8.3 x 10^(-9) s = 8.3ns

執行時間/時鐘週期 = 週期數
執行時間*時鐘頻率 = 週期數
時鐘週期 = 1/時鐘頻率
舉例說明:
dws中的Keypress_Perio是消抖週期,基準時鐘是32K。如果是1024個週期,則消抖時間是32ms;
即:消抖時間 =(1/32000)*1024 s =0.032s =32ms

3.觸摸屏的供電配置
VDD VGP 供電區別

4.TP上實現虛擬按鍵功能:
參考[FAQ02518]
添加tp的virtual key,需在tp對應的頭文件中添加如下設置:
1.定義宏TPD_HAVE_BUTTON;
2.定義TPD_BUTTON_HEIGHT,TPD_KEY_COUNT,TPD_KEYS和TPD_KEYS_DIM,分別用於定義button被識 別的縱向座標,button的個數,對應的功能鍵,和每個功能鍵的座標。
配置示例:
#define TPD_HAVE_BUTTON
#define TPD_BUTTON_HEIGHT 480 //這個不小於LCD的分辨率的height
#define TPD_KEY_COUNT 4
#define TPD_KEYS {KEY_MENU, KEY_HOME, KEY_BACK, KEY_SEARCH}
#define TPD_KEYS_DIM {{40,500,40,60},{120,500,40,60},{200,500,40,60},{280,500,40,60}}
其中,{40,500,40,60}對應了KEY_MENU的座標, (40,50)是該key center的座標,40是該鍵的寬度 ,60是該鍵的高度
3.button定義初始化成功後,通過adb shell,可以在/sys/board_properties/virtualkeys.mtk- tpd中看到這些button的定義

5.TP虛擬按鍵背光燈時間控制:
adjust powermanagerservice.java define LONG_KEYLIGHT_DELAY value

6.I2C傳輸數據速率設定方式:
在進行i2c 傳輸前設置,i2c_client->timing = timing_number;
備註:
1.當設備不支持快速mode timing_number < = 100;2.當設備支持快速mode timing_number <= 400;轉載請註明出處:http://blog.csdn.net/cbk861110/article/details/40931835四、Driver - Misc1.關於MTK平臺支持的耳機:一般手機(包括Nokia、三星等)是:L、R、MIC、GND。小米、iPhone、HTC等是:L、R、GND、MIC。MTK 平臺目前支持第一種:L、R、MIC、GND。 (對於一般3線制耳機MTK也支持)。2.DCT配置GPIO的設置/初 始化:1)當配置GPIO時,有的有勾選M0~M7中的兩個,甚至有的還需要勾選勾選多個?最後GPIO配置成了 哪個功能呢? (1) GPIO在系統初始化後的mode是由Def.Mode這一欄決定的。 (2) 如果勾選了M0-M7中的某些項,則會生成類似 #define GPIO_UART_UTXD4_PIN_M_GPIO GPIO_MODE_00 這樣的宏定義,在code中可以直接使用。 (3) 但是系統初始化後的mode還是以Def.Mode這一欄的選擇爲準。2)當配置成NC的gpio實際開機後是個什麼狀態? 通常是Mode 0,GPIO Mode,輸入模式,使能內部下拉。3) 修改了DCT中的GPIO Setting後,怎樣編譯? ./mk [Project_Name] new preloader ./mk [Project_Name] new uboot/lk ./mk [Project_Name] new kernel ./mk [Project_Name] bootimage4)MT6589的dct配置的參數是在代碼的哪個地方生效? LK中生效, 具體位置如下:mediatek/platform/mt6589/lk/mt_gpio_init.c 函數爲void platform_early_init(void)--> mt_gpio_set_default();

3. 讀取和修改GPIO配置參數的 ADB命令

4.耳機檢測
82以及之後的平臺,請一定要用EINT+ACCDET方式進行耳機檢測。

5.Headset accdet常用宏:
在accdet.c和accdet_custome.h爲了實現一些功能有用到很多宏開關,把目前相應的宏開關介紹如下 :
1: ACCDET_EINT
是否啓用了外部中斷來偵測是否有耳機插入和拔出
2: ACCDET_MULTI_KEY_FEATURE
是否支持使用A/D來偵測key,這裏要注意的是即使耳機只有一個key若是在89的平臺也需打開此宏 開關
3: ACCDET_LOW_POWER
當插入三段耳機6s後自動關閉micbias,達到省電的目的
以上三個宏可以看成一個宏
4: ACCDET_28v_MODE
在我們內部有一個switch是針對外部耳機是用2.8還是1.9V的切換開關,美標的是2.8V, 國標的是 1.9V
5: ACCDET_PIN_RECOGNIZATION
美標的插孔識別國標的耳機,國標的耳機識別美標的插孔,目前這個功能還沒有實現,此宏不能打開
6: ACCDET_SHORT_PLUGOUT_DEBOUNCE
ACCDET_SHORT_PLUGOUT_DEBOUNCE_CN 25
拔出耳機後有時候圖標會再彈出後在消失, 主要解決類似bug
7: ACCDET_PIN_SWAP
美標的插孔識別國標的耳機,這個時候需要藉助accdet的一個上拉電阻,當有這種情形的時候AB一 直爲0,達到檢測到的目的,當然也有誤判的時候, 4段耳機按住按鍵插入後會有誤判

6.如何配置PMIC 上的RST_KEY
alps/mediatek/custom/$PRJ/kernel/kpd/kpd/mtk_kpd.h
配成 vol- :
#define KPD_PMIC_RSTKEY_MAP KEY_VOLUMEDOWN
配成 home key:
#define KPD_PMIC_RSTKEY_MAP KEY_HOME

7.怎樣添加一個自定義的LED燈
1. 修改如下兩個文件:
alps/mediatek/custom/common/kernel/leds/inc/cust_leds.h
enum mt65xx_led_type
{
MT65XX_LED_TYPE_RED = 0,
… …
MT65XX_LED_TYPE_LCD,
MT65XX_LED_TYPE_ABC, // Add a new LED type
MT65XX_LED_TYPE_TOTAL,
};
alps/mediatek/custom/YOUR_PRJ/kernel/leds/mt65xx/cust_leds.c
static struct cust_mt65xx_led cust_led_list[MT65XX_LED_TYPE_TOTAL] = {
{“red”, MT65XX_LED_MODE_NONE, -1,{0}},
{“lcd-backlight”, MT65XX_LED_MODE_CUST, (int)Cust_SetBacklight,{0}},
// Set LED params, Please refer to
{“abc-backlight”, MT65XX_LED_MODE_CUST, (int)Cust_SetBacklight_abc,{0}},
};

8.BB端PWM FIFO mode配置參數說 明

9.如何配置UART1/UART4爲Log輸 出端口?
mediatek\source\external\mhal\src\custom\common\preloader\inc\cust_bldr.h
#define CFG_LOG_BAUDRATE 921600
#define CFG_UART_LOG (UART1)
可以修改如下宏定義切換log輸出口:
mediatek/custom/project_name/preloader/inc/cust_bldr.h: CFG_UART_LOG 定義爲 1 or 4

如何修改UART輸出數據的波特率
有以下3個地方分別控制不同的部分的波特率
1. 設置 preloader 波特率,這裏不會設置到uboot和kernel
文件爲mediatek/custom/proj/preloader/inc/cus_bldr.h
#define CFG_LOG_BAUDRATE (115200)
2. 修改uboot 波特率
mediatek/custom/proj/uboot/inc/configs/ubconfigs.h
#define CFG_LOG_BAUDRATE (115200)
3. 修改kernel 波特率
mediatek/config/mt6575/autoconfig/kconfig/platform
CONFIG_CMDLINE=”console=ttyMt3, 115200″

10.如何通過adb shell命令 調試Vibrator
下面的命令是用於調試,請試着用它找出你想要的時間和震動強度。 1000毫秒 = 1秒
adb shell “echo 1000 > /sys/devices/virtual/timed_output/vibrator/enable”

11.ACCDET模塊耳機檢測的原理
ACCDET內部有兩個比較器,會根據傳入的電壓判斷併產生中斷。ACCDET的輸入電壓即耳機 MIC PIN
的電壓,內部比較器的輸出分別對應A/B兩個寄存器。
ACCDET內部兩個比較器的Vref分別是1.77V和0.4V(硬件決定的,不能修改),所以,對應的電壓有 3個範圍:
1.77V-1.9V: 未插入耳機的狀態(AB=B11)
0.4V-1.77V: 插入4段式(有Mic)耳機時的狀態(AB = B01)
0-0.4V : 插入3段式耳機時的狀態,或者4段式按鍵按下時的狀態(AB = B00)
耳機的狀態會保存到ACCDET的寄存器中,當電壓在任意2個範圍間切換時,狀態發生變化,ACCDET產生
中斷,中斷處理中讀取狀態寄存器的值,並根據狀態的變化做相應的處理.

12.如何調整不同sensor驅動的 加載順序
在mt6575_devs.c /mt6577_devs.c 文件內 mt6577_board_init函數,修改不同設備的 註冊順序。

platform_device_register(&sensor_alsps);
platform_device_register(&sensor_gsensor);
調整上述的註冊順序,即可調整驅動中probe的加載順序。

13.SIM1和SIM2兩個卡槽交換:
修改modem的相關代碼, 請做如下修改, 即可交換SIM1 SIM2 Modem:
icc_switchControl_al.c(MOLY\driver\storage\sim\src)
kal_bool sim_physicalSlotChanged = KAL_TRUE;

轉載請註明出處:http://blog.csdn.net/cbk861110/article/details/40931835

五、FM
1,FM支持哪些音頻方式
Line in模擬方式和I2S數字方式。
硬件工程師要確定原理圖上選擇的是哪種方式,然後進行如下配置。
l Line in
MTK_FM_RX_AUDIO=FM_ANALOG_INPUT
MTK_FM_TX_AUDIO=FM_ANALOG_OUTPUT
l I2S
MTK_FM_RX_AUDIO=FM_DIGTAL_INPUT
MTK_FM_TX_AUDIO=FM_DIGTAL_OUTPUT
使用dws配置I2S管腳,可以參考FAQ03803中的配置進行。

2.fm如何打開支持50K的feature
修改alps/mediatek/config/[Project]/ProjectConfig.mk文件中的MTK_FM_50KHZ_SUPPORT變量。
設置MTK_FM_50KHZ_SUPPORT=yespatch

3.如何修改6620/6626/6628的FM RSSI門限
RSSI: Receive Signal Strength Indicator 接收信號強度指示
Rx: Recieived power 接收功率
兩者意思一樣,具體指(前向或者反向)接收機接收到信道帶寬上的寬帶接收功率。實際上中,前向鏈路接收機(指手機)接收到的通常用Rx表示,反向鏈路接收機(指基站側)通常用反向RSSI表示。

4.如何關閉RDS
由於沒有宏用來切換RDS的開啓與關閉,直接修改上層APK上的接口isRDSSupported即可。
RDS是數字廣播系統,主要在歐洲運用很廣泛.它的主要作用是這樣的:它有一個優先權的設定特點.你可以設定你喜歡的電臺頻道,如體育,新聞或軍事等,當你的機子收到你所設定的頻道信號時,機子正在工作的內容會中止,轉而播出這方面的信息.它是數字可字母顯示的,沒有聲音.還有一種功能就是警告中斷,當路面有事故發生(如堵車等),電臺會播送信號,機子收到就會顯示出來,你就可以走別的路了.一般在歐洲的車載電子設備中要求要有這個RDS功能.

5.FM調試文檔
alps\mediatek\config\$Project\ProjectConfig.mk
alps\mediatek\config\$Project \autoconfig\kconfig\project
這兩支文件中和fm相關的變量設置,例如MTK_FM_SUPPORT、MTK_FM_CHIP、
CONFIG_MTK_FM(這個變量十分重要,決定FM模塊是否編譯)。
1.1 JNI層編譯
編譯命令:mk $project mm mediatek\external\fmradio\
1.1.1 alps\mediatek\external\fmradio\Android.mk負責產生linux文件系統中
/system/etc/firmware下的fm的bin文件,目前只針對6628。
1.1.2 alps\mediatek\external\fmradio\fmr\Android.mk負責產生libfmjni.so和libfmar1000.so、
libfmmt6616.so、libfmmt6620.so、libfmmt6626.so、libfmmt6626.so、libfmmt6628.so。
1.1.3 alps\mediatek\external\fmradio\custom\Android.mk負責產生libfmcust.so。
1.2 Kernel層編譯
編譯命令:
l MT6620 mk $project n k mediatek\kernel\drivers\combo\drv_fm
l MT6628/6626 mk $project n k mediatek\kernel\drivers\fmradio
1.2.1 MT6620
1.2.1.1 alps\mediatek\kernel\drivers\combo\Makefile
1.2.1.2 alps\mediatek\kernel\drivers\combo\drv_fm\Makefile
1.2.1.3 alps\mediatek\kernel\drivers\combo\drv_fm\public\Makefile
1.2.1.4 alps\mediatek\kernel\drivers\combo\drv_fm\private\Makefile
1.2.2 MT6626+MT6628
1.2.2.1 alps\mediatek\kernel\drivers\fmradio\Makefile
1.2.2.2 alps\mediatek\kernel\drivers\fmradio\private\Makefile
FM加載驅動ko文件導致的問題
正常模式:alps\mediatek\config\$project \ init.project.rc
Meta模式:alps\mediatek\config\$project \meta_init.project.rc
工廠模式:alps\mediatek\custom\$project \factory\init.rc
主要是在相關的init文件中加載FM的文件和編譯FM driver產生的ko是否一致。

六、Camera
1.MT6575上mclk設爲 26Mhz時,佔空比不是50%
MT6575上26Mhz mclk設置後佔空比不是50%, 量到爲61.7%.

2.Camera上電開 power(DVDD, AVDD, IOVDD)之間間隔時間太長

3.如何配置 lens
首先需要向sensor的vendor瞭解,使用的sensor是否內嵌lens的driver IC
如OV5640和MT9P017就是內嵌lens driver ic的。內嵌lens driver ic,即直接操作sensor的寄存器去推lens。
若sensor沒有內嵌lens的driver IC,則需要向模組廠瞭解,模組是否外掛了lens的driver IC,driver IC的型號是什麼。我們codebase裏的FM50AF下的代碼,對應了AD5820的driver ic。如果您的模組包的也是這顆lens driver IC,則直接配置爲fm50af即可;如果是其他型號的driver IC,您也可以嘗試使用AD5820的驅動(注意把device address改過來)
有些sensor自帶AF算法。如ov3640是一顆含AF core的sensor,即它自己能夠做AF算法。因爲YUV+AF要求sensor本身是能自己做AF算法的,所以不是每顆YUV sensor都是支持自動對焦的。如果您使用的sensor含有AF CORE,且您希望使用sensor自己的AF算法來對焦,即可配置爲sensordrive,但需要您參照文檔
ALPS_YUV+AF_customization_and_application_note(請在DMS上搜這篇文檔看)對sensor driver做針對AF功能的修改。

4.使用 FM50AF 之外的 Lens Driver的修改
由於root process & global writeable file已經在非PRC(中華人民共和國)地區被強制要求,因此ALPS.ICS2.MP 版本及之後版本對root權限方面做了要求,這個要求對於Camera的影響就是,如果使用 FM50AF 之外的lens driver,需要在 init.rc 文件中增加對新Lens driver權限和用戶方面的修改
例如增加了 XXXAF 這個lens driver 需要修改文件 mediatek\config\mt65XX\init.rc
添加下面二行
chmod 0660 /dev/XXXAF
chown system camera /dev/XXXAF
添加後如下
#Camera
chmod 0666 /dev/camera-sysram
chmod 0666 /dev/camera-isp
chmod 0660 /dev/camera-eis
chmod 0660 /dev/camera-fdvt
chmod 0666 /dev/camera-resmgr
chmod 0660 /dev/kd_camera_hw
chmod 0660 /dev/kd_camera_flashlight
chmod 0660 /dev/FM50AF
chmod 0660 /dev/XXXAF
chown system camera /dev/camera-sysram
chown system camera /dev/camera-isp
chown system camera /dev/camera-eis
chown system camera /dev/camera-fdvt
chown system camera /dev/camera-resmgr
chown system camera /dev/kd_camera_hw
chown system camera /dev/kd_camera_flashlight
chown system camera /dev/FM50AF
chown system camera /dev/XXXAF

5.如何修改I2C speed
Mediatek\custom\common\kernel\imgsensor\src\kd_sensorlist.c
iWriteReg()中最前面加上g_pstI2Cclient->timing,表示設置I2C的速度
如果不設置,爲默認值100K ,
比如想將I2C的speed設置爲400K,可將g_pstI2Cclient->timing設置爲400K

6.如何打開或者關閉閃光 燈
打開/關閉閃光燈可以通過如下配置(兩種方法) :
1. 在alps/mediatek/config/pjt/ProjectConfig.mk 文件中,按照如下配置
CUSTOM_HAL_FLASHLIGHT = constant_flashlight #dummy_flashlight
CUSTOM_KERNEL_FLASHLIGHT = constant_flashlight #dummy_flashlight

2. 在feature table中把flash相關的feature 打開/關閉
RAW sensor 涉及的文件
1) alps\mediatek\custom\project name\hal\camera\camera 目錄下cfg_ftbl_custom_raw_main.h
2) alps\mediatek\custom\common\hal\camera\camera 目錄下cfg_ftbl_custom_raw_main.h
3) alps\mediatek\source\external\mhal\src\core\drv\6575\isp目錄下cfg_ftbl_raw_sceneindep.h
YUV sensor 涉及的文件
1) alps\mediatek\custom\project name\hal\camera\camera 目錄下cfg_ftbl_custom_yuv_main.h
2) alps\mediatek\custom\common\hal\camera\camera 目錄下cfg_ftbl_custom_yuv_main.h
3) alps\mediatek\custom\common\hal\imgsensor\xxx_yuv目錄下cfg_ftbl_xxx_yuv.h
規則:優先級,1) > 2) > 3),即如果project name下相應的的文件,則只需要在相應的文件中打開flash相關的 feature,如果沒有,則在2)中的文件打開/關閉:
#if 1//0
// Flash Light
CONFIG_FEATURE(FID_AE_STROBE,
BY_DEFAULT(FLASHLIGHT_FORCE_OFF),
FLASHLIGHT_AUTO, FLASHLIGHT_FORCE_ON, FLASHLIGHT_FORCE_OFF
)
#endif

7.如何控制mclk的開關
由於mclk在sensor上電之前就已經開了,如果不滿足sensor spec中上電時序要求,可在開sensor power之前將mclk先 關閉,然後再需要時再打開,如何控制mclk的開關呢?

可調用void mt_isp_mclk_ctrl(int en) API去控制, (mediate\platform\mt6575\kernel\core\mt6575_isp.c)

8.如何調整閃光燈在 auto模式下的打閃閾值
參考[FAQ03033]
修改camera_ae_plinetable_xxx_mt657X.h文件註釋爲u4StrobeTrigerBV的值,例如下面代碼
static strAETable g_AE_CaptureTable =(
20, //u4StrobeTrigerBV
);

這一行, 這個值越大越容易打閃,越小越不容易打閃。

轉載請註明出處:http://blog.csdn.net/cbk861110/article/details/40931835

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章