mini2440 LCD(型号:P43)驱动的背光驱动失效原因分析

news2024/11/13 8:52:52

目录

概述

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》中的方法是不行的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1532860.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ZYNQ AXI GPIO

1 原理介绍 一个AXI GPIO 模块有两个GPIO&#xff0c;分别是GPIO和GPIO2&#xff0c;也就是channel1和channel2&#xff0c;为 双向IO。 AXI GPIO的寄存器也不多&#xff0c;主要是两个channel 的数据寄存器GPIO_DATA和GPIO2_DATA&#xff0c;两个channel的方向控制GPIO_TRI和…

Tempo Talents | 创新专业建设方案,赋能高校4+N大数据学科人才培养

数字经济成为国家战略&#xff0c;是新一轮的经济发展引擎&#xff0c;数字人才、复合型人才成为发展的关键和核心要素。各级政府、区域开始以区域产业为导向&#xff0c;培育、聚集产业所需的数智化人才。 高校作为人才培养的重要基地&#xff0c;也发挥着不可或缺的作用。他…

【Spark编程基础】实验三RDD 编程初级实践(附源代码)

目录 一、实验目的二、实验平台三、实验内容1.spark-shell 交互式编程2.编写独立应用程序实现数据去重3.编写独立应用程序实现求平均值问题 一、实验目的 1、熟悉 Spark 的 RDD 基本操作及键值对操作&#xff1b; 2、熟悉使用 RDD 编程解决实际具体问题的方法 二、实验平台 …

神经网络(深度学习,计算机视觉,得分函数,损失函数,前向传播,反向传播,激活函数)

目录 一、神经网络简介 二、深度学习要解决的问题 三、深度学习的应用 四、计算机视觉 五、计算机视觉面临的挑战 六、得分函数 七、损失函数 八、前向传播 九、反向传播 十、神经元的个数对结果的影响 十一、正则化与激活函数 一、神经网络简介 神经网络是一种有监督…

安卓findViewById 的优化方案:ViewBinding与ButterKnife(一)

好多小伙伴现在还用findViewById来获取控件的id, 在这里提供俩种替代方案&#xff1a;ViewBinding与ButterKnife&#xff1b; 先来说说ButterKnife ButterKnife ButterKnife是一个专注于Android系统的View注入框架&#xff0c;在过去的项目中总是需要很多的findViewById来查…

【C语言】结构体内存对齐问题

1.结构体内存对齐 我们已经基本掌握了结构体的使用了。那我们现在必须得知道结构体在内存中是如何存储的&#xff1f;内存是如何分配的&#xff1f;所以我们得知道如何计算结构体的大小&#xff1f;这就引出了我们今天所要探讨的内容&#xff1a;结构体内存对齐。 1.1 对齐规…

绝地求生:七周年活动来袭,小黑盒联名限时返场

就在2024.3.20号下午18点&#xff0c;小黑盒绝地求生板块上线最新活动&#xff0c;活动方法和以往一样采用积分抽奖的方式&#xff0c;通过每日签到&#xff0c;完成任务即可获得相应积分&#xff0c;抽奖需消耗10积分&#xff0c;第一天可以抽8次&#xff0c;后面每一天可以抽…

利用colab部署chatglm

登录colab 创建新的notebook 选择notebook设置 选择GPU然后保存&#xff0c;需要选择GPU 克隆代码 !git clone https://github.com/THUDM/ChatGLM-6B.git切换到目录安装所需要的依赖 %cd /content/ChatGLM-6B %pwd !pip install -r requirements.txt安装所需要的依赖包 …

微软聘请了谷歌DeepMind的联合创始人

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

爬虫基础:Web网页基础

爬虫基础&#xff1a;Web网页基础 前言Web网页基础网页的组成网页的结构节点树及节点间的关系选择器 前言 用浏览器访问不同的网站时&#xff0c;呈现的页面各不相同&#xff0c;你有没有想过为何会这样呢&#xff1f;了解一下网页的组成、结构和节点等内容。了解这些内容有助于…

超长爬电结构法蓝底板平面(厚膜、无感设计)中功率电阻

灌封胶封装设计 厚膜无感电阻规格书 EAK特殊设计的模压灌封胶结构设计&#xff0c;使本产品具备超长的 爬电距离&#xff0c;符合VDE0160和UL94-V0的标准。 技术特点 底板中心温度≤85C时,单一电阻结构额定 功率为150W。 四种封装结构&#xff0c;最多封装三个电阻。 2-…

【ChatGLM3-6B】本地大模型使用方法详细教程!!!内含详细的代码解析!!

ChatGLM3介绍 ChatGLM3 是智谱AI与清华大学KEG实验室联合发布的新一代对话预训练模型。 ChatGLM3-6B 的基础模型 ChatGLM3-6B-Base 采用了更多样的训练数据、更充分的训练步数和更合理的训练策略。在语义、数学、推理、代码、知识等不同角度的数据集上测评显示&#xff0c;Ch…

写一个简单的 C++ 日志库 - cllogger(3)- CRT

通过上一篇 《写一个简单的 C 日志库 - cllogger&#xff08;2&#xff09;- 日期时间》我们已经掌握了如何通过 std::chrono 提供的日期时间工具转换时间参数为指定格式的字符串。 现在我们可以把各个参数信息拼装为 Entry 实例&#xff0c;交给 OutputMessage() void cllog…

PyTorch 深度学习(GPT 重译)(三)

六、使用神经网络拟合数据 本章内容包括 与线性模型相比&#xff0c;非线性激活函数是关键区别 使用 PyTorch 的nn模块 使用神经网络解决线性拟合问题 到目前为止&#xff0c;我们已经仔细研究了线性模型如何学习以及如何在 PyTorch 中实现这一点。我们专注于一个非常简单…

python爬虫学习第二天----类型转换

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

Word2vec学习笔记

&#xff08;1&#xff09;NNLM模型&#xff08;神经网络语言模型&#xff09; 语言模型是一个单纯的、统一的、抽象的形式系统&#xff0c;语言客观事实经过语言模型的描述&#xff0c;比较适合于电子计算机进行自动处理&#xff0c;因而语言模型对于自然语言的信息处理具有重…

Python基础入门 --- 6.数据容器

文章目录 Python基础入门第六章&#xff1a;6.数据容器6.1 列表6.1.1 列表下标索引6.1.2 列表常用操作查找指定某元素的下标修改指定位置的元素值插入元素追加元素方式1追加元素方式2删除元素删除某元素在列表中的第一个匹配项清空列表统计某元素在列表中的数量统计列表元素个数…

【Redis】Redis常见原理和数据结构

Redis 什么是redis redis是一款基于内存的k-v数据结构的非关系型数据库&#xff0c;读写速度非常快&#xff0c;常用于缓存&#xff0c;消息队列、分布式锁等场景。 redis的数据类型 string&#xff1a;字符串 缓存对象&#xff0c;分布式ID&#xff0c;token&#xff0c;se…

RAGGED: Towards Informed Design of Retrieval Augmented Generation Systems阅读笔记

论文链接&#xff1a;https://arxiv.org/abs/2403.09040 Github链接&#xff1a;GitHub - neulab/ragged: Retrieval Augmented Generation Generalized Evaluation Dataset 最近RAG&#xff08;retrieval-augmented generation&#xff09;真的好火&#xff0c;这不CMU的发了…

vscode用SSH远程开发c语言

vscode配置远程 这里我使用虚拟机进行展示&#xff0c;首先需要你的虚拟机安装好ssh 没安装好就执行下面的命令安装并开启服务 sudo apt-get install ssh sudo service ssh start ps -e | grep sshvscode安装 remote-ssh扩展 点击左下角的远程连接&#xff0c;我这里已经连接…