目录
概述
1 背光驱动移植
1.1 问题描述
1.2 LCD背光驱动
1.2.1 原理图分析
2 移植驱动程序
2.1 编写驱动代码
2.2.1 编写代码
2.2.2 添加驱动配置
2.2 配置驱动至内核
3 测试背光控制
4 分析P43屏的资料
4.1 查询P43的资料
4.2 关于P43的介绍
5 失效原因分析
概述
笔者根据文档《Mini2440 Linux移植开发实战指南.pdf》移植mini2440 LCD驱动,LCD型号为P43。在移植LCD driver之前,首先移植了背光部分的程序,本文详细记录了背光移植的过程,并总结了移植过程中存在的问题,并把解决的方法也一一记录下来,方便日后查看。
1 背光驱动移植
1.1 问题描述
在mini2440的控制台输出的log,可以看见如下信息,提示no platform data for lcd,为了保证LCD能够正常工作,必须已经LCD的驱动。
log的信息如下:
NET: Registered protocol family 1
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
JFFS2 version 2.2. (NAND) © 2001-2006 Red Hat, Inc.
ROMFS MTD (C) 2007 Red Hat, Inc.
msgmni has been set to 118
alg: No test for stdrng (krng)
io scheduler noop registered
io scheduler anticipatory registered (default)
io scheduler deadline registered
io scheduler cfq registered
s3c2410-lcd s3c2410-lcd: no platform data for lcd, cannot attach
s3c2410-lcd: probe of s3c2410-lcd failed with error -22
mini2440上使用的LCD的实物图。型号为:P43
1.2 LCD背光驱动
1.2.1 原理图分析
在 mini2440/micro2440 开发板中, LCD 背光是通过 CPU 的 LCD_PWR 引脚来控制的,从原理图中可以看出,它对应于 GPG4,如图 :
当 LCD_PWR 输出为高电平“ 1”时,将打开背光;当输出为低电平“ 0”时,将关闭背光(注意:这里只是打开和关闭背光,而并没有背光亮度的调节作用)。
2 移植驱动程序
2.1 编写驱动代码
笔者选取的内核源码为: linux-2.6.32.24.tar.bz2,下载地址:
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.24.tar.gz
2.2.1 编写代码
在linux-2.6.32.24/drivers/video/目录下创建一个文件:mini2440_backlight.c,编写如下代码。
/***********************************************************
Copyright 2024-2029. All rights reserved.
文件名 : drivers/video/backlight/mini2440_backlight.c
作者 : tangmingfei2013@126.com
版本 : V1.0
描述 : mini2440 LCD backlight driver
其他 : 无
日志 : V1.0 2024/3/19
***********************************************************/
#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/input.h>
#include <linux/init.h>
#include <linux/serio.h>
#include <linux/delay.h>
#include <linux/clk.h>
#include <linux/miscdevice.h>
#include <linux/gpio.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/uaccess.h>
#include <mach/regs-clock.h>
#include <plat/regs-timer.h>
#include <mach/regs-gpio.h>
#include <linux/cdev.h>
#undef DEBUG
//#define DEBUG
#ifdef DEBUG
#define DPRINTK(x...) {printk(__FUNCTION__"(%d): ",__LINE__);printk(##x);}
#else
#define DPRINTK(x...) (void)(0)
#endif
#define DEVICE_NAME "backlight"
static unsigned int bl_state;
static inline void set_bl(int state)
{
bl_state = !!state;
s3c2410_gpio_setpin(S3C2410_GPG(4), bl_state);
}
static inline unsigned int get_bl(void)
{
return bl_state;
}
static ssize_t dev_write(struct file *file, const char *buffer, size_t count, loff_t * ppos)
{
unsigned char ch;
int ret;
if (count == 0) {
return count;
}
ret = copy_from_user(&ch, buffer, sizeof ch) ? -EFAULT : 0;
if (ret) {
return ret;
}
ch &= 0x01;
set_bl(ch);
return count;
}
static ssize_t dev_read(struct file *filp, char *buffer, size_t count, loff_t *ppos)
{
int ret;
unsigned char str[] = {'0', '1' };
if (count == 0) {
return 0;
}
ret = copy_to_user(buffer, str + get_bl(), sizeof(unsigned char) ) ? -EFAULT : 0;
if (ret) {
return ret;
}
return sizeof(unsigned char);
}
static struct file_operations dev_fops = {
owner: THIS_MODULE,
read: dev_read,
write: dev_write,
};
static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &dev_fops,
};
static int __init dev_init(void)
{
int ret;
ret = misc_register(&misc);
printk (DEVICE_NAME"\tinitialized\n");
s3c2410_gpio_cfgpin(S3C2410_GPG(4), S3C2410_GPIO_OUTPUT);
set_bl(1);
return ret;
}
static void __exit dev_exit(void)
{
misc_deregister(&misc);
}
module_init(dev_init);
module_exit(dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("tangmingfei2013@126.com");
2.2.2 添加驱动配置
然后把背光配置选项加入内核配置菜单,在 linux-2.6.32.24/drivers/video/Kconfig文件中,添加背光驱动的配置信息,详细代码如下:
linux-2.6.32.24/drivers/video/Kconfig代码内容:
config BACKLIGHT_MINI2440
tristate "Backlight support for mini2440"
depends on MACH_MINI2440 && FB_S3C2410
help
backlight driver for MINI2440
在 linux-2.6.32.24/drivers/video/Makefile中加入驱动目标文件,如图:
linux-2.6.32.24/drivers/video/Makefile中代码:
obj-$(CONFIG_BACKLIGHT_MINI2440) += mini2440_backlight.o
2.2 配置驱动至内核
在内核源代码根目录执行:make menuconfig,依次选择如下子菜单:
Device Drivers --->
Graphics support --->
<*> Support for frame buffer devices --->
配置完成后,退出配置页面,保存配置参数
3 测试背光控制
根据《Mini2440 Linux移植开发实战指南.pdf》中提供的方法,使用命令如下:
echo 0 > /dev/backlight 可以关闭 LCD 背光。
echo 1 > /dev/backlight 可以打开 LCD 背光。
事实上,使用如上命令并不能控制LCD的背光状态。这个方法失效
4 分析P43屏的资料
4.1 查询P43的资料
登录如下网站,可以找到P43屏的相关资料
https://wiki.friendlyelec.com/wiki/index.php/LCD-P43/zh
4.2 关于P43的介绍
如下文字介绍了P43的实现原理:
5 失效原因分析
在LCD P43上,其使用一个低成本的MCU连接一个专业的触控芯片(在此我们使用的是ADS7843或兼容芯片),采集并处理四线电阻模拟信号,并把滤波(未校准)后的稳定原始数据通过GPIO送给ARM主控。包括背光控制也是通过一线触摸的方式实现的,所以直接用《Mini2440 Linux移植开发实战指南.pdf》中的方法是不行的。