学者之家电子论坛--打造电子工程师共同致富的平台's Archiver

xingyangqing 发表于 2010-1-30 11:58

MTK平台驱动调试指南

GPIO设置篇[p=30, 2, left]一、GPIO有关的函数[/p][p=30, 2, left]1.GPIO_ModeSetup:[/p][p=30, 2, left]函数原型:void GPIO_ModeSetup(kal_uint16 pin, kal_uint16 conf_dada)[/p][p=30, 2, left]功能:设置GPIO的工作模式是作为GPIO,还是作为专有功能接口。[/p][p=30, 2, left]参数:[/p][p=30, 2, left]pin:GPIO 的pin脚号,对应于原理图上MTK62XX 主CPU芯片的上的GPIO标号[/p][p=30, 2, left]conf_dada:值有0~3。其中0是表示作为GPIO模式,其他根据专有功能的不同进行设置。[/p][p=30, 2, left] [/p][p=30, 2, left]2.GPO_InitIO[/p][p=30, 2, left]函数原型:void GPIO_InitIO(char direction, char port)[/p][p=30, 2, left]功能:初始化GPIO的工作方向是作为输入,还是作为输出[/p][p=30, 2, left]参数:[/p][p=30, 2, left]    direction:工作方向,0表示输入,1表示输出[/p][p=30, 2, left]    port:GPIO的pin脚[/p][p=30, 2, left] [/p][p=30, 2, left] [/p][p=30, 2, left]3.GPIO_ReadIO[/p][p=30, 2, left]函数原型:char GPIO_ReadIO(char port)[/p][p=30, 2, left]功能:从GPIO读取数据[/p][p=30, 2, left]参数:[/p][p=30, 2, left]    port:GPIO的pin脚[/p][p=30, 2, left] [/p][p=30, 2, left]4.GPIO_WriteIO[/p][p=30, 2, left]函数原型:void GPIO_WriteIO(kal_char data, kal_char port)[/p][p=30, 2, left]功能:往GPIO写数据[/p][p=30, 2, left]参数:[/p][p=30, 2, left]data: 1表示给高电平,0表示给低电平[/p][p=30, 2, left]    port:GPIO的pin脚[/p][p=30, 2, left] [/p][p=30, 2, left]备注:这些函数在Gpio.C中可以找到。[/p][p=30, 2, left] [/p][p=30, 2, left] [/p][p=30, 2, left]二、GPIO模式设置[/p][p=30, 2, left]    GPIO口在系统上电的时候,有的是默认高电平,有的是默认低电平,这是MCU内部决定的,软件无法更改,但是在系统开机过程中,会对GPIO进行初始化,MCU中有几个GPIO模式初始化寄存器,通过这个寄存器给GPIO设置初始模式。[/p][p=30, 2, left]    例如:以下这个寄存器就是用来设置0-7号GPIO的模工作模式的。[/p][p=30, 2, left]    这个初始化过程在Gpio_Drv.C中的函数GPIO_init()中,项目开始的时候,先要检查这个部分的模式设置是否正确。[/p][p=30, 2, left] [/p][p=30, 2, left] [/p][p=30, 2, left]三、各个功能模块的GPIO设置[/p][p=30, 2, left] [/p][p=30, 2, left]1.    LCD背光,马达[/p][p=30, 2, left]有的LCD背光是靠GPIO进行控制的,有的则靠PMIC进行控制。但不管那个方式进行控制,都只需修改Custom_equipment.c中的相关部分就可以了,具体如下:[/p][p=30, 2, left]首先,检查数组[/p][p=30, 2, left]GPIO_MAP_ENTRY gpio_map_tbl[] = {[/p][p=30, 2, left]   {GPIO_VAILD, GPIO_PORT_24, netname[GPIO_LABEL_LCD_BACKLIGHT], NULL },[/p][p=30, 2, left]。[/p][p=30, 2, left]。[/p][p=30, 2, left]。[/p][p=30, 2, left]};[/p][p=30, 2, left]将没有使用的GPIO,用GPIO_INVALID给屏蔽掉。[/p][p=30, 2, left]然后,修改函数custom_cfg_gpio_set_level,在对应的GPIO类型上将控制函数添加进去即可。比如:[/p][p=30, 2, left]   switch(gpio_dev_type)    [/p][p=30, 2, left]   {[/p][p=30, 2, left]   case GPIO_DEV_LED_MAINLCD:[/p][p=30, 2, left]     if( gpio_dev_level == LED_LIGHT_LEVEL0)// LEVEL0- LEVEL5是背光由若到强的控制,LEVEL0表示关闭背光[/p][p=30, 2, left]GPIO_WriteIO(GPIO_OFF, custom_cfg_outward_gpio_port(GPIO_LABEL_LCD_BACKLIGHT) );[/p][p=30, 2, left]        else[/p][p=30, 2, left]           GPIO_WriteIO(GPIO_ON, custom_cfg_outward_gpio_port(GPIO_LABEL_LCD_BACKLIGHT) );[/p][p=30, 2, left]          [/p][p=30, 2, left]        PWM2_level(gpio_dev_level);[/p][p=30, 2, left]        break;[/p][p=30, 2, left] [/p][p=30, 2, left]2.    蓝牙[/p][p=30, 2, left]在文件bt_hw_define.h中参照原理图进行对应GPIO的修改。[/p][p=30, 2, left]   #define BT_GPIO_RESET     52//39 //GPIO_39 : PMIC reset[/p][p=30, 2, left]   #define BT_GPIO_DSC       36//;4 //GPIO_4 : to disconnect RFComm link[/p][p=30, 2, left]   #define BT_GPIO_POWER 4//12 //GPIO_12: Power[/p][p=30, 2, left]   #define BT_GPIO_DATASELECT 0//;3 //GPIO_3: DataSelect[/p][p=30, 2, left] [/p][p=30, 2, left]3.    Camera[/p][p=30, 2, left]在文件Camera_hw.c和sccb.h中参照原理图进行对应GPIO的修改。[/p][p=30, 2, left]【Camera_hw.c】[/p][p=30, 2, left]       #define MODULE_POWER_PIN        6  // GPIO NO.[/p][p=30, 2, left]#define MODULE_RESET_PIN        12  // GPIO NO.[/p][p=30, 2, left]#define MODULE_CMPDN_PIN        13  // GPIO NO.[/p][p=30, 2, left] [/p][p=30, 2, left]【sccb.h】[/p][p=30, 2, left]#define SCCB_SERIAL_CLK_PIN     8[/p][p=30, 2, left]#define SCCB_SERIAL_DATA_PIN       9[/p][p=30, 2, left]      [/p][p=30, 2, left]4.    TouchPanel[/p][p=30, 2, left]在文件Touch_panel_spi.h中参照原理图进行对应GPIO的修改[/p][p=30, 2, left]   #define SPI_DIN_PIN     1 //17 [/p][p=30, 2, left]   #define SPI_CLK_PIN     8 //20  [/p][p=30, 2, left]   #define SPI_DOUT_PIN    38 //22 [/p][p=30, 2, left]   #define SPI_CS_PIN      9 //23 [/p][p=30, 2, left]   #define SPI_BUSY_PIN    5 //21 [/p][p=30, 2, left] [/p][p=30, 2, left]四、总结[/p][p=30, 2, left]   GPIO的设置相对来讲比较简单,只要仔细参对原理图,基本上就可以将GPIO配置好。当然有些时候GPIO配置好了也达不到效果,就需要和硬件工程师一起来进行检测分析,测量对应电路的工作电压或电流,来判断工作是否正常。总之在前期的调试方面,多跟硬件工程师沟通、讨论、分析,会很快解决问题。[/p][p=30, 2, left] [/p][p=30, 2, left]Ø      中断调试篇[/p][p=30, 2, left]中断调试一般来说包括以下几个方面,一一做简单介绍:[/p][p=30, 2, left]1.      中断号匹配[/p][p=30, 2, left]这个部分在文件eint_def.c中进行设置,参照原理图设置即可。[/p][p=30, 2, left] [/p][p=30, 2, left]2.      中断触发方式的设置[/p][p=30, 2, left]在文件eint_def.c中,首先要对中断的触发响应时间进行设置,是在数组变量custom_eint_sw_debounce_time_delay中。一般情况下这个部分是不用动的,但有时候中断触发有问题的时候,这就是一个调试点。比如对于Touchpanel的中断,对应的响应时间一般是0,如果不是0,就需要修改。[/p][p=30, 2, left]另外,因为中断触发分电平触发和边沿触发,电平触发又分高电平触发和低电平触发,边沿触发又分为上升沿触发和下降沿触发,因此先需要跟硬件工程师了解对应的中断触发方式,然后在对应的中断初始化的地方修改触发方式。[/p][p=30, 2, left] [/p][p=30, 2, left]3.      中断处理流程调试[/p][p=30, 2, left]有时候中断设置好了,对应功能也不能正常使用,那么就需要调试中断处理流程了,需要增加trace,一般我们会用系统带的trace函数kal_prompt_trace,有时候调试这个函数不能正常工作,那么我们就用这个文件中的函数sys_print打印trace信息,要使用这个函数,需要在系统最开始启动的时候,调用sys_uart_init进行初始化。这个函数库是在6228平台上做的,可能在其他平台上寄存器因为不同,需要进行修改。[/p][p=30, 2, left]往往在调试的过程中,经常发现是给芯片供电方面出了问题。因为有时候MTK给过来的代码,在他们的参考设计上是一种供电方式,但是在我们的设计上可能就是不一样了。所以在找到芯片供电部分代码的时候,查找对应资料,看是否调用正常。[/p][p=30, 2, left]----------------------------------------------------------------[/p]
dbg_print怎么打开?

哪个宏控制呢?
DRV_DEBUG打开后串口还是没有信息出来

make\drv\drv.def
中加入DRV_DEBUG

我一般在dbgprint.c里面直接修改
#if 1//def  DRV_DEBUG
#if 1//(!defined(IC_MODULE_TEST))
--------------------------------------------------------------------
{
char buffer[50];
sprintf(buffer, "ERROR");
rmmi_write_to_uart((kal_uint8*)buffer, strlen(buffer), KAL_TRUE);
}

永不言败 发表于 2010-2-6 14:30

好东西!

手持机 发表于 2010-3-5 18:04

真是那么回事,好东西,顶起来

湖伊 发表于 2010-3-31 13:37

Thank you very much!

卧虎 发表于 2010-4-10 11:55

写的不错的

页: [1]

Powered by Discuz! Archiver 7.1  © 2001-2009 Comsenz Inc.

302 Found

302 Found


nginx/1.8.0