当换上自己的lcd屏幕时,发现屏幕上的黑点总是在闪烁,刚开始我们一直以为是屏幕频率的问题,所以我们之前的nanopi3中的lcds.c里面的lcd702结构体里面的.freq改为70,100,因为我们觉得屏幕闪动就是频率太低,但是改了以后还是没有用,那么lcd的屏幕闪烁到底是什么造成的呢?
我们来看下代码:
static struct nxp_lcd wvga_s702 = {
.width = 800,
.height = 480,
.p_width = 155,
.p_height = 93,
.bpp = 24,
.freq = 61,
.timing = {
.h_fp = 44,
.h_bp = 26,
.h_sw = 20,
.v_fp = 22,
.v_fpe = 1,
.v_bp = 15,
.v_bpe = 1,
.v_sw = 8,
},
.polarity = {
.rise_vclk = 1,
.inv_hsync = 1,
.inv_vsync = 1,
.inv_vden = 0,
},
.gpio_init = s702_gpio_init,
};
这个时候我看到里面的函数s702_gpio_init
static void s702_gpio_init(void)
{
int i;
common_gpio_init();
nx_gpio_set_drive_strength(PAD_GPIO_A, 0, 2);
for (i = 1; i < 25; i++)
nx_gpio_set_drive_strength(PAD_GPIO_A, i, 0);
for (; i < 28; i++)
nx_gpio_set_drive_strength(PAD_GPIO_A, i, 1);
}
来吧,我们看一下这28个引脚是怎么控制的吧,看看这些引脚的电路图吧!
上面的图中的lcd的24个引脚(GPIOA的1~24脚)对应函数中的r,g,b三色控制引脚,另外的四个引脚分别是HSYNC(水平),VSYNC(控制),LCD_DE(lcd使能信号),LCD_CLK(lcd时钟信号).
驱动电流补充:
参考:对驱动能力重点理解,
驱动能力:参考三星的驱动手册可知此函数是设置驱动能力。
s5p_gpio_set_drvstr(S5PV210_GPH3(0), 2); //驱动能力 0-3
加大我们的驱动电流即可,需要仔细看驱动电流强度等级。
static void s70_gpio_init(void)
{
int i;
/* PVCLK */
nx_gpio_set_drive_strength(PAD_GPIO_A, 0, 3);
/* RGB24 */
for (i = 1; i < 25; i++)
nx_gpio_set_drive_strength(PAD_GPIO_A, i, 3);
/* HS/VS/DE */
nx_gpio_set_drive_strength(PAD_GPIO_A, 25, 3);
nx_gpio_set_drive_strength(PAD_GPIO_A, 26, 3);
nx_gpio_set_drive_strength(PAD_GPIO_A, 27, 3);
}
现在我们看一下我的内核中最后一个参数的定义及说明:
void NX_GPIO_SetDriveStrength(U32 ModuleIndex,U32 BitNumber,NX_GPIO_DRVSTRENGTH drvstrength)
{
register struct NX_GPIO_RegisterSet *pRegister;
NX_ASSERT( NUMBER_OF_GPIO_MODULE > ModuleIndex );
pRegister = __g_ModuleVariables[ModuleIndex].pRegister;
NX_ASSERT( CNULL != pRegister );
NX_GPIO_SetBit(&pRegister->GPIOx_DRV1, BitNumber, (CBOOL)(((U32)drvstrength>>0) & 0x1));
NX_GPIO_SetBit(&pRegister->GPIOx_DRV0, BitNumber, (CBOOL)(((U32)drvstrength>>1) & 0x1));
}
此处我们重要看一下这个宏定义吧:NX_GPIO_DRVSTRENGTH
typedef enum
{
NX_GPIO_DRVSTRENGTH_0 = 0UL,
NX_GPIO_DRVSTRENGTH_1 = 1UL,
NX_GPIO_DRVSTRENGTH_2 = 2UL,
NX_GPIO_DRVSTRENGTH_3 = 3UL
}NX_GPIO_DRVSTRENGTH;
说明:里面的0UL,1UL,2UL,3UL分别指的是2mA,4mA,6mA,8mA;
还是回到我们最开始的问题吧!,当我们加大gpio驱动强度后,我们发现最开始出现的闪屏现象解决了。。。。