韦东山视频之LCD驱动(Mini2440 X35)

韦东山嵌入式linux系列-驱动进化之路:总线设备驱动模型 应用程序调用open等函数最简单的方法是驱动层也提供对应的drv_open,应用程序调用read,驱动层也提供对应的drv_read等等。需要写出驱动层的函数,为了便于管理,将这些函数放到file_operations结构体中,即第一步定义对应的file_operations结构体,并实现对应的open等程序(第一步);实现完成之后,将file_operations结构体通过register_chrdev注册到内核(第二步);然后通过入口函数调用注册函数(chrdev),安装驱动程序的时候,内核会调用入口函 阅读详情

测试平台: Mini2440  Sonic X35 Lcd  Linux-2.6.29  u-boot 2008.10

实验思考:

说起这块屏幕,可真是费劲,LCD原理图跟别人的好多不一样,时序图也有很大的差别,LCD上vline 和vframe根本没有,只能通过pci和mck两个时钟进行设置;

还一个就是:不知道是uboot的原因还是友善官网提供的原理图有错 ,vden必须反转才能正常!!

 源代码:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/string.h>
#include <linux/mm.h>
#include <linux/slab.h>
#include <linux/delay.h>
#include <linux/fb.h>
#include <linux/init.h>
#include <linux/dma-mapping.h>
#include <linux/interrupt.h>
#include <linux/workqueue.h>
#include <linux/wait.h>
#include <linux/platform_device.h>
#include <linux/clk.h>

#include <asm/io.h>
#include <asm/uaccess.h>
#include <asm/div64.h>
#include <linux/types.h>
#include <asm/mach/map.h>
#include <mach/regs-lcd.h>
#include <mach/regs-gpio.h>
#include <mach/fb.h>

struct lcd_regs{
	unsigned long   lcdcon1;
    unsigned long	lcdcon2;
	unsigned long	lcdcon3;
	unsigned long	lcdcon4;
	unsigned long	lcdcon5;
	unsigned long	lcdsaddr1;
	unsigned long	lcdsaddr2;
	unsigned long	lcdsaddr3;
	unsigned long	redlut;
	unsigned long	greenlut;
	unsigned long	bluelut; 
	unsigned long	reserved[9];
	unsigned long	dithmode;
	unsigned long	tpal;
	unsigned long	lcdintpnd;
	unsigned long	lcdsrcpnd;
	unsigned long	lcdintmsk;
	unsigned long	lpcsel;
};
static volatile struct lcd_regs *lcd_regs_base;

static struct fb_info *fb_x35;

static volatile unsigned long *gpbcon;
static volatile unsigned long *gpbdat;
static volatile unsigned long *gpccon;
static volatile unsigned long *gpdcon;
static volatile unsigned long *gpgcon;

static u32 pseudo_palette[16];

static inline unsigned int chan_to_field(unsigned int chan,
	struct fb_bitfield* bf)
{
	chan &= 0xffff;
	chan >>= 16 - bf->length;
	
	return chan << bf->offset;
}


//设置颜色
static int x35_setcolreg(unsigned int regno, unsigned int red, 
		unsigned int green, unsigned int blue,
		unsigned int transp, struct fb_info *info)
{
	unsigned int val;
	
	if (regno > 16)
		return 1;

	val  = chan_to_field(red,	&info->var.red);
	val |= chan_to_field(green, &info->var.green);
	val |= chan_to_field(blue,	&info->var.blue);
	
	pseudo_palette[regno] = val;
	
	return 0;

}


static struct fb_ops mini_fb_ops = {
	.owner 			= THIS_MODULE,
	.fb_setcolreg 	= x35_setcolreg,
	.fb_fillrect  	= cfb_fillrect,
	.fb_copyarea  	= cfb_copyarea,
	.fb_imageblit   = cfb_imageblit,
};



static int lcd_init(void)
{
	//1)分配一个fb_info
	fb_x35 = framebuffer_alloc(0, NULL);

	//2)填充fb_info结构
	// 1 设置固定参数
	// 2 设置可变参数
	// 3 设置操作函数
	// 4 其他的设置
	strcpy(fb_x35->fix.id, "mylcd");	
	fb_x35->fix.smem_len 		= 240 * 320 * 32 / 8;  // frambuffer的大小

	fb_x35->fix.type 			= FB_TYPE_PACKED_PIXELS;//扫描方式,以像素点扫描 非隔行扫描	
	fb_x35->fix.visual 			= FB_VISUAL_TRUECOLOR; //色阶 真彩色
	fb_x35->fix.line_length 	= 240 * 4;

	fb_x35->var.xres 			= 240;
	fb_x35->var.yres 			= 320;
	fb_x35->var.xres_virtual 	= 240;
	fb_x35->var.yres_virtual 	= 320;
	fb_x35->var.bits_per_pixel 	= 32;  //每个像素点占有的字节数


	//颜色放置的方式,这里是真彩色为 8:8:8,每种颜色占用8位
	fb_x35->var.red.offset 		= 16;
	fb_x35->var.red.length 		= 8;
	fb_x35->var.blue.offset 	= 8;
	fb_x35->var.blue.length 	= 8;
	fb_x35->var.green.offset 	= 0;
	fb_x35->var.green.length 	= 8;
	
	fb_x35->var.activate 		= FB_ACTIVATE_NOW; //设置颜色立即生效

	//设置操作函数
	fb_x35->fbops 				= &mini_fb_ops;

	fb_x35->pseudo_palette 		= pseudo_palette; //调色板
	fb_x35->screen_size 		= 240 * 320 * 32 / 8;  //屏幕尺寸的大小


	//3)设置硬件,驱动lcd
	// 1 设置lcd引脚可用
	// 2 设置lcd控制器寄存器
	// 3 设置其他的
	gpbcon = ioremap(0x56000010, 8);	
	gpbdat = gpbcon+1;
	gpccon 		= 	ioremap(0x5600020, 4);
	gpdcon 		= 	ioremap(0x5600030, 4);	
	gpgcon 		= 	ioremap(0x5600060, 4);

	*gpccon 	= 	0xaaaaaaaa;
	*gpdcon 	= 	0xaaaaaaaa;
	*gpgcon 	|= 	(0x3 << (4 * 2));  //lcd_pwren lcd电源引脚
	
	lcd_regs_base 	= ioremap(0x4d000000, sizeof(struct lcd_regs));
	
	lcd_regs_base->lcdcon1 = (9 << 8) | (3 << 5) | (0xd << 1);
	lcd_regs_base->lcdcon2 = (8 << 24) | (319 << 14) | (4 << 6) | (9 << 0);
	lcd_regs_base->lcdcon3 = (15 << 19) | (239 << 8) | (16 << 0) ;
	lcd_regs_base->lcdcon4 = 5;
	lcd_regs_base->lcdcon5 = (0 << 12) | (0 << 10) | (1<<6) | (0 << 1) | (0 << 0) ;
			//vsync swap set error

	//分配显存,将显存地址告诉framebuffer
	fb_x35->screen_base 		= dma_alloc_writecombine(NULL, fb_x35->fix.smem_len, 
						&(fb_x35->fix.smem_start), GFP_KERNEL);//fb_x35->fix.smem_start = xxx;  /* 显存的物理地址 */
	lcd_regs_base->lcdsaddr1 	= (fb_x35->fix.smem_start >> 1) & (~(3 << 30)); //[31~0]=0b00xx xxxx ... 30误写成20
	lcd_regs_base->lcdsaddr2 	= ((fb_x35->fix.smem_start + fb_x35->fix.smem_len) >> 1) & 0x1fffff;
	lcd_regs_base->lcdsaddr3 	= (0 << 11) | ((240 * 32 / 16) << 0); //行的长度有错


	//启动lcd
	lcd_regs_base->lcdcon1 		|= (1 << 0);
	lcd_regs_base->lcdcon5 		|= (1 << 3);
	/* MINI2440的背光电路也是通过LCD_PWREN来控制的, 不需要单独的背光引脚 */
	
	//4)注册framebuffer
	register_framebuffer(fb_x35);
	
	return 0;
}

static void lcd_exit(void)
{
	//注销framebuffer结构
	//释放分配的frambuffer显存
	//关闭lcd控制器以及电源
	//取消映射地址
	//释放framebuffer结构
	unregister_framebuffer(fb_x35);
	lcd_regs_base->lcdcon1 		&= ~(1 << 0);
	lcd_regs_base->lcdcon5 		&= ~(1 << 3);
	
	dma_free_writecombine(NULL, fb_x35->fix.smem_len, fb_x35->screen_base, fb_x35->fix.smem_start);

	iounmap(lcd_regs_base);
	iounmap(gpccon);
	iounmap(gpdcon);
	iounmap(gpgcon);

	framebuffer_release(fb_x35);
}


module_init(lcd_init);
module_exit(lcd_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("LCL");

如何测试:

1. make menuconfig去掉原来的驱动程序
-> Device Drivers
  -> Graphics support
<M> S3C2410 LCD framebuffer support

2. make uImage
   make modules 

3. 使用新的uImage启动开发板:

4. 先将之前module下编译出来的几个文件拷到开发板上cfbcopyarea.ko cfbfillrect.ko cfbimgblt.ko(/drivers/video/*)

5.

insmod cfbcopyarea.ko
insmod cfbfillrect.ko
insmod cfbimgblt.ko
insmod lcd.ko

6.

echo hello > /dev/tty1  // 可以在LCD上看见hello
cat lcd.ko > /dev/fb0   // 花屏

当然也可以测试其他的,这里不进行描述。

注意:里面的图像调整其实还不是最关键的,关键是vden不翻转 就没有图像,我调试过好多次,幸亏论坛网友热心帮助,才点亮lcd。

解决mini2440 LCD(型号:P43)驱动的背光失效问题 本文介绍了 解决mini2440 LCD(型号:P43)驱动的背光失效问题的方法,并通过实操方式,详细记录整个LCD driver的移植过程,还移植触摸功能的驱动,并且烧写到mini2440开发板上,且能正常的工作。 阅读详情

相关推荐

Sony LCD-X35液晶屏在Mini2440开发板上的应用指南

LCD(Liquid Crystal Display,液晶显示)技术自从20世纪70年代问世以来,已经广泛应用于嵌入式系统中,从最基础的单色显示到如今的全彩高清屏幕,LCD为用户提供了一个不可或缺的交互界面。LCD的主要优点包括:低功耗、轻薄设计、无辐射、使用寿命长,这些特点使得LCD成为嵌入式系统的首选显示解决方案。TFT(Thin-Film Transistor,薄膜晶体管)技术。

weixin_32242475的博客 638

嵌入式Linux驱动教程(韦东山2期)

1.没有废话,句句都是干货!学习后保证可以跟着视频完成相应的实验。2.现场从0编写/调试工作中的绝大部分驱动,内容--- 理论 +

韦东山视频修改mini2440的LCD驱动

按韦东山的视频上讲的不能直接用到mini2440,内核必须修改,时序图,电路图都不一样,需要改动

micro2440 LCD裸机测试

最近几天在弄micro2440的LCD,遇到了诸多

zhangjun1992的专栏 1382

MINI2440_LCD驱动(TD35可用)

MINI2440_LCD驱动,统宝3.5寸液晶屏使用官方源码会出现图像偏移的情况,可以使用本源码替代,测试图像显示正常。

一个测试工程师走进一家酒吧……

一个测试工程师走进一家酒吧,要了一杯啤酒;一个测试工程师走进一家酒吧,要了一杯咖啡;一个测试工程师走进一家酒吧,要了 0.7 杯啤酒;一个测试工程师走进一家酒吧,要了-1 杯啤酒;一个测试...

字节跳动技术团队官方博客 4890

mini2440 LCD实验

今天对LCD实验做一个总结。        1、时序很重要。              LCD的使用时,有些引脚的信号需要翻转,如HSYNC、VSYNC、VDEN等。我使用的开发板是mini2440,LCD屏是X35。它的手册:http://wenku.baidu.com/view/1f114c03de80d4d8d15a4f46.html              通过实验,我发现

Huntinux 1903

基于MYD-YT153与AD7616的16通道高速ADC采集系统实战指南

在嵌入式系统与工业数据采集领域,模拟信号采集是连接物理世界与数字系统的关键技术。其核心原理是通过模数转换器(ADC)将连续的模拟电压信号转换为离散的数字码值,供处理器处理。这项技术的价值在于实现了对温度、压力、振动等关键物理量的精确感知与数字化,是工业自动化、设备监测、科学实验等场景的基石。本文聚焦于**多通道**、**高精度**采集这一常见需求,深入剖析如何利用全志T153处理器的LocalBus并行总线接口,高效驱动ADI的16位、16通道同步采样ADC芯片AD7616,构建一个稳定可靠的高速数据采集系

weixin_30335353的博客 443

韦东山嵌入式Linux学习——016 LCD(2)-编写程序

LCD硬件原理与LCD控制器介绍 /*  *硬件平台:韦东山嵌入式Linxu开发板(S3C2440.v3)  *软件平台:运行于VMware Workstation 12 Player下UbuntuLTS16.04_x64 系统,  *参考资料:开发版原理图,S3C2440A datasheet,AT043TN24 datasheet */ 目录LCD硬件原理与L...

weixin_42813232的博客 943

告别图像畸变:手把手教你用HALCON的`gen_image_to_world_plane_map`做高精度视觉测量

本文详细解析了HALCON的`gen_image_to_world_plane_map`算子在工业视觉测量中的应用,通过精确的几何变换消除透视畸变,提升测量精度。文章涵盖相机标定、世界坐标系建立、实战应用及性能优化,适用于液晶屏质检、金属板检测等场景,帮助工程师实现高精度视觉测量。

weixin_28718487的博客 424

大疆上云API-1.10.0版本-设备位置数据实时处理与WebSocket推送实战解析

本文深入解析了大疆上云API 1.10.0版本中设备位置数据的实时处理与推送全链路。通过剖析源码,详细阐述了从MQTT接收OSD数据、Spring Integration路由分发、业务逻辑处理到WebSocket实时推送至前端地图的核心流程,并提供了实战优化与避坑指南,帮助开发者构建高可靠的无人机实时定位系统。

weixin_29291863的博客 413

韦东山嵌入式Linux学习——016 LCD(1)-硬件原理与LCD控制器介绍

LCD硬件原理与LCD控制器 /*  *硬件平台:韦东山嵌入式Linxu开发板(S3C2440.v3)  *软件平台:运行于VMware Workstation 12 Player下UbuntuLTS16.04_x64 系统,  *参考资料:开发版原理图,S3C2440A datasheet,AT043TN24 datasheet */ 目录LCD硬件原理与LCD...

weixin_42813232的博客 1273

YOLOv11改进 | 主干/Backbone篇 | 利用RT-DETR主干网络PPHGNetV2助力yolov11有效涨点(轻量化目标检测网络)

本文给大家带来利用RT-DETR模型主干HGNet去替换YOLOv11的主干,RT-DETR是今年由百度推出的第一款实时的ViT模型,其在实时检测的领域上号称是打败了YOLO系列,其利用两个主干一个是HGNet一个是ResNet,其中HGNet就是我们今天来讲解的网络结构模型,这个网络结构目前还没有推出论文,所以其理论知识在网络上也是非常的少,我也是根据网络结构图进行了分析(精度mAP提高0.05)。YOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备​目录一、本文介绍。

Snu77的博客 3721

移植Linux3.4.2版本内核到mini2440(二)--添加网卡、UVC摄像头、LCD驱动

移植Linux3.4.2版本内核到mini2440(二)--添加网卡、UVC摄像头、LCD驱动 2014-01-01 11:36:45 分类: 嵌入式            移植Linux3.4.2版本内核到mini2440(二)--添加网卡、UVC摄像头、LCD驱动             该移植工作主要参考了韦东山的《嵌入式Linux应用开发完全手册》,第二

win2domain的专栏 1456

7、刚度矩阵与弹簧元素:有限元分析的核心

本文深入探讨了有限元分析中的核心概念——刚度矩阵与弹簧元素。详细介绍了刚度矩阵的定义、构建方法及其对称性、正定性和稀疏性等性质,同时解析了弹簧和阻尼器元素的特性及其在模拟复杂系统中的应用,如液压缸、减震器等。通过结合刚度矩阵与弹簧元素,可以提高结构模型的精度并模拟复杂的工程系统。文章还讨论了优化策略、验证流程、误差分析及实际应用案例,展示了这些技术在桥梁分析、汽车悬挂系统等领域的重要作用,并展望了其在未来新材料、智能结构和数字孪生技术中的发展潜力。

nice1的博客 236

基于YOLO26/11/v8算法的Web目标检测系统,人脸表情识别系统,Django+Vue3 的前后端分离,实现摄像头实时识别,YOLO26/YOLO11/v8 + LLM大模型智能分析,科研必备

在人工智能迈向通用化(AGI)的今天,“视觉感知 + 语言理解”的多模态联合是未来的趋势。单纯的检测画框已经无法满足复杂的业务需求,如何让系统“看懂”画面并进行“思考”,是当前视觉项目的重点。我们知道目标检测是计算机视觉中的重要任务,广泛应用于安防监控、自动驾驶、智能家居等领域。因此本项目将 YOLO 目标检测模型(兼容 YOLO26/v11/v8 系列)与 DeepSeek 等顶流大语言模型(LLM) 进行联合,使用 Django (后端) + Vue3 (前端) 技术栈

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2843

韦东山嵌入式Liunx驱动大全二

MIPI-DPI (Display Pixel Interface) ,Pixel(像素),强调的是操作单个像素,在MPU上的LCD控制器就是这种接口。使用platform_driver注册,在probe函数里分配fb_info、设置fb_info、注册fb_info、硬件相关的设置。ubuntu系统中,通过grep查找(第一个属性的值没找到),第二个属性找到内核的imx6ull.dtsi文件的第1017行,并打开。韦老师的课比较难,第一遍不知道在说什么,但是坚持看完一遍,再来复习,基本上就水到渠成了。

DZJ_Nirvana 2115

JavaScript实现量化交易策略(附完整源码)

JavaScript实现量化交易策略(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 722

第二期驱动篇——1.1 LCD驱动编写—Linux内核中LCD驱动框架分析

Linux内核中LCD驱动框架分析 /*  *硬件平台:韦东山嵌入式Linxu开发板(S3C2440.v3)  *软件平台:运行于VMware Workstation 12 Player下UbuntuLTS16.04_x64 系统  *参考资料:《嵌入式Linux应用开发手册》、《嵌入式Linux应用开发手册第2版》 目录Linux内核中LCD驱动框架分析一、前言二、框架1、回顾裸板LCD驱动2、Linux下LCD驱动框架2.1 fbmem_init函数解析2.2 fb_op

weixin_42813232的博客 686

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

[韦东山]嵌入式Linux应用开发 lecture4 Framebuffer应用编程

假设更改LCD中位置为(x,y)的像素点的颜色值,则其内存位为:base+(y*x_res+x)*bpp/8。Linux通过Framebuffer驱动程序来控制LCD,其中保存着单帧图像的全部像素点颜色值。tip:需要使用open/ioctl/mmap函数,可通过man指令来查找头文件和函数原型;③应用程序通过mmap映射Framebuffer,在Framebuffer中写入数据;根据LCD分辨率、BPP分配Framebuffer;根据LCD的参数设置LCD控制器的时序、信号极性;

qq_45430996的博客 308

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

s3c2440的LCD应用

要想正确使用LCD,必须注意两点:1、时序;2、显示缓存区。   1、时序 LCD一般需要三个时序信号:VSYNC、HSYNC和VCLK。VSYNC是垂直同步信号,在每进行一个帧(即一个屏)的扫描之前,该信号就有效一次,由该信号可以确定LCD的场频,即每秒屏幕刷新的次数(单位Hz)。HSYNC是水平同步信号,在每进行一行的扫描之前,该信号就有效一次,由该信号可以确定LCD的行频,即每秒屏幕从

weed_hz的专栏 1218

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

关于mini2440LCD模块总结

一.平台:mini2440 + sony ACX502BMU-7(TFT屏  采用16bpp  240*320) 二.模块简述: 首先我们从上面的硬件原理图可知:我们需要配置的引脚有除了VDDLCD  nRESET TSXM TSYM TSXP TSYP 以及那些接地的引脚,所有的引脚都要进行配置。 三.下面是mini2440 LCD模块的系统框图: 从上图可知:图片数据

Y_Dennis的博客 949

Linux LCD驱动中的LCD参数

转载地址:http://www.linuxidc.com/Linux/2011-01/31800.htm kernel版本:linux-2.6.34 开发板:PW2440 CPU:S3C3440 LCD:3.5 寸TFT(320×240),Model Name LQ035NC111 LCD的参数设定是需要根据LCD的手册来设定arch/arm/mach-s3c2440/mach-sm

kunkliu的博客 2050

Linux驱动LCD driver学习总结

这篇文章写于13年11月,这里仅记录一下曾经涉猎了这方面的知识,可能对以后的一些知识了解有所帮助 关于platform总线模型,可以参考之前的一篇文章Linux驱动Platform总线模型,这对frameBuffer的驱动注册可能有所帮助 一、LCD硬件框架 二、LCD软件框架 三、LCD初始化流程 四、LCD on与off的流程 五、LC...

源码在手 6828

Linux驱动之LCD实战视频课程-韦东山-专题视频课程

总结出怎么写一个lcd的驱动程序的步骤 1.分配一个fb_info的结构体 2.设置fb_info结构体 3.向内核注册register_framebuffer 4.硬件相关的初始化

韦东山嵌入式专栏 638
上一篇: dma_alloc_writecombine
下一篇: 韦东山视频实验之USB鼠标驱动
comwise
博客等级 码龄15年 58粉丝 85原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值