MTK平臺驅動調試指南
Ø GPIO設置篇
一、GPIO有關的函數
1.GPIO_ModeSetup:
函數原型:void GPIO_ModeSetup(kal_uint16 pin, kal_uint16 conf_dada)
功能:設置GPIO的工作模式是作為GPIO,還是作為專有功能接口。
參數:
pin:GPIO 的pin腳號,對應於原理圖上MTK62XX 主CPU芯片的上的GPIO標號
conf_dada:值有0~3。其中0是表示作為GPIO模式,其他根據專有功能的不同進行設置。
2.GPO_InitIO
函數原型:void GPIO_InitIO(char direction, char port)
功能:初始化GPIO的工作方向是作為輸入,還是作為輸出
參數:
direction:工作方向,0表示輸入,1表示輸出
port:GPIO的pin腳
3.GPIO_ReadIO
函數原型:char GPIO_ReadIO(char port)
功能:從GPIO讀取數據
參數:
port:GPIO的pin腳
4.GPIO_WriteIO
函數原型:void GPIO_WriteIO(kal_char data, kal_char port)
功能:往GPIO寫數據
參數:
data: 1表示給高電平,0表示給低電平
port:GPIO的pin腳
備註:這些函數在Gpio.C中可以找到。
二、GPIO模式設置
GPIO口在系統上電的時候,有的是默認高電平,有的是默認低電平,這是MCU內部決定的,軟件無法更改,但是在系統開機過程中,會對GPIO進行初始化,MCU中有幾個GPIO模式初始化寄存器,通過這個寄存器給GPIO設置初始模式。
例如:以下這個寄存器就是用來設置0-7號GPIO的模工作模式的。
這個初始化過程在Gpio_Drv.C中的函數GPIO_init()中,項目開始的時候,先要檢查這個部分的模式設置是否正確。
三、各個功能模塊的GPIO設置
1. LCD背光,馬達
有的LCD背光是靠GPIO進行控制的,有的則靠PMIC進行控制。但不管那個方式進行控制,都只需修改Custom_equipment.c中的相關部分就可以了,具體如下:
首先,檢查數組
GPIO_MAP_ENTRY gpio_map_tbl[] = {
/*GPIO_LABEL_LCD_BACKLIGHT */ {GPIO_VAILD, GPIO_PORT_24, netname[GPIO_LABEL_LCD_BACKLIGHT], NULL },
。
。
。
};
將沒有使用的GPIO,用GPIO_INVALID給屏蔽掉。
然後,修改函數custom_cfg_gpio_set_level,在對應的GPIO類型上將控制函數添加進去即可。比如:
switch(gpio_dev_type)
{
case GPIO_DEV_LED_MAINLCD:
if( gpio_dev_level == LED_LIGHT_LEVEL0)// LEVEL0- LEVEL5是背光由若到強的控制,LEVEL0表示關閉背光
GPIO_WriteIO(GPIO_OFF, custom_cfg_outward_gpio_port(GPIO_LABEL_LCD_BACKLIGHT) );
else
GPIO_WriteIO(GPIO_ON, custom_cfg_outward_gpio_port(GPIO_LABEL_LCD_BACKLIGHT) );
PWM2_level(gpio_dev_level);
break;
2. 藍牙
在文件bt_hw_define.h中參照原理圖進行對應GPIO的修改。
#define BT_GPIO_RESET 52//39 //GPIO_39 : PMIC reset
#define BT_GPIO_DSC 36//;4 //GPIO_4 : to disconnect RFComm link
#define BT_GPIO_POWER 4//12 //GPIO_12: Power
#define BT_GPIO_DATASELECT 0//;3 //GPIO_3: DataSelect
3. Camera
在文件Camera_hw.c和sccb.h中參照原理圖進行對應GPIO的修改。
【Camera_hw.c】
#define MODULE_POWER_PIN 6 // GPIO NO.
#define MODULE_RESET_PIN 12 // GPIO NO.
#define MODULE_CMPDN_PIN 13 // GPIO NO.
【sccb.h】
#define SCCB_SERIAL_CLK_PIN 8
#define SCCB_SERIAL_DATA_PIN 9
4. TouchPanel
在文件Touch_panel_spi.h中參照原理圖進行對應GPIO的修改
#define SPI_DIN_PIN 1 //17 /*1GPO*/
#define SPI_CLK_PIN 8 //20 /*8GPO*/
#define SPI_DOUT_PIN 38 //22 /*18GPI*/
#define SPI_CS_PIN 9 //23 /*9GPO*/
#define SPI_BUSY_PIN 5 //21 /*5GPI*/
四、總結
GPIO的設置相對來講比較簡單,只要仔細參對原理圖,基本上就可以將GPIO配置好。當然有些時候GPIO配置好了也達不到效果,就需要和硬件工程師一起來進行檢測分析,測量對應電路的工作電壓或電流,來判斷工作是否正常。總之在前期的調試方面,多跟硬件工程師溝通、討論、分析,會很快解決問題。
Ø 中斷調試篇
中斷調試一般來說包括以下幾個方面,一一做簡單介紹:
1. 中斷號匹配
這個部分在文件eint_def.c中進行設置,參照原理圖設置即可。
2. 中斷觸發方式的設置
在文件eint_def.c中,首先要對中斷的觸發響應時間進行設置,是在數組變量custom_eint_sw_debounce_time_delay中。一般情況下這個部分是不用動的,但有時候中斷觸發有問題的時候,這就是一個調試點。比如對於Touchpanel的中斷,對應的響應時間一般是0,如果不是0,就需要修改。
另外,因為中斷觸發分電平觸發和邊沿觸發,電平觸發又分高電平觸發和低電平觸發,邊沿觸發又分為上升沿觸發和下降沿觸發,因此先需要跟硬件工程師了解對應的中斷觸發方式,然後在對應的中斷初始化的地方修改觸發方式。
3. 中斷處理流程調試
有時候中斷設置好了,對應功能也不能正常使用,那麽就需要調試中斷處理流程了,需要增加trace,一般我們會用系統帶的trace函數kal_prompt_trace,有時候調試這個函數不能正常工作,那麽我們就用這個文件中的函數sys_print打印trace信息,要使用這個函數,需要在系統最開始啟動的時候,調用sys_uart_init進行初始化。這個函數庫是在6228平臺上做的,可能在其他平臺上寄存器因為不同,需要進行修改。
往往在調試的過程中,經常發現是給芯片供電方面出了問題。因為有時候MTK給過來的代碼,在他們的參考設計上是一種供電方式,但是在我們的設計上可能就是不一樣了。所以在找到芯片供電部分代碼的時候,查找對應資料,看是否調用正常。
再分享一下我老師大神的人工智能教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow
MTK平臺驅動調試指南