linux nanopi3 lcd 闪屏处理

当换上自己的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驱动强度后,我们发现最开始出现的闪屏现象解决了。。。。

 

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌上花开缓缓归以

你的鼓励将是我创作的最大动力,

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值